--- loncom/interface/lonindexer.pm 2001/08/14 14:13:03 1.18
+++ loncom/interface/lonindexer.pm 2002/08/20 13:01:53 1.51
@@ -1,7 +1,30 @@
# The LearningOnline Network with CAPA
-#
# Directory Indexer
#
+# $Id: lonindexer.pm,v 1.51 2002/08/20 13:01:53 www Exp $
+#
+# Copyright Michigan State University Board of Trustees
+#
+# This file is part of the LearningOnline Network with CAPA (LON-CAPA).
+#
+# LON-CAPA is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# LON-CAPA is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with LON-CAPA; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#
+# /home/httpd/html/adm/gpl.txt
+#
+# http://www.lon-capa.org/
+#
# YEAR=1999
# 5/21/99, 5/22,5/25,5/26,5/31,6/2,6/10,7/12,7/14 Gerd Kortemeyer)
# 11/23 Gerd Kortemeyer
@@ -15,15 +38,39 @@
# 6/26,7/8 H. K. Ng
# 8/6,8/7,8/10 Scott Harrison
# 8/14 H. K. Ng
+# 8/28,10/15,11/28,11/29 Scott Harrison
+# 11/30 Matthew Hall
+# 12/11,12/13 Scott Harrison
+# YEAR=2002
+# 1/17 Scott Harrison
+# 6/29/2002 H. K. Ng
+#
+###
+
+###############################################################################
+## ##
+## ORGANIZATION OF THIS PERL MODULE ##
+## ##
+## 1. Description of functions ##
+## 2. Modules used by this module ##
+## 3. Choices for different output views (detailed, summary, xml, etc) ##
+## 4. BEGIN block (to be run once after compilation) ##
+## 5. Handling routine called via Apache and mod_perl ##
+## 6. Other subroutines ##
+## ##
+###############################################################################
package Apache::lonindexer;
+# ------------------------------------------------- modules used by this module
use strict;
use Apache::lonnet();
+use Apache::loncommon();
use Apache::Constants qw(:common);
use Apache::File;
use GDBM_File;
+# ---------------------------------------- variables used throughout the module
my %hash; # tied to a user-specific gdbm file
my %dirs; # keys are directories, values are the open/close status
my %language; # has the reference information present in language.tab
@@ -34,26 +81,28 @@ my $extrafield; # default extra table ce
my $fnum; # file counter
my $dnum; # directory counter
-# ---------------------------------------------------------------------- BEGIN
-sub BEGIN {
- my $fh=Apache::File->new($Apache::lonnet::perlvar{'lonTabDir'}.
- '/language.tab');
- map {
- $_=~/(\w+)\s+([\w\s\-]+)/;
- $language{$1}=$2;
- } <$fh>;
-}
+# ----- Used to include or exclude files with certain extensions.
+my @Only = ();
+my @Omit = ();
-# ---------------------------------------------------------------- Main Handler
+
+# ----------------------------- Handling routine called via Apache and mod_perl
sub handler {
my $r = shift;
$r->content_type('text/html');
+ &Apache::loncommon::no_cache($r);
$r->send_http_header;
return OK if $r->header_only;
$fnum=0;
$dnum=0;
+ untie %hash;
+
+ # Deal with stupid global variables (is there a way around making
+ # these global to this package? It is just so wrong....)
+ undef (@Only);
+ undef (@Omit);
-# --------------------------------------------- machine configuration variables
+# ------------------------------------- read in machine configuration variables
my $iconpath= $r->dir_config('lonIconsURL') . "/";
my $domain = $r->dir_config('lonDefDomain');
my $role = $r->dir_config('lonRole');
@@ -69,8 +118,11 @@ sub handler {
my $uri=$r->uri;
# -------------------------------------- see if called from an interactive mode
- &get_unprocessed_cgi();
-
+ # Get the parameters from the query string
+ &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
+ ['catalogmode','launch','acts','mode','form','element',
+ 'only','omit']);
+ #-------------------------------------------------------------------
my $closebutton='';
my $groupimportbutton='';
my $colspan='';
@@ -79,22 +131,15 @@ sub handler {
my $diropendb =
"/home/httpd/perl/tmp/$domain\_$ENV{'user.name'}_indexer.db";
- if (tie(%hash,'GDBM_File',$diropendb,&GDBM_WRCREAT,0640)) {
+ if (tie(%hash,'GDBM_File',$diropendb,&GDBM_WRCREAT(),0640)) {
if ($ENV{'form.launch'} eq '1') {
&start_fresh_session();
- }
-
+ }
# -------------------- refresh environment with user database values (in %hash)
- if ($hash{'mode_catalog'} eq 'interactive') {
- $ENV{'form.catalogmode'}='interactive';
- }
- if ($hash{'mode_catalog'} eq 'groupimport') {
- $ENV{'form.catalogmode'}='groupimport';
- }
+ &setvalues(\%hash,'form.catalogmode',\%ENV,'form.catalogmode' );
# --------------------- define extra fields and buttons in case of special mode
if ($ENV{'form.catalogmode'} eq 'interactive') {
- $hash{'mode_catalog'}='interactive';
$extrafield='
'.
' | ';
@@ -104,7 +149,6 @@ sub handler {
END
}
elsif ($ENV{'form.catalogmode'} eq 'groupimport') {
- $hash{'mode_catalog'}='groupimport';
$extrafield=''.
' | ';
@@ -117,35 +161,136 @@ END
onClick="javascript:select_group()">
END
}
-
+ # Additions made by Matthew to make the browser a little easier to deal
+ # with in the future.
+ #
+ # $mode (at this time) indicates if we are in edit mode.
+ # $form is the name of the form that the URL is placed when the
+ # selection is made.
+ # $element is the name of the element in $formname which receives
+ # the URL.
+ # &Apache::lonxml::debug('Checking mode, form, element');
+ &setvalues(\%hash,'form.mode' ,\%ENV,'form.mode' );
+ &setvalues(\%hash,'form.form' ,\%ENV,'form.form' );
+ &setvalues(\%hash,'form.element',\%ENV,'form.element');
+ &setvalues(\%hash,'form.only' ,\%ENV,'form.only' );
+ &setvalues(\%hash,'form.omit' ,\%ENV,'form.omit' );
+
+ # Deal with 'omit' and 'only'
+ if (exists $ENV{'form.omit'}) {
+ @Omit = split(',',$ENV{'form.omit'});
+ }
+ if (exists $ENV{'form.only'}) {
+ @Only = split(',',$ENV{'form.only'});
+ }
+
+ my $mode = $ENV{'form.mode'};
+ my ($form,$element);
+ if ($mode eq 'edit' || $mode eq 'parmset') {
+ $form = $ENV{'form.form'};
+ $element = $ENV{'form.element'};
+ }
+ &Apache::lonxml::debug("mode=$mode form=$form element=$element");
# ------ set catalogmodefunctions to have extra needed javascript functionality
my $catalogmodefunctions='';
if ($ENV{'form.catalogmode'} eq 'interactive' or
$ENV{'form.catalogmode'} eq 'groupimport') {
- $catalogmodefunctions=<
The LearningOnline Network With CAPA Directory Browser
-
+ENDJS
+}
+
+sub writedebug {
+ my $text = shift;
+ return "";
+}
+
# -------------------- filters out files based on extensions (returns an array)
sub match_ext {
my ($r,@packlist)=@_;
@@ -437,29 +606,19 @@ sub match_ext {
my @fileext;
my $dirptr=16384;
- my $tabdir = $r->dir_config('lonTabDir');
- my $fn = $tabdir.'/filetypes.tab';
- if (-e $fn) {
- my $FH=Apache::File->new($fn);
- my @content=<$FH>;
- foreach my $line (@content) {
- (my $ext,my $foo) = split /\s+/,$line;
- push @fileext,$ext;
- }
- }
foreach my $line (@packlist) {
chomp $line;
$line =~ s/^\/home\/httpd\/html//;
my @unpackline = split (/\&/,$line);
- next if ($unpackline[0] eq ".");
- next if ($unpackline[0] eq "..");
+ next if ($unpackline[0] eq '.');
+ next if ($unpackline[0] eq '..');
my @filecom = split (/\./,$unpackline[0]);
my $fext = pop(@filecom);
my $fnptr = $unpackline[3]&$dirptr;
if ($fnptr == 0 and $unpackline[3] ne "") {
- foreach my $nextline (@fileext) {
- push @trimlist,$line if $nextline eq $fext;
- }
+ my $embstyle = &Apache::loncommon::fileembstyle($fext);
+ push @trimlist,$line if (defined($embstyle) &&
+ ($embstyle ne 'hdn' or $fext eq 'meta'));
} else {
push @trimlist,$line;
}
@@ -469,33 +628,33 @@ sub match_ext {
}
# ------------------------------- displays one line in appropriate table format
-sub display_line{
+sub display_line {
my ($r,$diropen,$line,$indent,$startdir,$hashref,@list)=@_;
my (@pathfn, $fndir, $fnptr);
my $dirptr=16384;
my $fileclr="#ffffe6";
- my $iconpath= $r->dir_config('lonIconsURL') . "/";
+ my $iconpath= $r->dir_config('lonIconsURL') . '/';
my @filecom = split (/\&/,$line);
my @pathcom = split (/\//,$filecom[0]);
my $listname = $pathcom[scalar(@pathcom)-1];
my $fnptr = $filecom[3]&$dirptr;
my $msg = 'View '.$filecom[0].' resources';
- $msg = 'Close '.$filecom[0].' directory' if $diropen eq "opened";
+ $msg = 'Close '.$filecom[0].' directory' if $diropen eq 'opened';
- my $tabtag="";
+ my $tabtag='';
my $i=0;
- while ($i<=5) {
- $tabtag=join('',$tabtag," | ")
+ while ($i<=6) {
+ $tabtag=join('',$tabtag," | ")
if $hash{'display_attrs_'.$i} == 1;
$i++;
}
# display uplink arrow
- if ($filecom[1] eq "viewOneUp") {
- $r->print("$extrafield");
- $r->print("\n");
+ if ($filecom[1] eq 'viewOneUp') {
+ $r->print(" |
$extrafield");
+ $r->print("\n");
$r->print ('\n");
+ $r->print("Domain - $listname (".
+ $Apache::lonnet::domaindescription{$listname}.") $tabtag |
\n");
return OK;
# display user directory
}
- if ($filecom[1] eq "user") {
- $r->print("$extrafield");
- $r->print("\n");
+ if ($filecom[1] eq 'user') {
+ $r->print(" |
$extrafield");
+ $r->print("\n");
my $curdir = $startdir.$filecom[0].'/';
my $anchor = $curdir;
$anchor =~ s/\///g;
@@ -557,11 +717,27 @@ sub display_line{
}
# display file
- if ($fnptr == 0 and $filecom[3] ne "") {
- my @file_ext = split (/\./,$listname);
- my $curfext = $file_ext[scalar(@file_ext)-1];
+ if ($fnptr == 0 and $filecom[3] ne '') {
my $filelink = $startdir.$filecom[0];
- $r->print(" |
");
+ return OK if (!&Apache::lonnet::allowed('bre',$filelink));
+ my @file_ext = split (/\./,$listname);
+ my $curfext = $file_ext[-1];
+ if (@Omit) {
+ foreach (@Omit) { return OK if ($curfext eq $_); }
+ }
+ if (@Only) {
+ my $skip = 1;
+ foreach (@Only) { $skip = 0 if ($curfext eq $_); }
+ return OK if ($skip > 0);
+ }
+ # Set the icon for the file
+ my $iconname = "unknown.gif";
+ my $embstyle = &Apache::loncommon::fileembstyle($curfext);
+ # The unless conditional that follows is a bit of overkill
+ $iconname = $curfext.".gif" unless
+ (!defined($embstyle) || $embstyle eq 'unk' || $embstyle eq 'hdn');
+ #
+ $r->print(" |
");
my $metafile = grep /^$filecom[0]\.meta\&/, @list;
my $title;
if ($ENV{'form.catalogmode'} eq 'interactive') {
@@ -569,17 +745,20 @@ sub display_line{
$title = &Apache::lonnet::metadata($filelink,'title')
if ($metafile == 1);
$title=$listname unless $title;
- $r->print("");
+ my $titleesc=HTML::Entities::encode($title);
+ $titleesc=~s/\'/\\'/; #' (clean up this spare quote)
+ $r->print("");
$r->print(" ".
"\n");
- $r->print(" | ");
+ $r->print(" | ");
}
elsif ($ENV{'form.catalogmode'} eq 'groupimport') {
$title=$listname;
$title = &Apache::lonnet::metadata($filelink,'title')
if ($metafile == 1);
$title=$listname unless $title;
+ my $titleesc=&HTML::Entities::encode($title);
$r->print("\n");
- $r->print(" | ");
+ $r->print(" | ");
$hash{"pre_${fnum}_link"}=$filelink;
- $hash{"pre_${fnum}_title"}=$title;
+ $hash{"pre_${fnum}_title"}=$titleesc;
$fnum++;
}
@@ -613,7 +792,7 @@ sub display_line{
".gif border='0' />\n") if $rem > 0;
}
- $r->print(" \n");
+ $r->print(" \n");
$r->print (" $listname ");
@@ -623,36 +802,40 @@ sub display_line{
"TARGET=_self>metadata) ") if ($metafile == 1);
$r->print(" | \n");
- $r->print(" ",
+ if ($hash{'display_attrs_0'} == 1) {
+ my $title = &Apache::lonnet::metadata($filelink,'title')
+ if ($metafile == 1);
+ $r->print(' | '.($title eq '' ? ' ' : $title).
+ ' | '."\n");
+ }
+ $r->print(' ',
$filecom[8]," | \n")
- if $hash{'display_attrs_0'} == 1;
- $r->print(" ".
- (localtime($filecom[9]))." | \n")
if $hash{'display_attrs_1'} == 1;
- $r->print(" ".
- (localtime($filecom[10]))." | \n")
+ $r->print(' '.
+ (localtime($filecom[9]))." | \n")
if $hash{'display_attrs_2'} == 1;
+ $r->print(' '.
+ (localtime($filecom[10]))." | \n")
+ if $hash{'display_attrs_3'} == 1;
- if ($hash{'display_attrs_3'} == 1) {
+ if ($hash{'display_attrs_4'} == 1) {
my $author = &Apache::lonnet::metadata($filelink,'author')
if ($metafile == 1);
- $author = ' ' if (!$author);
- $r->print(" ".$author.
+ $r->print(' | '.($author eq '' ? ' ' : $author).
" | \n");
}
- if ($hash{'display_attrs_4'} == 1) {
+ if ($hash{'display_attrs_5'} == 1) {
my $keywords = &Apache::lonnet::metadata($filelink,'keywords')
if ($metafile == 1);
- $keywords = ' ' if (!$keywords);
- $r->print(" ".$keywords.
+ # $keywords = ' ' if (!$keywords);
+ $r->print(' | '.($keywords eq '' ? ' ' : $keywords).
" | \n");
}
- if ($hash{'display_attrs_5'} == 1) {
+ if ($hash{'display_attrs_6'} == 1) {
my $lang = &Apache::lonnet::metadata($filelink,'language')
if ($metafile == 1);
- $lang = $language{$lang};
- $lang = ' ' if (!$lang);
- $r->print(" ".$lang.
+ $lang = &Apache::loncommon::languagedescription($lang);
+ $r->print(' | '.($lang eq '' ? ' ' : $lang).
" | \n");
}
$r->print("
\n");
@@ -665,7 +848,7 @@ sub display_line{
my $curdir = $startdir.$filecom[0].'/';
my $anchor = $curdir;
$anchor =~ s/\///g;
- $r->print("$extrafield");
+ $r->print(" |
$extrafield");
&begin_form ($r,$curdir);
my $indentm1 = $indent-1;
if ($indentm1 < 11 and $indentm1 > 0) {
@@ -712,30 +895,171 @@ sub begin_form {
$dnum++;
}
-# ----------- grab unprocessed CGI variables that may have been appended to URL
-sub get_unprocessed_cgi {
- map {
- my ($name, $value) = split(/=/,$_);
- $value =~ tr/+/ /;
- $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
- if ($name eq 'catalogmode' or $name eq 'launch' or $name eq 'acts') {
- $ENV{'form.'.$name}=$value;
- }
- } (split(/&/,$ENV{'QUERY_STRING'}));
-}
-
# --------- settings whenever the user causes the indexer window to be launched
sub start_fresh_session {
- delete $hash{'mode_catalog'};
- map {
- if ($_ =~ /^pre_/) {
- delete $hash{$_};
- }
- if ($_ =~ /^store/) {
- delete $hash{$_};
- }
- } keys %hash;
+ delete $hash{'form.catalogmode'};
+ delete $hash{'form.mode'};
+ delete $hash{'form.form'};
+ delete $hash{'form.element'};
+ delete $hash{'form.omit'};
+ delete $hash{'form.only'};
+ foreach (keys %hash) {
+ delete $hash{$_} if (/^(pre_|store)/);
+ }
+}
+
+# ------------------------------------------------------------------- setvalues
+sub setvalues {
+ # setvalues is used in registerurl to synchronize the database
+ # hash and environment hashes
+ my ($H1,$h1key,$H2,$h2key) =@_;
+ #
+ if (exists $H2->{$h2key}) {
+ $H1->{$h1key} = $H2->{$h2key};
+ } elsif (exists $H1->{$h1key}) {
+ $H2->{$h2key} = $H1->{$h1key};
+ }
}
1;
-__END__
+
+=head1 NAME
+
+Apache::lonindexer - mod_perl module for cross server filesystem browsing
+
+=head1 SYNOPSIS
+
+Invoked by /etc/httpd/conf/srm.conf:
+
+
+ SetHandler perl-script
+ PerlHandler Apache::lonindexer
+
+
+=head1 INTRODUCTION
+
+This module enables a scheme of browsing across a cross server.
+
+This is part of the LearningOnline Network with CAPA project
+described at http://www.lon-capa.org.
+
+=head1 BEGIN SUBROUTINE
+
+This routine is only run once after compilation.
+
+=over 4
+
+=item *
+
+Initializes %language hash table.
+
+=back
+
+=head1 HANDLER SUBROUTINE
+
+This routine is called by Apache and mod_perl.
+
+=over 4
+
+=item *
+
+read in machine configuration variables
+
+=item *
+
+see if called from an interactive mode
+
+=item *
+
+refresh environment with user database values (in %hash)
+
+=item *
+
+define extra fields and buttons in case of special mode
+
+=item *
+
+set catalogmodefunctions to have extra needed javascript functionality
+
+=item *
+
+print header
+
+=item *
+
+evaluate actions from previous page (both cumulatively and chronologically)
+
+=item *
+
+output title
+
+=item *
+
+get state of file attributes to be showing
+
+=item *
+
+output state of file attributes to be showing
+
+=item *
+
+output starting row to the indexed file/directory hierarchy
+
+=item *
+
+read in what directories have previously been set to "open"
+
+=item *
+
+if not at top level, provide an uplink arrow
+
+=item *
+
+recursively go through all the directories and output as appropriate
+
+=item *
+
+information useful for group import
+
+=item *
+
+end the tables
+
+=item *
+
+end the output and return
+
+=back
+
+=head1 OTHER SUBROUTINES
+
+=over 4
+
+=item *
+
+scanDir - recursive scan of a directory
+
+=item *
+
+get_list - get complete matched list based on the uri (returns an array)
+
+=item *
+
+match_ext - filters out files based on extensions (returns an array)
+
+=item *
+
+display_line - displays one line in appropriate table format
+
+=item *
+
+begin_form - prints the beginning of a form for directory or file link
+
+=item *
+
+start_fresh_session - settings whenever the user causes the indexer window
+to be launched
+
+=back
+
+=cut
|