]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/interface/http_getter/http_getter.pl
Another patch to the http_getter.ml.
[helm.git] / helm / interface / http_getter / http_getter.pl
index 4ad35848075ef78c44c230b1c5c4e8ceb6f227b1..1d99e65ce03bf5b552adf1c8e1a5451b07f03172 100755 (executable)
@@ -1,9 +1,15 @@
 #!/usr/bin/perl
 
+# First of all, let's load HELM configuration
+use Env;
+my $HELM_CONFIGURATION_PREFIX = $ENV{"HELM_CONFIGURATION_PREFIX"};
+my $HELM_CONFIGURATION_PATH =
+ $HELM_CONFIGURATION_PREFIX."/local/lib/helm/configuration.pl";
 # next require defines: $helm_dir, $html_link
-# LUCA - 12 sep 2000
-# require "/usr/lib/helm/configuration.pl";
-require "/home/cadet/sacerdot/local/lib/helm/configuration.pl";
+require $HELM_CONFIGURATION_PATH;
+
+
+
 use HTTP::Daemon;
 use HTTP::Status;
 use HTTP::Request;
@@ -12,9 +18,10 @@ use DB_File;
 
 my $cont = "";
 my $d = new HTTP::Daemon LocalPort => 8081;
-tie(%map, 'DB_File', 'urls_of_uris.db', O_RDONLY, 0664);
+tie(%map, 'DB_File', $uris_dbm.".db", O_RDONLY, 0664);
 print "Please contact me at: <URL:", $d->url, ">\n";
 print "helm_dir: $helm_dir\n";
+print "urls_of_uris.db: $uris_dbm.db\n";
 $SIG{CHLD} = "IGNORE"; # do not accumulate defunct processes
 while (my $c = $d->accept) {
  if (fork() == 0) {
@@ -49,7 +56,8 @@ while (my $c = $d->accept) {
                $response = $ua->request($request, \&callback);
                
                print "Storing file\n";
-               open(FD, $filename);
+               mkdirs($filename);
+               open(FD, ">".$filename);
                print FD $cont;
                close(FD);
 
@@ -89,7 +97,8 @@ while (my $c = $d->accept) {
                $response = $ua->request($request, \&callback);
                
                print "Storing file for the annotation\n";
-               open(FD, $filename);
+               mkdirs($filename);
+               open(FD, ">".$filename);
                print FD $cont;
                close(FD);
             }
@@ -111,7 +120,8 @@ while (my $c = $d->accept) {
                   $response = $ua->request($request, \&callback);
                
                   print "Storing file for the file to annotate\n";
-                  open(FD, $filename_target);
+                  mkdirs($filename_target);
+                  open(FD, ">".$filename_target);
                   print FD $cont;
                   close(FD);
                }
@@ -138,19 +148,38 @@ EOT
             $res->content($merged);
             $c->send_response($res);
         } elsif ($http_method eq 'GET' and $http_path eq "/getwithtypes") {
-            my $do_annotate = ($cicuri =~ /\.types$/);
+            my $mode;
+            my $do_annotate;
+            if ($cicuri =~ /\.types$/) {
+               $do_annotate = 1;
+               $mode = "types";
+            } elsif ($cicuri =~ /\.ann$/) {
+               $do_annotate = 1;
+               $mode = "ann";
+            } else {
+               $do_annotate = 0;
+            }
             my $target_to_annotate = $cicuri;
-            $target_to_annotate =~ s/(.*)\.types$/$1/ if $do_annotate;
+            if ($mode eq "types") {
+               $target_to_annotate =~ s/(.*)\.types$/$1/;
+            } elsif ($mode eq "ann") {
+               $target_to_annotate =~ s/(.*)\.ann$/$1/;
+            }
             my $filename = $cicuri;
             $filename =~ s/cic:(.*)/$1/;
             $filename =~ s/theory:(.*)/$1/;
             my $filename_target = $helm_dir.$filename if $do_annotate;
             $filename = $helm_dir.$filename.".xml";
-            $filename_target =~ s/(.*)\.types$/$1.xml/ if $do_annotate;
+            if ($mode eq "types") {
+               $filename_target =~ s/(.*)\.types$/$1.xml/;
+            } elsif ($mode eq "ann") {
+               $filename_target =~ s/(.*)\.ann$/$1.xml/;
+            }
             my $resolved = $map{$cicuri};
             my $resolved_target = $map{$target_to_annotate} if $do_annotate;
             if ($do_annotate) {
-               print "GETWITHTYPES!!\n";
+               print "GETWITHTYPES!!\n" if ($mode eq "types");
+               print "GETWITHANN!!\n" if ($mode eq "ann");
                print "($cicuri, $target_to_annotate) ==> ($resolved + $resolved_target) ($filename)\n";
              } else {
                print "$cicuri ==> $resolved ($filename)\n";
@@ -159,18 +188,22 @@ EOT
             # Retrieves the annotation
 
             if (stat($filename)) {
-               print "Using local copy for the types\n";
+               print "Using local copy for the types\n" if ($mode eq "types");
+               print "Using local copy for the ann\n" if ($mode eq "ann");
                open(FD, $filename);
                while(<FD>) { $cont .= $_; }
                close(FD);
             } else {
-               print "Downloading the types\n";
+               print "Downloading the types\n" if ($mode eq "types");
+               print "Downloading the ann\n" if ($mode eq "ann");
                $ua = LWP::UserAgent->new;
                $request = HTTP::Request->new(GET => "$resolved");
                $response = $ua->request($request, \&callback);
                
-               print "Storing file for the types\n";
-               open(FD, $filename);
+               print "Storing file for the types\n" if ($mode eq "types");
+               print "Storing file for the ann\n" if ($mode eq "ann");
+               mkdirs($filename);
+               open(FD, ">".$filename);
                print FD $cont;
                close(FD);
             }
@@ -193,7 +226,8 @@ EOT
                   $response = $ua->request($request, \&callback);
                
                   print "Storing file for the file to type\n";
-                  open(FD, $filename_target);
+                  mkdirs($filename_target);
+                  open(FD, ">".$filename_target);
                   print FD $cont;
                   close(FD);
                }
@@ -209,13 +243,21 @@ EOT
             $target =~ s/<!DOCTYPE [^>]*>//sg;
             $annotation =~ s/<\?xml [^?]*\?>//sg;
             $annotation =~ s/<!DOCTYPE [^>]*>//sg;
+            my $element, $endelement; 
+            if ($mode eq "types") {
+               $element = "<ALLTYPES>";
+               $endelement = "</ALLTYPES>";
+            } elsif ($mode eq "ann") {
+               $element = "";
+               $endelement = "";
+            }
             my $merged = <<EOT;
 <?xml version="1.0" encoding="UTF-8"?>
 <cicxml uri="$target_to_annotate">
 $target
-<ALLTYPES>
+$element
 $annotation
-</ALLTYPES>
+$endelement
 </cicxml>
 EOT
 
@@ -270,3 +312,18 @@ sub callback
  my ($data) = @_;
  $cont .= $data;
 }
+
+# Does not raise errors if could not create dirs/files
+
+# Too much powerful: creates even /home, /home/users/, ...
+sub mkdirs
+{
+ my ($pathname) = @_;
+ my @dirs = split /\//,$pathname;
+ my $tmp;
+ foreach $dir (@dirs) {
+  $tmp = ((defined($tmp)) ?  $tmp = $tmp."\/".$dir : "");
+  mkdir($tmp,0777);
+ }
+ rmdir($tmp);
+}