You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@deltaspike.apache.org by gp...@apache.org on 2015/10/18 01:06:05 UTC

[2/2] deltaspike git commit: DELTASPIKE-1005 @Transactional and @TransactionScoped support for @Repository

DELTASPIKE-1005 @Transactional and @TransactionScoped support for @Repository


Project: http://git-wip-us.apache.org/repos/asf/deltaspike/repo
Commit: http://git-wip-us.apache.org/repos/asf/deltaspike/commit/05876253
Tree: http://git-wip-us.apache.org/repos/asf/deltaspike/tree/05876253
Diff: http://git-wip-us.apache.org/repos/asf/deltaspike/diff/05876253

Branch: refs/heads/master
Commit: 05876253e064527d03f72ff846696ebbbef77e88
Parents: 51d5ac8
Author: gpetracek <gp...@apache.org>
Authored: Sun Oct 18 01:02:32 2015 +0200
Committer: gpetracek <gp...@apache.org>
Committed: Sun Oct 18 01:02:32 2015 +0200

----------------------------------------------------------------------
 .../data/impl/handler/QueryHandler.java         | 45 +++++++++++++++++++-
 1 file changed, 44 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/deltaspike/blob/05876253/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/QueryHandler.java
----------------------------------------------------------------------
diff --git a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/QueryHandler.java b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/QueryHandler.java
index 0501a4f..2f8fcff 100755
--- a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/QueryHandler.java
+++ b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/QueryHandler.java
@@ -25,10 +25,14 @@ import java.util.List;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
+import javax.enterprise.inject.spi.BeanManager;
 import javax.inject.Inject;
 import javax.persistence.PersistenceException;
 
 import org.apache.deltaspike.core.api.lifecycle.Initialized;
+import org.apache.deltaspike.core.util.AbstractInvocationContext;
+import org.apache.deltaspike.core.util.AnnotationUtils;
+import org.apache.deltaspike.core.util.ExceptionUtils;
 import org.apache.deltaspike.core.util.ProxyUtils;
 import org.apache.deltaspike.data.api.QueryInvocationException;
 import org.apache.deltaspike.data.api.Repository;
@@ -37,6 +41,8 @@ import org.apache.deltaspike.data.impl.builder.QueryBuilderFactory;
 import org.apache.deltaspike.data.impl.meta.RepositoryComponent;
 import org.apache.deltaspike.data.impl.meta.RepositoryComponents;
 import org.apache.deltaspike.data.impl.meta.RepositoryMethod;
+import org.apache.deltaspike.jpa.api.transaction.Transactional;
+import org.apache.deltaspike.jpa.spi.transaction.TransactionStrategy;
 
 /**
  * Entry point for query processing.
@@ -65,8 +71,45 @@ public class QueryHandler implements Serializable, InvocationHandler
     @Inject
     private QueryRunner runner;
 
+    @Inject
+    private BeanManager beanManager;
+
+    @Inject
+    private TransactionStrategy transactionStrategy;
+
     @Override
-    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
+    public Object invoke(final Object proxy, final Method method, final Object[] args) throws Throwable
+    {
+        Transactional transactionalAnnotation =
+            AnnotationUtils.extractAnnotationFromMethodOrClass(
+                this.beanManager, method, proxy.getClass(), Transactional.class);
+
+        if (transactionalAnnotation != null)
+        {
+            return transactionStrategy.execute(
+                new AbstractInvocationContext<Object>(proxy, method, args, null)
+                {
+                    @Override
+                    public Object proceed() throws Exception
+                    {
+                        try
+                        {
+                            return process(proxy, method, args);
+                        }
+                        catch (Throwable t)
+                        {
+                            throw ExceptionUtils.throwAsRuntimeException(t);
+                        }
+                    }
+                });
+        }
+        else
+        {
+            return process(proxy, method, args);
+        }
+    }
+
+    public Object process(Object proxy, Method method, Object[] args) throws Throwable
     {
         CdiQueryInvocationContext queryContext = null;
         try