Subject: [LON-CAPA-dev] Re: Printing broken in CVS HEAD?

From: Stuart Raeburn <[email-masked]>
Date: Mon, 23 Aug 2010 14:46:40 -0400

Hi,

The problem is that amongst the dependencies in printout.pl is one  
which eventually includes lonmenu.pm, and a dependency on  
lonwishlist.pm was recently added to lonmenu.pm.

If 'use Apache::lonwishlist.pm' is _not_ included in lonmenu.pm then  
printout.pl reports:

> Undefined subroutine &Apache::lonwishlist::getfoldersOption called  
> at /home/httpd/lib/perl//Apache/lonmenu.pm line 1144.

wish causes the script to produce no output.

If, however, 'use Apache::lonwishlist.pm' is added to lonmenu.pm, and  
it is called outside of mod_perl, i.e., in the cgi context, by  
printout.pl, an ISE is generated.

> Can't locate Apache/Constants.pm in @INC at /home/httpd/lib/perl//Apache
>  /lonwishlist.pm line 47.

The chain here is:

printout.pl uses loncommon.pm uses lonmenu.pm uses lonwishlist.pm

Only the last of these is a handler, which makes use of  
Apache::Constants (e.g., to return OK).

This type of issues has been seen before, and is encountered whenever  
perl modules are used outside of mod_perl context (e.g., run as cgi  
scripts or run as scripts by cron).  It is for this reason that care  
has to be token with the location of subroutines.  The most common  
solution has been to move subroutines which are required in contexts  
which do not support Apache::Constants, but are used in multiple  
places, to modules which do not have handler subroutines, such as  
loncommon.pm, lonnet.pm, or lonmenu.pm

Stuart Raeburn

---

From: Stuart Raeburn <[email-masked]>
Date: Mon, 23 Aug 2010 15:53:24 -0400

Looking at lonwishlist.pm, one suggestion would be to split it into a  
display module lonwishlistdisplay.pm (which would contain the handler  
routine, and the requirement for Apache::Constants) and a separate  
utilities module (lonwishlist.pm) which would contain the other  
routines.

This was the approach taken with lonnavdisplay.pm and lonnavmaps.pm

Stuart Raeburn