diff --git a/impl/src/main/java/org/jboss/weld/extensions/bean/generic/GenericBeanExtension.java b/impl/src/main/java/org/jboss/weld/extensions/bean/generic/GenericBeanExtension.java index c8c66de..d4f19c6 100644 --- a/impl/src/main/java/org/jboss/weld/extensions/bean/generic/GenericBeanExtension.java +++ b/impl/src/main/java/org/jboss/weld/extensions/bean/generic/GenericBeanExtension.java @@ -78,6 +78,9 @@ class GenericBeanExtension implements Extension // A map of generic configuration types to producer methods on generic beans // Used to track the generic bean found private final Map, Map, Bean>> genericBeanProducerMethods; + + // A map of producer methods on generic beans to their disposer method (if existent) + private final Map, AnnotatedMethod> genericBeanDisposerMethods; // A map of generic configuration types to producer fields on generic beans // Used to track the generic bean found @@ -103,6 +106,7 @@ class GenericBeanExtension implements Extension { this.genericBeans = new HashMap, Map, Bean>>(); this.genericBeanProducerMethods = new HashMap, Map, Bean>>(); + this.genericBeanDisposerMethods = new HashMap, AnnotatedMethod>(); this.genericBeanProducerFields = new HashMap, Map, Bean>>(); this.genericInjectionTargets = new HashMap, Map, InjectionTarget>>(); this.genericProducers = new HashMap, Map>>(); @@ -187,6 +191,12 @@ void registerGenericBeanProducerMethod(@Observes ProcessProducerMethod) +// { +// disposerMethods.put(method, (AnnotatedMethod) event.getAnnotatedDisposedParameter()); +// } } } @@ -405,6 +415,7 @@ private Bean createGenericProducerBean(final BeanManager beanManager, fin Set qualifiers = getQualifiers(genericProducers.get(genericConfiguration.annotationType()).get(genericConfiguration).getAnnotations(), beanManager); // TODO make this passivation capable? + // TODO Make this wrap the existing bean, replacing the type and qualifiers only BeanBuilder builder = new BeanBuilder(beanManager).setJavaClass(genericBeanType).setQualifiers(qualifiers).setBeanLifecycle(new BeanLifecycle() { @@ -440,7 +451,7 @@ private Bean createGenericBean(Bean originalBean, Annotation genericCo private Bean createGenericProducerMethod(Bean originalBean, Annotation genericConfiguration, AnnotatedMethod method, BeanManager beanManager) { Set qualifiers = getQualifiers(genericProducers.get(genericConfiguration.annotationType()).get(genericConfiguration).getAnnotations(), originalBean, beanManager); - return new GenericProducerMethod(originalBean, genericConfiguration, method, qualifiers, syntheticProvider, beanManager); + return new GenericProducerMethod(originalBean, genericConfiguration, method, (AnnotatedMethod) genericBeanDisposerMethods.get(method), qualifiers, syntheticProvider, beanManager); } private Bean createGenericProducerField(Bean originalBean, Annotation genericConfiguration, AnnotatedField field, BeanManager beanManager) diff --git a/impl/src/main/java/org/jboss/weld/extensions/bean/generic/GenericProducerMethod.java b/impl/src/main/java/org/jboss/weld/extensions/bean/generic/GenericProducerMethod.java index 6fbbff9..3b357a8 100644 --- a/impl/src/main/java/org/jboss/weld/extensions/bean/generic/GenericProducerMethod.java +++ b/impl/src/main/java/org/jboss/weld/extensions/bean/generic/GenericProducerMethod.java @@ -16,14 +16,23 @@ class GenericProducerMethod extends AbstactGenericBean { - private final InjectableMethod method; + private final InjectableMethod producerMethod; + private final InjectableMethod disposerMethod; private final Type declaringBeanType; private final Annotation declaringBeanQualifier; - GenericProducerMethod(Bean originalBean, Annotation genericConfiguration, AnnotatedMethod method, Set qualifiers, Synthetic.Provider syntheticProvider, BeanManager beanManager) + GenericProducerMethod(Bean originalBean, Annotation genericConfiguration, AnnotatedMethod method, AnnotatedMethod disposerMethod, Set qualifiers, Synthetic.Provider syntheticProvider, BeanManager beanManager) { - super(originalBean, qualifiers, beanManager); - this.method = new InjectableMethod(method, this, beanManager); + super(originalBean, qualifiers, beanManager); + this.producerMethod = new InjectableMethod(method, this, beanManager); + if (disposerMethod != null) + { + this.disposerMethod = new InjectableMethod(disposerMethod, this, beanManager); + } + else + { + this.disposerMethod = null; + } this.declaringBeanType = originalBean.getBeanClass(); this.declaringBeanQualifier = syntheticProvider.get(genericConfiguration); } @@ -33,9 +42,7 @@ public T create(CreationalContext creationalContext) { try { - Bean declaringBean = getBeanManager().resolve(getBeanManager().getBeans(declaringBeanType, declaringBeanQualifier)); - Object receiver = getBeanManager().getReference(declaringBean, declaringBean.getBeanClass(), creationalContext); - return method.invoke(receiver, creationalContext); + return producerMethod.invoke(getReceiver(creationalContext), creationalContext); } finally { @@ -44,4 +51,27 @@ public T create(CreationalContext creationalContext) } } + @Override + public void destroy(T instance, CreationalContext creationalContext) + { + if (disposerMethod != null) + { + try + { + disposerMethod.invoke(getReceiver(creationalContext), creationalContext); + } + finally + { + // Generic managed beans must be dependent + creationalContext.release(); + } + } + } + + private Object getReceiver(CreationalContext creationalContext) + { + Bean declaringBean = getBeanManager().resolve(getBeanManager().getBeans(declaringBeanType, declaringBeanQualifier)); + return getBeanManager().getReference(declaringBean, declaringBean.getBeanClass(), creationalContext); + } + }