(no commit message)
authorErik Brakkee <erik@brakkee.org>
Tue, 27 Jul 2010 20:32:01 +0000 (20:32 +0000)
committerErik Brakkee <erik@brakkee.org>
Tue, 27 Jul 2010 20:32:01 +0000 (20:32 +0000)
test/enterprise/src/main/java/org/wamblee/test/persistence/JpaBuilder.java
test/enterprise/src/main/java/org/wamblee/test/persistence/LoggingTransactionResultCallback.java [new file with mode: 0644]
test/enterprise/src/main/java/org/wamblee/test/persistence/TransactionResultCallback.java [new file with mode: 0644]

index dac2789b942e8f5a79442a6b5fb80e37d7bd8fe9..d50ca76e10b92172d0a51e4caf8218f3b90e191d 100644 (file)
@@ -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<EntityManager> {
      * 
      * @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;
         }
     }
@@ -177,9 +199,18 @@ public class JpaBuilder implements TransactionResource<EntityManager> {
     }
 
     @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<EntityManager> {
     }
 
     @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 (file)
index 0000000..42d37e4
--- /dev/null
@@ -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 (file)
index 0000000..64c787d
--- /dev/null
@@ -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