You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openwebbeans.apache.org by rm...@apache.org on 2014/09/08 22:59:47 UTC

svn commit: r1623574 - in /openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans: component/creation/ config/ portable/ util/

Author: rmannibucau
Date: Mon Sep  8 20:59:47 2014
New Revision: 1623574

URL: http://svn.apache.org/r1623574
Log:
disposal methods for field producers

Added:
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/BaseProducerFactory.java
      - copied, changed from r1623449, openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/MethodProducerFactory.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/BaseProducerProducer.java
      - copied, changed from r1623478, openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/ProducerMethodProducer.java
Modified:
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/AbstractBeanBuilder.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/CdiInterceptorBeanBuilder.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/DecoratorBeanBuilder.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/FieldProducerFactory.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/MethodProducerFactory.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/ProducerMethodBeansBuilder.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/BeansDeployer.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/ProducerFieldProducer.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/ProducerMethodProducer.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansUtil.java

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/AbstractBeanBuilder.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/AbstractBeanBuilder.java?rev=1623574&r1=1623573&r2=1623574&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/AbstractBeanBuilder.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/AbstractBeanBuilder.java Mon Sep  8 20:59:47 2014
@@ -26,6 +26,7 @@ import javax.enterprise.inject.spi.Annot
 import javax.enterprise.inject.spi.AnnotatedType;
 import java.util.Set;
 
+import org.apache.webbeans.component.ProducerFieldBean;
 import org.apache.webbeans.component.ProducerMethodBean;
 import org.apache.webbeans.exception.WebBeansConfigurationException;
 import org.apache.webbeans.util.GenericsUtil;
@@ -41,7 +42,9 @@ public abstract class AbstractBeanBuilde
      * @param annotatedMethods of the given bean class
      * @param producerBeans or an empty Set
      */
-    protected void validateNoDisposerWithoutProducer(Set<AnnotatedMethod<? super T>> annotatedMethods, Set<ProducerMethodBean<?>> producerBeans)
+    protected void validateNoDisposerWithoutProducer(Set<AnnotatedMethod<? super T>> annotatedMethods,
+                                                     Set<ProducerMethodBean<?>> producerBeans,
+                                                     Set<ProducerFieldBean<?>> producerFields)
     {
         for (final AnnotatedMethod<?> annotatedMethod : annotatedMethods)
         {
@@ -60,7 +63,18 @@ public abstract class AbstractBeanBuilde
                     }
                     if (!found)
                     {
-                        throw new WebBeansConfigurationException("@Disposes without @Produces " + annotatedMethod.getJavaMember());
+                        for (final ProducerFieldBean<?> field : producerFields)
+                        {
+                            if (GenericsUtil.satisfiesDependency(false, field.getCreatorField().getType(), param.getBaseType()))
+                            {
+                                found = true;
+                                break;
+                            }
+                        }
+                        if (!found)
+                        {
+                            throw new WebBeansConfigurationException("@Disposes without @Produces " + annotatedMethod.getJavaMember());
+                        }
                     }
                     break;
                 }

Copied: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/BaseProducerFactory.java (from r1623449, openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/MethodProducerFactory.java)
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/BaseProducerFactory.java?p2=openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/BaseProducerFactory.java&p1=openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/MethodProducerFactory.java&r1=1623449&r2=1623574&rev=1623574&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/MethodProducerFactory.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/BaseProducerFactory.java Mon Sep  8 20:59:47 2014
@@ -18,71 +18,61 @@
  */
 package org.apache.webbeans.component.creation;
 
-import java.lang.annotation.Annotation;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Set;
+import org.apache.webbeans.annotation.AnyLiteral;
+import org.apache.webbeans.config.WebBeansContext;
+import org.apache.webbeans.exception.WebBeansConfigurationException;
+import org.apache.webbeans.util.AnnotationUtil;
+import org.apache.webbeans.util.Asserts;
+import org.apache.webbeans.util.GenericsUtil;
 
 import javax.enterprise.event.Observes;
 import javax.enterprise.inject.Default;
 import javax.enterprise.inject.Disposes;
 import javax.enterprise.inject.Produces;
+import javax.enterprise.inject.spi.AnnotatedMember;
 import javax.enterprise.inject.spi.AnnotatedMethod;
 import javax.enterprise.inject.spi.AnnotatedParameter;
+import javax.enterprise.inject.spi.AnnotatedType;
 import javax.enterprise.inject.spi.Bean;
 import javax.enterprise.inject.spi.DefinitionException;
 import javax.enterprise.inject.spi.InjectionPoint;
-import javax.enterprise.inject.spi.Producer;
+import javax.enterprise.inject.spi.ProducerFactory;
 import javax.inject.Inject;
 import javax.inject.Named;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Type;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
 
