Changeset 23824


Ignore:
Timestamp:
2011-03-28T10:41:58+13:00 (13 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 edited

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 " .
Note: See TracChangeset for help on using the changeset viewer.