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
*
* @param aWork
* Work to execute.
+ *
* @return The return value of the execute method of the unit of work.
*/
public <T> T execute(JpaUnitOfWork<T> 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> T execute(JpaUnitOfWork<T> 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;
}
}
}
@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);
}
@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();
--- /dev/null
+/*
+ * 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);
+ }
+}
--- /dev/null
+/*
+ * 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