From 4c176ce124f4478ae8781625fd1bc6d28a35e466 Mon Sep 17 00:00:00 2001 From: Erik Brakkee Date: Tue, 27 Jul 2010 20:32:01 +0000 Subject: [PATCH] --- .../wamblee/test/persistence/JpaBuilder.java | 43 ++++++++++++++++--- .../LoggingTransactionResultCallback.java | 43 +++++++++++++++++++ .../TransactionResultCallback.java | 31 +++++++++++++ 3 files changed, 112 insertions(+), 5 deletions(-) create mode 100644 test/enterprise/src/main/java/org/wamblee/test/persistence/LoggingTransactionResultCallback.java create mode 100644 test/enterprise/src/main/java/org/wamblee/test/persistence/TransactionResultCallback.java diff --git a/test/enterprise/src/main/java/org/wamblee/test/persistence/JpaBuilder.java b/test/enterprise/src/main/java/org/wamblee/test/persistence/JpaBuilder.java index dac2789b..d50ca76e 100644 --- a/test/enterprise/src/main/java/org/wamblee/test/persistence/JpaBuilder.java +++ b/test/enterprise/src/main/java/org/wamblee/test/persistence/JpaBuilder.java @@ -29,6 +29,7 @@ import javax.persistence.PersistenceException; import org.wamblee.general.ThreadSpecificProxyFactory; import org.wamblee.test.jndi.StubInitialContextFactory; import org.wamblee.test.transactions.TransactionResource; +import org.wamblee.test.transactions.TransactionResult; /** * Utility for building an appropriately configured EntityManagerFactory. The @@ -152,17 +153,38 @@ public class JpaBuilder implements TransactionResource { * * @param aWork * Work to execute. + * * @return The return value of the execute method of the unit of work. */ public T execute(JpaUnitOfWork aWork) throws Exception { + return execute(aWork, new LoggingTransactionResultCallback(Level.INFO)); + } + + /** + * Executes a unit of work. This creates an entitymanager and runs the + * {@link JpaUnitOfWork#execute(EntityManager)} within a transaction, + * passing it the entity manager. Use of this method saves a lot of typing + * for applications. + * + * @param aWork + * Work to execute. + * @param aTransactionResultCallback + * callback to notify of the result of the transaction. + * + * @return The return value of the execute method of the unit of work. + */ + public T execute(JpaUnitOfWork aWork, + TransactionResultCallback aCallback) throws Exception { EntityManager em = begin(); try { T value = aWork.execute(em); - commit(em); + TransactionResult result = commit(em); + aCallback.status(result); return value; } catch (Exception e) { LOGGER.log(Level.WARNING, "Exception occured", e); - rollback(em); + TransactionResult result = rollback(em); + aCallback.status(result); throw e; } } @@ -177,9 +199,18 @@ public class JpaBuilder implements TransactionResource { } @Override - public void commit(EntityManager aEntityManager) { + public TransactionResult commit(EntityManager aEntityManager) { try { - aEntityManager.getTransaction().commit(); + EntityTransaction transaction = aEntityManager.getTransaction(); + if (transaction.isActive()) { + if (transaction.getRollbackOnly()) { + transaction.rollback(); + return TransactionResult.ROLLBACK; + } + transaction.commit(); + return TransactionResult.COMMIT; + } + return TransactionResult.UNKNOWN; } finally { aEntityManager.close(); entityManager.set(null); @@ -187,12 +218,14 @@ public class JpaBuilder implements TransactionResource { } @Override - public void rollback(EntityManager aEntityManager) { + public TransactionResult rollback(EntityManager aEntityManager) { try { EntityTransaction transaction = aEntityManager.getTransaction(); if (transaction.isActive()) { transaction.rollback(); + return TransactionResult.ROLLBACK; } + return TransactionResult.UNKNOWN; } finally { if (aEntityManager.isOpen()) { aEntityManager.close(); diff --git a/test/enterprise/src/main/java/org/wamblee/test/persistence/LoggingTransactionResultCallback.java b/test/enterprise/src/main/java/org/wamblee/test/persistence/LoggingTransactionResultCallback.java new file mode 100644 index 00000000..42d37e48 --- /dev/null +++ b/test/enterprise/src/main/java/org/wamblee/test/persistence/LoggingTransactionResultCallback.java @@ -0,0 +1,43 @@ +/* + * Copyright 2005-2010 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.wamblee.test.persistence; + +import java.util.logging.Level; +import java.util.logging.Logger; + +import org.wamblee.test.transactions.TransactionResult; + +/** + * Logging the result of a transaction. + * @author Erik Brakkee + * + */ +public class LoggingTransactionResultCallback implements + TransactionResultCallback { + + private static final Logger LOGGER = Logger.getLogger(LoggingTransactionResultCallback.class.getName()); + + private Level level; + + public LoggingTransactionResultCallback(Level aLevel) { + level = aLevel; + } + + @Override + public void status(TransactionResult aResult) { + LOGGER.log(level, "Transaction result " + aResult); + } +} diff --git a/test/enterprise/src/main/java/org/wamblee/test/persistence/TransactionResultCallback.java b/test/enterprise/src/main/java/org/wamblee/test/persistence/TransactionResultCallback.java new file mode 100644 index 00000000..64c787dd --- /dev/null +++ b/test/enterprise/src/main/java/org/wamblee/test/persistence/TransactionResultCallback.java @@ -0,0 +1,31 @@ +/* + * Copyright 2005-2010 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.wamblee.test.persistence; + +import org.wamblee.test.transactions.TransactionResult; + +/** + * Callback to notify the test of the result of the transaction. + * + * @author Erik Brakkee + */ +public interface TransactionResultCallback { + /** + * Result notification. + * @param aResult Transaction result. + */ + void status(TransactionResult aResult); +} \ No newline at end of file -- 2.31.1