/*! @header FTTransactionImpl @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.04.05 ola     initial version
  23.08.06 ola     license changed
  -------------------------------------------------------------------------
  
*/ #include #include #include @implementation FTTransactionStepAndContext - initWithTransactionStep: (id ) aTransactionStep withContext: (FTTransactionContext *) aTransactionContext { self = [super init]; self->transactionStep = [aTransactionStep retain]; self->transactionContext = [aTransactionContext retain]; return self; } - (void) dealloc { if( nil != self->transactionStep ) { [self->transactionStep release]; } if( nil != self->transactionContext ) { [self->transactionContext release]; } [super dealloc]; } - (id ) transactionStep { return transactionStep; } - (FTTransactionContext *) transactionContext { return transactionContext; } @end @implementation FTTransactionImpl - initForTransactionManager: (id ) aManager { self = [super init]; self->transactionManager = [aManager retain]; self->transactionStepsAndContexts = [[NSMutableArray alloc] init]; self->transactionKeyToArrayIndex = [[NSMutableDictionary alloc] init]; return self; } - (void) dealloc { if( nil != self->transactionManager ) { [self->transactionManager release]; } if( nil != self->transactionStepsAndContexts ) { [self->transactionStepsAndContexts release]; } if( nil != self->transactionKeyToArrayIndex ) { [self->transactionKeyToArrayIndex release]; } [super dealloc]; return; } - (void) abort { } - (unsigned) addTransactionStep: (FTTransactionStepAndContext *) stepToAdd { unsigned index = [self->transactionStepsAndContexts count]; [self->transactionStepsAndContexts addObject: stepToAdd]; return index; } - addTransactionStep: (id ) stepToAdd withContext: (FTTransactionContext *) context { [self addTransactionStep: [[FTTransactionStepAndContext alloc] initWithTransactionStep: stepToAdd withContext: context]]; return self; } - addTransactionStep: (id ) stepToAdd withContext: (FTTransactionContext *) context identifiedByKey: (id ) aKey { id indexObj; unsigned index = [self addTransactionStep: [[FTTransactionStepAndContext alloc] initWithTransactionStep: stepToAdd withContext: context]]; indexObj = [NSNumber numberWithUnsignedInt: index]; if( nil != [self->transactionKeyToArrayIndex objectForKey: indexObj] ) { NSString *msg; msg = [NSString stringWithFormat: @"FTTransactioImpl::addTransactionStep: trying to add a "\ "transaction for key=\"%@\" although a transaction with this key "\ "alreday exisrs!", aKey]; [[FTLogging coreLog] fatal: msg]; [[[ECIllegalStateException alloc] initWithIllegalStateInfo: msg] raise]; } else { [self->transactionKeyToArrayIndex setObject: indexObj forKey: aKey]; } return self; } - (void) commit { [self->transactionManager commitTransaction: self]; } - (FTTransactionContext *) createContext { return [[FTTransactionContext alloc] init]; } - (id ) transactionStepForKey: (id ) aKey { FTTransactionStepAndContext *stepAndContext; NSNumber *index = (NSNumber *) [self->transactionKeyToArrayIndex objectForKey: aKey]; if( nil != index ) { stepAndContext = (FTTransactionStepAndContext *) [self->transactionStepsAndContexts objectAtIndex: [index unsignedIntValue]]; if( nil != stepAndContext ) { return [stepAndContext transactionStep]; } else { [self->transactionKeyToArrayIndex removeObjectForKey: aKey]; return nil; } } return nil; } - (NSMutableArray *) transactionSteps { return self->transactionStepsAndContexts; } @end