litesoft
@ 939
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 150 151 152 153 154 155 156 |
// This Source Code is in the Public Domain per: http://litesoft.org/License.txt package org.litesoft.orsup.nonpublic; import java.sql.*; import org.litesoft.commonfoundation.typeutils.*; import java.util.*; import org.litesoft.logger.*; import org.litesoft.orsup.transact.*; public class TransCommitCollector { public static final Logger LOGGER = LoggerFactory.getLogger( TransCommitCollector.class ); private Timestamp mTransactionTimeStamp = Timestamps.now(); private Set<TransCommitEntry> mEntries = new HashSet<TransCommitEntry>(); private CA_LinkListNode mCommitAugmentors; public TransCommitCollector( CA_LinkListNode pCommitAugmentors ) { mCommitAugmentors = pCommitAugmentors; } public void augment( HistoryAugmentor pHistoryAugmentor ) { for ( TransCommitEntry entry : mEntries ) { entry.augment( pHistoryAugmentor, mTransactionTimeStamp ); } } public void add( List<PersistentObjectImpl<?>> pParticipants ) { for ( PersistentObjectImpl participant : pParticipants ) { TransCommitEntry entry = new TransCommitEntry( participant ); entry.checkShouldProcess_AboutToCommit( mCommitAugmentors, mTransactionTimeStamp ); if ( !mEntries.add( entry ) ) { LOGGER.error.log( "Duplicate (", participant, ") Entry on add(...)?" ); } } for ( int i = 9; i >= 0; i-- ) { boolean changes = false; for ( TransCommitEntry entry : mEntries ) { if ( entry.checkShouldProcess_AboutToCommit( mCommitAugmentors, mTransactionTimeStamp ) ) { changes = true; } } if ( !changes ) { return; } } throw new IllegalStateException( "Pre-Commit Changes did not stabilize" ); } public void justAdd( List<PersistentObjectImpl<?>> pParticipants ) { for ( PersistentObjectImpl participant : pParticipants ) { TransCommitEntry entry = new TransCommitEntry( participant ); entry.updateChangeNumber(); if ( !mEntries.add( entry ) ) { LOGGER.error.log( "Duplicate (", participant, ") Entry on add(...)?" ); } } } public void validateNoChanges( String pWhoToBlame ) { StringBuilder sb = null; for ( TransCommitEntry entry : mEntries ) { if ( entry.hasChanged() ) { if ( sb == null ) { sb = new StringBuilder( pWhoToBlame ).append( " caused changes in the following PO(s):" ); } sb.append( "\n " ).append( entry.getParticipant() ); } } if ( sb != null ) { throw new IllegalStateException( sb.toString() ); } } public Set<PersistentObjectImpl> getEntriesToCommit( DataStoreChangeCollector pCollector ) { Set<PersistentObjectImpl> commiting = new HashSet<PersistentObjectImpl>( mEntries.size() ); for ( TransCommitEntry entry : mEntries ) { PersistentObjectImpl participant = entry.getParticipant(); if ( participant.isDirty() ) { pCollector.add( participant, entry.getExtraPOinfo() ); participant.setCommitTimestamps( mTransactionTimeStamp ); if ( !commiting.add( participant ) ) { LOGGER.error.log( "Duplicate (", participant, ") Entry on getEntriesToCommit(...)?" ); } } else if ( participant.isForcedChangeNotification() ) { pCollector.add( participant, entry.getExtraPOinfo() ); } } return commiting; } public void commitSucceeded( String pTransactionSourceId, SucceededTransactionCommitListener[] pSucceededTransactionCommitListeners, TransParticipantsManager pTransParticipantsManager ) { for ( TransCommitEntry entry : mEntries ) { try { PersistentObjectImpl.BackDoor.transactionCommitSucceededDropTransactionOn( entry.getParticipant() ); } catch ( RuntimeException ignore ) { LOGGER.error.log( ignore, "successfulCommit?" ); // We have already succeeded, don't fail now } } for ( SucceededTransactionCommitListener zSucceededTransactionCommitListener : pSucceededTransactionCommitListeners ) { zSucceededTransactionCommitListener.successfulCommitBeforeClear( pTransactionSourceId, mEntries, pTransParticipantsManager ); } for ( TransCommitEntry entry : mEntries ) { try { PersistentObjectImpl.BackDoor.transactionCommitSucceededClearTransactionalChangesOn( entry.getParticipant() ); } catch ( RuntimeException ignore ) { LOGGER.error.log( ignore, "successfulCommit?" ); // We have already succeeded, don't fail now } } } } |