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 2013/03/07 17:20:28 UTC

git commit: DELTASPIKE-113 support for dependent-scoped invocation-handlers

Updated Branches:
  refs/heads/master a91605aad -> e97ee9233


DELTASPIKE-113 support for dependent-scoped invocation-handlers


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

Branch: refs/heads/master
Commit: e97ee923377b72560cf7e60d39bc8b854c346874
Parents: a91605a
Author: gpetracek <gp...@apache.org>
Authored: Thu Mar 7 17:16:21 2013 +0100
Committer: gpetracek <gp...@apache.org>
Committed: Thu Mar 7 17:16:21 2013 +0100

----------------------------------------------------------------------
 .../InvocationHandlerBindingExtension.java         |   13 ------
 .../invocationhandler/PartialBeanLifecycle.java    |   34 ++++++++++++++-
 .../shared/PartialBeanHandler.java                 |    4 +-
 3 files changed, 35 insertions(+), 16 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/e97ee923/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/invocationhandler/InvocationHandlerBindingExtension.java
----------------------------------------------------------------------
diff --git a/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/invocationhandler/InvocationHandlerBindingExtension.java b/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/invocationhandler/InvocationHandlerBindingExtension.java
index 74bffd4..4d1f4ef 100644
--- a/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/invocationhandler/InvocationHandlerBindingExtension.java
+++ b/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/invocationhandler/InvocationHandlerBindingExtension.java
@@ -25,7 +25,6 @@ import org.apache.deltaspike.core.util.ClassUtils;
 import org.apache.deltaspike.core.util.bean.BeanBuilder;
 import org.apache.deltaspike.core.util.metadata.builder.AnnotatedTypeBuilder;
 
-import javax.enterprise.context.NormalScope;
 import javax.enterprise.event.Observes;
 import javax.enterprise.inject.spi.AfterBeanDiscovery;
 import javax.enterprise.inject.spi.AnnotatedType;
@@ -185,17 +184,5 @@ public class InvocationHandlerBindingExtension implements Extension, Deactivatab
                     bindingAnnotationClass.getName() + " (" +
                     alreadyFoundHandler.getName() + " and " + beanClass.getName() + ")");
         }
-
-        for (Annotation annotation : annotations)
-        {
-            if (beanManager.isNormalScope(annotation.annotationType()))
-            {
-                return;
-            }
-        }
-
-        //at least we have to restrict dependent-scoped beans (we wouldn't be able to destroy such handlers properly).
-        this.definitionError = new IllegalStateException(beanClass.getName() + " needs to be normal-scoped. " +
-            "(= Scopes annotated with @" + NormalScope.class.getName() + ")");
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/e97ee923/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/invocationhandler/PartialBeanLifecycle.java
----------------------------------------------------------------------
diff --git a/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/invocationhandler/PartialBeanLifecycle.java b/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/invocationhandler/PartialBeanLifecycle.java
index 63d5721..400bf34 100644
--- a/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/invocationhandler/PartialBeanLifecycle.java
+++ b/deltaspike/core/impl/src/main/java/org/apache/deltaspike/core/impl/invocationhandler/PartialBeanLifecycle.java
@@ -21,17 +21,20 @@ package org.apache.deltaspike.core.impl.invocationhandler;
 import javassist.util.proxy.MethodFilter;
 import javassist.util.proxy.ProxyFactory;
 import javassist.util.proxy.ProxyObject;
+import org.apache.deltaspike.core.api.provider.BeanManagerProvider;
 import org.apache.deltaspike.core.api.provider.BeanProvider;
 import org.apache.deltaspike.core.util.ExceptionUtils;
 import org.apache.deltaspike.core.util.metadata.builder.AnnotatedTypeBuilder;
 import org.apache.deltaspike.core.util.metadata.builder.ContextualLifecycle;
 
+import javax.enterprise.context.Dependent;
 import javax.enterprise.context.spi.CreationalContext;
 import javax.enterprise.inject.spi.Bean;
 import javax.enterprise.inject.spi.BeanManager;
 import javax.enterprise.inject.spi.InjectionTarget;
 import java.lang.reflect.InvocationHandler;
 import java.lang.reflect.Method;
