/*! @header FTImport @abstract Module of FT @availability OS X, GNUstep @copyright 2004, 2005, 2006 Free Software Foundation, Inc. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  -------------------------------------------------------------------------
  Modification history

  27.07.06 ola     initial version
  23.08.06 ola     license changed
  -------------------------------------------------------------------------
  
*/ #include #include @implementation FTImport + (ECLogger *) log { return [ECLogging loggerForContext: @"FTImport"]; } - init { self = [super init]; self->login = nil; self->passwd = nil; self->targetGraphName = nil; self->sourceGraphName = nil; self->sourceBaseDirectory = nil; self->defaultRule = nil; self->output = [[ECStandardOutput alloc] init]; return self; } - (void) dealloc { [self->login release]; [self->passwd release]; [self->targetGraphName release]; [self->sourceGraphName release]; [self->sourceBaseDirectory release]; [self->output release]; [self->defaultRule release]; [super dealloc]; } - (BOOL) cmdLineArgumentsOK { BOOL gotSourceGraphName = NO; BOOL gotSourceDirectory = NO; BOOL gotNewGraphname = NO; BOOL gotLogin = NO; BOOL gotPasswd = NO; NSString *arg; NSEnumerator *arguments = [[[NSProcessInfo processInfo] arguments] objectEnumerator]; while( (arg = [arguments nextObject]) ) { if( [arg isEqualToString: @"-newGraphname"] ) { self->targetGraphName = [arguments nextObject]; gotNewGraphname = YES; continue; } else if( [arg isEqualToString: @"-sourceGraphName"] ) { self->sourceGraphName = [arguments nextObject]; gotSourceGraphName = YES; continue; } else if( [arg isEqualToString: @"-sourceBaseDirectory"] ) { self->sourceBaseDirectory = [arguments nextObject]; gotSourceDirectory = YES; continue; } else if( [arg isEqualToString: @"-login"] ) { self->login = [arguments nextObject]; gotLogin = YES; continue; } else if( [arg isEqualToString: @"-password"] ) { self->passwd = [arguments nextObject]; gotPasswd = YES; } } return gotSourceDirectory && gotSourceDirectory && gotNewGraphname && gotLogin && gotPasswd && gotSourceGraphName ; } #define _argumentsOverview \ @"\nCommand line parameters:\n"\ "\t-configFile \n\t\tFT configuration file\n"\ "\t-configFile \n\t\tConfiguration file for the "\ "server\n"\ "\t-sourceGraphName \n\t\tName of exported graph (physically the"\ " name of the directory where the exported\n\t\tcontent relies in. This "\ "directory is relative to \n"\ "\t-sourceBaseDirectory \n\t\tBase directory from where to "\ "start the import\n"\ "\t-newGraphname \n\t\tName of graph to be created during "\ "import\n"\ "\t-login \n\t\tlogin account with sufficient rights\n"\ "\t-password \n\t\tpassword of the specified login" - cmdLineArgumentsOverview { [self->output writeString: _argumentsOverview]; return self; } - (BOOL) fileSpecificationsOK { BOOL toReturn = NO; BOOL directoryExists; NSFileManager *fileMgr = [NSFileManager defaultManager]; if( ![fileMgr fileExistsAtPath: self->sourceBaseDirectory isDirectory: &directoryExists] ) { directoryExists = NO; } if( !directoryExists ) { [self->output writeString: [NSString stringWithFormat: @"Source base directory does not exist: %@", self->sourceBaseDirectory]]; toReturn = NO; } else { if( ![fileMgr fileExistsAtPath: [NSString stringWithFormat: @"%@/%@", self->sourceBaseDirectory, self->sourceGraphName]] ) { [self->output writeString: [NSString stringWithFormat: @"Source XML file does not exist: %@", self->sourceGraphName]]; toReturn = NO; } else { toReturn = YES; } } return toReturn; } - (BOOL) graphDoesNotExist { BOOL toReturn = NO; EC_AUTORELEASEPOOL_BEGIN id objectToIdMapper; id graphManager; id graph; objectToIdMapper = [[self session] defaultObjectToIdMapper]; graphManager = [[self session] graphManager]; graph = [graphManager graphWithId: [objectToIdMapper mapObject: self->targetGraphName]]; if( nil != graph ) { [graph close]; [self->output writeString: [NSString stringWithFormat: @"Graph already exists with id=%@", self->targetGraphName]]; toReturn = NO; } else { toReturn = YES; } EC_AUTORELEASEPOOL_END return toReturn; } - installParsingRule: (FTImportDefaultXMLRule *) aRule usingXMLControl: (ECXMLControl *) control { ECXMLControlRuleSelector *ruleSelector; ECXMLControlDelegateMessageRule *delegationRule; [control enableDefaultRules: NO]; ruleSelector = [control ruleSelector]; delegationRule = [[[ECXMLControlDelegateMessageRule alloc] initWithDelegationTarget: aRule selectorToCall: @selector(addGraphForEvent:) forXMLElementTypename: @"FTExport"] autorelease]; [ruleSelector addRule: delegationRule forEvent: [ECXMLControlEvent eventId_elementStarted]]; delegationRule = [[[ECXMLControlDelegateMessageRule alloc] initWithDelegationTarget: aRule selectorToCall: @selector(addNodeIdForEvent:) forXMLElementTypename: @"node"] autorelease]; [ruleSelector addRule: delegationRule forEvent: [ECXMLControlEvent eventId_elementStarted]]; delegationRule = [[[ECXMLControlDelegateMessageRule alloc] initWithDelegationTarget: aRule selectorToCall: @selector(addNodeReference:) forXMLElementTypename: @"reference"] autorelease]; [ruleSelector addRule: delegationRule forEvent: [ECXMLControlEvent eventId_elementStarted]]; delegationRule = [[[ECXMLControlDelegateMessageRule alloc] initWithDelegationTarget: aRule selectorToCall: @selector(addNodeReferenceList:) forXMLElementTypename: @"nodeReferenceList"] autorelease]; [ruleSelector addRule: delegationRule forEvent: [ECXMLControlEvent eventId_elementStarted]]; delegationRule = [[[ECXMLControlDelegateMessageRule alloc] initWithDelegationTarget: aRule selectorToCall: @selector(addServiceData:) forXMLElementTypename: @"nodeServiceData"] autorelease]; [ruleSelector addRule: delegationRule forEvent: [ECXMLControlEvent eventId_elementStarted]]; delegationRule = [[[ECXMLControlDelegateMessageRule alloc] initWithDelegationTarget: aRule selectorToCall: @selector(addServiceDataItem:) forXMLElementTypename: @"dataItem"] autorelease]; [ruleSelector addRule: delegationRule forEvent: [ECXMLControlEvent eventId_elementStarted]]; return self; } - (ECLogger *) log { return [FTImport log]; } - run { NSString *sourceXMLFilename; ECXMLControl *xmlControl; NSArray *xmlFiles; int i; if( ![self fileSpecificationsOK] ) { return self; } [self startServerUsingLogin: self->login usingPassword: self->passwd]; if( [[FTImport log] isInfoEnabled] ) { [[FTImport log] info: @"Server started. Now checking existence of graph..."]; } if( ![self graphDoesNotExist] ) { return self; } NS_DURING EC_AUTORELEASEPOOL_BEGIN xmlFiles = [NSArray arrayWithObjects: @"graph.xml", @"nodes.xml", @"references.xml", @"serviceData.xml", nil]; self->defaultRule = [[FTImportDefaultXMLRule alloc] initForImport: self]; for( i = 0; i < [xmlFiles count]; i++ ) { EC_AUTORELEASEPOOL_BEGIN sourceXMLFilename = [NSString stringWithFormat: @"%@/%@/%@", self->sourceBaseDirectory, self->sourceGraphName, [xmlFiles objectAtIndex: i]]; if( [[FTImport log] isInfoEnabled] ) { [[FTImport log] info: @"Interpreting source XML file: %@", sourceXMLFilename]; } xmlControl = [[[ECXMLControl alloc] initWithContentsOfURL: [[[NSURL alloc] initFileURLWithPath: sourceXMLFilename ] autorelease]] autorelease]; [self installParsingRule: self->defaultRule usingXMLControl: xmlControl]; [xmlControl parseXML]; EC_AUTORELEASEPOOL_END } EC_AUTORELEASEPOOL_END NS_HANDLER [self->defaultRule releaseResources]; [self->defaultRule release]; self->defaultRule = nil; [self closeSessionAndStopServer]; [localException raise]; NS_ENDHANDLER [self->defaultRule releaseResources]; [self->defaultRule release]; self->defaultRule = nil; [self closeSessionAndStopServer]; return self; } - (NSString *) sourceBaseDirectory { return [NSString stringWithFormat: @"%@/%@", self->sourceBaseDirectory, self->sourceGraphName]; } - (NSString *) targetGraphName { return self->targetGraphName; } @end int main( int argc, char *argv[] ) { EC_AUTORELEASEPOOL_BEGIN FTImport *importTool; NSLog( @"FTImport Version %@", FTIMPORT_VERSION ); importTool = [[[FTImport alloc] init] autorelease]; [FTAbstractTool startTool: importTool]; EC_AUTORELEASEPOOL_END exit( 0 ); }