litesoft
@ 804
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 |
// This Source Code is in the Public Domain per: http://litesoft.org/License.txt package org.litesoft.orsup.nonpublic; import java.util.*; import org.litesoft.core.typeutils.*; import org.litesoft.orsup.base.*; public class TransParticipantsManager { protected final Map<PersistentObjectURL, PersistentObjectImpl<?>> mParticipants = new HashMap<PersistentObjectURL, PersistentObjectImpl<?>>(); private List<PersistentObjectImpl<?>> mAddedParticipantDuringCommits = null; private TransState mState = TransState.ACTIVE; public synchronized boolean isEmpty() { return mParticipants.isEmpty(); } public synchronized PersistentObjectImpl<?> get( PersistentObjectURL pPersistentObjectURL ) { return mParticipants.get( pPersistentObjectURL ); } private void clear() { mParticipants.clear(); mAddedParticipantDuringCommits = null; } public synchronized TransState getState() { return mState; } public synchronized void dispose() { validateNotCommitting( "dispose" ); mState = mState.dispose(); for ( PersistentObjectImpl participant : mParticipants.values() ) { try { PersistentObjectImpl.BackDoor.disposeTransactionOn( participant ); } catch ( RuntimeException ignore ) { TransactionImpl.LOGGER.error.log( ignore, "dipose?" ); // Whatever! } } clear(); } public synchronized void initiateCommitting( List<PersistentObjectImpl<?>> pParticipantsListToPopulate ) { validateNotCommitting( "commit" ); mState = mState.commitInit(); mAddedParticipantDuringCommits = new ArrayList<PersistentObjectImpl<?>>(); pParticipantsListToPopulate.addAll( mParticipants.values() ); } public synchronized void transitionToLowLevelCommitting() { mState = mState.commitLowLevel(); } public synchronized void successfullyCommitted() { mState = mState.commitSucceeded(); clear(); } public synchronized void clearCommitting() { mState = mState.clearCommitting(); mAddedParticipantDuringCommits = null; } public synchronized PersistentObjectImpl<?> addPO( PersistentObjectImpl<?> pPersistentObject ) { validateFunctional( "add a" ); validateSupportsPOmodification( "add a" ); PersistentObjectURL poURL = pPersistentObject.getPersistentObjectURL(); PersistentObjectImpl<?> existing = mParticipants.get( poURL ); if ( existing != null ) { return existing; } mParticipants.put( poURL, pPersistentObject ); if ( mAddedParticipantDuringCommits != null ) { mAddedParticipantDuringCommits.add( pPersistentObject ); } return pPersistentObject; } public synchronized PersistentObject[] getAllParticipants() { return mParticipants.values().toArray( new PersistentObject[mParticipants.size()] ); } public synchronized List<PersistentObjectImpl<?>> grabAddedParticipantsDuringCommits() { List<PersistentObjectImpl<?>> rv = mAddedParticipantDuringCommits; mAddedParticipantDuringCommits = new ArrayList<PersistentObjectImpl<?>>(); return rv; } public synchronized void changeURL( PersistentObjectURL pOrigURL, PersistentObjectURL pNewURL ) { Objects.assertNotNull( "OrigURL", pOrigURL ); Objects.assertNotNull( "NewURL", pNewURL ); validateNotCommitting( "changeURL" ); validateSupportsPOmodification( "change a URL on a" ); validateFunctional( "change a URL on a" ); PersistentObjectImpl<?> zPO = mParticipants.remove( pOrigURL ); if ( zPO != null ) { mParticipants.put( pNewURL, zPO ); } } public synchronized void validateNotCommitting( String pWhatCalled ) { if ( mAddedParticipantDuringCommits != null ) { throw new IllegalStateException( "May not call '" + pWhatCalled + "' during the commit process" ); } } private void validateSupportsPOmodification( String pWhat ) // called under synchronized { if ( !mState.supportsPOmodification() ) { throw new IllegalStateException( "Attempt to " + pWhat + " PersistentObject to a transaction during Low Level Commit state" ); } } private void validateFunctional( String pWhat ) // called under synchronized { if ( !mState.isFunctional() ) { throw new IllegalStateException( "Attempt to " + pWhat + " PersistentObject to a Disposed or Successfully Committed transaction" ); } } } |