+import java.util.Set;
 
 class PartialBeanLifecycle<T, H extends InvocationHandler> implements ContextualLifecycle<T>
 {
@@ -39,6 +42,7 @@ class PartialBeanLifecycle<T, H extends InvocationHandler> implements Contextual
 
     private final InjectionTarget<T> partialBeanInjectionTarget;
     private final Class<H> handlerClass;
+    private CreationalContext<?> creationalContextOfDependentHandler;
 
     PartialBeanLifecycle(Class<T> partialBeanClass, Class<H> handlerClass, BeanManager beanManager)
     {
@@ -76,7 +80,7 @@ class PartialBeanLifecycle<T, H extends InvocationHandler> implements Contextual
     {
         try
         {
-            H handlerInstance = BeanProvider.getContextualReference(this.handlerClass);
+            H handlerInstance = createHandlerInstance();
 
             T instance = this.partialBeanProxyClass.newInstance();
 
@@ -98,6 +102,29 @@ class PartialBeanLifecycle<T, H extends InvocationHandler> implements Contextual
         return null;
     }
 
+    private H createHandlerInstance()
+    {
+        Set<Bean<H>> handlerBeans = BeanProvider.getBeanDefinitions(this.handlerClass, false, true);
+
+        if (handlerBeans.size() != 1)
+        {
+            throw new IllegalStateException(handlerBeans.size() + " beans found for " + this.handlerClass);
+        }
+
+        Bean<H> handlerBean = handlerBeans.iterator().next();
+
+        BeanManager beanManager = BeanManagerProvider.getInstance().getBeanManager();
+        CreationalContext<?> creationalContextOfHandler = beanManager.createCreationalContext(handlerBean);
+
+        H handlerInstance = (H)beanManager.getReference(handlerBean, this.handlerClass, creationalContextOfHandler);
+
+        if (handlerBean.getScope().equals(Dependent.class))
+        {
+            this.creationalContextOfDependentHandler = creationalContextOfHandler;
+        }
+        return handlerInstance;
+    }
+
     public void destroy(Bean<T> bean, T instance, CreationalContext<T> creationalContext)
     {
         if (this.partialBeanInjectionTarget != null)
@@ -105,6 +132,11 @@ class PartialBeanLifecycle<T, H extends InvocationHandler> implements Contextual
             this.partialBeanInjectionTarget.preDestroy(instance);
         }
 
+        if (this.creationalContextOfDependentHandler != null)
+        {
+            this.creationalContextOfDependentHandler.release();
+        }
+
         H handlerInstance = (H) ((PartialBeanMethodHandler)((ProxyObject) instance).getHandler()).getHandlerInstance();
         //injectionTarget.dispose(handlerInstance); //currently producers aren't supported
         creationalContext.release();

http://git-wip-us.apache.org/repos/asf/incubator-deltaspike/blob/e97ee923/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/api/invocationhandler/shared/PartialBeanHandler.java
----------------------------------------------------------------------
diff --git a/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/api/invocationhandler/shared/PartialBeanHandler.java b/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/api/invocationhandler/shared/PartialBeanHandler.java
index 2ef3b5a..bac54f8 100644
--- a/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/api/invocationhandler/shared/PartialBeanHandler.java
+++ b/deltaspike/core/impl/src/test/java/org/apache/deltaspike/test/core/api/invocationhandler/shared/PartialBeanHandler.java
@@ -20,14 +20,14 @@ package org.apache.deltaspike.test.core.api.invocationhandler.shared;
 
 import javax.annotation.PostConstruct;
 import javax.annotation.PreDestroy;
-import javax.enterprise.context.RequestScoped;
+import javax.enterprise.context.Dependent;
 import javax.inject.Inject;
 import java.lang.reflect.InvocationHandler;
 import java.lang.reflect.Method;
 
 @PartialBeanBinding
 @CustomInterceptor //for uc003
-@RequestScoped
+@Dependent //normal-scopes are possible as well
 public class PartialBeanHandler implements InvocationHandler, /*just needed for testing interceptors: */TestInterceptorAware
 {
     @Inject