Repository: deltaspike
Updated Branches:
  refs/heads/master 530dc72c8 -> d14eb560c


DELTASPIKE-1062 @Transactional and @TransactionScoped support for @Repository 
including qualifiers


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

Branch: refs/heads/master
Commit: d14eb560c47e4a875df452c9df088cf38af7ab92
Parents: 530dc72
Author: gpetracek <[email protected]>
Authored: Fri Jan 8 03:49:21 2016 +0100
Committer: gpetracek <[email protected]>
Committed: Fri Jan 8 03:54:33 2016 +0100

----------------------------------------------------------------------
 .../data/impl/handler/EntityManagerLookup.java  |  9 ++++
 .../data/impl/handler/QueryHandler.java         | 46 +++++++++++++++-----
 2 files changed, 43 insertions(+), 12 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/deltaspike/blob/d14eb560/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/EntityManagerLookup.java
----------------------------------------------------------------------
diff --git 
a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/EntityManagerLookup.java
 
b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/EntityManagerLookup.java
index 3a78393..5970544 100644
--- 
a/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/EntityManagerLookup.java
+++ 
b/deltaspike/modules/data/impl/src/main/java/org/apache/deltaspike/data/impl/handler/EntityManagerLookup.java
@@ -28,6 +28,7 @@ import org.apache.deltaspike.core.api.provider.BeanProvider;
 import org.apache.deltaspike.core.api.provider.DependentProvider;
 import org.apache.deltaspike.data.api.EntityManagerResolver;
 import org.apache.deltaspike.data.impl.meta.RepositoryComponent;
+import org.apache.deltaspike.jpa.spi.entitymanager.ActiveEntityManagerHolder;
 
 public class EntityManagerLookup
 {
@@ -36,6 +37,9 @@ public class EntityManagerLookup
     @Any
     private Instance<EntityManager> entityManager;
 
+    @Inject
+    private ActiveEntityManagerHolder activeEntityManagerHolder;
+
     private DependentProvider<? extends EntityManagerResolver> 
dependentResolverProvider;
 
     public EntityManager lookupFor(final RepositoryComponent repository)
@@ -57,6 +61,11 @@ public class EntityManagerLookup
         }
         else
         {
+            if (activeEntityManagerHolder.isSet())
+            {
+                return activeEntityManagerHolder.get();
+            }
+
             result = entityManager.select(new DefaultLiteral()).get();
         }
         if (repository.hasEntityManagerFlushMode())

http://git-wip-us.apache.org/repos/asf/deltaspike/blob/d14eb560/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 86b018e..5858f16 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
@@ -18,22 +18,13 @@
  */
 package org.apache.deltaspike.data.impl.handler;
 
-import java.io.Serializable;
-import java.lang.reflect.InvocationHandler;
-import java.lang.reflect.Method;
-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.interceptor.AbstractInvocationContext;
+import org.apache.deltaspike.core.api.provider.BeanProvider;
 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.core.util.interceptor.AbstractInvocationContext;
+import org.apache.deltaspike.core.util.metadata.AnnotationInstanceProvider;
 import org.apache.deltaspike.data.api.QueryInvocationException;
 import org.apache.deltaspike.data.api.Repository;
 import org.apache.deltaspike.data.impl.builder.QueryBuilder;
@@ -42,8 +33,22 @@ 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.entitymanager.ActiveEntityManagerHolder;
 import org.apache.deltaspike.jpa.spi.transaction.TransactionStrategy;
 
+import javax.enterprise.inject.Any;
+import javax.enterprise.inject.spi.BeanManager;
+import javax.inject.Inject;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceException;
+import java.io.Serializable;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
 /**
  * Entry point for query processing.
  */
@@ -77,6 +82,9 @@ public class QueryHandler implements Serializable, 
InvocationHandler
     @Inject
     private TransactionStrategy transactionStrategy;
 
+    @Inject
+    private ActiveEntityManagerHolder activeEntityManagerHolder;
+
     @Override
     public Object invoke(final Object proxy, final Method method, final 
Object[] args) throws Throwable
     {
@@ -86,6 +94,20 @@ public class QueryHandler implements Serializable, 
InvocationHandler
 
         if (transactionalAnnotation != null)
         {
+            if (transactionalAnnotation.qualifier().length > 1)
+            {
+                throw new IllegalStateException(proxy.getClass().getName() + " 
uses @" + Transactional.class.getName() +
+                    " with multiple qualifiers. That isn't supported with @" + 
Repository.class.getName());
+            }
+
+            Class<? extends Annotation> qualifier = 
transactionalAnnotation.qualifier()[0];
+            if (!Any.class.equals(qualifier))
+            {
+                EntityManager entityManager = 
BeanProvider.getContextualReference(
+                    EntityManager.class, false, 
AnnotationInstanceProvider.of(qualifier));
+                activeEntityManagerHolder.set(entityManager);
+            }
+
             return transactionStrategy.execute(
                 new AbstractInvocationContext<Object>(proxy, method, args, 
null)
                 {

Reply via email to