OAI package handle correctly unicode content
authorPhilippe Jaillon <jaillon@chataigne.emse.fr>
Mon, 30 Jun 2008 14:07:36 +0000 (16:07 +0200)
committerJoshua Ferraro <jmf@liblime.com>
Wed, 2 Jul 2008 17:25:32 +0000 (12:25 -0500)
Signed-off-by: Joshua Ferraro <jmf@liblime.com>
C4/OAI/DC.pm [changed mode: 0644->0755]
C4/OAI/DP.pm [changed mode: 0644->0755]
opac/oai.pl

old mode 100644 (file)
new mode 100755 (executable)
index 4c9eca5..e19dd5e
@@ -103,7 +103,6 @@ and the I<cursor> keys set.
 
 package C4::OAI::DC;
 
-use Encode;
 use C4::OAI::DP;
 use vars ('@ISA');
 @ISA = ("C4::OAI::DP");
@@ -161,7 +160,7 @@ sub Archive_FormatRecord
    my $footer = "</oaidc:dc>\n";
    my $metadata = '';
 
-   $metadata = $header . encode("utf8", decode( "iso-8859-1",$self->{'utility'}->FormatXML($dc))) . $footer if( $dc );
+   $metadata = $header . $self->{'utility'}->FormatXML($dc) . $footer if( $dc );
 
    $self->FormatRecord ($hashref->Identifier()->[0] ,
                         $hashref->DateStamp(),
old mode 100644 (file)
new mode 100755 (executable)
index d67a854..361c1fd
 #  -----------------------------------------+-------------+-------------
 #   Virginia Polytechnic Institute and State University   |  www.vt.edu  
 #  -------------------------------------------------------+-------------
+#    January 2008
+#  ------------------+--------------------------------------------------
+#   Ph. Jaillon      | 
+#  ------------------+----------------------+---------------------------
+#   Department of Computer Science          |      
+#  -----------------------------------------+-------------+-------------
+#   Ecole Nationale Superieure des Mines de St-Etienne    |  www.emse.fr 
+#  -------------------------------------------------------+-------------
+
 
 $VERSION = '1.0.0';
 
@@ -41,6 +50,8 @@ use POSIX;
 use CGI;
 use C4::OAI::Utility;
 
+# setting binmode to utf8 (any characters printed on STDOUT are utf8 encoded)
+binmode(STDOUT, ":utf8");
 
 # constructor
 sub new
@@ -498,16 +509,27 @@ sub Identify
          },
          {
             'title'    => 'VTOAI Perl Data Provider',
-            'author'   => {
-               'name' => 'Hussein Suleman',
-               'email' => 'hussein@vt.edu',
-               'institution' => 'Virginia Tech',
-               'mdorder' => [ qw ( name email institution ) ],
-             },
+            'author'   => [
+                    {
+                      'name' => 'Hussein Suleman',
+                      'email' => 'hussein@vt.edu',
+                      'institution' => 'Virginia Tech',
+                      'mdorder' => [ qw ( name email institution ) ],
+                    },
+                    {
+                      'name' => 'Philippe Jaillon',
+                      'email' => 'jaillon@emse.fr',
+                      'institution' => 'École Nationale Supérieure des Mines de Saint-Étienne',
+                      'mdorder' => [ qw ( name email institution ) ],
+                    }
+            ],
             'version'  => '3.05',
-            'URL'      => 'http://www.dlib.vt.edu/projects/OAI/',
+            'URL'      => [
+               'http://www.dlib.vt.edu/projects/OAI/',
+               'http://oai-pmh.emse.fr/'
+            ],
             'mdorder'  => [ qw ( title author version URL ) ]
-         } 
+         },
       ]]
    };
    push (@{$identity->{'description'}}, $desc);
index 73f352f..44b7367 100755 (executable)
@@ -30,7 +30,8 @@ use MARC::File::USMARC;
 
 sub new { # Get a MAR::Record as parameter and bless it as MARC::Record::KOHADC
        shift;
-       bless shift;
+       my $marc = shift;
+       bless $marc  if( ref( $marc ) );
 }
 
 sub subfield {
@@ -61,6 +62,15 @@ my @result = ();
        \@result;
 }  
 
+sub XMLescape {
+my ($t) = shift;
+
+       foreach (@$t ) {
+               s/\&/\&amp;/g; s/</&lt;/g;
+       }
+       $t;
+} 
+
 sub Status {
   my $self = shift;
        undef;
@@ -68,17 +78,17 @@ sub Status {
 
 sub Title {
   my $self = shift;
-       $self->getfields('biblio.title');
+       &XMLescape( $self->getfields('biblio.title') );
 }
 
 sub Creator {
   my $self = shift;
-       $self->getfields('biblio.author');
+       &XMLescape( $self->getfields('biblio.author') );
 }
 
 sub Subject {
   my $self = shift;
-       $self->getfields('bibliosubject.subject');
+       &XMLescape( $self->getfields('bibliosubject.subject') );
 }
 
 sub DateStamp {
@@ -125,12 +135,12 @@ sub Language {
 
 sub Type {
   my $self = shift;
-       $self->getfields('biblioitems.itemtype');
+       &XMLescape( $self->getfields('biblioitems.itemtype') );
 }
 
 sub Publisher {
   my $self = shift;
-       $self->getfields('biblioitems.publishercode');
+       &XMLescape( $self->getfields('biblioitems.publishercode') );
 }
 
 sub Set {
@@ -285,8 +295,13 @@ sub Archive_GetRecord
 
    if( my $r = $sth->fetchrow_hashref() ) {
        my $marc = new MARC::Record::KOHADC( ::GetMarcBiblio( $identifier ) );
-       $marc->{'biblio.timestamp'} = $r->{'timestamp'};
-       return $marc ;
+       if( $marc ) {
+               $marc->{'biblio.timestamp'} = $r->{'timestamp'};
+               return $marc ;
+       }
+       else {
+               warn("Archive_GetRecord : no MARC record for " . C4::Context->preference("OAI-PMH:archiveID") . ":" . $identifier);
+       }
    }
 
    $self->AddError ('idDoesNotExist', 'The value of the identifier argument is unknown or illegal in this repository');
@@ -316,11 +331,15 @@ sub Archive_ListRecords
 
         ($metadataPrefix, $offset, $from, $until ) = &parseResumptionToken($from, $until, $metadataPrefix, $resumptionToken);
 
-warn( "Archive_ListRecords : $set, $from, $until, $metadataPrefix, $resumptionToken\n");
+#warn( "Archive_ListRecords : $set, $from, $until, $metadataPrefix, $resumptionToken\n");
        $sth->execute( $from,$until,$self->{'MaxCount'}?$self->{'MaxCount'}:100000, $offset );
 
        while( my $r = $sth->fetchrow_hashref() ) { 
                my $marc = new MARC::Record::KOHADC( ::GetMarcBiblio( $r->{'biblionumber'} ) );
+               unless( $marc ) { # somme time there is problems within koha, and we can't get valid marc record
+                       warn("Archive_ListRecords : no MARC record for " . C4::Context->preference("OAI-PMH:archiveID") .":" . $r->{'biblionumber'} );
+                       next;
+               }
                $marc->{'biblio.timestamp'} = $r->{'timestamp'};
                push( @allrows, $marc );
        }