Changeset 23824

Show
Ignore:
Timestamp:
28.03.2011 10:41:58 (8 years ago)
Author:
sjm84
Message:

Phase one of commiting the files changed to extend the DSpace exporting capabilities to include more than just dublin core metadata

Location:
main/trunk/greenstone2/perllib/plugouts
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • main/trunk/greenstone2/perllib/plugouts/BasePlugout.pm

    r23387 r23824  
    368368    my ($handle,$docroot,$nondoctype) = @_; 
    369369     
    370     print $handle '<?xml version="1.0" encoding="UTF-8" standalone="no"?>' . "\n"; 
     370     
     371    #print $handle '<?xml version="1.0" encoding="UTF-8" standalone="no"?>' . "\n"; 
     372     
     373    #For Dspace must be UTF in lower case 
     374    print $handle '<?xml version="1.0" encoding="utf-8" standalone="no"?>' . "\n"; 
    371375    
    372376    if (!defined $nondoctype){ 
     
    386390    print $handle "</$docroot>\n" if defined $docroot; 
    387391} 
     392 
     393 
     394sub output_general_xml_header  
     395{ 
     396    my $self = shift (@_); 
     397    my ($handle,$docroot,$opt_attributes,$opt_dtd, $opt_doctype) = @_; 
     398     
     399    print $handle '<?xml version="1.0" encoding="utf-8" standalone="no"?>' . "\n"; 
     400    
     401    if (defined $opt_dtd) { 
     402        my $doctype = (defined $opt_doctype) ? $opt_doctype : $docroot; 
     403    print $handle "<!DOCTYPE $doctype SYSTEM \"$opt_dtd\">\n"; 
     404    } 
     405 
     406    if (defined $docroot) { 
     407        my $full_docroot = $docroot; 
     408        if (defined $opt_attributes) { 
     409          $full_docroot .= " $opt_attributes"; 
     410        } 
     411 
     412        print $handle "<$full_docroot>\n"  
     413      } 
     414} 
     415 
     416sub output_general_xml_footer  
     417{ 
     418    output_xml_footer(@_); 
     419} 
     420 
    388421 
    389422sub process { 
  • main/trunk/greenstone2/perllib/plugouts/DSpacePlugout.pm

    r22921 r23824  
    2828use strict; 
    2929no strict 'refs'; 
    30  
     30use utf8; 
    3131eval {require bytes}; 
    3232use util; 
     
    3737} 
    3838 
    39 my $arguments = []; 
     39my $arguments = [  
     40       { 'name' => "metadata_prefix",  
     41    'desc' => "{DSpacePlugout.metadata_prefix}", 
     42    'type' => "string",    
     43    'reqd' => "no", 
     44    'hiddengli' => "no"} ]; 
     45 
    4046 
    4147my $options = { 'name'     => "DSpacePlugout", 
    4248        'desc'     => "{DSpacePlugout.desc}", 
    4349        'abstract' => "no", 
    44         'inherits' => "yes" }; 
     50        'inherits' => "yes", 
     51                'args'     => $arguments }; 
    4552 
    4653sub new { 
     
    5360 
    5461    my $self = new BasePlugout($plugoutlist,$inputargs,$hashArgOptLists);     
    55      
     62 
     63    print STDERR "***** metadata prefix = \"", $self->{'metadata_prefix'}, "\"\n"; 
     64 
    5665    return bless $self, $class; 
     66} 
     67 
     68sub saveas_dspace_metadata 
     69{ 
     70    my $self = shift (@_); 
     71    my ($doc_obj,$working_dir,$metadata_file,$docroot,$metadata_prefix) = @_; 
     72 
     73    # my $docroot_attributes = ($metadata_prefix eq "dc") ? undef : "schema=\"$metadata_prefix\""; 
     74    my $docroot_attributes = "schema=\"$metadata_prefix\""; 
     75  
     76    my $doc_dc_file = &util::filename_cat ($working_dir, $metadata_file); 
     77    $self->open_xslt_pipe($doc_dc_file,$self->{'xslt_file'}); 
     78 
     79    my $outhandler; 
     80    if (defined $self->{'xslt_writer'}){ 
     81    $outhandler = $self->{'xslt_writer'}; 
     82    } 
     83    else{ 
     84    $outhandler = $self->get_output_handler($doc_dc_file); 
     85     } 
     86    
     87    $self->output_general_xml_header($outhandler, $docroot, $docroot_attributes); 
     88 
     89    my $metadata_hashmap = $doc_obj->get_metadata_hashmap($doc_obj->get_top_section(), 
     90                                                          $metadata_prefix); 
     91 
     92    foreach my $metaname (keys %$metadata_hashmap) { 
     93      my $metavals = $metadata_hashmap->{$metaname}; 
     94 
     95      my $qualifier = undef; 
     96      my $element; 
     97      if ($metaname =~ m/^(.*?)\^(.*?)$/) { 
     98        $element = $1; 
     99        $qualifier = $2; 
     100        $qualifier = lc($qualifier); 
     101      } 
     102      else { 
     103        $element = $metaname; 
     104      } 
     105      $element =~ s/^.*?\.//; 
     106      $element = lc($element); 
     107 
     108      foreach my $metaval (@$metavals) { 
     109         
     110        #if element is empty then no need to export it. 
     111         
     112        if ($metaval =~ /\S/) { 
     113            print $outhandler "  <dcvalue element=\"$element\""; 
     114            #If no qualifier then add qualifier="none" 
     115            #print $outhandler " qualifier=\"$qualifier\"" if defined $qualifier; 
     116            if (defined $qualifier) { 
     117                print $outhandler " qualifier=\"$qualifier\"" ; 
     118            } 
     119            else { 
     120                print $outhandler " qualifier=\"none\" language=\"\"" ; 
     121            } 
     122            print $outhandler ">$metaval"; 
     123            print $outhandler "</dcvalue>\n"; 
     124        } 
     125         
     126         
     127         
     128      } 
     129    } 
     130     
     131    $self->output_general_xml_footer($outhandler,$docroot); 
     132    
     133    if (defined $self->{'xslt_writer'}){      
     134    $self->close_xslt_pipe();  
     135    } 
     136    else{ 
     137    close($outhandler); 
     138    } 
     139 
    57140} 
    58141 
     
    72155    my $outhandle = $self->{'output_handle'}; 
    73156   
    74     # Genereate handle file  
    75     # (Note: this section of code would benefit from being restructured) 
    76     my $doc_handle_file = &util::filename_cat ($working_dir, "handle"); 
    77      
    78     my $env_hp = $ENV{'DSPACE_HANDLE_PREFIX'}; 
    79     my $handle_prefix = (defined $env_hp) ? $env_hp : "123456789"; 
    80  
    81     my $outhandler =  $self->get_output_handler($doc_handle_file); 
    82  
    83     my ($handle) = ($doc_dir =~ m/^(.*)(:?\.dir)?$/); 
    84  
    85     print $outhandler "$handle_prefix/$handle\n"; 
    86      
    87     close ($outhandler); 
    88      
     157    my $generate_handle = 0; 
     158    if ($generate_handle) { 
     159        # Genereate handle file  
     160        # (Note: this section of code would benefit from being restructured) 
     161        my $doc_handle_file = &util::filename_cat ($working_dir, "handle"); 
     162     
     163        my $env_hp = $ENV{'DSPACE_HANDLE_PREFIX'}; 
     164        my $handle_prefix = (defined $env_hp) ? $env_hp : "123456789"; 
     165 
     166        my $outhandler =  $self->get_output_handler($doc_handle_file); 
     167 
     168        my ($handle) = ($doc_dir =~ m/^(.*)(:?\.dir)?$/); 
     169 
     170        print $outhandler "$handle_prefix/$handle\n"; 
     171     
     172        close ($outhandler); 
     173    } 
     174     
    89175    ######################### 
    90176    # save the content file 
     
    92178    my $doc_contents_file = &util::filename_cat ($working_dir, "contents"); 
    93179     
    94     $outhandler =  $self->get_output_handler($doc_contents_file); 
     180    my $outhandler =  $self->get_output_handler($doc_contents_file); 
    95181 
    96182    $self->process_assoc_files ($doc_obj, $doc_dir, $outhandler); 
     
    100186    close($outhandler); 
    101187 
    102      ############################# 
     188    ############################# 
    103189    # save the dublin_core.xml file 
    104190    ############################### 
    105     my $doc_dc_file = &util::filename_cat ($working_dir, "dublin_core.xml"); 
    106     $self->open_xslt_pipe($doc_dc_file,$self->{'xslt_file'}); 
    107  
    108     if (defined $self->{'xslt_writer'}){ 
    109     $outhandler = $self->{'xslt_writer'}; 
    110     } 
    111     else{ 
    112     $outhandler = $self->get_output_handler($doc_dc_file); 
    113      } 
    114     
    115     $self->output_xml_header($outhandler, "dublin_core",1); 
    116  
    117     my $all_text = $self->get_dc_metadata($doc_obj, $doc_obj->get_top_section()); 
    118     print $outhandler $all_text; 
    119  
    120     $self->output_xml_footer($outhandler,"dublin_core"); 
    121     
    122     if (defined $self->{'xslt_writer'}){      
    123     $self->close_xslt_pipe();  
    124     } 
    125     else{ 
    126     close($outhandler); 
    127     } 
    128         
     191#      my $doc_dc_file = &util::filename_cat ($working_dir, "dublin_core.xml"); 
     192#      $self->open_xslt_pipe($doc_dc_file,$self->{'xslt_file'}); 
     193 
     194#      if (defined $self->{'xslt_writer'}){ 
     195#   $outhandler = $self->{'xslt_writer'}; 
     196#      } 
     197#      else{ 
     198#   $outhandler = $self->get_output_handler($doc_dc_file); 
     199#       } 
     200    
     201#      $self->output_general_xml_header($outhandler, "dublin_core"); 
     202 
     203#      my $all_text = $self->get_dc_metadata($doc_obj, $doc_obj->get_top_section()); 
     204#      print $outhandler $all_text; 
     205 
     206#      $self->output_general_xml_footer($outhandler,"dublin_core"); 
     207    
     208#      if (defined $self->{'xslt_writer'}){      
     209#   $self->close_xslt_pipe();  
     210#      } 
     211#      else{ 
     212#   close($outhandler); 
     213#      } 
     214 
     215    $self->saveas_dspace_metadata($doc_obj,$working_dir, 
     216                                  "dublin_core.xml","dublin_core","dc"); 
     217 
     218    my $metadata_prefix_list = $self->{'metadata_prefix'}; 
     219    print STDERR "***!! md prefix = $metadata_prefix_list\n"; 
     220 
     221    my @metadata_prefixes = split(/,\s*/,$metadata_prefix_list); 
     222    foreach my $ep (@metadata_prefixes) { 
     223      $self->saveas_dspace_metadata($doc_obj,$working_dir, 
     224                                    "metadata_$ep.xml","dublin_core",$ep);  
     225    } 
     226 
    129227    $self->{'short_doc_file'} =  &util::filename_cat ($doc_dir, "dublin_core.xml");  
    130228    $self->store_output_info_reference($doc_obj); 
     
    195293        } 
    196294 
    197         # Store the associated file to the "contents" file 
    198         print $handle "$assoc_file_rec->[1]\t$bundle\n"; 
     295        # Store the associated file to the "contents" file. Cover.pdf not needed. 
     296        if ($afile ne "cover.jpg") { 
     297            print $handle "$assoc_file_rec->[1]\t$bundle\n"; 
    199298        } 
     299        } 
    200300     
    201  
    202301        $filename = &util::filename_cat($working_dir, $afile); 
    203302         
    204          
    205         &util::hard_link ($real_filename, $filename, $self->{'verbosity'}); 
    206          
    207         $doc_obj->add_utf8_metadata ($doc_obj->get_top_section(), 
    208                      "gsdlassocfile", 
    209                      "$afile:$assoc_file_rec->[2]:$dir"); 
     303        if ($afile ne "cover.jpg") { 
     304            &util::hard_link ($real_filename, $filename, $self->{'verbosity'}); 
     305            $doc_obj->add_utf8_metadata ($doc_obj->get_top_section(), 
     306                 "gsdlassocfile", 
     307                 "$afile:$assoc_file_rec->[2]:$dir"); 
     308        } 
    210309    } elsif ($self->{'verbosity'} > 2) { 
    211310        print $outhandler "DSpacePlugout::process couldn't copy the associated file " .