/* * Copyright 2002-2015 SCOOP Software GmbH * * 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.copperengine.spring; import java.sql.Connection; import javax.sql.DataSource; import org.copperengine.core.persistent.txn.DatabaseTransaction; import org.copperengine.core.persistent.txn.Transaction; import org.copperengine.core.persistent.txn.TransactionController; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.TransactionStatus; import org.springframework.transaction.support.DefaultTransactionDefinition; /** * Implementation of the {@link TransactionController} interface that internally uses Springs Transaction Management * * @author austermann */ public class SpringTransactionController implements TransactionController { private static final Logger logger = LoggerFactory.getLogger(SpringTransactionController.class); private DataSource dataSource; private PlatformTransactionManager transactionManager; public void setTransactionManager(PlatformTransactionManager transactionManager) { this.transactionManager = transactionManager; } public void setDataSource(DataSource dataSource) { this.dataSource = dataSource; } @SuppressWarnings("unchecked") @Override public <T> T run(final DatabaseTransaction<T> txn) throws Exception { final T[] t = (T[]) new Object[1]; new SpringTransaction() { @Override protected void execute(Connection con) throws Exception { t[0] = txn.run(con); } }.run(transactionManager, dataSource, new DefaultTransactionDefinition()); return t[0]; } @Override public <T> T run(Transaction<T> txn) throws Exception { final TransactionStatus txnStatus = transactionManager.getTransaction(new DefaultTransactionDefinition()); T t = null; try { t = txn.run(); } catch (Exception e) { logger.error("execution failed - rolling back transaction", e); transactionManager.rollback(txnStatus); throw e; } transactionManager.commit(txnStatus); return t; } }