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

  05.06.05 ola     initial version
  23.08.06 ola     license changed
  -------------------------------------------------------------------------
  
*/ #include #include #include /*! * @define __FTGRAPHIMPL_TRANSACTION_TYPEPARAM key within transaction context * which refers to the type of transaction */ #define __FTGRAPHIMPL_TRANSACTION_TYPEPARAM @"@FTGraphImpl::typeParam" /*! * @define __FTGRAPHIMPL_TRANSACTION_NODEPARAM key within transaction context * which refers to the node paramater */ #define __FTGRAPHIMPL_TRANSACTION_NODEPARAM @"@FTGraphImpl::nodeParam" /*! * @define __FTGRAPHIMPL_TRANSACTION_GRAPHPARAM key whose value refers to the * graph instance */ #define __FTGRAPHIMPL_TRANSACTION_GRAPHPARAM @"FTGraphImpl::graphRef" @implementation FTGraphImplTransactions + (void) addGenericContextData:(FTNodeImpl *) node graph: (FTGraphImpl *) graph operation: (int) operation toContext: (FTTransactionContext *) context { [context addObject: node forKey: __FTGRAPHIMPL_TRANSACTION_NODEPARAM ]; [context addObject: graph forKey: __FTGRAPHIMPL_TRANSACTION_GRAPHPARAM ]; [context addObject: [NSNumber numberWithInt: operation] forKey: __FTGRAPHIMPL_TRANSACTION_TYPEPARAM]; } + (FTGraphImplTransactions *) createForDeletionOfNode: (FTNodeImpl *) node withContext: (FTTransactionContext *) context withGraph: (FTGraphImpl *) graph { FTGraphImplTransactions *toReturn; [self addGenericContextData: node graph: graph operation: __FTGRAPHIMPL_TX_NODE_REMOVE toContext: context]; toReturn = [[FTGraphImplTransactions alloc] init]; [toReturn enableOperation: YES]; return toReturn; } + (FTGraphImplTransactions *) createForUpdateOfNode: (FTNodeImpl *) node withContext: (FTTransactionContext *) context withGraph: (FTGraphImpl *) graph { FTGraphImplTransactions *toReturn = nil; [self addGenericContextData: node graph: graph operation: __FTGRAPHIMPL_TX_NODE_UPDATE toContext: context]; toReturn = [[FTGraphImplTransactions alloc] init]; [toReturn enableOperation: YES]; return toReturn; } - (FTGraphImpl *) graphFromContext: (FTTransactionContext *) transactionContext { FTGraphImpl *toReturn = nil; id tmp; tmp = [transactionContext objectForKey: __FTGRAPHIMPL_TRANSACTION_GRAPHPARAM]; if( nil != tmp ) { if( [tmp isKindOfClass: [FTGraphImpl class]] ) { toReturn = (FTGraphImpl *) tmp; } else { [[FTLogging coreLog] error: @"Cannot find an instance of FTGraphImpl for context key: %@", __FTGRAPHIMPL_TRANSACTION_GRAPHPARAM ]; } } return toReturn; } - enableOperation: (BOOL) doEnable { self->operationEnabled = doEnable; return self; } - (FTNodeImpl *) nodeFromContext: (FTTransactionContext *) transactionContext { FTNodeImpl *toReturn = nil; id tmp; tmp = [transactionContext objectForKey: __FTGRAPHIMPL_TRANSACTION_NODEPARAM]; if( nil != tmp ) { if( [tmp isKindOfClass: [FTNodeImpl class]] ) { toReturn = (FTNodeImpl *) tmp; } else { [[FTLogging coreLog] error: @"Cannot find an instance of FTNodeImpl for context key: %@", __FTGRAPHIMPL_TRANSACTION_NODEPARAM ]; } } return toReturn; } + (enum __FTGraphImplTransactionType) operationIdFromContext: (FTTransactionContext *) transactionContext { int operationId = __FTGRAPHIMPL_TX_UNKNOWN; if( nil != [transactionContext objectForKey: __FTGRAPHIMPL_TRANSACTION_TYPEPARAM] ) { operationId = [((NSNumber *) [transactionContext objectForKey: __FTGRAPHIMPL_TRANSACTION_TYPEPARAM]) intValue]; } return operationId; } - (BOOL) performAction: (FTTransactionContext *) transactionContext { BOOL success = NO; FTGraphImpl *graph; if( [[FTLogging coreLog] isTraceEnabled] ) { [[FTLogging coreLog] trace: @"FTGraphImplTransactions::performAction" ]; } if( self->operationEnabled ) { if( nil != [transactionContext objectForKey: __FTGRAPHIMPL_TRANSACTION_TYPEPARAM] ) { graph = [self graphFromContext: transactionContext]; if( nil == graph ) { /** * Something wrong here since we always expect a gaph instance in the * transaction context */ [[[ECIllegalStateException alloc] initWithIllegalStateInfo: @"FTGraphImplTransactions::performAction: "\ "Could not find graph parameter in transaction context"] raise ]; } switch( [FTGraphImplTransactions operationIdFromContext: transactionContext] ) { case __FTGRAPHIMPL_TX_NODE_UPDATE: success = [self performUpdateWithContext: transactionContext withGraph: graph ]; break; case __FTGRAPHIMPL_TX_NODE_REMOVE: success = [self performDeletionWithContext: transactionContext withGraph: graph]; break; default: [[[ECIllegalStateException alloc] initWithIllegalStateInfo: @"FTGraphImplTransactions::performAction"\ ": Unsupported operation given!"] raise]; } } } else { success = YES; if( [[FTLogging coreLog] isDebugEnabled] ) { [[FTLogging coreLog] debug: @"FTGraphImplTransactions::performAction: Action disabled" ]; } } return success; } - (BOOL) performDeletionWithContext: (FTTransactionContext *) transactionContext withGraph: (FTGraphImpl *) aGraph { FTNodeImpl *node; if( [[FTLogging coreLog] isTraceEnabled] ) { [[FTLogging coreLog] trace: @"%FTGraphImplTransactions::performDeletionWithContext..." ]; } node = [self nodeFromContext: transactionContext]; if( nil == node ) { [[[ECIllegalStateException alloc] initWithIllegalStateInfo: @"FTGraphImplTransactions::performDeletionWithContext:"\ "Could not find node parameter in transaction context"] raise ]; } [aGraph removeNodeFromDatabase: node]; return YES; } - (BOOL) performUpdateWithContext: (FTTransactionContext *) transactionContext withGraph: (FTGraphImpl *) aGraph { FTNodeImpl *node; if( [[FTLogging coreLog] isTraceEnabled] ) { [[FTLogging coreLog] trace: @"%FTGraphImplTransactions::performUpdateWithContext..." ]; } node = [self nodeFromContext: transactionContext]; if( nil == node ) { [[[ECIllegalStateException alloc] initWithIllegalStateInfo: @"FTGraphImplTransactions::performUpdateWithContext:"\ "Could not find node parameter in transaction context"] raise ]; } [aGraph updateNode: node]; return YES; } - (BOOL) undoAction: (FTTransactionContext *) transactionContext { [[[ECNotImplementedException alloc] initWithOperationInformation: @"FTGraphImplTransactions::undoAction" ] raise]; return NO; } @end