/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
*/
package org.hibernate.resource.transaction.internal;
import java.util.LinkedHashSet;
import javax.transaction.Synchronization;
import org.hibernate.internal.CoreLogging;
import org.hibernate.internal.CoreMessageLogger;
import org.hibernate.resource.transaction.LocalSynchronizationException;
import org.hibernate.resource.transaction.NullSynchronizationException;
import org.hibernate.resource.transaction.spi.SynchronizationRegistryImplementor;
The standard implementation of the SynchronizationRegistry contract
Author: Steve Ebersole
/**
* The standard implementation of the SynchronizationRegistry contract
*
* @author Steve Ebersole
*/
public class SynchronizationRegistryStandardImpl implements SynchronizationRegistryImplementor {
private static final CoreMessageLogger log = CoreLogging.messageLogger( SynchronizationRegistryStandardImpl.class );
private LinkedHashSet<Synchronization> synchronizations;
Intended for test access
Returns: The number of Synchronizations registered
/**
* Intended for test access
*
* @return The number of Synchronizations registered
*/
public int getNumberOfRegisteredSynchronizations() {
return synchronizations == null ? 0 : synchronizations.size();
}
@Override
public void registerSynchronization(Synchronization synchronization) {
if ( synchronization == null ) {
throw new NullSynchronizationException();
}
if ( synchronizations == null ) {
synchronizations = new LinkedHashSet<Synchronization>();
}
final boolean added = synchronizations.add( synchronization );
if ( !added ) {
log.synchronizationAlreadyRegistered( synchronization );
}
}
@Override
public void notifySynchronizationsBeforeTransactionCompletion() {
log.trace( "SynchronizationRegistryStandardImpl.notifySynchronizationsBeforeTransactionCompletion" );
if ( synchronizations != null ) {
for ( Synchronization synchronization : synchronizations ) {
try {
synchronization.beforeCompletion();
}
catch (Throwable t) {
log.synchronizationFailed( synchronization, t );
throw new LocalSynchronizationException(
"Exception calling user Synchronization (beforeCompletion): " + synchronization.getClass().getName(),
t
);
}
}
}
}
@Override
public void notifySynchronizationsAfterTransactionCompletion(int status) {
log.tracef(
"SynchronizationRegistryStandardImpl.notifySynchronizationsAfterTransactionCompletion(%s)",
status
);
if ( synchronizations != null ) {
try {
for ( Synchronization synchronization : synchronizations ) {
try {
synchronization.afterCompletion( status );
}
catch (Throwable t) {
log.synchronizationFailed( synchronization, t );
throw new LocalSynchronizationException(
"Exception calling user Synchronization (afterCompletion): " + synchronization.getClass().getName(),
t
);
}
}
}
finally {
clearSynchronizations();
}
}
}
@Override
public void clearSynchronizations() {
log.debug( "Clearing local Synchronizations" );
if ( synchronizations != null ) {
synchronizations.clear();
}
}
}