-import javax.enterprise.inject.spi.ProducerFactory;
-import org.apache.webbeans.config.WebBeansContext;
-import org.apache.webbeans.exception.WebBeansConfigurationException;
-import org.apache.webbeans.portable.ProducerMethodProducer;
-import org.apache.webbeans.util.AnnotationUtil;
-import org.apache.webbeans.util.Asserts;
-import org.apache.webbeans.util.GenericsUtil;
-
-public class MethodProducerFactory<P> implements ProducerFactory<P>
+public abstract class BaseProducerFactory<P> implements ProducerFactory<P>
 {
 
-    private AnnotatedMethod<? super P> producerMethod;
-    private AnnotatedMethod<? super P> disposalMethod;
-    private Bean<P> parent;
-    private WebBeansContext webBeansContext;
+    protected AnnotatedMethod<? super P> disposalMethod;
+    protected Bean<P> parent;
+    protected WebBeansContext webBeansContext;
 
-    public MethodProducerFactory(AnnotatedMethod<? super P> producerMethod, Bean<P> parent, WebBeansContext webBeansContext)
+    public BaseProducerFactory(Bean<P> parent, WebBeansContext webBeansContext)
     {
-        Asserts.assertNotNull(producerMethod, "producer method may not be null");
         Asserts.assertNotNull(webBeansContext, "WebBeansContext may not be null");
-        this.producerMethod = producerMethod;
         this.parent = parent;
         this.webBeansContext = webBeansContext;
-        defineDisposalMethod();
     }
 
-    public Class<?> getReturnType()
-    {
-        return producerMethod.getJavaMember().getReturnType();
-    }
-
-    @Override
-    public <T> Producer<T> createProducer(Bean<T> bean)
+    protected <T> Set<InjectionPoint> getInjectionPoints(final Bean<T> bean)
     {
         Set<InjectionPoint> disposalIPs = null;
         if (disposalMethod != null)
         {
             disposalIPs = new HashSet<InjectionPoint>(webBeansContext.getInjectionPointFactory().buildInjectionPoints(bean, disposalMethod));
         }
-
-        Producer<T> producer = new ProducerMethodProducer<T, P>(parent, producerMethod, disposalMethod, createInjectionPoints(bean), disposalIPs, webBeansContext);
-        return webBeansContext.getWebBeansUtil().fireProcessProducerEvent(producer, producerMethod);
+        return disposalIPs;
     }
 
-    private void defineDisposalMethod()
+    protected void defineDisposalMethod()
     {
-        Set<Annotation> producerQualifiers = webBeansContext.getAnnotationManager().getQualifierAnnotations(producerMethod.getAnnotations());
+        final AnnotatedMember<? super P> producer = producerType();
+        Set<Annotation> producerQualifiers = webBeansContext.getAnnotationManager().getQualifierAnnotations(producer.getAnnotations());
         if (producerQualifiers.size() == 1 && producerQualifiers.iterator().next().annotationType().equals(Default.class))
         {
             producerQualifiers = Collections.emptySet();
@@ -95,17 +85,23 @@ public class MethodProducerFactory<P> im
                 producerQualifiersWithoutNamed.add(qualifier);
             }
         }
-        Set<AnnotatedMethod<? super P>> annotatedMethods
-            = (Set<AnnotatedMethod<? super P>>)(Set<?>)webBeansContext.getAnnotatedElementFactory().getFilteredAnnotatedMethods(producerMethod.getDeclaringType());        
+
+        final AnnotatedType declaringType = producer.getDeclaringType();
+        final Type producerBaseType = producerType().getBaseType();
+        final Set<AnnotatedMethod<? super P>> annotatedMethods =
+                webBeansContext.getAnnotatedElementFactory().getFilteredAnnotatedMethods(declaringType);
+
+        AnnotatedMethod<? super P> anyDisposal = null;
+
         for (AnnotatedMethod<? super P> annotatedMethod : annotatedMethods)
-        {            
-            if (annotatedMethod.getDeclaringType().equals(producerMethod.getDeclaringType()))
+        {
+            if (annotatedMethod.getDeclaringType().equals(declaringType))
             {
                 for (AnnotatedParameter<? super P> annotatedParameter : annotatedMethod.getParameters())
                 {
                     if (annotatedParameter.isAnnotationPresent(Disposes.class))
                     {
-                        if (!GenericsUtil.satisfiesDependency(false, producerMethod.getBaseType(), annotatedParameter.getBaseType()))
+                        if (!GenericsUtil.satisfiesDependency(false, producerBaseType, annotatedParameter.getBaseType()))
                         {
                             continue;
                         }
@@ -126,10 +122,10 @@ public class MethodProducerFactory<P> im
                             continue;
                         }
                         boolean same = true;
-                        for (Annotation disposalQualifier: disposalQualifiers)
+                        for (Annotation disposalQualifier : disposalQualifiers)
                         {
                             boolean found = false;
-                            for (Annotation producerQualifier: producerQualifiers)
+                            for (Annotation producerQualifier : producerQualifiers)
                             {
                                 if (AnnotationUtil.isCdiAnnotationEqual(producerQualifier, disposalQualifier))
                                 {
@@ -145,6 +141,10 @@ public class MethodProducerFactory<P> im
                         }
                         if (!same)
                         {
+                            if (disposalQualifiers.size() == 1 && AnyLiteral.INSTANCE.equals(disposalQualifiers.iterator().next()))
+                            {
+                                anyDisposal = annotatedMethod;
+                            }
                             continue;
                         }
                         if (disposalMethod != null)
@@ -153,19 +153,31 @@ public class MethodProducerFactory<P> im
                                     + disposalMethod.getJavaMember().getName() + " in class : "
                                     + annotatedMethod.getDeclaringType().getJavaClass());
                         }
-                        if (!annotatedMethod.getDeclaringType().equals(producerMethod.getDeclaringType()))
-                        {
-                            throw new WebBeansConfigurationException("Producer method component of the disposal method : "
-                                    + annotatedMethod.getJavaMember().getName() + " in class : "
-                                    + annotatedMethod.getDeclaringType().getJavaClass() + " must be in the same class!");
-                        }
-                        checkDisposalMethod(annotatedMethod);
-                        disposalMethod = (AnnotatedMethod<P>)annotatedMethod;
+                        validateDisposalMethod(declaringType, annotatedMethod);
+                        disposalMethod = annotatedMethod;
                     }
                 }
             }
         }
-    }    
+        if (disposalMethod == null && anyDisposal != null)
+        {
+            validateDisposalMethod(declaringType, anyDisposal);
+            disposalMethod = anyDisposal;
+        }
+    }
+
+    private void validateDisposalMethod(final AnnotatedType declaringType, final AnnotatedMethod<? super P> annotatedMethod)
+    {
+        if (!annotatedMethod.getDeclaringType().equals(declaringType))
+        {
+            throw new WebBeansConfigurationException("Producer method component of the disposal method : "
+                    + annotatedMethod.getJavaMember().getName() + " in class : "
+                    + annotatedMethod.getDeclaringType().getJavaClass() + " must be in the same class!");
+        }
+        checkDisposalMethod(annotatedMethod);
+    }
+
+    protected abstract AnnotatedMember<? super P> producerType();
 
     private void checkDisposalMethod(AnnotatedMethod<? super P> annotatedMethod)
     {
@@ -200,9 +212,4 @@ public class MethodProducerFactory<P> im
             }
         }
     }
