/* * Copyright 2016 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.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.annotation.Isolation; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.interceptor.DefaultTransactionAttribute; import org.springframework.transaction.interceptor.MatchAlwaysTransactionAttributeSource; import org.springframework.transaction.interceptor.TransactionAttribute; import org.springframework.transaction.interceptor.TransactionInterceptor; import org.springframework.util.Assert; /** * Provides a fluent API to build a transaction interceptor. See * {@link TransactionAttribute} for property meanings; if a {@link TransactionAttribute} * is provided, the individual properties are ignored. If a * {@link PlatformTransactionManager} is not provided, a single instance of * {@link PlatformTransactionManager} will be discovered at runtime; if you have more * than one transaction manager, you must inject the one you want to use here. * <p> * When the {@code handleMessageAdvice} option is in use, this builder produces * {@link TransactionHandleMessageAdvice} instance. * * @author Gary Russell * @author Artem Bilan * * @since 5.0 * */ public class TransactionInterceptorBuilder { private final DefaultTransactionAttribute transactionAttribute = new DefaultTransactionAttribute(); private final TransactionInterceptor transactionInterceptor; public TransactionInterceptorBuilder() { this(false); } public TransactionInterceptorBuilder(boolean handleMessageAdvice) { if (handleMessageAdvice) { this.transactionInterceptor = new TransactionHandleMessageAdvice(); } else { this.transactionInterceptor = new TransactionInterceptor(); } transactionAttribute(this.transactionAttribute); } public TransactionInterceptorBuilder propagation(Propagation propagation) { Assert.notNull(propagation, "'propagation' must not be null."); this.transactionAttribute.setPropagationBehavior(propagation.value()); return this; } public TransactionInterceptorBuilder isolation(Isolation isolation) { Assert.notNull(isolation, "'isolation' must not be null."); this.transactionAttribute.setIsolationLevel(isolation.value()); return this; } public TransactionInterceptorBuilder timeout(int timeout) { this.transactionAttribute.setTimeout(timeout); return this; } public TransactionInterceptorBuilder readOnly(boolean readOnly) { this.transactionAttribute.setReadOnly(readOnly); return this; } public final TransactionInterceptorBuilder transactionAttribute(TransactionAttribute transactionAttribute) { MatchAlwaysTransactionAttributeSource txAttributeSource = new MatchAlwaysTransactionAttributeSource(); txAttributeSource.setTransactionAttribute(transactionAttribute); this.transactionInterceptor.setTransactionAttributeSource(txAttributeSource); return this; } public TransactionInterceptorBuilder transactionManager(PlatformTransactionManager transactionManager) { this.transactionInterceptor.setTransactionManager(transactionManager); return this; } public TransactionInterceptor build() { return this.transactionInterceptor; } }