--- loncom/publisher/lonpublisher.pm 2002/08/07 19:45:05 1.86
+++ loncom/publisher/lonpublisher.pm 2002/08/09 18:03:05 1.91
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Publication Handler
#
-# $Id: lonpublisher.pm,v 1.86 2002/08/07 19:45:05 albertel Exp $
+# $Id: lonpublisher.pm,v 1.91 2002/08/09 18:03:05 matthew Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -61,6 +61,43 @@
## ##
###############################################################################
+
+######################################################################
+######################################################################
+
+=pod
+
+=head1 Name
+
+lonpublisher - LON-CAPA publishing handler
+
+=head1 Synopsis
+
+lonpublisher takes the proper steps to add resources to the LON-CAPA
+digital library. This includes updating the metadata table in the
+LON-CAPA database.
+
+=head1 Description
+
+lonpublisher is many things to many people.
+To all people it is woefully documented.
+This documentation conforms to this standard.
+
+This module publishes a file. This involves gathering metadata,
+versioning the file, copying file from construction space to
+publication space, and copying metadata from construction space
+to publication space.
+
+=head2 Internal Functions
+
+=over 4
+
+=cut
+
+######################################################################
+######################################################################
+
+
package Apache::lonpublisher;
# ------------------------------------------------- modules used by this module
@@ -75,6 +112,7 @@ use Apache::loncacc;
use DBI;
use Apache::lonnet();
use Apache::loncommon();
+use Apache::lonmysql;
my %addid;
my %nokey;
@@ -87,7 +125,19 @@ my $docroot;
my $cuname;
my $cudom;
-# ----------------------------------------------- Evaluate string with metadata
+#########################################
+#########################################
+
+=pod
+
+=item metaeval
+
+Evaluate string with metadata
+
+=cut
+
+#########################################
+#########################################
sub metaeval {
my $metastring=shift;
@@ -130,7 +180,19 @@ sub metaeval {
}
}
-# -------------------------------------------------------- Read a metadata file
+#########################################
+#########################################
+
+=pod
+
+=item metaread
+
+Read a metadata file
+
+=cut
+
+#########################################
+#########################################
sub metaread {
my ($logfile,$fn)=@_;
unless (-e $fn) {
@@ -147,7 +209,19 @@ sub metaread {
return '
Processed file: '.$fn.'';
}
-# ---------------------------- convert 'time' format into a datetime sql format
+#########################################
+#########################################
+
+=pod
+
+=item sqltime
+
+Convert 'time' format into a datetime sql format
+
+=cut
+
+#########################################
+#########################################
sub sqltime {
my $timef=shift @_;
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =
@@ -156,8 +230,28 @@ sub sqltime {
return "$year-$mon-$mday $hour:$min:$sec";
}
-# --------------------------------------------------------- Various form fields
+#########################################
+#########################################
+
+=pod
+
+=item Form field generating functions
+
+=over 4
+
+=item textfield
+
+=item hiddenfield
+
+=item selectbox
+
+=back
+
+=cut
+
+#########################################
+#########################################
sub textfield {
my ($title,$name,$value)=@_;
return "\n
$title:
".
@@ -184,8 +278,19 @@ sub selectbox {
return $selout.'';
}
-# -------------------------------------------------------- Publication Step One
+#########################################
+#########################################
+
+=pod
+
+=item urlfixup
+
+Fix up a url? First step of publication
+=cut
+
+#########################################
+#########################################
sub urlfixup {
my ($url,$target)=@_;
unless ($url) { return ''; }
@@ -206,7 +311,19 @@ sub urlfixup {
return $url;
}
+#########################################
+#########################################
+
+=pod
+=item absoluteurl
+
+Currently undocumented
+
+=cut
+
+#########################################
+#########################################
sub absoluteurl {
my ($url,$target)=@_;
unless ($url) { return ''; }
@@ -217,6 +334,19 @@ sub absoluteurl {
return $url;
}
+#########################################
+#########################################
+
+=pod
+
+=item set_allow
+
+Currently undocumented
+
+=cut
+
+#########################################
+#########################################
sub set_allow {
my ($allow,$logfile,$target,$tag,$oldurl)=@_;
my $newurl=&urlfixup($oldurl,$target);
@@ -235,6 +365,19 @@ sub set_allow {
return $return_url
}
+#########################################
+#########################################
+
+=pod
+
+=item get_subscribed_hosts
+
+Currently undocumented
+
+=cut
+
+#########################################
+#########################################
sub get_subscribed_hosts {
my ($target)=@_;
my @subscribed;
@@ -268,6 +411,19 @@ sub get_subscribed_hosts {
}
+#########################################
+#########################################
+
+=pod
+
+=item get_max_ids_indices
+
+Currently undocumented
+
+=cut
+
+#########################################
+#########################################
sub get_max_ids_indices {
my ($content)=@_;
my $maxindex=10;
@@ -299,7 +455,62 @@ sub get_max_ids_indices {
return ($needsfixup,$maxid,$maxindex);
}
-#Arguably this should all be done as an lonnet::ssi instead
+#########################################
+#########################################
+
+=pod
+
+=item get_all_text_unbalanced
+
+Currently undocumented
+
+=cut
+
+#########################################
+#########################################
+sub get_all_text_unbalanced {
+ #there is a copy of this in lonxml.pm
+ my($tag,$pars)= @_;
+ my $token;
+ my $result='';
+ $tag='<'.$tag.'>';
+ while ($token = $$pars[-1]->get_token) {
+ if (($token->[0] eq 'T')||($token->[0] eq 'C')||($token->[0] eq 'D')) {
+ $result.=$token->[1];
+ } elsif ($token->[0] eq 'PI') {
+ $result.=$token->[2];
+ } elsif ($token->[0] eq 'S') {
+ $result.=$token->[4];
+ } elsif ($token->[0] eq 'E') {
+ $result.=$token->[2];
+ }
+ if ($result =~ /(.*)$tag(.*)/) {
+ #&Apache::lonnet::logthis('Got a winner with leftovers ::'.$2);
+ #&Apache::lonnet::logthis('Result is :'.$1);
+ $result=$1;
+ my $redo=$tag.$2;
+ push (@$pars,HTML::LCParser->new(\$redo));
+ $$pars[-1]->xml_mode('1');
+ last;
+ }
+ }
+ return $result
+}
+
+#########################################
+#########################################
+
+=pod
+
+=item fix_ids_and_indices
+
+Currently undocumented
+
+=cut
+
+#########################################
+#########################################
+#Arguably this should all be done as a lonnet::ssi instead
sub fix_ids_and_indices {
my ($logfile,$source,$target)=@_;
@@ -352,9 +563,7 @@ sub fix_ids_and_indices {
}
foreach my $type ('src','href','background','bgimg') {
foreach my $key (keys(%parms)) {
- print $logfile "for $type, and $key\n";
if ($key =~ /^$type$/i) {
- print $logfile "calling set_allow\n";
$parms{$key}=&set_allow(\%allow,$logfile,
$target,$tag,
$parms{$key});
@@ -413,6 +622,9 @@ sub fix_ids_and_indices {
}
if (!$endtag) { if ($token->[4]=~m:/>$:) { $endtag=' /'; }; }
$outstring.='<'.$tag.$newparmstring.$endtag.'>';
+ if ($lctag eq 'm') {
+ $outstring.=&get_all_text_unbalanced('/m',\@parser);
+ }
} elsif ($token->[0] eq 'E') {
if ($token->[2]) {
unless ($token->[1] eq 'allow') {
@@ -437,6 +649,75 @@ sub fix_ids_and_indices {
return ($outstring,%allow);
}
+#########################################
+#########################################
+
+=pod
+
+=item store_metadata
+
+Store the metadata in the metadata table in the loncapa database.
+Uses lonmysql to access the database.
+
+Inputs: \%metadata
+
+Returns: (error,status). error is undef on success, status is undef on error.
+
+=cut
+
+#########################################
+#########################################
+sub store_metadata {
+ my %metadata = %{shift()};
+ my $error;
+ # Determine if the table exists
+ my $status = &Apache::lonmysql::check_table('metadata');
+ if (! defined($status)) {
+ $error='WARNING: Cannot connect to '.
+ 'database!';
+ &Apache::lonnet::logthis($error);
+ return ($error,undef);
+ }
+ if ($status == 0) {
+ # It would be nice to actually create the table....
+ $error ='WARNING: The metadata table does not '.
+ 'exist in the LON-CAPA database.';
+ &Apache::lonnet::logthis($error);
+ return ($error,undef);
+ }
+ # Remove old value from table
+ $status = &Apache::lonmysql::remove_from_table
+ ('metadata','url',$metadata{'url'});
+ if (! defined($status)) {
+ $error = 'Error when removing old values from '.
+ 'metadata table in LON-CAPA database.';
+ &Apache::lonnet::logthis($error);
+ return ($error,undef);
+ }
+ # Store data in table.
+ $status = &Apache::lonmysql::store_row('metadata',\%metadata);
+ if (! defined($status)) {
+ $error='Error occured storing new values in '.
+ 'metadata table in LON-CAPA database';
+ &Apache::lonnet::logthis($error);
+ return ($error,undef);
+ }
+ return (undef,$status);
+}
+
+#########################################
+#########################################
+
+=pod
+
+=item publish
+
+Currently undocumented. This is the workhorse function of this module.
+
+=cut
+
+#########################################
+#########################################
sub publish {
my ($source,$target,$style)=@_;
@@ -756,8 +1037,20 @@ END
'
Synchronized SQL metadata database'; - print $logfile "\nSynchronized SQL metadata database"; - } + my $warning; + $metadatafields{'url'} = $distarget; + $metadatafields{'version'} = 'current'; + unless ($metadatafields{'copyright'} eq 'priv') { + my ($error,$success) = &store_metadata(\%metadatafields); + if ($success) { + $scrout.='
Synchronized SQL metadata database'; + print $logfile "\nSynchronized SQL metadata database"; + } else { + $warning.=$error; + print $logfile "\n".$error; + } + } else { + $scrout.='
Private Publication - did not synchronize database'; + print $logfile "\nPrivate: Did not synchronize data into ". + "SQL metadata database"; } - -} else { - $scrout.='
Private Publication - did not synchronize database';
- print $logfile "\nPrivate: Did not synchronize data into ".
- "SQL metadata database";
-}
# ----------------------------------------------------------- Copy old versions
if (-e $target) {
@@ -1022,8 +1273,36 @@ if (-e $target) {
}
-# ================================================================ Main Handler
+#########################################
+#########################################
+
+=pod
+
+=item handler
+
+A basic outline of the handler subroutine follows.
+
+=over 4
+
+=item Get query string for limited number of parameters
+
+=item Check filename
+
+=item File is there and owned, init lookup tables
+
+=item Start page output
+
+=item Individual file
+
+=item publish from $thisfn to $thistarget with $thisembstyle
+
+=back
+
+=cut
+
+#########################################
+#########################################
sub handler {
my $r=shift;
@@ -1180,107 +1459,9 @@ unless ($ENV{'form.phase'} eq 'two') {
1;
__END__
-=head1 NAME
-
-Apache::lonpublisher - Publication Handler
-
-=head1 SYNOPSIS
-
-Invoked by /etc/httpd/conf/srm.conf:
-
-