-
-    protected Set<InjectionPoint> createInjectionPoints(Bean<?> bean)
-    {
-        return new HashSet<InjectionPoint>(webBeansContext.getInjectionPointFactory().buildInjectionPoints(bean, producerMethod));
-    }
 }

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/CdiInterceptorBeanBuilder.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/CdiInterceptorBeanBuilder.java?rev=1623574&r1=1623573&r2=1623574&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/CdiInterceptorBeanBuilder.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/CdiInterceptorBeanBuilder.java Mon Sep  8 20:59:47 2014
@@ -57,7 +57,7 @@ public class CdiInterceptorBeanBuilder<T
         validateNoProducerMethod(annotatedType);
 
         // make sure that CDI interceptors do not have a Disposes method
-        validateNoDisposerWithoutProducer(webBeansContext.getAnnotatedElementFactory().getFilteredAnnotatedMethods(annotatedType), Collections.EMPTY_SET);
+        validateNoDisposerWithoutProducer(webBeansContext.getAnnotatedElementFactory().getFilteredAnnotatedMethods(annotatedType), Collections.EMPTY_SET, Collections.emptySet());
     }
 
     @Override

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/DecoratorBeanBuilder.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/DecoratorBeanBuilder.java?rev=1623574&r1=1623573&r2=1623574&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/DecoratorBeanBuilder.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/DecoratorBeanBuilder.java Mon Sep  8 20:59:47 2014
@@ -135,7 +135,8 @@ public class DecoratorBeanBuilder<T> ext
         validateNoProducerMethod(annotatedType);
 
         // make sure that CDI Decorator do not have a Disposes method
-        validateNoDisposerWithoutProducer(webBeansContext.getAnnotatedElementFactory().getFilteredAnnotatedMethods(annotatedType), Collections.EMPTY_SET);
+        validateNoDisposerWithoutProducer(
+                webBeansContext.getAnnotatedElementFactory().getFilteredAnnotatedMethods(annotatedType), Collections.EMPTY_SET, Collections.emptySet());
 
     }
 

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/FieldProducerFactory.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/FieldProducerFactory.java?rev=1623574&r1=1623573&r2=1623574&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/FieldProducerFactory.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/FieldProducerFactory.java Mon Sep  8 20:59:47 2014
@@ -18,32 +18,29 @@
  */
 package org.apache.webbeans.component.creation;
 
-import javax.enterprise.inject.spi.AnnotatedField;
-import javax.enterprise.inject.spi.Bean;
-import javax.enterprise.inject.spi.Producer;
-
-import javax.enterprise.inject.spi.ProducerFactory;
-import javax.inject.Inject;
-
 import org.apache.webbeans.config.WebBeansContext;
 import org.apache.webbeans.portable.ProducerFieldProducer;
 import org.apache.webbeans.util.Asserts;
 import org.apache.webbeans.util.ClassUtil;
 
+import javax.enterprise.inject.spi.AnnotatedField;
+import javax.enterprise.inject.spi.AnnotatedMember;
+import javax.enterprise.inject.spi.Bean;
+import javax.enterprise.inject.spi.InjectionPoint;
+import javax.enterprise.inject.spi.Producer;
+import javax.inject.Inject;
 import java.lang.reflect.ParameterizedType;
 import java.lang.reflect.Type;
+import java.util.Set;
 
-public class FieldProducerFactory<P> implements ProducerFactory<P>
+public class FieldProducerFactory<P> extends BaseProducerFactory<P>
 {
-
     private AnnotatedField<? super P> producerField;
-    private Bean<P> parent;
-    private WebBeansContext webBeansContext;
 
     public FieldProducerFactory(AnnotatedField<? super P> producerField, Bean<P> parent, WebBeansContext webBeansContext)
     {
+        super(parent, webBeansContext);
         Asserts.assertNotNull(producerField, "producer method may not be null");
-        Asserts.assertNotNull(webBeansContext, "WebBeansContext may not be null");
 
         if (producerField.isAnnotationPresent(Inject.class))
         {
@@ -63,14 +60,14 @@ public class FieldProducerFactory<P> imp
         }
 
         this.producerField = producerField;
-        this.parent = parent;
-        this.webBeansContext = webBeansContext;
+        defineDisposalMethod();
     }
 
     @Override
     public <T> Producer<T> createProducer(Bean<T> bean)
     {
-        Producer<T> producer = new ProducerFieldProducer<T, P>(parent, producerField, webBeansContext);
+        final Set<InjectionPoint> disposalIPs = getInjectionPoints(bean);
+        final Producer<T> producer = new ProducerFieldProducer<T, P>(parent, producerField, disposalMethod, disposalIPs, webBeansContext);
         return webBeansContext.getWebBeansUtil().fireProcessProducerEvent(producer, producerField);
     }
 
@@ -78,4 +75,10 @@ public class FieldProducerFactory<P> imp
     {
         return producerField.getJavaMember().getType();
     }
+
+    @Override
+    protected AnnotatedMember<? super P> producerType()
+    {
+        return producerField;
+    }
 }

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/MethodProducerFactory.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/MethodProducerFactory.java?rev=1623574&r1=1623573&r2=1623574&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/MethodProducerFactory.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/MethodProducerFactory.java Mon Sep  8 20:59:47 2014
@@ -18,50 +18,36 @@
  */
 package org.apache.webbeans.component.creation;
 
-import java.lang.annotation.Annotation;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Set;
+import org.apache.webbeans.config.WebBeansContext;
+import org.apache.webbeans.portable.ProducerMethodProducer;
+import org.apache.webbeans.util.Asserts;
 
