/*
* Copyright 2002-2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.integration.transaction;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.transaction.support.TransactionSynchronization;
import org.springframework.util.Assert;
/**
* Default implementation of {@link TransactionSynchronizationFactory} which takes an instance of
* {@link TransactionSynchronizationProcessor} allowing you to create a {@link TransactionSynchronization}
* using {{@link #create(Object)} method.
*
* @author Gary Russell
* @author Oleg Zhurakousky
* @author Artem Bilan
*
* @since 2.2
*/
public class DefaultTransactionSynchronizationFactory implements TransactionSynchronizationFactory {
private final Log logger = LogFactory.getLog(getClass());
private final TransactionSynchronizationProcessor processor;
public DefaultTransactionSynchronizationFactory(TransactionSynchronizationProcessor processor) {
Assert.notNull(processor, "'processor' must not be null");
this.processor = processor;
}
@Override
public TransactionSynchronization create(Object key) {
Assert.notNull(key, "'key' must not be null");
return new DefaultTransactionalResourceSynchronization(key);
}
private final class DefaultTransactionalResourceSynchronization extends IntegrationResourceHolderSynchronization {
DefaultTransactionalResourceSynchronization(Object resourceKey) {
super(new IntegrationResourceHolder(), resourceKey);
}
@Override
public void beforeCommit(boolean readOnly) {
if (DefaultTransactionSynchronizationFactory.this.logger.isTraceEnabled()) {
DefaultTransactionSynchronizationFactory.this.logger.trace("'pre-Committing' transactional resource");
}
DefaultTransactionSynchronizationFactory.this.processor.processBeforeCommit(resourceHolder);
}
@Override
protected boolean shouldReleaseBeforeCompletion() {
return false;
}
@Override
protected void processResourceAfterCommit(IntegrationResourceHolder resourceHolder) {
if (DefaultTransactionSynchronizationFactory.this.logger.isTraceEnabled()) {
DefaultTransactionSynchronizationFactory.this.logger.trace("'Committing' transactional resource");
}
DefaultTransactionSynchronizationFactory.this.processor.processAfterCommit(resourceHolder);
}
@Override
public void afterCompletion(int status) {
if (status != TransactionSynchronization.STATUS_COMMITTED) {
if (DefaultTransactionSynchronizationFactory.this.logger.isTraceEnabled()) {
DefaultTransactionSynchronizationFactory.this.logger.trace("'Rolling back' transactional resource");
}
DefaultTransactionSynchronizationFactory.this.processor.processAfterRollback(resourceHolder);
}
super.afterCompletion(status);
}
}
}