Changeset 8737


Ignore:
Timestamp:
2004-12-03T17:32:01+13:00 (19 years ago)
Author:
davidb
Message:

Extension to RecPlug so metadata that goes with a file that is in a
sub (or subsub ..) directory can gets bound to it correctly.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/gsdl/perllib/plugins/RecPlug.pm

    r8716 r8737  
    9898use util;
    9999
     100use File::Basename;
     101
    100102
    101103BEGIN {
     
    159161    }
    160162
     163    $self->{'subdir_extrametakeys'} = {};
     164
    161165    return bless $self, $class;
    162166}
     
    248252    my %extrametadata;               # maps from filespec to extra metadata keys
    249253    my @extrametakeys;               # keys of %extrametadata in order read
     254
     255    my $dirsepre = &util::get_re_dirsep();
     256    my $dirsep    = &util::get_dirsep();
     257    my $local_dirname = $dirname;
     258    $local_dirname =~ s/^$base_dir($dirsepre)//;
     259    $local_dirname .= $dirsep;
     260
     261    if (defined $self->{'subdir_extrametakeys'}->{$local_dirname}) {
     262    print STDERR "**** Matching on dirname = $local_dirname\n";
     263    my $extrakeys = $self->{'subdir_extrametakeys'}->{$local_dirname};
     264    foreach my $ek (@$extrakeys) {
     265        my $extrakeys_re  = $ek->{'re'};
     266        my $extrakeys_md  = $ek->{'md'};
     267        push(@extrametakeys,$extrakeys_re);
     268        $extrametadata{$extrakeys_re} = $extrakeys_md;
     269    }
     270    delete($self->{'subdir_extrametakeys'}->{$local_dirname});
     271    }
    250272
    251273    if ($read_metadata_files) {
     
    280302    }
    281303   
     304    # filter out any extrametakeys that mention subdirectories and store
     305    # for later use (i.e. when that sub-directory is being processed)
     306
     307    foreach my $ek (@extrametakeys) {
     308    my ($subdir_re,$extrakey_dir) = &File::Basename::fileparse($ek);
     309    $extrakey_dir =~ s/\\\./\./g; # remove RE syntax
     310
     311    my $dirsep = &util::get_dirsep();
     312
     313    if ($ek =~ m/$dirsep/) { # specifies at least one directory
     314        my $md = $extrametadata{$ek};
     315
     316        my $subdir_extrametakeys = $self->{'subdir_extrametakeys'};
     317        print STDERR "*** pushing on $subdir_re for $extrakey_dir\n";
     318
     319        my $subdir_rec = { 're' => $subdir_re, 'md' => $md };
     320        push(@{$subdir_extrametakeys->{$extrakey_dir}},$subdir_rec);
     321    }
     322    }
    282323   
    283324    # import each of the files in the directory
     
    501542# Afterwards $mdref1 will be updated, and $mdref2 will be unchanged.
    502543#
    503 # We have to be acreful about the way we merge metadata when one metadata
     544# We have to be careful about the way we merge metadata when one metadata
    504545# structure is in "override" mode and one is in "merge" mode.  In fact, we
    505546# use the mode from the second structure, $mdref2, because it is generally
     
    509550# Another issue is the use of references to pass metadata around.  If we
    510551# simply copy one metadata structure reference to another, then we're
    511 # effectively justr copyinga pointer, and changes to the new referene
     552# effectively just copyinga pointer, and changes to the new referene
    512553# will affect the old (copied) one also.  This also applies to ARRAY
    513554# references used as metadata element values (hence the "clonedata"
Note: See TracChangeset for help on using the changeset viewer.