Annotation of foxridge-archiver/changemeta.pl, revision 1.5

1.5     ! casties     1: #!/usr/bin/perl -w
1.1       casties     2: 
                      3: use strict;
                      4: use XML::LibXML;
                      5: 
1.4       casties     6: use lib '/usr/local/mpiwg/archive';
1.1       casties     7: use MPIWGStor;
                      8: 
                      9: # make output unbuffered
                     10: $|=1;
                     11: 
                     12: # program version
1.4       casties    13: my $version = "0.3 (11.12.2006 ROC)";
1.1       casties    14: my $help = 
1.3       casties    15: "use: changemeta [options] dir
1.1       casties    16: options:
                     17:   -debug  show debugging info
                     18:   -dry-run  simulate, dont'do anything
1.2       casties    19:   -access=free  set free access tag (use access=mpiwg for restricted access)
1.4       casties    20:   -derived-from=/mpiwg/archive/data/DBDDHKP
                     21:   -production-comment=\"scanned with flatbed scanner\"
1.1       casties    22: ";
1.3       casties    23: logger("INFO", "changemeta $version");
1.1       casties    24: 
                     25: 
                     26: #######################################################
                     27: # internal parameters
                     28: #
                     29: 
                     30: # read command line parameters
                     31: my $args = MPIWGStor::parseargs;
                     32: if (! scalar(%$args)) {
                     33:     print $help, "\n";
                     34:     exit 1;
                     35: }
                     36: 
                     37: # debug level
                     38: $debug = (exists $$args{'debug'}) ? $$args{'debug'} : 0;
                     39: 
                     40: # simulate action only
                     41: my $dry_run = (exists $$args{'dry-run'}) ? $$args{'dry-run'} : 0;
                     42: logger('DEBUG', "dry-run: $dry_run");
                     43: 
                     44: # access type
                     45: my $access_type = (exists $$args{'access'}) ? $$args{'access'} : "";
                     46: logger('DEBUG', "access: $access_type");
                     47: 
1.4       casties    48: # derived-from
                     49: my $derived_from = (exists $$args{'derived-from'}) ? $$args{'derived-from'} : "";
                     50: logger('DEBUG', "derived-from: $derived_from");
                     51: 
                     52: # production-comment
                     53: my $production_comment = (exists $$args{'production-comment'}) ? $$args{'production-comment'} : "";
                     54: logger('DEBUG', "production-comment: $production_comment");
                     55: 
1.1       casties    56: # index.meta namespace (not really implemented!)
                     57: my $namespace = "";
                     58: 
                     59: 
                     60: my $xml_changed = 0;
                     61: my $errcnt = 0;
                     62: my $warncnt = 0;
                     63: 
                     64: #######################################################
                     65: # check parameters that were passed to the program
                     66: #
                     67: my $docdir = $$args{'path'};
                     68: if (! $docdir) {
                     69:     logger("ABORT", "no document directory given!");
                     70:     exit 1;
                     71: }
                     72: # strip double slashes
                     73: $docdir = sstrip($docdir, 1);
                     74: if (! -d $docdir) {
                     75:     logger("ABORT", "document directory \'$docdir\' doesn't exist!");
                     76:     exit 1;
                     77: }
                     78: 
                     79: 
                     80: #######################################################
                     81: # subroutines
                     82: #
                     83: 
                     84: #
                     85: # sets access tag to given access_type
                     86: # removes access tag if access_type is empty
                     87: #
                     88: sub change_access {
                     89:     my ($access_type, $index_root) = @_;
                     90: 
                     91:     my $parent_tag = $index_root->findnodes('//meta/access-conditions')->get_node(1);
                     92:     if ($parent_tag) {
                     93:    my $access_tag = $parent_tag->findnodes('access')->get_node(1);
1.2       casties    94:    # remove access tag if it exists
1.1       casties    95:    if ($access_tag) {
                     96:        $parent_tag->removeChild($access_tag);
                     97:    }
                     98:     } else {
                     99:    $parent_tag = create_element_path('meta/access-conditions', $index_root, $namespace);
                    100:     }
                    101: 
1.2       casties   102:     # add new access tag (if $access_Type is not empty)
1.1       casties   103:     if ($access_type eq "free") {
                    104:    create_element_path('access@type=free', $parent_tag, $namespace);
                    105:     } elsif (length $access_type > 0) {
                    106:    my $acc_tag = create_element_path('access@type=institution', $parent_tag, $namespace);
                    107:    create_text_path('name', $access_type, $acc_tag, $namespace);
                    108:     }
                    109:     $xml_changed++
                    110: }
                    111: 
