- Timestamp:
- 2013-04-12T17:27:33+12:00 (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
main/trunk/greenstone2/perllib/cgiactions/metadataaction.pm
r27173 r27176 48 48 "get-import-metadata" => { 49 49 'compulsory-args' => [ "d", "metaname" ], 50 'optional-args' => [ ] },50 'optional-args' => [ "metapos" ] }, 51 51 52 52 "get-archives-metadata" => { … … 85 85 "set-import-metadata" => { 86 86 'compulsory-args' => [ "metaname", "metavalue" ], 87 'optional-args' => [ "d", "f", "metamode" ] }, # metamode can be "accumulate", "override", or "unique-id". Also need to add the ability to specify a previous metadata value to overwrite (because we can't use metapos)87 'optional-args' => [ "d", "f", "metamode", "metapos", "prevmetavalue" ] }, # metamode can be "accumulate", "override", or "unique-id". Also need to add the ability to specify a previous metadata value to overwrite (because we can't use metapos). Metapos now supported, but assumes you are working with a Simple (instead of Complex) collection 88 88 89 89 #SET METHODS (ARRAY) … … 111 111 "remove-import-metadata" => { 112 112 'compulsory-args' => [ "d", "metaname", "metavalue" ], #TODO: add f argument 113 'optional-args' => [ ] },113 'optional-args' => [ "metapos" ] }, # only provide metapos arg for SIMPLE collections 114 114 115 115 "remove-archives-metadata" => { … … 314 314 my $docid = $self->{'d'}; 315 315 my $metaname = $self->{'metaname'}; 316 my $metapos = $self->{'metapos'}; 317 $metapos = 0 if (!defined $metapos); # gets the first value by default since metapos defaults to 0 318 316 319 my $infodbtype = $self->{'infodbtype'}; 317 320 if (!defined $docid) 318 321 { 319 322 $gsdl_cgi->generate_error("No docid (d=...) specified.\n"); … … 339 342 my $metadata_xml_filename = &util::filename_cat($import_dirname, "metadata.xml"); 340 343 341 $gsdl_cgi->generate_ok_message($self->get_metadata_from_metadata_xml($gsdl_cgi, $metadata_xml_filename, $metaname, $ import_tailname));344 $gsdl_cgi->generate_ok_message($self->get_metadata_from_metadata_xml($gsdl_cgi, $metadata_xml_filename, $metaname, $metapos, $import_tailname)); 342 345 343 346 # Release the lock once it is done … … 348 351 { 349 352 my $self = shift @_; 350 my ($gsdl_cgi, $metadata_xml_filename, $metaname, $ src_file) = @_;353 my ($gsdl_cgi, $metadata_xml_filename, $metaname, $metapos, $src_file) = @_; 351 354 352 355 my @rules = … … 377 380 close(MIN); 378 381 379 $parser->parse($xml_in, {metaname => $metaname, src_file => $src_file});382 $parser->parse($xml_in, {metaname => $metaname, metapos => $metapos, src_file => $src_file}); 380 383 381 384 if(defined $parser->{'pad'}->{'metavalue'}) … … 394 397 my ($tagname, $attrHash, $contextArray, $parentDataArray, $parser) = @_; 395 398 396 if (($parser->{'parameters'}->{'src_file'} eq $parser->{'parameters'}->{'current_file'}) && ($attrHash->{'name'} eq $parser->{'parameters'}->{'metaname'})) 399 # no subsection support yet in metadata.xml 400 401 if (($parser->{'parameters'}->{'src_file'} eq $parser->{'parameters'}->{'current_file'}) && $parser->{'parameters'}->{'metaname'} eq $attrHash->{'name'}) 397 402 { 398 $parser->{'pad'}->{'metavalue'} = $attrHash->{'_content'}; 403 if (!defined $parser->{'parameters'}->{'poscount'}) 404 { 405 $parser->{'parameters'}->{'poscount'} = 0; 406 } 407 else 408 { 409 $parser->{'parameters'}->{'poscount'}++; 410 } 411 412 # gets the first value by default, since metapos defaults to 0 413 if (($parser->{'parameters'}->{'poscount'} == $parser->{'parameters'}->{'metapos'})) 414 { 415 if($parser->{'parameters'}->{'metapos'} > 0) { 416 print STDERR "@@@@ WARNING: non-zero metapos.\n"; 417 print STDERR "@@@@ Assuming SIMPLE collection and proceeding to retrieve the import meta at".$parser->{'parameters'}->{'metapos'}.".\n"; 418 } 419 $parser->{'pad'}->{'metavalue'} = $attrHash->{'_content'}; 420 } 399 421 } 400 422 } … … 540 562 } 541 563 my $metavalue = $self->{'metavalue'}; 542 my $metamode = $self->{'metamode'} || "accumulate";543 my $append_or_not = ($metamode eq "accumulate") ? " \"append\"" : "";544 564 545 565 # Generate the dbkey … … 555 575 556 576 # Set the new value 557 my $cmd = "gdbmset \"$infodb_file_path\" \"$dbkey\" \"$metavalue\" $append_or_not";577 my $cmd = "gdbmset \"$infodb_file_path\" \"$dbkey\" \"$metavalue\""; 558 578 my $status = system($cmd); 559 579 if ($status != 0) { … … 624 644 $doc_rec->{$metaname}->[$metapos] = $metavalue; 625 645 } 626 elsif (defined $metamode && $metamode eq "accumulate") { 646 elsif (defined $metamode && $metamode eq "override") { 647 $doc_rec->{$metaname} = [ $metavalue ]; 648 } 649 else { # default for index was to override, but because accumulate is less destructive, 650 # and because accumulate is the default for archives and import, that's the new default for index too 627 651 if(defined $doc_rec->{$metaname}) { 628 652 push(@{$doc_rec->{$metaname}}, $metavalue); # accumulate the value for that metaname … … 630 654 $doc_rec->{$metaname} = [ $metavalue ]; 631 655 } 632 633 }634 else { # default for index was to override635 $doc_rec->{$metaname} = [ $metavalue ];636 656 } 637 657 … … 665 685 # as yet no support for setting subsection metadata in metadata.xml 666 686 if ((defined $docid_secnum) && ($docid_secnum !~ m/^\s*$/)) { 667 $gsdl_cgi->generate_ ok_message("*** Unable to set import metadata for subsections at this stage.\n");687 $gsdl_cgi->generate_message("*** No support yet for setting import metadata at subsections level.\n"); 668 688 return; 669 689 } … … 688 708 } 689 709 690 # Obtain where the metadata.xml is from the archiveinfo-doc.gdb file 691 # If the doc oid is not specified, we assume the metadata.xml is next to the specified "f" 692 my $metadata_xml_file; 693 my $import_filename = undef; 694 if (defined $docid) { 695 my $arcinfo_doc_filename = &dbutil::get_infodb_file_path($infodbtype, "archiveinf-doc", $archive_dir); 696 my $doc_rec = &dbutil::read_infodb_entry($infodbtype, $arcinfo_doc_filename, $docid_root); 697 698 # This now stores the full pathname 699 $import_filename = $doc_rec->{'src-file'}->[0]; 700 } 701 else { 702 $import_filename = &util::filename_cat($collect_dir,$collect,$import_file); 703 } 704 705 # figure out correct metadata.xml file [?] 706 # Assuming the metadata.xml file is next to the source file 707 # Note: This will not work if it is using the inherited metadata from the parent folder 708 my ($import_tailname, $import_dirname) = File::Basename::fileparse($import_filename); 709 my $metadata_xml_filename = &util::filename_cat($import_dirname,"metadata.xml"); 710 711 # Edit the metadata.xml 712 # Modified by Jeffrey from DL Consulting 713 # Handle the case where there is one metadata.xml file for multiple FileSets 714 # The XML filter needs to know whether it is in the right FileSet 715 # TODO: This doesn't fix the problem where the metadata.xml is not next to the src file. 716 # TODO: This doesn't handle the common metadata (where FileName doesn't point to a single file) 717 $self->edit_metadata_xml($gsdl_cgi, $metadata_xml_filename, 718 $metaname, $metavalue, $metamode, $import_tailname); 719 710 # adding metapos and prevmetavalue support to import_metadata subroutines 711 my $metapos = $self->{'metapos'}; # don't force undef to 0. Undef has meaning when metamode=override 712 my $prevmetavalue = $self->{'prevmetavalue'}; 713 714 my $arcinfo_doc_filename = &dbutil::get_infodb_file_path($infodbtype, "archiveinf-doc", $archive_dir); 715 my $metadata_xml_filename = $self->set_import_metadata_entry($gsdl_cgi, $arcinfo_doc_filename, $infodbtype, $docid_root, $metaname, $metapos,$metavalue, $metamode,$prevmetavalue, $collect, $collect_dir); # at this point, docid_root = docid 720 716 721 717 my $mess = "set-import-metadata successful: Key[$docid] -> $metadata_xml_filename\n"; … … 749 745 my $prevmetavalue = $self->{'prevmetavalue'}; 750 746 751 my $metapos = $self->{'metapos'}; # Don't append "|| undef", since if metapos=0 it will then be set to undef 752 753 # Don't set metapos=0 if it's undefined, as doing so will interfere when overriding all values for a metaname 754 # (all values for a metaname should get overridden if metamode=override combined with no user-defined metapos) 747 my $metapos = $self->{'metapos'}; # don't force undef to 0. Undef has meaning when metamode=override 748 # Don't append "|| undef", since if metapos=0 it will then be set to undef 755 749 756 750 my $metamode = $self->{'metamode'}; … … 804 798 my $docid = $self->{'d'}; 805 799 my $metaname = $self->{'metaname'}; 806 my $metapos = $self->{'metapos'}; 800 my $metapos = $self->{'metapos'}; # undef has meaning 807 801 my $metavalue = $self->{'metavalue'}; 808 802 my $infodbtype = $self->{'infodbtype'}; … … 1020 1014 my $metaname = $doc_array_rec->{'metaname'}; 1021 1015 if(defined $metaname) { 1022 my $metapos = $doc_array_rec->{'metapos'}; 1016 my $metapos = $doc_array_rec->{'metapos'}; # can legitimately be undef 1023 1017 my $metavalue = $doc_array_rec->{'metavalue'}; 1024 1018 my $metamode = $doc_array_rec->{'metamode'} || $self->{'metamode'}; … … 1139 1133 my $dbkey = "$docid.$metaname"; 1140 1134 my $metavalue = $doc_array_rec->{'metavalue'}; 1141 # no metapos for live_meta, so can default metamode to accumulate1142 my $metamode = $doc_array_rec->{'metamode'} || $self->{'metamode'} || "accumulate";1143 1144 my $append_or_not = ($metamode eq "accumulate") ? " \"append\"" : "";1145 1135 1146 1136 # Set the new value 1147 my $cmd = "gdbmset \"$infodb_file_path\" \"$dbkey\" \"$metavalue\" $append_or_not";1137 my $cmd = "gdbmset \"$infodb_file_path\" \"$dbkey\" \"$metavalue\""; 1148 1138 $status = system($cmd); 1149 1139 … … 1152 1142 foreach my $metatable_rec ( @$metatable ) { 1153 1143 $metaname = $metatable_rec->{'metaname'}; 1154 my $metamode = $metatable_rec->{'metamode'} || $doc_array_rec->{'metamode'} || $self->{'metamode'} || "accumulate";1155 my $append_or_not = ($metamode eq "accumulate") ? " \"append\"" : "";1156 1144 my $dbkey = "$docid.$metaname"; 1157 1145 1158 1146 my $metavals = $metatable_rec->{'metavals'}; # a sub-subarray 1159 1147 foreach my $metavalue ( @$metavals ) { 1160 my $cmd = "gdbmset \"$infodb_file_path\" \"$dbkey\" \"$metavalue\" $append_or_not";1148 my $cmd = "gdbmset \"$infodb_file_path\" \"$dbkey\" \"$metavalue\""; 1161 1149 $status = system($cmd); 1162 $append_or_not = " \"append\""; # even if metamode=override, need to accumulate all subsequent1163 # metavals for this metaname, else the just-assigned metavalue for this metaname will be lost1164 1150 } 1165 1151 } … … 1621 1607 if(defined $metaname) { 1622 1608 1623 my $metapos = $doc_array_rec->{'metapos'} || 0; 1609 my $metapos = $doc_array_rec->{'metapos'}; # don't force undef to 0. Undef has meaning when metamode=override 1610 1624 1611 my $metamode = $doc_array_rec->{'metamode'} || $self->{'metamode'}; 1625 1612 my $metavalue = $doc_array_rec->{'metavalue'}; 1626 1613 my $prevmetavalue = $self->{'prevmetavalue'}; # to make this sub behave as _set_archives_metadata 1627 1614 1628 # Some sanity checks1629 $metapos = 0 if (!defined $metapos);1630 1615 1631 1616 if ((!defined $metamode) || ($metamode =~ m/^\s*$/)) { … … 1882 1867 } 1883 1868 1884 # if overriding but no metapos, then clear all the meta for this metaname1869 # if overriding (for set-meta) but no metapos, then clear all the meta for this metaname 1885 1870 if ((defined $parser->{'parameters'}->{'metamode'}) && ($parser->{'parameters'}->{'metamode'} eq "override") && (!defined $parser->{'parameters'}->{'metapos'})) { 1886 1871 return []; … … 1917 1902 # file. 1918 1903 # So, skip anything with a .* in it as it is too general 1919 # print STDERR "@@@@ Skipping entry in metadata.xml where FileName=.* as it is too general\n";1904 ## print STDERR "@@@@ Skipping entry in metadata.xml where FileName=.* as it is too general\n"; 1920 1905 return [$tagname => $attrHash]; 1921 1906 } … … 1929 1914 my $name_attr = $attrHash->{'name'}; 1930 1915 if (($name_attr eq $metaname) && ($metamode eq "override")) { 1931 # Get the value and override the current value 1916 1917 # now metadata.xml functions need to keep track of metapos 1918 if (!defined $parser->{'parameters'}->{'poscount'}) 1919 { 1920 $parser->{'parameters'}->{'poscount'} = 0; 1921 } 1922 else 1923 { 1924 $parser->{'parameters'}->{'poscount'}++; 1925 } 1926 1927 # If either the metapos or prevmetavalue is set, 1928 # get the value and override the current value 1932 1929 my $metavalue = $parser->{'parameters'}->{'metavalue'}; 1933 $attrHash->{'_content'} = $metavalue; 1934 1935 ## print STDERR "**** overriding metadata.xml\n"; 1936 1937 # Don't want it to wipe out any other pieces of metadata 1938 $parser->{'parameters'}->{'metamode'} = "done"; 1939 } 1930 1931 if(defined $parser->{'parameters'}->{'prevmetavalue'} && $parser->{'parameters'}->{'prevmetavalue'} eq $attrHash->{'_content'}) 1932 { 1933 $attrHash->{'_content'} = $metavalue; 1934 1935 ## print STDERR "**** overriding metadata.xml\n"; 1936 1937 # Don't want it to wipe out any other pieces of metadata 1938 $parser->{'parameters'}->{'metamode'} = "done"; 1939 } 1940 elsif(defined $parser->{'parameters'}->{'metapos'} && $parser->{'parameters'}->{'poscount'} == $parser->{'parameters'}->{'metapos'}) 1941 { 1942 $attrHash->{'_content'} = $metavalue; 1943 $parser->{'parameters'}->{'metamode'} = "done"; 1944 } 1945 } 1946 1947 # mxml_description will process the metadata if metadata is accumulate, 1948 # or if we haven't found the metadata to override 1940 1949 1941 1950 # RAW is [$tagname => $attrHash] not $tagname => $attrHash!! … … 1970 1979 # multiple FileSets, it will add to all of them 1971 1980 if (($metamode eq "accumulate") || ($metamode eq "override")) { 1981 1972 1982 # if metamode was "override" but get to here then it failed to 1973 1983 # find an item to override, in which case it should append its 1974 1984 # value to the end, just like the "accumulate" mode 1985 1986 if ($metamode eq "override") { 1987 print "No metadata value to override. Switching 'metamode' to accumulate\n"; 1988 } 1975 1989 1976 1990 # tack a new metadata tag on to the end of the <Metadata>+ block … … 2103 2117 { 2104 2118 my $self = shift @_; 2105 my ($gsdl_cgi, $metadata_xml_filename, $metaname, $meta value, $metamode, $src_file) = @_;2119 my ($gsdl_cgi, $metadata_xml_filename, $metaname, $metapos, $metavalue, $metamode, $src_file, $prevmetavalue) = @_; 2106 2120 2107 2121 # Set the call-back functions for the metadata tags … … 2175 2189 2176 2190 $parser->filter($xml_in, $MOUT, { metaname => $metaname, 2191 metapos => $metapos, 2177 2192 metavalue => $metavalue, 2178 2193 metamode => $metamode, 2179 2194 src_file => $src_file, 2195 prevmetavalue => $prevmetavalue, 2180 2196 current_file => undef} ); 2181 2197 close($MOUT); … … 2268 2284 my $docid = $doc_array_rec->{'docid'}; 2269 2285 2270 push(@all_docids,$docid); 2286 my ($docid_root,$docid_secnum); 2287 if(defined $docid) { 2288 ($docid_root,$docid_secnum) = ($docid =~ m/^(.*?)(\..*)?$/); 2289 # as yet no support for setting subsection metadata in metadata.xml 2290 if ((defined $docid_secnum) && ($docid_secnum !~ m/^\s*$/)) { 2291 $gsdl_cgi->generate_message("*** docid: $docid. No support yet for setting import metadata at subsections level.\n"); 2292 next; # skip this docid in for loop 2293 } 2294 } 2295 2296 push(@all_docids,$docid); # docid_root rather 2271 2297 2272 2298 my $metaname = $doc_array_rec->{'metaname'}; … … 2274 2300 my $metamode = $doc_array_rec->{'metamode'} || $self->{'metamode'}; 2275 2301 my $metavalue = $doc_array_rec->{'metavalue'}; 2276 2302 $metavalue =~ s/<(.*?)>/<$1>/g; 2303 2277 2304 if ((!defined $metamode) || ($metamode =~ m/^\s*$/)) { 2278 2305 # make "accumulate" the default (less destructive, as won't actually … … 2280 2307 $metamode = "accumulate"; 2281 2308 } 2282 2283 $self->set_import_metadata_entry($gsdl_cgi, $arcinfo_doc_filename, $infodbtype, $docid, $metaname, $metavalue, $metamode); 2309 2310 # adding metapos and prevmetavalue support to import_metadata subroutines 2311 my $metapos = $doc_array_rec->{'metapos'}; # don't force undef to 0. Undef has meaning when metamode=override 2312 my $prevmetavalue = $self->{'prevmetavalue'}; 2313 2314 $self->set_import_metadata_entry($gsdl_cgi, $arcinfo_doc_filename, $infodbtype, $docid_root, $metaname, $metapos, $metavalue, $metamode, $prevmetavalue, $collect, $collect_dir); # at this point, docid_root = docid 2284 2315 2285 2316 } elsif (defined $doc_array_rec->{'metatable'}) { # if no metaname, we expect a metatable … … 2294 2325 $metamode = "accumulate"; 2295 2326 } 2296 # no metapos for import 2327 2328 # No support for metapos and prevmetavalue in the JSON metatable substructure 2329 my $metapos = undef; 2330 my $prevmetavalue = undef; 2297 2331 my $metavals = $metatable_rec->{'metavals'}; # a sub-subarray 2298 2332 2299 2333 foreach my $metavalue ( @$metavals ) { 2300 $self->set_import_metadata_entry($gsdl_cgi, $arcinfo_doc_filename, $infodbtype, $docid, $metaname, $metavalue, $metamode); 2334 $metavalue =~ s/<(.*?)>/<$1>/g; 2335 2336 $self->set_import_metadata_entry($gsdl_cgi, $arcinfo_doc_filename, $infodbtype, $docid_root, $metaname, $metapos, $metavalue, $metamode, $prevmetavalue, $collect, $collect_dir); # at this point, docid_root = docid 2301 2337 if($metamode eq "override") { # now, having overridden the first metavalue of the metaname, 2302 2338 # need to accumulate subsequent metavals for this metaname, else the just-assigned … … 2318 2354 { 2319 2355 my $self = shift @_; 2320 my ($gsdl_cgi, $arcinfo_doc_filename, $infodbtype, $docid, $metaname, $metavalue, $metamode) = @_; 2356 my ($gsdl_cgi, $arcinfo_doc_filename, $infodbtype, $docid, $metaname, $metapos, $metavalue, $metamode, $prevmetavalue, $collect, $collect_dir) = @_; 2357 2358 my $info_mess = <<RAWEND; 2359 **************************** 2360 set_import_metadata_entry() 2361 **************************** 2362 collect = $collect 2363 collect_dir = $collect_dir 2364 infodbtype = $infodbtype 2365 arcinfo_doc_filename = $arcinfo_doc_filename 2366 docid = $docid 2367 metaname = $metaname 2368 metapos = $metapos 2369 metavalue = $metavalue 2370 metamode = $metamode 2371 prevmetavalue = $prevmetavalue 2372 **************************** 2373 RAWEND 2374 2375 $gsdl_cgi->generate_message($info_mess); 2376 2377 # import works with metadata.xml which can have inherited metadata 2378 # so setting or removing at a metapos can have unintended effects for a COMPLEX collection 2379 # (a collection that has or can have inherited metadata). Metapos has expected behaviour for 2380 # a SIMPLE collection, which is one that doesn't have inherited metadata. Assume caller knows 2381 # what they're doing if they provide a metapos. 2382 if(defined $metapos) { 2383 print STDERR "@@@@ WARNING: metapos defined.\n"; 2384 print STDERR "@@@@ Assuming SIMPLE collection and proceeding to modify the import meta at $metapos.\n"; 2385 } 2321 2386 2322 2387 # Obtain where the metadata.xml is from the archiveinfo-doc.gdb file … … 2325 2390 my $import_filename = undef; 2326 2391 2327 my $doc_rec = &dbutil::read_infodb_entry($infodbtype, $arcinfo_doc_filename, $docid); 2328 2329 # This now stores the full pathname 2330 $import_filename = $doc_rec->{'src-file'}->[0]; 2392 if (defined $docid) { 2393 # my $arcinfo_doc_filename = &dbutil::get_infodb_file_path($infodbtype, "archiveinf-doc", $archive_dir); 2394 my $doc_rec = &dbutil::read_infodb_entry($infodbtype, $arcinfo_doc_filename, $docid); 2395 2396 # This now stores the full pathname 2397 $import_filename = $doc_rec->{'src-file'}->[0]; 2398 } else { # only for set_import_meta, not the case when calling method is set_import_metadata_array 2399 # as the array version of the method doesn't support the -f parameter yet 2400 my $import_file = $self->{'f'}; 2401 $import_filename = &util::filename_cat($collect_dir,$collect,$import_file); 2402 } 2331 2403 2332 2404 # figure out correct metadata.xml file [?] … … 2336 2408 my $metadata_xml_filename = &util::filename_cat($import_dirname,"metadata.xml"); 2337 2409 2338 $self->edit_metadata_xml($gsdl_cgi, $metadata_xml_filename, $metaname, $metavalue, $metamode, $import_tailname); 2339 return 1; 2410 # If we're overriding everything, then $metamode=override combined with $metapos=undefined 2411 # in which case, we need to remove all metavalues for the metaname at the given (sub)section 2412 # Thereafter, we will finally be able to set the overriding metavalue for this metaname 2413 if(!defined $metapos && $metamode eq "override") { 2414 ## print STDERR "@@@ REMOVING all import metadata for $metaname\n"; 2415 $self->remove_from_metadata_xml($gsdl_cgi, $metadata_xml_filename, $metaname, $metapos, undef, $import_tailname, $metamode); # we're removing all values, so metavalue=undef 2416 2417 } 2418 2419 # Edit the metadata.xml 2420 # Modified by Jeffrey from DL Consulting 2421 # Handle the case where there is one metadata.xml file for multiple FileSets 2422 # The XML filter needs to know whether it is in the right FileSet 2423 # TODO: This doesn't fix the problem where the metadata.xml is not next to the src file. 2424 # TODO: This doesn't handle the common metadata (where FileName doesn't point to a single file) 2425 $self->edit_metadata_xml($gsdl_cgi, $metadata_xml_filename, $metaname, 2426 $metapos, $metavalue, $metamode, $import_tailname, $prevmetavalue); 2427 #return 0; 2428 return $metadata_xml_filename; 2340 2429 } 2341 2430 … … 2365 2454 2366 2455 my $metaname = $self->{'metaname'}; 2456 my $metapos = $self->{'metapos'}; 2367 2457 my $metavalue = $self->{'metavalue'}; 2368 $metavalue =~ s/<(.*?)>/<$1>/g; 2458 if(defined $metavalue) { 2459 $metavalue =~ s/<(.*?)>/<$1>/g; 2460 } elsif (!defined $metapos) { # if given no metavalue or metapos to delete, default to deleting the 1st 2461 $metapos = 0; 2462 } 2463 my $metamode = $self->{'metamode'} || undef; 2464 2465 # import works with metadata.xml which can have inherited metadata 2466 # so setting or removing at a metapos can have unintended effects for a COMPLEX collection 2467 # (a collection that has or can have inherited metadata). Metapos has expected behaviour for 2468 # a SIMPLE collection, which is one that doesn't have inherited metadata. Assume caller knows 2469 # what they're doing if they provide a metapos. 2470 if(defined $metapos) { 2471 print STDERR "@@@@ WARNING: metapos defined.\n"; 2472 print STDERR "@@@@ Assuming SIMPLE collection and proceeding to modify the import meta at $metapos.\n"; 2473 } 2369 2474 2370 2475 # Obtain where the metadata.xml is from the archiveinfo-doc.gdb file … … 2392 2497 my $metadata_xml_filename = &util::filename_cat($import_dirname,"metadata.xml"); 2393 2498 2394 $self->remove_from_metadata_xml($gsdl_cgi, $metadata_xml_filename, $metaname, $meta value, $import_tailname);2499 $self->remove_from_metadata_xml($gsdl_cgi, $metadata_xml_filename, $metaname, $metapos, $metavalue, $import_tailname, $metamode); # metamode has no meaning for removing meta, but is used by set_meta when overriding All 2395 2500 2396 2501 my $mess = "remove-import-metadata successful: Key[$docid] -> $metadata_xml_filename\n"; … … 2429 2534 { 2430 2535 my $self = shift @_; 2431 my ($gsdl_cgi, $metadata_xml_filename, $metaname, $metavalue, $src_file) = @_; 2432 2536 my ($gsdl_cgi, $metadata_xml_filename, $metaname, $metapos, $metavalue, $src_file, $metamode) = @_; 2537 # metamode generally has no meaning for removing meta, but is used by set_meta 2538 # when overriding all metavals for a metaname, in which case remove_meta is called with metamode 2539 2433 2540 # Set the call-back functions for the metadata tags 2434 2541 my @rules = … … 2471 2578 else { 2472 2579 binmode($MOUT,":utf8"); 2473 $parser->filter($xml_in, $MOUT, {metaname => $metaname, meta value => $metavalue, src_file => $src_file, current_file => undef});2580 $parser->filter($xml_in, $MOUT, {metaname => $metaname, metapos => $metapos, metavalue => $metavalue, src_file => $src_file, metamode => $metamode, current_file => undef}); 2474 2581 close($MOUT); 2475 2582 } … … 2481 2588 my ($tagname, $attrHash, $contextArray, $parentDataArray, $parser) = @_; 2482 2589 2483 if ((defined $parser->{'parameters'}->{'metavalue'}) && ($parser->{'parameters'}->{'src_file'} eq $parser->{'parameters'}->{'current_file'}) && ($attrHash->{'name'} eq $parser->{'parameters'}->{'metaname'}) && ($attrHash->{'_content'} eq $parser->{'parameters'}->{'metavalue'})) 2590 # metadata.xml does not handle subsections 2591 2592 # since metadata.xml now has to deal with metapos, we keep track of the metadata position 2593 if (($parser->{'parameters'}->{'src_file'} eq $parser->{'parameters'}->{'current_file'}) 2594 && $parser->{'parameters'}->{'metaname'} eq $attrHash->{'name'}) 2484 2595 { 2485 return []; 2596 if (!defined $parser->{'parameters'}->{'poscount'}) 2597 { 2598 $parser->{'parameters'}->{'poscount'} = 0; 2599 } 2600 else 2601 { 2602 $parser->{'parameters'}->{'poscount'}++; 2603 } 2604 2605 # if overriding but no metapos, then clear all the meta for this metaname 2606 if ((defined $parser->{'parameters'}->{'metamode'}) && ($parser->{'parameters'}->{'metamode'} eq "override") && (!defined $parser->{'parameters'}->{'metapos'})) { 2607 return []; 2608 } 2609 2610 if ((defined $parser->{'parameters'}->{'metapos'}) && ($parser->{'parameters'}->{'poscount'} == $parser->{'parameters'}->{'metapos'})) 2611 { 2612 return []; 2613 } 2614 2615 if ((defined $parser->{'parameters'}->{'metavalue'}) && ($attrHash->{'_content'} eq $parser->{'parameters'}->{'metavalue'})) 2616 { 2617 return []; 2618 } 2486 2619 } 2487 2620 … … 2660 2793 2661 2794 # Obtain the specified metadata pos 2662 if(!defined $metapos && !defined $metavalue) { #$metapos = 0 if (!defined $metapos); 2795 # if no metavalue or metapos to delete, default to deleting the 1st value for the metaname 2796 if(!defined $metapos && !defined $metavalue) { 2663 2797 $metapos = 0; 2664 2798 } … … 2788 2922 my $metamode = "accumulate"; 2789 2923 2924 # metapos/prevmetavalue were never before used in this subroutine, so set them to undefined 2925 my $metapos = undef; 2926 my $prevmetavalue = undef; 2927 2790 2928 #=======================================================================# 2791 2929 # set_import_metadata [START] … … 2829 2967 # TODO: This doesn't fix the problem where the metadata.xml is not next to the src file. 2830 2968 # TODO: This doesn't handle the common metadata (where FileName doesn't point to a single file) 2831 $self->edit_metadata_xml($gsdl_cgi, $metadata_xml_filename, 2832 $metaname, $metavalue, $metamode, $import_tailname);2969 $self->edit_metadata_xml($gsdl_cgi, $metadata_xml_filename, $metaname, 2970 $metapos, $metavalue, $metamode, $import_tailname, $prevmetavalue); 2833 2971 #=======================================================================# 2834 2972 # set_import_metadata [END]
Note:
See TracChangeset
for help on using the changeset viewer.