/[cvs]/nfo/perl/libs/Data/Transfer/Sync/API.pm
ViewVC logotype

Diff of /nfo/perl/libs/Data/Transfer/Sync/API.pm

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.9 by joko, Tue May 13 08:16:44 2003 UTC revision 1.10 by joko, Sat Jun 19 01:43:03 2004 UTC
# Line 9  Line 9 
9  ##  ##
10  ## -------------------------------------------------------------------------  ## -------------------------------------------------------------------------
11  ##    $Log$  ##    $Log$
12    ##    Revision 1.10  2004/06/19 01:43:03  joko
13    ##    code from _prepareOptions now split into _prepareMap and _mergeOptions
14    ##
15  ##    Revision 1.9  2003/05/13 08:16:44  joko  ##    Revision 1.9  2003/05/13 08:16:44  joko
16  ##    minor update: modified header  ##    minor update: modified header
17  ##  ##
# Line 136  sub readArguments { Line 139  sub readArguments {
139          dbKey => $self->{args_raw}->{source},          dbKey => $self->{args_raw}->{source},
140          nodeType => $self->{args_raw}->{'source-type'},          nodeType => $self->{args_raw}->{'source-type'},
141          nodeName => $self->{args_raw}->{'source-node'},          nodeName => $self->{args_raw}->{'source-node'},
142            ident => $self->{args_raw}->{'source-ident'},
143        },        },
144        target => {        target => {
145          dbKey => $self->{args_raw}->{target},          dbKey => $self->{args_raw}->{target},
# Line 384  sub _prepareOptions { Line 388  sub _prepareOptions {
388    # inform user about option preparation    # inform user about option preparation
389    $logger->debug( __PACKAGE__ . "->_prepareOptions( source.node='$opts->{source}->{nodeName}', target.node='$opts->{target}->{nodeName}', mode='$opts->{process}->{mode}', e='$opts->{process}->{erase}', p='$opts->{process}->{prepare}' )");    $logger->debug( __PACKAGE__ . "->_prepareOptions( source.node='$opts->{source}->{nodeName}', target.node='$opts->{target}->{nodeName}', mode='$opts->{process}->{mode}', e='$opts->{process}->{erase}', p='$opts->{process}->{prepare}' )");
390    
391    # try to load mapping-metadata-container    my $map = {};
392      # How? Create a new instance of the given    $map = $self->_prepareMap($opts) if not $opts->{process}->{prepare};
393      # perl module/package name in ->{...}->{moduleName}.    #$map = $self->_prepareMap($opts);
394      # This instance is used later in the innards of the sync,  
395      # that's why the module (class) should have a certain layout    # merge all together
396      # enabling the core to use it for gathering metadata while processing.    $self->_mergeOptions($opts, $map);
397      my $mapObject = DesignPattern::Object->fromPackage($opts->{map}->{moduleName});    #print Dumper($self->{options});
398    
399    # try to resolve map from metadata-container    $self->{state}->{options_ready} = 1;
400    
401      # type of the item/node    return 1;
     my $source_nodeType = $opts->{source}->{nodeType};  
       
     # check if mapping for certain node is contained in mapping object  
     if (!$mapObject || !$mapObject->can($source_nodeType)) {  
       $logger->warning( __PACKAGE__ . "->_prepareOptions: Can't access mapping for source-type=\"$source_nodeType\" - please check \"$opts->{map}->{moduleName}\".");  
       return;  
     }  
402    
403      # get map  }
404      my $map = $mapObject->$source_nodeType;  
405      #print Dumper($map);  sub _prepareMap {
406      my $self = shift;
407      my $opts = shift;
408        
409      my $map_version = $map->{metadata}->{version};    # 1. try to load mapping-metadata-container
410      # FIXME: backward compatibility    
411      if (!$map_version) {    # How? Create a new instance of the given
412        $self->options_to_V2($map);    # perl module/package name in ->{...}->{moduleName}.
413      }    # This instance is used later in the innards of the sync,
414      # that's why the module (class) should have a certain layout
415      # enabling the core to use it for gathering metadata while processing.
416      my $mapObject = DesignPattern::Object->fromPackage($opts->{map}->{moduleName});
417    
     # trace  
       #print Dumper($map);  
       #exit;  
       #print "ref: ", ref $map->{target}, "\n";  
       #print "target: ", $map->{target}, "\n";  
       
     # check here if "target" is actually a CODEref - in this case: resolve it - deprecated!!! ???  
     if (ref $map->{target}->{address} eq 'CODE') {  
       $map->{target}->{address} = $map->{target}->{address}->($source_nodeType);  
     }  
       
     # resolve expressions (on nodename-level) here  
     elsif ($map->{target}->{address} =~ m/^(code|expr):(.+?)$/) {  
       my $target_dynamic_type = $1;  
       my $target_dynamic_expression = $2;  
       if (lc $target_dynamic_type eq 'code') {  
         $map->{target} = $mapObject->$target_dynamic_expression($map);  
       }  
     }  
418    
419    # merging - V1    # 2. try to resolve map from metadata-container
420      #map { $opts->{$_} = $map->{$_}; } keys %$map;  
421      # trace    # type of the item/node
422        #print Dumper($self->{options});    my $source_nodeType = $opts->{source}->{nodeType};
423        
424    # merging - V2    # check if mapping for certain node is contained in mapping object
425      if (!$mapObject || !$mapObject->can($source_nodeType)) {
426        $logger->warning( __PACKAGE__ . "->_prepareOptions: Can't access mapping for source-type=\"$source_nodeType\" - please check \"$opts->{map}->{moduleName}\".");
427        return;
428      }
429    
430      # merge local map with local opts    # get map
431          my $map = $mapObject->$source_nodeType;
432        # delete undef'd items in $map    #print Dumper($map);
433        
434        # enable cloning    my $map_version = $map->{metadata}->{version};
435        # FIXME: do we really need cloning here? trade safety/encapsulation for speed?    # FIXME: backward compatibility
436        Hash::Merge::set_clone_behavior(1);    if (!$map_version) {
437        Hash::Merge::set_behavior( 'RIGHT_PRECEDENT' );      $self->options_to_V2($map);
438        #Hash::Merge::set_behavior( 'STORAGE_PRECEDENT' );    }
       #Hash::Merge::set_behavior( 'RETAINMENT_PRECEDENT' );  
       # TODO: add an option to Hash::Merge not to overwrite set items with undefined/empty/not assigned ones  
       my $locals_merged = merge( $opts, $map );  
   
     # trace  
       #print Dumper($opts);  
       #print Dumper($map);  
       #print Dumper($locals_merged);  
       #exit;  
439    
440      # merge local-merged ones with instance-wide options    # trace
441        Hash::Merge::set_clone_behavior(0);      #print Dumper($map);
442        $self->{options} = merge( $self->{options}, $locals_merged );      #exit;
443        #print "ref: ", ref $map->{target}, "\n";
444        #print "target: ", $map->{target}, "\n";
445        
446      # trace    # check here if "target" is actually a CODEref - in this case: resolve it - deprecated!!! ???
447        #print Dumper($self->{options});    if (ref $map->{target}->{address} eq 'CODE') {
448        #exit;      $map->{target}->{address} = $map->{target}->{address}->($source_nodeType);
449      }
450        
451      # resolve expressions (on nodename-level) here
452      elsif ($map->{target}->{address} =~ m/^(code|expr):(.+?)$/) {
453        my $target_dynamic_type = $1;
454        my $target_dynamic_expression = $2;
455        if (lc $target_dynamic_type eq 'code') {
456          $map->{target} = $mapObject->$target_dynamic_expression($map);
457        }
458      }
459      
460      return $map;
461      
462    }
463    
464    $self->{state}->{options_ready} = 1;  sub _mergeOptions {
465      my $self = shift;
466      my $opts = shift;
467      my $map = shift;
468    
469    return 1;    # 1. merge local map with local opts
470      
471      # delete undef'd items in $map
472    
473      # enable cloning
474      # FIXME: do we really need cloning here? trade safety/encapsulation for speed?
475      Hash::Merge::set_clone_behavior(1);
476      Hash::Merge::set_behavior( 'RIGHT_PRECEDENT' );
477      #Hash::Merge::set_behavior( 'STORAGE_PRECEDENT' );
478      #Hash::Merge::set_behavior( 'RETAINMENT_PRECEDENT' );
479      # TODO: add an option to Hash::Merge not to overwrite set items with undefined/empty/not assigned ones
480      my $locals_merged = merge( $opts, $map );
481    
482      # 2. merge local-merged ones with instance-wide options
483      Hash::Merge::set_clone_behavior(0);
484      $self->{options} = merge( $self->{options}, $locals_merged );
485  }  }
486    
   
