--- nfo/perl/libs/Data/Transfer/Sync/API.pm 2003/01/19 01:23:04 1.1 +++ nfo/perl/libs/Data/Transfer/Sync/API.pm 2003/01/20 16:59:48 1.2 @@ -1,4 +1,4 @@ -## $Id: API.pm,v 1.1 2003/01/19 01:23:04 joko Exp $ +## $Id: API.pm,v 1.2 2003/01/20 16:59:48 joko Exp $ ## ## Copyright (c) 2002 Andreas Motl ## @@ -6,34 +6,37 @@ ## ## ---------------------------------------------------------------------------------------- ## $Log: API.pm,v $ +## Revision 1.2 2003/01/20 16:59:48 joko +## + cosmetics and debugging +## ## Revision 1.1 2003/01/19 01:23:04 joko ## + new from Data/Transfer/Sync.pm ## ## ---------------------------------------------------------------------------------------- -package Data::Transfer::Sync::API; - +package Data::Transfer::Sync::API; + use strict; use warnings; - + use mixin::with qw( Data::Transfer::Sync ); - + # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - main - -use Data::Dumper; - + +use Data::Dumper; + use Data::Compare::Struct qw( getDifference isEmpty ); use Data::Transform::Deep qw( merge ); - + # get logger instance my $logger = Log::Dispatch::Config->instance; - + sub _init { my $self = shift; } - + sub checkOptions { my $self = shift; my $opts = shift; @@ -55,7 +58,7 @@ return $result; } - + sub checkOptionsV2 { my $self = shift; @@ -81,7 +84,7 @@ } - + sub prepareOptions { my $self = shift; @@ -175,7 +178,7 @@ return 1; } - + sub prepareOptionsV2 { my $self = shift; @@ -193,7 +196,7 @@ } # inform user about option preparation - $logger->notice( __PACKAGE__ . "->prepareOptionsV2( mode='$opts->{process}->{mode}', source->node='$opts->{source}->{nodeName}', target->node='$opts->{target}->{nodeName}', erase='$opts->{process}->{erase}', prepare='$opts->{process}->{prepare}' )"); + $logger->notice( __PACKAGE__ . "->prepareOptionsV2( source.node='$opts->{source}->{nodeName}', target.node='$opts->{target}->{nodeName}', mode='$opts->{process}->{mode}', e='$opts->{process}->{erase}', p='$opts->{process}->{prepare}' )"); # try to load mapping-metadata-container #my $mapObject = getNewPerlObjectByPkgName($opts->{map}->{moduleName}); @@ -240,8 +243,8 @@ return 1; } - - + + sub configure { my $self = shift; my @args = @_; @@ -278,8 +281,23 @@ $self->{state}->{configured} = 1; return 1; } - - + +sub _getDirectedArrow { + my $self = shift; + my $mode = shift; + $mode ||= ''; + + if (lc $mode eq 'push') { + return '->'; + } elsif (lc $mode eq 'pull') { + return '<-'; + } elsif (lc $mode eq 'full') { + return '<->'; + } else { + return ''; + } +} + # TODO: some feature to show off the progress of synchronization (cur/max * 100) sub syncNodes { @@ -300,53 +318,55 @@ $self->{meta} = {}; # hash to sum up results - my $direction_arrow = ''; + # TODO: re-implement! (sync-statistics???) # detect synchronization method to determine which optical symbol (directed arrow) to use - if (lc $self->{args}->{direction} eq 'push') { - $direction_arrow = '->'; - } elsif (lc $self->{args}->{direction} eq 'pull') { - $direction_arrow = '<-'; - } elsif (lc $self->{args}->{direction} eq 'full') { - $direction_arrow = '<->'; - } else { - } + my $mode = $self->{args}->{mode}; # V1 + $mode ||= $self->{options}->{process}->{mode}; # V2 + my $direction_arrow = $self->_getDirectedArrow($mode); - print Dumper($self); - #exit; - - if (!$self->{metadata}->{version} || $self->{metadata}->{version} < 0.2) { + if (!$self->{options}->{metadata}->{version} || $self->{options}->{metadata}->{version} < 0.2) { $self->_buildMetadataV1(); } else { - $self->_buildMetadataV1(); - #$self->_buildMetadataV2(); + $self->_buildMetadataV2(); } + $logger->info( __PACKAGE__ . "->syncNodes: source=$self->{meta}->{source}->{dbKey}/$self->{meta}->{source}->{nodeName} [$self->{meta}->{source}->{nodeType}] $direction_arrow target=$self->{meta}->{target}->{dbKey}/$self->{meta}->{target}->{nodeName} [$self->{meta}->{target}->{nodeType}]" ); + + return if !$self->_buildFieldmappingV1(); + return if !$self->_handleNodeContainers(); + return if !$self->_prepareSync(); + #print Dumper($self); +#print Dumper($self->{args}); +#print Dumper($self->{options}); #print Dumper($self->{meta}); +#print Dumper($self->{metadata}); + + $self->_syncNodes(); + +} - $logger->info( __PACKAGE__ . "->syncNodes: source=$self->{meta}->{source}->{dbkey}/$self->{meta}->{source}->{node} $direction_arrow target=$self->{meta}->{target}->{dbkey}/$self->{meta}->{target}->{node}" ); - $self->_buildFieldmappingV1(); +sub _handleNodeContainers { + my $self = shift; -#print Dumper($self->{meta}); - # check partners/nodes: does partner exist / is node available? foreach my $partner (keys %{$self->{meta}}) { # 1. check partners & storages if (!$self->{meta}->{$partner}) { - $logger->critical( __PACKAGE__ . "->syncNodes: Could not find partner '$partner' in configuration metadata." ); - return; + $logger->critical( __PACKAGE__ . "->_handleNodeContainers: Could not find partner '$partner' in configuration metadata." ); + next; } - my $dbkey = $self->{meta}->{$partner}->{dbkey}; + my $dbkey = $self->{meta}->{$partner}->{dbKey}; #print Dumper($self->{meta}); if (!$self->{meta}->{$partner}->{storage}) { - $logger->critical( __PACKAGE__ . "->syncNodes: Could not access storage of partner '$partner' (named '$dbkey'), looks like a configuration-error." ); - return; + $logger->critical( __PACKAGE__ . "->_handleNodeContainers: Could not access storage ( partner='$partner', dbKey='$dbkey' ) - configuration-error?" ); + next; } # TODO: @@ -364,12 +384,13 @@ # print Dumper($self); #print Dumper($self->{meta}->{$partner}); #print "öö", $self->{meta}->{$partner}->{node}, "\n"; - my $nodename = $self->{meta}->{$partner}->{node}; + my $nodename = $self->{meta}->{$partner}->{node}; # V1 + $nodename ||= $self->{meta}->{$partner}->{nodeName}; # V2 # check if nodename is actually a CODEref, execute it to get a mapped/filtered target-nodename #print "nodename: $nodename", "\n"; - $logger->info( __PACKAGE__ . "->syncNodes: Accessing dbType=\"$dbType\", nodename=\"$nodename\"." ); + $logger->debug( __PACKAGE__ . "->_handleNodeContainers: Accessing dbType=\"$dbType\", nodename=\"$nodename\"." ); =pod #print "----", ref $nodename, "\n"; @@ -379,21 +400,41 @@ $nodename = $nodename->($nodename); } =cut + +#print Dumper($self); + + #print "partner: $partner - nodename: $nodename", "\n"; if (!$self->{meta}->{$partner}->{storage}->existsChildNode($nodename)) { - $logger->critical( __PACKAGE__ . "->syncNodes: Could not reach node \"$nodename\" at partner \"$partner\"." ); - return; +#print "ex", "\n"; +#exit; + + if ($partner eq 'target' && $self->{options}->{target}->{autocreateFolders}) { + if (!$self->{meta}->{$partner}->{storage}->createChildNode($nodename)) { + $logger->critical( __PACKAGE__ . "->_handleNodeContainers: Could not create node '$self->{meta}->{$partner}->{nodeName}\@$self->{meta}->{$partner}->{dbKey}' [$self->{meta}->{$partner}->{nodeType}]." ); + next; + } + } else { + $logger->critical( __PACKAGE__ . "->_handleNodeContainers: Could not reach node \"$nodename\" at partner \"$partner\"." ); + next; + } } } + + return 1; + +} + + +sub _prepareSync { + my $self = shift; # TODO: # + if action == PUSH: start processing # -+ if action == PULL: swap metadata and start processing # - if action == FULL: start processing, then swap metadata and (re-)start processing -#print Dumper($self->{args}); - # manipulate metainfo according to direction of synchronization if (lc $self->{args}->{direction} eq 'push') { # just do it ... @@ -422,8 +463,8 @@ #print "ERASE", "\n"; $self->_erase_all('target'); } - - $self->_syncNodes(); + + return 1; }