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