487  sub _preCheckOptions {  sub _preCheckOptions {
488    
489    my $self = shift;    my $self = shift;
# Line 484  sub _preCheckOptions { Line 493  sub _preCheckOptions {
493      #print Dumper($opts);      #print Dumper($opts);
494      #exit;      #exit;
495            
496    if (!$opts->{process}->{mode}) {    if (!$opts->{process}->{mode} and !$opts->{process}->{prepare}) {
497      $logger->error( __PACKAGE__ . "->_preCheckOptions failed: Please specify \"--action=(load|save)\".");      $logger->error( __PACKAGE__ . "->_preCheckOptions failed: Please specify \"--action=(load|save)\" or \"--prepare\".");
498      return;      return;
499    }    }
500    
# Line 505  sub _preCheckOptions { Line 514  sub _preCheckOptions {
514      $logger->warning( __PACKAGE__ . "->_preCheckOptions: No mapping supplied - please check key 'map|mappings' in global configuration or specify additional argument '--mapping-module'.");      $logger->warning( __PACKAGE__ . "->_preCheckOptions: No mapping supplied - please check key 'map|mappings' in global configuration or specify additional argument '--mapping-module'.");
515      return;      return;
516    }    }
517    if (!$opts->{map}->{moduleName}) {    if (!$opts->{map}->{moduleName} and !$opts->{process}->{prepare}) {
518      $logger->warning( __PACKAGE__ . "->_preCheckOptions: Currently only perl-modules can provide mappings: Please specify one with '--mapping-module=My::Mapping::Module'.");      $logger->warning( __PACKAGE__ . "->_preCheckOptions: Currently only perl-modules can provide mappings: Please specify one with '--mapping-module=My::Mapping::Module'.");
519      return;      return;
520    }    }
# Line 554  sub _prepare_sync { Line 563  sub _prepare_sync {
563    if ($self->{options}->{process}->{prepare}) {    if ($self->{options}->{process}->{prepare}) {
564      $self->_prepareNode_MetaProperties('source');      $self->_prepareNode_MetaProperties('source');
565      $self->_prepareNode_DummyIdent('source');      $self->_prepareNode_DummyIdent('source');
566      #return;      return;
567      #$self->_erase_all($opts->{source_node});      #$self->_erase_all($opts->{source_node});
568    }    }
569        

Legend:
Removed from v.1.9  
changed lines
  Added in v.1.10

MailToCvsAdmin">MailToCvsAdmin
ViewVC Help
Powered by ViewVC 1.1.26 RSS 2.0 feed