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

  28.09.05 ola     initial version
  23.08.06 ola     license changed
  -------------------------------------------------------------------------
  
*/ #include #include #include #include @implementation FTDefaultServiceManagerImpl - initWithServer: (FTServerImpl *) aServer { self = [super init]; self->serviceIdToServiceLoader = [[NSMutableDictionary alloc] init]; self->rwLock = [[NSLock alloc] init]; self->server = [aServer retain]; return self; } - (void) dealloc { if( nil != self->serviceIdToServiceLoader ) { [self->serviceIdToServiceLoader release]; } if( nil != self->rwLock ) { [self->rwLock release]; } if( nil != self->server ) { [self->server release]; } [super dealloc]; } - (id ) allServicesForGraph: (id ) aGraph { return [self allServicesForNode: nil ofGraph: aGraph]; } - (id ) allServicesForNode: (id ) aNode ofGraph: (id ) aGraph { NSMutableArray *availServices = [[[NSMutableArray alloc] init] autorelease]; NSArray *allServices; int i; ECArrayIterator *toReturn; BOOL isAvailable; BOOL checkForNode = nil != aNode; EC_AUTORELEASEPOOL_BEGIN allServices = [self->serviceIdToServiceLoader allValues]; for( i = 0; i < [allServices count]; i++ ) { id availability; NS_DURING availability = [[allServices objectAtIndex: i] serviceAvailability]; if( checkForNode ) { isAvailable = [availability availableForNode: aNode ofGraph: aGraph]; } else { isAvailable = [availability availableForGraph: aGraph]; } if( isAvailable ) { if( checkForNode ) { [availServices addObject: [[allServices objectAtIndex: i ] serviceForNode: aNode ofGraph: aGraph]]; } else { [availServices addObject: [[allServices objectAtIndex: i ] serviceForGraph: aGraph]]; } } NS_HANDLER //ignore this exception and proceed NS_ENDHANDLER } toReturn = [[ECArrayIterator alloc] initWithArray: availServices]; EC_AUTORELEASEPOOL_END return toReturn; } - registerServiceWithId: (NSString *) serviceId withVersion: (id ) serviceVersion withServiceLoader: (id ) serviceLoader { id tmp; EC_AUTORELEASEPOOL_BEGIN [self rwLock]; tmp = [self->serviceIdToServiceLoader objectForKey: serviceId]; if( nil != tmp ) { if( [[tmp serviceVersion] isEqual: serviceVersion] ) { [self rwUnlock]; [[[ECAlreadyExistsException alloc] initWithResourceInformation: [[NSString alloc] initWithFormat: @"Service \"%@\" already exists "\ "with service id=\"%@\" and version=\"%@\"", tmp, serviceId, serviceVersion]] raise]; } else { [self unregisterAllVersionsOfServiceWithId: serviceId]; tmp = nil; } } [self->serviceIdToServiceLoader setObject: serviceLoader forKey: serviceId]; [serviceLoader setEnvironment: [[FTDefaultServiceEnvironment alloc] initWithServer: self->server]]; [self rwUnlock]; EC_AUTORELEASEPOOL_END return self; } - rwLock { [self->rwLock lock]; return self; } - rwUnlock { [self->rwLock unlock]; return self; } - (id ) serviceWithId: (NSString *) aServiceId forGraph: (id ) aGraph { return [self serviceWithId: aServiceId forGraph: aGraph forNode: nil]; } - (id ) serviceWithId: (NSString *) aServiceId forGraph: (id ) aGraph forNode: (id ) aNode { id toReturn = nil; id serviceLoader = [self->serviceIdToServiceLoader objectForKey: aServiceId]; NS_DURING if( nil != serviceLoader ) { if( nil != aNode ) { toReturn = [serviceLoader serviceForNode: aNode ofGraph: aGraph]; } else { toReturn = [serviceLoader serviceForGraph: aGraph]; } } NS_HANDLER //ignore it NS_ENDHANDLER return toReturn; } - switchAllServicesToMode: (ft_serviceMode_t) serviceMode { NSEnumerator *serviceLoaders = [serviceIdToServiceLoader objectEnumerator]; id current; EC_AUTORELEASEPOOL_BEGIN while( (current = [serviceLoaders nextObject]) ) { NS_DURING if( [[FTLogging coreLog] isDebugEnabled] ) { [[FTLogging coreLog] debug: @"FTDefaultServiceManagerImpl::switchAllServicesToMode: "\ "Switching mode of service: %@", current ]; } [current switchToMode: serviceMode]; NS_HANDLER [[FTLogging coreLog] error: @"FTDefaultServiceManagerImpl::switchAllServicesToMode: "\ "Switching mode of service \"%@\" FAILED! Ignoring it...", current ]; NS_ENDHANDLER } EC_AUTORELEASEPOOL_END return self; } - unregisterAllVersionsOfServiceWithId: (NSString *) serviceId { [self->serviceIdToServiceLoader removeObjectForKey: serviceId]; return self; } @end