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