Annotation of loncom/imspackages/imsprocessor.pm, revision 1.1

1.1     ! raeburn     1: package Apache::imsprocessor;
        !             2: 
        !             3: use Apache::lonnet;
        !             4: use LONCAPA::Configuration;
        !             5:  
        !             6: sub create_tempdir {
        !             7:     my ($caller,$pathinfo) = @_;   
        !             8:     my $configvars = &LONCAPA::Configuration::read_conf('loncapa.conf');
        !             9:     my $tempdir;
        !            10:     if ($caller eq 'DOCS') {
        !            11:         $tempdir =  $$configvars{'lonDaemons'}.'/tmp/'.$pathinfo;
        !            12:         if (!-e "$tempdir") {
        !            13:             mkdir("$tempdir",0755);
        !            14:         }
        !            15:     } elsif ($caller eq "CSTR") {
        !            16:         if (!-e "$pathinfo/temp") {
        !            17:             mkdir("$pathinfo/temp",0755);
        !            18:         }
        !            19:         $tempdir =  $pathinfo.'/temp';
        !            20:     }
        !            21:     return $tempdir;
        !            22: }
        !            23: 
        !            24: 
        !            25: sub expand_zip {
        !            26:     my ($tempdir,$filename) = @_;
        !            27:     my $zipfile = "$tempdir/$filename";
        !            28:     if ($filename =~ m|\.zip$|i) {
        !            29:         open(OUTPUT, "unzip -o $zipfile -d $tempdir  2> /dev/null |");
        !            30:         while (<OUTPUT>) {
        !            31:             print "$_<br />";
        !            32:         }
        !            33:         close(OUTPUT);
        !            34:     } else {
        !            35:         return 'nozip';
        !            36:     }
        !            37:     if ($filename =~ m|\.zip$|i) {
        !            38:         unlink($zipfile);
        !            39:     }
        !            40:     return 'ok';
        !            41: }
        !            42: 
        !            43: sub process_manifest {
        !            44:     my ($cms,$tempdir,$resources,$items,$hrefs) = @_;
        !            45:     my %toc = (
        !            46:               bb5 => 'tableofcontents',
        !            47:               angel => 'organization',
        !            48:               );
        !            49: 
        !            50:     my @state = ();
        !            51:     my $itm = '';
        !            52:     my $identifier = '';
        !            53:     my @seq = "Top";
        !            54:     my $lastitem;
        !            55:     $$items{'Top'}{'contentscount'} = 0;
        !            56: 
        !            57:     unless (-e "$tempdir/imsmanifest.xml") {
        !            58:         return 'nomanifest';
        !            59:     } 
        !            60: 
        !            61:     my $xmlfile = $tempdir.'/imsmanifest.xml';
        !            62:     my $p = HTML::Parser->new
        !            63:     (
        !            64:        xml_mode => 1,
        !            65:        start_h =>
        !            66:            [sub {
        !            67:                 my ($tagname, $attr) = @_;
        !            68:                 push @state, $tagname;
        !            69:                 my $num = @state - 3;
        !            70:                 my $start = $num;
        !            71:                 my $statestr = '';
        !            72:                 foreach (@state) {
        !            73:                     $statestr .= "$_ ";
        !            74:                 }
        !            75:                 if ( ($state[0] eq "manifest") && ($state[1] eq "organizations") && ($state[2] eq $toc{$cms}) ) {
        !            76:                     my $searchstr = "manifest organizations $toc{$cms}";
        !            77:                     while ($num > 0) {
        !            78:                         $searchstr .= " item";
        !            79:                         $num --; 
        !            80:                     }
        !            81:                     if (("@state" eq $searchstr) && (@state > 3)) {
        !            82:                         $itm = $attr->{identifier};              
        !            83:                         %{$$items{$itm}} = ();
        !            84:                         $$items{$itm}{contentscount} = 0;
        !            85:                         if ($cms eq 'bb5') {
        !            86:                             $$items{$itm}{resnum} = $attr->{identifierref};
        !            87:                             $$items{$itm}{title} = $attr->{title};
        !            88:                         } elsif ($cms eq 'angel') {
        !            89:                             if ($attr->{identifierref} =~ m/^res(.+)$/) {
        !            90:                                 $$items{$itm}{resnum} = $1;
        !            91:                             }
        !            92:                         }
        !            93:                         unless (defined(%{$resources{$$items{$itm}{resnum}}}) ) {
        !            94:                             %{$resources{$$items{$itm}{resnum}}} = ();
        !            95:                         }
        !            96:                         $$resources{$$items{$itm}{resnum}}{revitm} = $itm;
        !            97: 
        !            98:                         if ($start > @seq) {
        !            99:                             unless ($lastitem eq '') {
        !           100:                                 push @seq, $lastitem;
        !           101:                                 unless ( defined($contents{$seq[-1]}) ) {
        !           102:                                     @{$contents{$seq[-1]}} = ();
        !           103:                                 }
        !           104:                                 push @{$contents{$seq[-1]}},$itm;
        !           105:                                 $$items{$itm}{parentseq} = $seq[-1];
        !           106:                             }
        !           107:                         }
        !           108:                         elsif ($start < @seq) {
        !           109:                             my $diff = @seq - $start;
        !           110:                             while ($diff > 0) {
        !           111:                                 pop @seq;
        !           112:                                 $diff --;
        !           113:                             }
        !           114:                             if (@seq) {
        !           115:                                 push @{$contents{$seq[-1]}}, $itm;
        !           116:                             }
        !           117:                         } else {
        !           118:                             push @{$contents{$seq[-1]}}, $itm;
        !           119:                         }
        !           120:                         my $path;
        !           121:                         if (@seq > 1) {
        !           122:                             $path = join(',',@seq);
        !           123:                         } elsif (@seq > 0) {
        !           124:                             $path = $seq[0];
        !           125:                         }
        !           126:                         $$items{$itm}{filepath} = $path;
        !           127:                         $$items{$seq[-1]}{contentscount} ++;
        !           128:                         $lastitem = $itm;
        !           129:                     }
        !           130:                 } elsif ("@state" eq "manifest resources resource" ) {
        !           131:                     $identifier = $attr->{identifier};
        !           132:                     if ($cms eq 'bb5') {                 
        !           133:                         $$resources{$identifier}{file} = $attr->{file};
        !           134:                         $$resources{$identifier}{type} = $attr->{type};
        !           135:                     } elsif ($cms eq 'angel') {
        !           136:                         $identifier = substr($identifier,3);
        !           137:                         if ($attr->{href} =~ m-^_assoc/$identifier/(.+)$-) {
        !           138:                             $$resources{$identifier}{file} = $1;
        !           139:                         }                    
        !           140:                     }
        !           141:                     @{$$hrefs{$identifier}} = ();
        !           142:                 } elsif ("@state" eq "manifest resources resource file") {
        !           143:                     if ($cms eq 'bb5') {
        !           144:                         push @{$$hrefs{$identifier}},$attr->{href};
        !           145:                     } elsif ($cms eq 'angel') {
        !           146:                         if ($attr->{href} =~ m/^_assoc\\$identifier\\(.+)$/) {
        !           147:                             push @{$$hrefs{$identifier}},$1;
        !           148:                         } elsif ($attr->{href} =~ m/^Icons\\icon(\w+)\.gif/) {
        !           149:                             $$resources{$identifier}{type} = $1;
        !           150:                         } 
        !           151:                     }
        !           152:                 }
        !           153:            }, "tagname, attr"],
        !           154:         text_h =>
        !           155:             [sub {
        !           156:                 my ($text) = @_;
        !           157:               }, "dtext"],
        !           158:         end_h =>
        !           159:               [sub {
        !           160:                   my ($tagname) = @_;
        !           161:                   pop @state;
        !           162:                }, "tagname"],
        !           163:     );
        !           164:     $p->parse_file($xmlfile);
        !           165:     $p->eof;
        !           166: 
        !           167:     foreach my $itm (keys %contents) {
        !           168:         @{$$items{$itm}{contents}} = @{$contents{$itm}};
        !           169:     }
        !           170:     return 'ok' ;
        !           171: }
        !           172: 
        !           173: sub target_resources {
        !           174:     my ($resources,$oktypes,$targets) = @_; 
        !           175:     foreach my $key (keys %{$resources}) {
        !           176:         if ( defined($$oktypes{$$resources{$key}{type}}) ) {
        !           177:             push @{$targets}, $key;
        !           178:         }
        !           179:     }
        !           180:     return;
        !           181: }
        !           182: 
        !           183: 
        !           184: sub copy_resources {
        !           185:     my ($context,$cms,$hrefs,$tempdir,$targets,$url,$crs,$cdom,$chome,$destdir) = @_;
        !           186:     if ($context eq 'DOCS') {
        !           187:         my $path= $cdom.'/'.$crs.'/';
        !           188:         my $filepath= $Apache::lonnet::perlvar{'lonDocRoot'};
        !           189:         my @parts=split(/\//,$filepath.'/userfiles/'.$path);
        !           190:         for (my $count=4; $count<@parts; $count++) {
        !           191:             $filepath.="/$parts[$count]";
        !           192:             if ((-e $filepath)!=1) {
        !           193: 	        mkdir($filepath,0777);
        !           194:             }
        !           195:         }
        !           196:         foreach my $key (sort keys %{$hrefs}) {
        !           197:             if (grep/^$key$/,@{$targets}) {
        !           198:                 %{$url{$key}} = ();
        !           199:                 foreach my $file (@{$$hrefs{$key}}) {
        !           200:                     if ($cms eq 'bb5') {
        !           201:                         my $filename = $file;
        !           202:                         $filename =~ s/\//_/g;
        !           203:                         $filename = 'ims_'.$key.'_'.$filename;
        !           204:                         my $destination = $filepath.'/'.$filename;
        !           205:                         if (-e "$destination") {
        !           206:                             print STDERR "Can not copy file to $destination, as $filename already exists\n";
        !           207:                         } else {
        !           208:                             system("cp $tempdir/$key/$file $filepath/$filename");
        !           209:                             my $fetchresult= &Apache::lonnet::reply('fetchuserfile:'.$cdom.'/'.$crs.'/'.$filename,$chome);
        !           210: 
        !           211:                             if ($fetchresult eq 'ok') {
        !           212:                                 $$url{$key}{$filename} = '/uploaded/'.$path.$fname;
        !           213:                             } else {
        !           214:                                 &Apache::lonnet::logthis('Failed to transfer '.$cdom.'/'.$crs.'/'.$filename.' to host '.$chome.': '.$fetchresult);
        !           215:                                 $$url{$key}{$filename} = '/adm/notfound.html';
        !           216:                             }    
        !           217:                         }
        !           218:                     } elsif ($cms eq 'angel') {
        !           219:                         $file =~ s-\\-/-g;
        !           220:                         my $filename = $file;
        !           221:                         $filename =~ s/\//_/g;
        !           222:                         unless ($file eq 'pg'.$key.'.htm') {
        !           223:                             $filename = 'ims_'.$key.'_'.$filename;
        !           224:                             my $destination = $filepath.'/'.$filename;
        !           225:                             if (-e "$destination") {
        !           226:                                 print STDERR "Can not copy file to $destination, as $filename already exists\n";
        !           227:                             } else {
        !           228:                                 system("cp $tempdir/_assoc/$key/$file $filepath/$filename");
        !           229:                                 my $fetchresult= &Apache::lonnet::reply('fetchuserfile:'.$cdom.'/'.$crs.'/'.$file,$chome);
        !           230:                                 if ($fetchresult eq 'ok') {
        !           231:                                     $$url{$key}{$filename} = '/uploaded/'.$path.$fname;
        !           232:                                 } else {
        !           233:                                     &Apache::lonnet::logthis('Failed to transfer '.$cdom.'/'.$crs.'/'.$filename.' to host '.$chome.': '.$fetchresult);
        !           234:                                     $$url{$key}{$filename} = '/adm/notfound.html';
        !           235:                                 }
        !           236:                             }
        !           237:                         }
        !           238:                     }
        !           239:                 }
        !           240:             }
        !           241:         }
        !           242:     } elsif ($context eq 'CSTR') {
        !           243:         if (!-e "$destdir/resfiles") {
        !           244:             mkdir("$destdir/resfiles",0755);
        !           245:         }
        !           246:         if ($cms eq 'angel') { 
        !           247:             foreach my $key (sort keys %href) {
        !           248:                 foreach my $file (@{$href{$key}}) {
        !           249:                     $file =~ s-\\-/-g;
        !           250:                     unless ($file eq 'pg'.$key.'.htm') {
        !           251:                         if (!-e "$destdir/resfiles/$key") {
        !           252:                             mkdir("$destdir/resfiles/$key",0755);
        !           253:                         }
        !           254:                     }
        !           255:                     my $filepath = $file;
        !           256:                     while ($filepath =~ m-(\w+)/(.+)-) {
        !           257:                         $filepath = $2;
        !           258:                         if (!-e "$destdir/resfiles/$key/$1") {
        !           259:                             mkdir("$destdir/resfiles/$key/$1",0755);
        !           260:                         }
        !           261:                     }
        !           262:                     unless ($file eq 'pg'.$key.'.htm') {
        !           263:                         system("cp $tempdir/_assoc/$key/$file $destdir/resfiles/$key/$file");
        !           264:                     }
        !           265:                 }
        !           266:             }
        !           267:         } elsif ($cms eq 'bb5') {
        !           268:             foreach my $key (sort keys %href) {
        !           269:                 foreach my $file (@{$href{$key}}) {
        !           270:                     my $filepath = $file;
        !           271:                     if (!-e "$destdir/resfiles/$key") {
        !           272:                         mkdir("$destdir/resfiles/$key",0755);
        !           273:                     }
        !           274:                     while ($filepath =~ m-(\w+)/(.+)-) {
        !           275:                         $filepath = $2;
        !           276:                         if (!-e "$destdir/resfiles/$key/$1") {
        !           277:                             mkdir("$destdir/resfiles/$key/$1",0755);
        !           278:                         }
        !           279:                     }
        !           280:                     system("cp $tempdir/$key/$file $destdir/resfiles/$key/$file");
        !           281:                 }
        !           282:             }
        !           283:         }
        !           284:     }
        !           285: }
        !           286: 
        !           287: 1;
        !           288: __END__
        !           289:    
        !           290: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>