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

  17.07.06 ola     initial version
  23.08.06 ola     license changed
  -------------------------------------------------------------------------
  
*/ #include #include #include "FTDictionaryServiceForGraphImpl.h" enum _operation_id_t { _OP_UNKNOWN = 0, _OP_SET, _OP_REMOVE }; /** * definitions used for accessing variables within a transaction context */ #define __TRANS_CTX_NODE @"FTDictServ::node" #define __TRANS_CTX_KEY @"FTDictServ::key" #define __TRANS_CTX_OBJECT @"FTDictServ::object" #define __TRANS_CTX_OPERATION @"FTDictServ::operation" #define __TRANS_CTX_DICT_SERV_IMPL @"FTDictServ::dictServImpl" #define __TRANS_CTX_OPERATION_SET @"FTDictServ::_OP_SET" #define __TRANS_CTX_OPERATION_REMOVE @"FTDictServ::_OP_REMOVE" @implementation FTDictionaryServiceTransactionStepImpl + (FTDictionaryServiceTransactionStepImpl *) transactionForOperationSETOfNode: (id ) aNode withKey: (id ) aKey withObject: (id ) anObject withDictionaryServiceGraphImpl:(FTDictionaryServiceForGraphImpl *)serviceImpl transactionContext: (FTTransactionContext *) context { [context addObject: aNode forKey: __TRANS_CTX_NODE]; [context addObject: aKey forKey: __TRANS_CTX_KEY]; [context addObject: anObject forKey: __TRANS_CTX_OBJECT]; [context addObject: [NSNumber numberWithInt: _OP_SET] forKey: __TRANS_CTX_OPERATION]; [context addObject: serviceImpl forKey: __TRANS_CTX_DICT_SERV_IMPL]; FTDictionaryServiceTransactionStepImpl *transaction = [[[FTDictionaryServiceTransactionStepImpl alloc] init] autorelease]; return transaction; } + (FTDictionaryServiceTransactionStepImpl *) transactionForOperationREMOVEOfNode: (id ) aNode withKey: (id ) aKey withDictionaryServiceGraphImpl:(FTDictionaryServiceForGraphImpl *) serviceImpl transactionContext: (FTTransactionContext *) context { [context addObject: aNode forKey: __TRANS_CTX_NODE]; [context addObject: aKey forKey: __TRANS_CTX_KEY]; [context addObject: [NSNumber numberWithInt: _OP_REMOVE] forKey: __TRANS_CTX_OPERATION]; [context addObject: serviceImpl forKey: __TRANS_CTX_DICT_SERV_IMPL]; FTDictionaryServiceTransactionStepImpl *transaction = [[[FTDictionaryServiceTransactionStepImpl alloc] init] autorelease]; return transaction; } - (FTDictionaryServiceForGraphImpl *) dictServiceImplFromContext: (FTTransactionContext *) transactionContext { id toReturn = nil; toReturn = [transactionContext objectForKey: __TRANS_CTX_DICT_SERV_IMPL]; if( nil == toReturn ) { [[FTLogging coreLog] fatal:@"FTDictionaryServiceTransactionStepImpl::dictServiceImplFromContext"\ ": Unable to determine dict. service from current transaction context!"]; [[[ECIllegalStateException alloc] initWithIllegalStateInfo: @"FTDictionaryServiceTransactionStepImpl::"\ "dictServiceImplFromContext: Unable to determine dict. service from "\ "current transaction context!"] raise]; } return (FTDictionaryServiceForGraphImpl *) toReturn; } - (id ) keyFromContext: (FTTransactionContext *) transactionContext { id toReturn = nil; toReturn = [transactionContext objectForKey: __TRANS_CTX_KEY]; if( nil == toReturn ) { [[FTLogging coreLog] fatal: @"FTDictionaryServiceTransactionStepImpl::keyFromContext"\ ": Unable to determine key from current transaction context!"]; [[[ECIllegalStateException alloc] initWithIllegalStateInfo: @"FTDictionaryServiceTransactionStepImpl::"\ "keyFromContext: Unable to determine key from current "\ "transaction context!"] raise]; } return (id ) toReturn; } - (id ) nodeFromContext: (FTTransactionContext *) transactionContext { id toReturn = nil; toReturn = [transactionContext objectForKey: __TRANS_CTX_NODE]; if( nil == toReturn ) { [[FTLogging coreLog] fatal: @"FTDictionaryServiceTransactionStepImpl::nodeFromContext"\ ": Unable to determine node from current transaction context!"]; [[[ECIllegalStateException alloc] initWithIllegalStateInfo: @"FTDictionaryServiceTransactionStepImpl::"\ "nodeFromContext: Unable to determine node from current "\ "transaction context!"] raise]; } return (id ) toReturn; } - (id ) objectFromContext: (FTTransactionContext *) transactionContext { id toReturn = nil; toReturn = [transactionContext objectForKey: __TRANS_CTX_OBJECT]; if( nil == toReturn ) { [[FTLogging coreLog] fatal: @"FTDictionaryServiceTransactionStepImpl::objectFromContext"\ ": Unable to determine object from current transaction context!"]; [[[ECIllegalStateException alloc] initWithIllegalStateInfo: @"FTDictionaryServiceTransactionStepImpl::"\ "objectFromContext: Unable to determine object from current "\ "transaction context!"] raise]; } return (id ) toReturn; } - (enum _operation_id_t) operationIdFromContext: (FTTransactionContext *) transactionContext { enum _operation_id_t toReturn = _OP_UNKNOWN; id tmp; tmp = [transactionContext objectForKey: __TRANS_CTX_OPERATION]; if( nil != tmp ) { toReturn = [((NSNumber *) tmp) intValue]; } if( _OP_UNKNOWN == toReturn ) { [[FTLogging coreLog] fatal: @"FTDictionaryServiceTransactionStepImpl::operationIdFromContext"\ ": Unable to determine operation from current transaction context!"]; [[[ECIllegalStateException alloc] initWithIllegalStateInfo: @"FTDictionaryServiceTransactionStepImpl::"\ "operationIdFromContext: Unable to determine operation from current "\ "transaction context!"] raise]; } return toReturn; } - (BOOL) performAction: (FTTransactionContext *) transactionContext { BOOL success = NO; enum _operation_id_t operationId; if( [[FTLogging coreLog] isTraceEnabled] ) { [[FTLogging coreLog] trace: @"FTDictionaryServiceTransactionStepImpl::"\ "performAction"]; } operationId = [self operationIdFromContext: transactionContext]; switch( operationId ) { case _OP_SET: success = [self performActionSETWithContext: transactionContext]; break; case _OP_REMOVE: success = [self performActionREMOVEWithContext: transactionContext]; break; default: [[[ECIllegalStateException alloc] initWithIllegalStateInfo: @"FTDictionaryServiceTransactionStepImpl::performAction: UNKNOWN"\ " operationId given"] raise]; break; } return success; } - (BOOL) performActionREMOVEWithContext: (FTTransactionContext *) context { id node; id key; FTDictionaryServiceForGraphImpl *dictService; if( [[FTLogging coreLog] isTraceEnabled] ) { [[FTLogging coreLog] trace: @"FTDictionaryServiceTransactionStepImpl::"\ "performAction: operation=REMOVE"]; } node = [self nodeFromContext: context]; key = [self keyFromContext: context]; dictService = [self dictServiceImplFromContext: context]; [dictService removeObjectForKey: key ofNode: node]; return YES; } - (BOOL) performActionSETWithContext: (FTTransactionContext *) context { id node; id key; id object; FTDictionaryServiceForGraphImpl *dictService; if( [[FTLogging coreLog] isTraceEnabled] ) { [[FTLogging coreLog] trace: @"FTDictionaryServiceTransactionStepImpl::"\ "performActionSETWithContext"]; } node = [self nodeFromContext: context]; key = [self keyFromContext: context]; object = [self objectFromContext: context]; dictService = [self dictServiceImplFromContext: context]; [dictService addObject: object forKey: key forNode: node]; return YES; } - (BOOL) undoAction: (FTTransactionContext *) transactionContext { return YES; } @end