--- loncom/lonnet/perl/lonnet.pm 2000/11/25 19:56:04 1.70 +++ loncom/lonnet/perl/lonnet.pm 2000/11/27 20:44:04 1.71 @@ -76,7 +76,8 @@ # 10/04 Gerd Kortemeyer # 10/04 Guy Albertelli # 10/06,10/09,10/10,10/11,10/14,10/20,10/23,10/25,10/26,10/27,10/28,10/29, -# 10/30,10/31,11/2,11/14,11/15,11/16,11/20,11/21,11/22,11/25 Gerd Kortemeyer +# 10/30,10/31, +# 11/2,11/14,11/15,11/16,11/20,11/21,11/22,11/25,11/27 Gerd Kortemeyer package Apache::lonnet; @@ -85,10 +86,11 @@ use Apache::File; use LWP::UserAgent(); use HTTP::Headers; use vars -qw(%perlvar %hostname %homecache %spareid %hostdom %libserv %pr %prp %fe %fd $readit); +qw(%perlvar %hostname %homecache %spareid %hostdom %libserv %pr %prp %fe %fd $readit %metacache); use IO::Socket; use GDBM_File; use Apache::Constants qw(:common :http); +use HTML::TokeParser; # --------------------------------------------------------------------- Logging @@ -1451,19 +1453,10 @@ sub EXT { } # --------------------------------------------- last, look in resource metadata - my $uri=&declutter($ENV{'request.filename'}); - my $filename=$perlvar{'lonDocRoot'}.'/res/'.$uri.'.meta'; - if (-e $filename) { - my @content; - { - my $fh=Apache::File->new($filename); - @content=<$fh>; - } - if (join('',@content)=~ - /\<$space[^\>]*\>([^\<]*)\<\/$space\>/) { - return $1; - } - } + + my $metadata=&metadata($ENV{'request.filename'},$spacequalifierrest); + if ($metadata) { return $metadata; } + # ---------------------------------------------------- Any other user namespace } elsif ($realm eq 'environment') { # ----------------------------------------------------------------- environment @@ -1477,6 +1470,41 @@ sub EXT { return ''; } +# ---------------------------------------------------------------- Get metadata + +sub metadata { + my ($uri,$what)=@_; + $uri=&declutter($uri); + unless ($uri=~/\.meta$/) { $uri.='.meta'; } + unless ($metacache{$uri.':keys'}) { + my $metastring=&getfile($perlvar{'lonDocRoot'}.'/res/'.$uri); + my $parser=HTML::TokeParser->new(\$metastring); + my $token; + while ($token=$parser->get_token) { + if ($token->[0] eq 'S') { + my $entry=$token->[1]; + my $unikey=$entry; + if ($token->[2]->{'part'}) { + $unikey.='_'.$token->[2]->{'part'}; + } + if ($token->[2]->{'name'}) { + $unikey.='_'.$token->[2]->{'name'}; + } + if ($metacache{$uri.':keys'}) { + $metacache{$uri.':keys'}.=','.$unikey; + } else { + $metacache{$uri.':keys'}=$unikey; + } + map { + $metacache{$uri.':'.$unikey.'.'.$_}=$token->[2]->{$_}; + } $token->[3]; + $metacache{$uri.':'.$unikey}=$parser->get_text('/'.$entry); + } + } + } + return $metacache{$uri.':'.$what}; +} + # ------------------------------------------------- Update symbolic store links sub symblist { @@ -1742,6 +1770,7 @@ if ($readit ne 'done') { } } +%metacache=(); $readit='done'; &logthis('INFO: Read configuration');