1.4       casties   112: #
                    113: # sets derived-from tag to given value
                    114: # removes tag if derived_from is empty
                    115: #
                    116: sub change_derived {
                    117:     my ($derived_from, $index_root) = @_;
                    118: 
                    119:     my $derived_tag = $index_root->findnodes('derived-from')->get_node(1);
                    120:     # remove derived tag if it exists
                    121:     if ($derived_tag) {
                    122:         $index_root->removeChild($derived_tag);
                    123:     }
                    124: 
                    125:     # add new derived tag (if $derived_Type is not empty)
                    126:     if (length $derived_from > 0) {
                    127:    create_text_path('derived-from/archive-path', $derived_from, $index_root, $namespace);
                    128:     }
                    129:     $xml_changed++
                    130: }
                    131: 
                    132: #
                    133: # sets production-comment tag to given value
                    134: # removes production tag if production_comment is empty
                    135: #
                    136: sub change_production {
                    137:     my ($production_comment, $index_root) = @_;
                    138: 
                    139:     my $parent_tag = $index_root->findnodes('//meta/image-acquisition')->get_node(1);
                    140:     if ($parent_tag) {
                    141:    my $production_tag = $parent_tag->findnodes('production-comment')->get_node(1);
                    142:    # remove production tag if it exists
                    143:    if ($production_tag) {
                    144:        $parent_tag->removeChild($production_tag);
                    145:    }
                    146:     } else {
                    147:    $parent_tag = create_element_path('meta/image-acquisition', $index_root, $namespace);
                    148:     }
                    149: 
                    150:     # add new production tag (if $production_comment is not empty)
                    151:     if (length $production_comment > 0) {
                    152:    create_text_path('production-comment', $production_comment, $parent_tag, $namespace);
                    153:     }
                    154:     $xml_changed++
                    155: }
                    156: 
1.1       casties   157: 
                    158: 
                    159: 
                    160: 
                    161: 
                    162: 
                    163: #######################################################
                    164: # Main
                    165: #
                    166: 
                    167: my $index_doc;
                    168: my $index_root;
                    169: 
                    170: # load index.meta file
                    171: if (-f "$docdir/index.meta") {
                    172:     ($index_doc, $index_root) = read_xml("$docdir/index.meta");
                    173: } else {
                    174:     logger("ABORT", "index file \'$docdir/index.meta\' doesn't exist!");
                    175:     exit 1;
                    176: }
                    177: 
                    178: if ($access_type) {
1.2       casties   179:     change_access($access_type, $index_root);
1.1       casties   180: }
1.4       casties   181: if ($derived_from) {
                    182:     change_derived($derived_from, $index_root);
                    183: }
                    184: if ($production_comment) {
                    185:     change_production($production_comment, $index_root);
                    186: }
1.1       casties   187: 
                    188: 
                    189: logger("INFO", "$warncnt warnings");
                    190: logger("INFO", "$errcnt errors");
                    191: if ($errcnt > 0) {
                    192:     logger("ABORT", "there were errors!");
                    193:     exit 1;
                    194: } elsif ($xml_changed) {
                    195:     # write new index.meta file
                    196:     if ($dry_run) {
                    197:    logger('DEBUG', "would write $docdir/index.meta");
                    198:    logger('DEBUG', $index_doc->toString(1));
                    199:     } else {
1.2       casties   200:    write_xml($index_doc, "$docdir/index.meta");
1.1       casties   201:     }
                    202:     logger("DONE", "changed index file successfully!");
                    203: } else {
                    204:     logger("DONE", "didn't change index file");
                    205: }
                    206: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>