Changeset 37214 for main


Ignore:
Timestamp:
2023-01-29T23:42:13+13:00 (15 months ago)
Author:
davidb
Message:

Addition of new action (in the same style of get-archives-metadata) but for getting an associated file. While this particular operation can be achieved by simply building the URL directly, it has been introduced as part of the 'get-metadata' API for reasons on consistent treatment. The next feature to be added with be set-archives-assocfile, which is something that can't be done by forming a direct URL to the resource

File:
1 edited

Legend:

Unmodified
Added
Removed
  • main/trunk/greenstone2/perllib/cgiactions/metadataaction.pm

    r37207 r37214  
    8787        'compulsory-args' => [ "d", "metaname" ],
    8888        'optional-args'   => [ "dv", "metapos" ] },
     89
     90    "get-archives-assocfiles" => {
     91        'compulsory-args' => [ "d", "assocname" ],
     92        'optional-args'   => [ "dv" ] },
    8993   
    9094    "get-index-metadata" => {
     
    920924
    921925    my $doc_filename = &util::filename_cat($archive_dir, $doc_file);
    922        
     926
     927
    923928    $gsdl_cgi->generate_ok_message($self->get_metadata_from_archive_xml($gsdl_cgi, $doc_filename, $metaname, $metapos, $docid_secnum));
    924 
    925929}
    926930
     
    967971    $gsdl_cgi->generate_ok_message($self->get_metadata_from_archive_xml($gsdl_cgi, $doc_filename, $metaname, $metapos, $docid_secnum));
    968972
     973}
     974
     975sub get_archives_assocfiles
     976{
     977    my $self = shift @_;
     978
     979    my $username  = $self->{'username'};
     980    my $collect   = $self->{'collect'};
     981    my $gsdl_cgi  = $self->{'gsdl_cgi'};
     982    my $infodbtype = $self->{'infodbtype'};
     983
     984    # Obtain the collect and archive dir
     985    my $site = $self->{'site'};
     986    my $collect_dir = $gsdl_cgi->get_collection_dir($site);
     987   
     988    my $archive_dir = &util::filename_cat($collect_dir, $collect, "archives");
     989
     990    # look up additional args
     991    my $docid = $self->{'d'};
     992
     993    my $assocname = $self->{'assocname'};
     994   
     995    my $arcinfo_doc_filename = &dbutil::get_infodb_file_path($infodbtype, "archiveinf-doc", $archive_dir);
     996    my $doc_rec = &dbutil::read_infodb_entry($infodbtype, $arcinfo_doc_filename, $docid);
     997
     998    my $doc_file = $doc_rec->{'doc-file'}->[0];
     999
     1000    # check if request if for file-level doc-version history 'nminus-<n>' version
     1001    my $dv = $self->{'dv'};
     1002    if (defined $dv && ($dv ne "")) {
     1003        # Need to insert '_fldv_history/nminus-<n>' into doc_filename
     1004       
     1005        my ($doc_tailname, $doc_dirname) = File::Basename::fileparse($doc_file);
     1006        $doc_file = &util::filename_cat($doc_dirname,$FLDV_HISTORY_DIR,$dv,$doc_tailname);
     1007    }
     1008   
     1009    my $doc_filename = &util::filename_cat($archive_dir, $doc_file);
     1010       
     1011
     1012    # In the following the repeated calls to $self->get_metadata_from_archive_xml() with increasing $metapos
     1013    # get the job done, but is not very efficient
     1014    # => candidate for refactoring
     1015   
     1016    my $json_result_str .= "[";
     1017   
     1018
     1019    my $metapos = 0;
     1020    my $metavalue = $self->get_metadata_from_archive_xml($gsdl_cgi, $doc_filename, "gsdlassocfile", $metapos, "");
     1021
     1022    my $found_file     = undef;
     1023    my $found_mimetype = undef;
     1024   
     1025    while (defined $metavalue && $metavalue ne "") {
     1026
     1027        my ($assoc_file,$assoc_mimetype) = ($metavalue =~ m/^(.+?):(.+?):(?:.*)$/); # only need first two fields, third one might be section???
     1028
     1029        if ($assoc_file eq $assocname) {
     1030        $found_file     = $assoc_file;
     1031        $found_mimetype = $assoc_mimetype;
     1032        last;
     1033        }
     1034               
     1035        $metapos++;
     1036        $metavalue = $self->get_metadata_from_archive_xml($gsdl_cgi, $doc_filename, "gsdlassocfile", $metapos, "");
     1037    }
     1038
     1039    if (defined $found_file) {
     1040
     1041        my ($unused_tailname, $doc_dirname) = File::Basename::fileparse($doc_file);
     1042
     1043        if (defined $dv && ($dv ne "")) {
     1044        # Need to insert '_fldv_history/nminus-<n>' into doc_filename
     1045
     1046        $found_file = &util::filename_cat($doc_dirname,$FLDV_HISTORY_DIR,$dv,$found_file);
     1047        }
     1048        else {
     1049        $found_file = &util::filename_cat($doc_dirname,$found_file);
     1050        }
     1051       
     1052        my $found_filename = &util::filename_cat($archive_dir, $found_file);
     1053
     1054        $gsdl_cgi->generate_file($found_mimetype,$found_filename);
     1055    }
     1056    else {
     1057       
     1058        $gsdl_cgi->generate_error("Failed to find associated file $assocname in 'archives' for $docid");
     1059    }   
    9691060}
    9701061
Note: See TracChangeset for help on using the changeset viewer.