-import javax.enterprise.event.Observes;
-import javax.enterprise.inject.Default;
-import javax.enterprise.inject.Disposes;
-import javax.enterprise.inject.Produces;
+import javax.enterprise.inject.spi.AnnotatedMember;
 import javax.enterprise.inject.spi.AnnotatedMethod;
-import javax.enterprise.inject.spi.AnnotatedParameter;
 import javax.enterprise.inject.spi.Bean;
-import javax.enterprise.inject.spi.DefinitionException;
 import javax.enterprise.inject.spi.InjectionPoint;
 import javax.enterprise.inject.spi.Producer;
-import javax.inject.Inject;
-import javax.inject.Named;
-
-import javax.enterprise.inject.spi.ProducerFactory;
-import org.apache.webbeans.config.WebBeansContext;
-import org.apache.webbeans.exception.WebBeansConfigurationException;
-import org.apache.webbeans.portable.ProducerMethodProducer;
-import org.apache.webbeans.util.AnnotationUtil;
-import org.apache.webbeans.util.Asserts;
-import org.apache.webbeans.util.GenericsUtil;
+import java.util.HashSet;
+import java.util.Set;
 
-public class MethodProducerFactory<P> implements ProducerFactory<P>
+public class MethodProducerFactory<P> extends BaseProducerFactory<P>
 {
-
     private AnnotatedMethod<? super P> producerMethod;
-    private AnnotatedMethod<? super P> disposalMethod;
-    private Bean<P> parent;
-    private WebBeansContext webBeansContext;
 
     public MethodProducerFactory(AnnotatedMethod<? super P> producerMethod, Bean<P> parent, WebBeansContext webBeansContext)
     {
+        super(parent, webBeansContext);
         Asserts.assertNotNull(producerMethod, "producer method may not be null");
-        Asserts.assertNotNull(webBeansContext, "WebBeansContext may not be null");
         this.producerMethod = producerMethod;
-        this.parent = parent;
-        this.webBeansContext = webBeansContext;
         defineDisposalMethod();
     }
 
+    @Override
+    protected AnnotatedMember<? super P> producerType()
+    {
+        return producerMethod;
+    }
+
     public Class<?> getReturnType()
     {
         return producerMethod.getJavaMember().getReturnType();
@@ -70,137 +56,11 @@ public class MethodProducerFactory<P> im
     @Override
     public <T> Producer<T> createProducer(Bean<T> bean)
     {
-        Set<InjectionPoint> disposalIPs = null;
-        if (disposalMethod != null)
-        {
-            disposalIPs = new HashSet<InjectionPoint>(webBeansContext.getInjectionPointFactory().buildInjectionPoints(bean, disposalMethod));
-        }
-
-        Producer<T> producer = new ProducerMethodProducer<T, P>(parent, producerMethod, disposalMethod, createInjectionPoints(bean), disposalIPs, webBeansContext);
+        final Set<InjectionPoint> disposalIPs = getInjectionPoints(bean);
+        final Producer<T> producer = new ProducerMethodProducer<T, P>(parent, producerMethod, disposalMethod, createInjectionPoints(bean), disposalIPs, webBeansContext);
         return webBeansContext.getWebBeansUtil().fireProcessProducerEvent(producer, producerMethod);
     }
 
-    private void defineDisposalMethod()
-    {
-        Set<Annotation> producerQualifiers = webBeansContext.getAnnotationManager().getQualifierAnnotations(producerMethod.getAnnotations());
-        if (producerQualifiers.size() == 1 && producerQualifiers.iterator().next().annotationType().equals(Default.class))
-        {
-            producerQualifiers = Collections.emptySet();
-        }
-        Set<Annotation> producerQualifiersWithoutNamed = new HashSet<Annotation>();
-        for (Annotation qualifier: producerQualifiers)
-        {
-            if (!qualifier.annotationType().equals(Named.class))
-            {
-                producerQualifiersWithoutNamed.add(qualifier);
-            }
-        }
-        Set<AnnotatedMethod<? super P>> annotatedMethods
-            = (Set<AnnotatedMethod<? super P>>)(Set<?>)webBeansContext.getAnnotatedElementFactory().getFilteredAnnotatedMethods(producerMethod.getDeclaringType());        
-        for (AnnotatedMethod<? super P> annotatedMethod : annotatedMethods)
-        {            
-            if (annotatedMethod.getDeclaringType().equals(producerMethod.getDeclaringType()))
-            {
-                for (AnnotatedParameter<? super P> annotatedParameter : annotatedMethod.getParameters())
-                {
-                    if (annotatedParameter.isAnnotationPresent(Disposes.class))
-                    {
-                        if (!GenericsUtil.satisfiesDependency(false, producerMethod.getBaseType(), annotatedParameter.getBaseType()))
-                        {
-                            continue;
-                        }
-
-                        Set<Annotation> producerQualifiersToCompare = producerQualifiers;
-                        Set<Annotation> disposalQualifiers = webBeansContext.getAnnotationManager().getQualifierAnnotations(annotatedParameter.getAnnotations());
-                        if (disposalQualifiers.size() == 1 && disposalQualifiers.iterator().next().annotationType().equals(Default.class))
-                        {
-                            disposalQualifiers = Collections.emptySet();
-                        }
-                        if (disposalQualifiers.size() == producerQualifiersToCompare.size() - 1)
-                        {
-                            // when @Named is present at the producer it may be ignored at the disposal
-                            producerQualifiersToCompare = producerQualifiersWithoutNamed;
-                        }
-                        if (disposalQualifiers.size() != producerQualifiersToCompare.size())
-                        {
-                            continue;
-                        }
-                        boolean same = true;
-                        for (Annotation disposalQualifier: disposalQualifiers)
-                        {
-                            boolean found = false;
-                            for (Annotation producerQualifier: producerQualifiers)
-                            {
-                                if (AnnotationUtil.isCdiAnnotationEqual(producerQualifier, disposalQualifier))
-                                {
-                                    found = true;
-                                    break;
-                                }
-                            }
-                            if (!found)
-                            {
-                                same = false;
-                                break;
-                            }
-                        }
-                        if (!same)
-                        {
-                            continue;
-                        }
-                        if (disposalMethod != null)
-                        {
-                            throw new WebBeansConfigurationException("There are multiple disposal method for the producer method : "
-                                    + disposalMethod.getJavaMember().getName() + " in class : "
-                                    + annotatedMethod.getDeclaringType().getJavaClass());
-                        }
-                        if (!annotatedMethod.getDeclaringType().equals(producerMethod.getDeclaringType()))
-                        {
-                            throw new WebBeansConfigurationException("Producer method component of the disposal method : "
-                                    + annotatedMethod.getJavaMember().getName() + " in class : "
-                                    + annotatedMethod.getDeclaringType().getJavaClass() + " must be in the same class!");
-                        }
-                        checkDisposalMethod(annotatedMethod);
-                        disposalMethod = (AnnotatedMethod<P>)annotatedMethod;
-                    }
-                }
-            }
-        }
-    }    
-
-    private void checkDisposalMethod(AnnotatedMethod<? super P> annotatedMethod)
-    {
-        boolean found = false;
-        for (AnnotatedParameter<?> parameter : annotatedMethod.getParameters())
-        {
-            if(parameter.isAnnotationPresent(Disposes.class))
-            {
-                if(found)
-                {
-                    throw new WebBeansConfigurationException("Error in definining disposal method of annotated method : " + annotatedMethod
-                            + ". Multiple disposes annotation.");
-                }
-                found = true;
-            }
-        }
-        
-        if(annotatedMethod.isAnnotationPresent(Inject.class) 
-            || AnnotationUtil.hasAnnotatedMethodParameterAnnotation(annotatedMethod, Observes.class)
-            || annotatedMethod.isAnnotationPresent(Produces.class))
-        {
-            throw new DefinitionException("Error in definining disposal method of annotated method : " + annotatedMethod
-                    + ". Disposal methods  can not be annotated with" + " @Initializer/@Destructor/@Produces annotation or has a parameter annotated with @Observes.");
-        }
-
-        for (AnnotatedParameter param : annotatedMethod.getParameters())
-        {
-            if (param.getBaseType().equals(InjectionPoint.class))
-            {
-                throw new DefinitionException("Error in definining disposal method of annotated method : " + annotatedMethod
-                    + ". Disposal methods must not have an InjectionPoint.");
-            }
-        }
-    }
-
     protected Set<InjectionPoint> createInjectionPoints(Bean<?> bean)
     {
         return new HashSet<InjectionPoint>(webBeansContext.getInjectionPointFactory().buildInjectionPoints(bean, producerMethod));

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/ProducerMethodBeansBuilder.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/ProducerMethodBeansBuilder.java?rev=1623574&r1=1623573&r2=1623574&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/ProducerMethodBeansBuilder.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/ProducerMethodBeansBuilder.java Mon Sep  8 20:59:47 2014
@@ -19,6 +19,7 @@
 package org.apache.webbeans.component.creation;
 
 import org.apache.webbeans.component.InjectionTargetBean;
+import org.apache.webbeans.component.ProducerFieldBean;
 import org.apache.webbeans.component.ProducerMethodBean;
 import org.apache.webbeans.config.WebBeansContext;
 import org.apache.webbeans.exception.WebBeansConfigurationException;
@@ -61,7 +62,7 @@ public class ProducerMethodBeansBuilder<
     /**
      * {@inheritDoc}
      */
-    public Set<ProducerMethodBean<?>> defineProducerMethods(InjectionTargetBean<T> bean)
+    public Set<ProducerMethodBean<?>> defineProducerMethods(InjectionTargetBean<T> bean, Set<ProducerFieldBean<?>> producerFields)
     {
         Set<ProducerMethodBean<?>> producerBeans = new HashSet<ProducerMethodBean<?>>();
         Set<AnnotatedMethod<? super T>> annotatedMethods = webBeansContext.getAnnotatedElementFactory().getFilteredAnnotatedMethods(annotatedType);
@@ -113,7 +114,7 @@ public class ProducerMethodBeansBuilder<
         }
 
         // valid all @Disposes have a @Produces
-        validateNoDisposerWithoutProducer(annotatedMethods, producerBeans);
+        validateNoDisposerWithoutProducer(annotatedMethods, producerBeans, producerFields);
 
         return producerBeans;
     }

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/BeansDeployer.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/BeansDeployer.java?rev=1623574&r1=1623573&r2=1623574&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/BeansDeployer.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/BeansDeployer.java Mon Sep  8 20:59:47 2014
@@ -61,7 +61,7 @@ import org.apache.webbeans.intercept.Int
 import org.apache.webbeans.logger.WebBeansLoggerFacade;
 import org.apache.webbeans.portable.AbstractProducer;
 import org.apache.webbeans.portable.AnnotatedElementFactory;
-import org.apache.webbeans.portable.ProducerMethodProducer;
+import org.apache.webbeans.portable.BaseProducerProducer;
 import org.apache.webbeans.portable.events.ProcessAnnotatedTypeImpl;
 import org.apache.webbeans.portable.events.ProcessBeanImpl;
 import org.apache.webbeans.portable.events.ProcessSyntheticAnnotatedTypeImpl;
@@ -305,11 +305,12 @@ public class BeansDeployer
         {
             if (ProducerMethodBean.class.isInstance(bean))
             {
-                final Producer<?> producer = ProducerMethodBean.class.cast(bean).getProducer();
-                if (ProducerMethodProducer.class.isInstance(producer))
+                final Producer<?> producer = AbstractProducerBean.class.cast(bean).getProducer();
+                if (BaseProducerProducer.class.isInstance(producer))
                 {
-                    final Set<InjectionPoint> disposalIPs = ProducerMethodProducer.class.cast(producer).getDisposalIPs();
-                    if (disposalIPs != null)
+                    final BaseProducerProducer producerProducer = BaseProducerProducer.class.cast(producer);
+                    final Set<InjectionPoint> disposalIPs = producerProducer.getDisposalIPs();
+                    if (disposalIPs != null && !producerProducer.isAnyDisposal()) // any can be ambiguous but that's not an issue
                     {
                         webBeansUtil.validate(disposalIPs, bean);
                     }
@@ -1404,13 +1405,20 @@ public class BeansDeployer
                     logger.log(Level.FINE, "Found Managed Bean with class name : [{0}]", annotatedType.getJavaClass().getName());
                 }
 
-                Set<ObserverMethod<?>> observerMethods = new HashSet<ObserverMethod<?>>();
+                final Set<ObserverMethod<?>> observerMethods;
+                final AnnotatedType<T> beanAnnotatedType = bean.getAnnotatedType();
                 if(bean.isEnabled())
                 {
-                    observerMethods = new ObserverMethodsBuilder<T>(webBeansContext, bean.getAnnotatedType()).defineObserverMethods(bean);
+                    observerMethods = new ObserverMethodsBuilder<T>(webBeansContext, beanAnnotatedType).defineObserverMethods(bean);
                 }
-                Set<ProducerMethodBean<?>> producerMethods = new ProducerMethodBeansBuilder(bean.getWebBeansContext(), bean.getAnnotatedType()).defineProducerMethods(bean);
-                Set<ProducerFieldBean<?>> producerFields = new ProducerFieldBeansBuilder(bean.getWebBeansContext(), bean.getAnnotatedType()).defineProducerFields(bean);
+                else
+                {
+                    observerMethods = new HashSet<ObserverMethod<?>>();
+                }
+
+                final WebBeansContext wbc = bean.getWebBeansContext();
+                Set<ProducerFieldBean<?>> producerFields = new ProducerFieldBeansBuilder(wbc, beanAnnotatedType).defineProducerFields(bean);
+                Set<ProducerMethodBean<?>> producerMethods = new ProducerMethodBeansBuilder(wbc, beanAnnotatedType).defineProducerMethods(bean, producerFields);
 
                 ManagedBean<T> managedBean = (ManagedBean<T>)bean;
                 Map<ProducerMethodBean<?>,AnnotatedMethod<?>> annotatedMethods =

Copied: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/BaseProducerProducer.java (from r1623478, openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/ProducerMethodProducer.java)
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/BaseProducerProducer.java?p2=openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/BaseProducerProducer.java&p1=openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/ProducerMethodProducer.java&r1=1623478&r2=1623574&rev=1623574&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/ProducerMethodProducer.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/BaseProducerProducer.java Mon Sep  8 20:59:47 2014
@@ -18,54 +18,41 @@
  */
 package org.apache.webbeans.portable;
 
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
-import java.util.Map;
-import java.util.Set;
+import org.apache.webbeans.config.WebBeansContext;
+import org.apache.webbeans.context.creational.CreationalContextImpl;
+import org.apache.webbeans.inject.InjectableMethod;
+import org.apache.webbeans.spi.plugins.OpenWebBeansEjbPlugin;
+import org.apache.webbeans.util.Asserts;
 
 import javax.enterprise.context.spi.CreationalContext;
+import javax.enterprise.inject.Any;
+import javax.enterprise.inject.Disposes;
 import javax.enterprise.inject.spi.AnnotatedMethod;
+import javax.enterprise.inject.spi.AnnotatedParameter;
 import javax.enterprise.inject.spi.AnnotatedType;
 import javax.enterprise.inject.spi.Bean;
 import javax.enterprise.inject.spi.InjectionPoint;
-import javax.enterprise.inject.spi.Interceptor;
-
-import org.apache.webbeans.config.WebBeansContext;
-import org.apache.webbeans.context.creational.CreationalContextImpl;
-import org.apache.webbeans.inject.InjectableMethod;
-import org.apache.webbeans.spi.plugins.OpenWebBeansEjbPlugin;
-import org.apache.webbeans.util.Asserts;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.util.Set;
 
-/**
- * A {@link javax.enterprise.inject.spi.Producer} for producer-method beans.
- */
-public class ProducerMethodProducer<T, P> extends AbstractProducer<T>
+public abstract class BaseProducerProducer<T, P> extends AbstractProducer<T>
 {
 
-    private Bean<P> owner;
-    private WebBeansContext webBeansContext;
-    private Method producerMethod;
-    private Method disposalMethod;
-    private Set<InjectionPoint> disposalIPs;
-
-    public ProducerMethodProducer(Bean<P> owner,
-                                  AnnotatedMethod<? super P> producerMethod,
-                                  AnnotatedMethod<? super P> disposerMethod,
-                                  Set<InjectionPoint> points,
-                                  Set<InjectionPoint> disposalIPs,
-                                  WebBeansContext webBeansContext)
+    protected Bean<P> owner;
+    protected WebBeansContext webBeansContext;
+    protected Method disposalMethod;
+    protected Set<InjectionPoint> disposalIPs;
+    protected boolean isAnyDisposal;
+
+    public BaseProducerProducer(Bean<P> owner,
+                                AnnotatedMethod<? super P> disposerMethod,
+                                Set<InjectionPoint> points,
+                                Set<InjectionPoint> disposalIPs,
+                                WebBeansContext webBeansContext)
     {
         super(points);
-        if (owner == null && !producerMethod.isStatic())
-        {
-            throw new IllegalArgumentException("owner may not be null");
-        }
-        Asserts.assertNotNull(producerMethod, "method may not be null");
         Asserts.assertNotNull(webBeansContext, "WebBeansContext may not be null");
-        if (!producerMethod.isStatic())
-        {
-            Asserts.assertNotNull(owner, "owner may not be null for non-static producer method");
-        }
         this.owner = owner;
         this.webBeansContext = webBeansContext;
         this.disposalIPs = disposalIPs;
@@ -73,7 +60,6 @@ public class ProducerMethodProducer<T, P
         final OpenWebBeansEjbPlugin ejbPlugin = webBeansContext.getPluginLoader().getEjbPlugin();
         if (ejbPlugin != null)
         {
-            this.producerMethod = ejbPlugin.resolveViewMethod(owner, producerMethod.getJavaMember());
             if (disposerMethod != null)
             {
                 disposalMethod = ejbPlugin.resolveViewMethod(owner, disposerMethod.getJavaMember());
@@ -81,12 +67,22 @@ public class ProducerMethodProducer<T, P
         }
         else
         {
-            this.producerMethod = producerMethod.getJavaMember();
             if (disposerMethod != null)
             {
                 disposalMethod = disposerMethod.getJavaMember();
             }
         }
+        if (disposerMethod != null)
+        {
+            for (final AnnotatedParameter<?> param : disposerMethod.getParameters())
+            {
+                if (param.isAnnotationPresent(Disposes.class))
+                {
+                    isAnyDisposal = param.isAnnotationPresent(Any.class);
+                    break;
+                }
+            }
+        }
     }
 
     @Override
@@ -99,35 +95,6 @@ public class ProducerMethodProducer<T, P
     }
 
     @Override
-    protected T produce(Map<Interceptor<?>, ?> interceptors, CreationalContextImpl<T> creationalContext)
-    {
-        P parentInstance = null;
-        CreationalContext<P> parentCreationalContext = null;
-        InjectableMethod<T> m;
-        try
-        {
-            parentCreationalContext = webBeansContext.getBeanManagerImpl().createCreationalContext(owner);
-
-            if (!Modifier.isStatic(producerMethod.getModifiers()))
-            {
-                parentInstance = (P)webBeansContext.getBeanManagerImpl().getReference(owner, owner.getBeanClass(), parentCreationalContext);
-            }
-            
-            m = new InjectableMethod<T>(producerMethod, parentInstance, this, (CreationalContextImpl<T>) creationalContext);
-            
-            return m.doInjection();
-
-        }
-        finally
-        {
-            if (parentCreationalContext != null)
-            {
-                parentCreationalContext.release();
-            }
-        }
-    }
-
-    @Override
     public void dispose(T instance)
     {
         if (disposalMethod != null)
@@ -162,4 +129,9 @@ public class ProducerMethodProducer<T, P
     {
         return disposalIPs;
     }
+
+    public boolean isAnyDisposal()
+    {
+        return isAnyDisposal;
+    }
 }

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/ProducerFieldProducer.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/ProducerFieldProducer.java?rev=1623574&r1=1623573&r2=1623574&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/ProducerFieldProducer.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/ProducerFieldProducer.java Mon Sep  8 20:59:47 2014
@@ -18,57 +18,46 @@
  */
 package org.apache.webbeans.portable;
 
-import java.lang.reflect.Field;
-import java.lang.reflect.Modifier;
-import java.util.Collections;
-import java.util.Map;
+import org.apache.webbeans.component.AbstractOwbBean;
+import org.apache.webbeans.config.WebBeansContext;
+import org.apache.webbeans.context.creational.CreationalContextImpl;
+import org.apache.webbeans.exception.WebBeansException;
+import org.apache.webbeans.util.Asserts;
+import org.apache.webbeans.util.WebBeansUtil;
 
 import javax.enterprise.context.Dependent;
 import javax.enterprise.context.spi.CreationalContext;
 import javax.enterprise.inject.spi.AnnotatedField;
-import javax.enterprise.inject.spi.AnnotatedType;
+import javax.enterprise.inject.spi.AnnotatedMethod;
 import javax.enterprise.inject.spi.Bean;
 import javax.enterprise.inject.spi.InjectionPoint;
 import javax.enterprise.inject.spi.Interceptor;
+import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
+import java.util.Collections;
+import java.util.Map;
+import java.util.Set;
 
-import org.apache.webbeans.component.AbstractOwbBean;
-import org.apache.webbeans.config.WebBeansContext;
-import org.apache.webbeans.context.creational.CreationalContextImpl;
-import org.apache.webbeans.exception.WebBeansException;
-import org.apache.webbeans.util.Asserts;
-import org.apache.webbeans.util.WebBeansUtil;
-
-public class ProducerFieldProducer<T, P> extends AbstractProducer<T>
+public class ProducerFieldProducer<T, P> extends BaseProducerProducer<T, P>
 {
-
-    private Bean<P> owner;
-    private WebBeansContext webBeansContext;
     private AnnotatedField<? super P> producerField;
 
-    public ProducerFieldProducer(Bean<P> owner, AnnotatedField<? super P> producerField, WebBeansContext context)
+    public ProducerFieldProducer(Bean<P> owner,
+                                 AnnotatedField<? super P> producerField,
+                                 AnnotatedMethod<? super P> disposerMethod,
+                                 Set<InjectionPoint> disposalIPs,
+                                 WebBeansContext webBeansContext)
     {
-        super(Collections.<InjectionPoint>emptySet());
+        super(owner, disposerMethod, Collections.<InjectionPoint>emptySet(), disposalIPs, webBeansContext);
         if (owner == null && !producerField.isStatic())
         {
             throw new IllegalArgumentException("owner may not be null");
         }
         Asserts.assertNotNull(producerField, "field may not be null");
-        Asserts.assertNotNull(context, "WebBeansContext may not be null");
-        this.owner = owner;
-        webBeansContext = context;
         this.producerField = producerField;
     }
 
     @Override
-    public void defineInterceptorStack(final Bean<T> bean, final AnnotatedType<T> annotatedType, final WebBeansContext webBeansContext)
-    {
-        if (webBeansContext.getOpenWebBeansConfiguration().supportsInterceptionOnProducers())
-        {
-            super.defineInterceptorStack(bean, annotatedType, webBeansContext);
-        }
-    }
-
-    @Override
     protected T produce(Map<Interceptor<?>, ?> interceptors, CreationalContextImpl<T> creationalContext)
     {
         T instance = null;

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/ProducerMethodProducer.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/ProducerMethodProducer.java?rev=1623574&r1=1623573&r2=1623574&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/ProducerMethodProducer.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/ProducerMethodProducer.java Mon Sep  8 20:59:47 2014
@@ -25,7 +25,6 @@ import java.util.Set;
 
 import javax.enterprise.context.spi.CreationalContext;
 import javax.enterprise.inject.spi.AnnotatedMethod;
-import javax.enterprise.inject.spi.AnnotatedType;
 import javax.enterprise.inject.spi.Bean;
 import javax.enterprise.inject.spi.InjectionPoint;
 import javax.enterprise.inject.spi.Interceptor;
@@ -39,14 +38,9 @@ import org.apache.webbeans.util.Asserts;
 /**
  * A {@link javax.enterprise.inject.spi.Producer} for producer-method beans.
  */
-public class ProducerMethodProducer<T, P> extends AbstractProducer<T>
+public class ProducerMethodProducer<T, P> extends BaseProducerProducer<T, P>
 {
-
-    private Bean<P> owner;
-    private WebBeansContext webBeansContext;
     private Method producerMethod;
-    private Method disposalMethod;
-    private Set<InjectionPoint> disposalIPs;
 
     public ProducerMethodProducer(Bean<P> owner,
                                   AnnotatedMethod<? super P> producerMethod,
@@ -55,46 +49,20 @@ public class ProducerMethodProducer<T, P
                                   Set<InjectionPoint> disposalIPs,
                                   WebBeansContext webBeansContext)
     {
-        super(points);
-        if (owner == null && !producerMethod.isStatic())
-        {
-            throw new IllegalArgumentException("owner may not be null");
-        }
+        super(owner, disposerMethod, points, disposalIPs, webBeansContext);
         Asserts.assertNotNull(producerMethod, "method may not be null");
-        Asserts.assertNotNull(webBeansContext, "WebBeansContext may not be null");
         if (!producerMethod.isStatic())
         {
             Asserts.assertNotNull(owner, "owner may not be null for non-static producer method");
         }
-        this.owner = owner;
-        this.webBeansContext = webBeansContext;
-        this.disposalIPs = disposalIPs;
-
         final OpenWebBeansEjbPlugin ejbPlugin = webBeansContext.getPluginLoader().getEjbPlugin();
         if (ejbPlugin != null)
         {
             this.producerMethod = ejbPlugin.resolveViewMethod(owner, producerMethod.getJavaMember());
-            if (disposerMethod != null)
-            {
-                disposalMethod = ejbPlugin.resolveViewMethod(owner, disposerMethod.getJavaMember());
-            }
         }
         else
         {
             this.producerMethod = producerMethod.getJavaMember();
-            if (disposerMethod != null)
-            {
-                disposalMethod = disposerMethod.getJavaMember();
-            }
-        }
-    }
-
-    @Override
-    public void defineInterceptorStack(final Bean<T> bean, final AnnotatedType<T> annotatedType, final WebBeansContext webBeansContext)
-    {
-        if (webBeansContext.getOpenWebBeansConfiguration().supportsInterceptionOnProducers())
-        {
-            super.defineInterceptorStack(bean, annotatedType, webBeansContext);
         }
     }
 
@@ -126,40 +94,4 @@ public class ProducerMethodProducer<T, P
             }
         }
     }
-
-    @Override
-    public void dispose(T instance)
-    {
-        if (disposalMethod != null)
-        {
-            P parentInstance = null;
-            CreationalContext<P> parentCreationalContext = null;
-            InjectableMethod<T> m;
-            try
-            {
-                parentCreationalContext = webBeansContext.getBeanManagerImpl().createCreationalContext(owner);
-
-                if (!Modifier.isStatic(disposalMethod.getModifiers()))
-                {
-                    parentInstance = (P)webBeansContext.getBeanManagerImpl().getReference(owner, owner.getBeanClass(), parentCreationalContext);
-                }
-
-                m = new InjectableMethod<T>(disposalMethod, parentInstance, this, (CreationalContextImpl<T>) parentCreationalContext, disposalIPs);
-                m.setDisposable(true);
-                m.setProducerMethodInstance(instance);
-
-                m.doInjection();
-
-            }
-            finally
-            {
-                parentCreationalContext.release();
-            }
-        }
-    }
-
-    public Set<InjectionPoint> getDisposalIPs()
-    {
-        return disposalIPs;
-    }
 }

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansUtil.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansUtil.java?rev=1623574&r1=1623573&r2=1623574&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansUtil.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansUtil.java Mon Sep  8 20:59:47 2014
@@ -1382,8 +1382,8 @@ public final class WebBeansUtil
         //Check for Enabled via Alternative
         setInjectionTargetBeanEnableFlag(managedBeanCreator.getBean());
         ManagedBean<T> managedBean = managedBeanCreator.getBean();
-        new ProducerMethodBeansBuilder(managedBean.getWebBeansContext(), managedBean.getAnnotatedType()).defineProducerMethods(managedBean);
-        new ProducerFieldBeansBuilder(managedBean.getWebBeansContext(), managedBean.getAnnotatedType()).defineProducerFields(managedBean);
+        new ProducerMethodBeansBuilder(managedBean.getWebBeansContext(), managedBean.getAnnotatedType()).defineProducerMethods(
+                managedBean, new ProducerFieldBeansBuilder(managedBean.getWebBeansContext(), managedBean.getAnnotatedType()).defineProducerFields(managedBean));
         new ObserverMethodsBuilder<T>(webBeansContext, managedBean.getAnnotatedType()).defineObserverMethods(managedBean);
 
         if (managedBean.getProducer() instanceof AbstractProducer)