/*! @header FTDictionaryServiceLoader @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

  21.09.05 ola     initial version
  16.07.06 ola     new implementation
  23.08.06 ola     license changed
  -------------------------------------------------------------------------
  
*/ #include #include #include #include #include #include "FTDictionaryServiceForGraphImpl.h" #include #define __VERSION_MAJOR 0 #define __VERSION_MINOR 2 #define __VERSION_BUILD 1 #define __VERSION_STATE FT_VERSION_SNAPSHOT #define __FTDictionaryServiceId @"FTDictionaryService" #define __FTDictionaryServiceDataDirectory @"FTDictionaryServiceData" #define __FTDictionaryIndexDB @"DictionaryIndex.db" @implementation FTDictionaryServiceLoader - init { self = [super init]; self->serviceVersion = [[FTVersionImpl alloc] initWithMajor: __VERSION_MAJOR withMinor: __VERSION_MINOR withBuild: __VERSION_BUILD asState: __VERSION_STATE]; self->serviceAvailability = [[FTDictionaryServiceAvailability alloc] init]; self->serviceEnvironment = nil; self->graphToServiceImpl = nil; self->generalLock = [[NSLock alloc] init]; return self; } - (void) dealloc { [self->generalLock release]; if( nil != self->serviceVersion ) { [self->serviceVersion release]; } if( nil != self->serviceAvailability ) { [self->serviceAvailability release]; } if( nil != self->serviceEnvironment ) { [self->serviceEnvironment release]; } [self->databaseNameScheme release]; [super dealloc]; } - (NSString *) databaseNameScheme { return self->databaseNameScheme; } - onGraphClosed: (NSNotification *) notification { FTDictionaryServiceForGraphImpl *serviceImpl; FTGraphImpl *graphImpl; unsigned cnt; graphImpl = [notification object]; if( [[FTLogging coreLog] isTraceEnabled] ) { [[FTLogging coreLog] trace: @"FTDictionaryServiceLoader::onGraphClosed"]; } serviceImpl = [[self->graphToServiceImpl objectForKey: [graphImpl graphId] incrementRefCounter: NO] retain]; NS_DURING cnt = [self->graphToServiceImpl referenceCounterOfObjectForKey: [graphImpl graphId]] ; if( nil != serviceImpl ) { [self->graphToServiceImpl decrementRefCounterForKey: [graphImpl graphId]]; cnt = [self->graphToServiceImpl referenceCounterOfObjectForKey: [graphImpl graphId]] ; if(0 == cnt ) { [[NSNotificationCenter defaultCenter] removeObserver: self]; [serviceImpl close]; } } else { [[NSNotificationCenter defaultCenter] removeObserver: self]; } NS_HANDLER [serviceImpl release]; [localException raise]; NS_ENDHANDLER [serviceImpl release]; return self; } - (id ) serviceAvailability { return self->serviceAvailability; } - (id ) serviceForGraph: (id ) aGraph { return nil; } - (id ) serviceForNode: (id ) aNode ofGraph: (id ) aGraph { FTDictionaryServiceForGraphImpl *serviceImpl; [self->generalLock lock]; serviceImpl = [self->graphToServiceImpl objectForKey: [aGraph graphId] incrementRefCounter: NO]; if( nil == serviceImpl ) { NS_DURING serviceImpl = [[FTDictionaryServiceForGraphImpl alloc] initForGraph: aGraph serviceLoader: self]; [self->graphToServiceImpl addObject: serviceImpl forKey: [aGraph graphId]]; [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(onGraphClosed:) name: FTNotification_Graph_afterClosed object: nil]; NS_HANDLER [self->generalLock unlock]; [[FTLogging coreLog] error: @"FTDictionaryServiceLoader::serviceForNode: Unable to create "\ "new dictionary service instance due to exception: %@", localException]; [localException raise]; NS_ENDHANDLER } [self->generalLock unlock]; return [serviceImpl serviceForNode: aNode]; } - (NSString *) serviceId { return __FTDictionaryServiceId; } - (id ) serviceVersion { return self->serviceVersion; } - setDatabaseNameSchema: (NSString *) aDatabaseName { [aDatabaseName retain]; [self->databaseNameScheme release]; self->databaseNameScheme = aDatabaseName; return self; } - setEnvironment: (id ) aServiceEnvironment { if( nil != self->serviceEnvironment ) { [self->serviceEnvironment release]; } self->serviceEnvironment = [aServiceEnvironment retain]; return self; } - switchToMode: (ft_serviceMode_t) aServiceMode { id allKeys; id currentService; id graphId; switch( aServiceMode ) { case FT_SERVICE_MODE_ONLINE: [self->graphToServiceImpl release]; self->graphToServiceImpl = [[ECCache alloc] init]; break; case FT_SERVICE_MODE_SHUTDOWN: /* close all dictionaries: */ allKeys = [self->graphToServiceImpl allKeys]; while( [allKeys hasNext] ) { graphId = [allKeys next]; currentService = [self->graphToServiceImpl objectForKey: [allKeys next] incrementRefCounter: NO]; NS_DURING [currentService close]; NS_HANDLER [[FTLogging coreLog] error: @"FTDictionaryServiceLoader::switchToMode: Unable to close "\ "dictionary identified by: %@", graphId]; NS_ENDHANDLER } [self->graphToServiceImpl release]; self->graphToServiceImpl = nil; break; default: [[FTLogging coreLog] error: @"FTDictionaryServiceLoader::switchToMode: "\ "Unknown mode=%u given. Ignoring it.", (unsigned) aServiceMode]; } return self; } @end @implementation FTDictionaryServiceAvailability - (BOOL) availableForGraph: (id ) aGraph { return nil != aGraph; } - (BOOL) availableForNodesOfGraph: (id ) aGraph { return nil != aGraph; } - (BOOL) availableForNode: (id ) aNode ofGraph: (id ) aGraph { return ((nil != aNode) && (nil != aGraph)); } @end