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

svn commit: r1436797 - in /openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans: annotation/AnnotationManager.java component/creation/ProducerMethodProducerBuilder.java portable/ProducerMethodProducer.java

Author: arne
Date: Tue Jan 22 08:41:46 2013
New Revision: 1436797

URL: http://svn.apache.org/viewvc?rev=1436797&view=rev
Log:
OWB-755: Fixed definition of disposal methods

Modified:
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/annotation/AnnotationManager.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/ProducerMethodProducerBuilder.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/ProducerMethodProducer.java

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/annotation/AnnotationManager.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/annotation/AnnotationManager.java?rev=1436797&r1=1436796&r2=1436797&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/annotation/AnnotationManager.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/annotation/AnnotationManager.java Tue Jan 22 08:41:46 2013
@@ -332,6 +332,11 @@ public final class AnnotationManager
         return result;
     }
 
+    public Set<Annotation> getQualifierAnnotations(Set<Annotation> annotations)
+    {
+        return new HashSet<Annotation>(Arrays.asList(getQualifierAnnotations(annotations.toArray(new Annotation[annotations.size()]))));
+    }
+
     /**
      * Gets the array of qualifier annotations on the given array.
      *

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/ProducerMethodProducerBuilder.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/ProducerMethodProducerBuilder.java?rev=1436797&r1=1436796&r2=1436797&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/ProducerMethodProducerBuilder.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/ProducerMethodProducerBuilder.java Tue Jan 22 08:41:46 2013
@@ -18,17 +18,22 @@
  */
 package org.apache.webbeans.component.creation;
 
+import java.lang.annotation.Annotation;
+import java.util.Collections;
 import java.util.HashSet;
 import java.util.Set;
 
+import javax.enterprise.inject.Default;
 import javax.enterprise.inject.Disposes;
 import javax.enterprise.inject.spi.AnnotatedMethod;
 import javax.enterprise.inject.spi.AnnotatedParameter;
 import javax.enterprise.inject.spi.InjectionPoint;
+import javax.inject.Named;
 
 import org.apache.webbeans.component.OwbBean;
 import org.apache.webbeans.component.ProducerMethodBean;
 import org.apache.webbeans.portable.ProducerMethodProducer;
+import org.apache.webbeans.util.AnnotationUtil;
 import org.apache.webbeans.util.Asserts;
 
 public class ProducerMethodProducerBuilder<T, P>
@@ -55,7 +60,20 @@ public class ProducerMethodProducerBuild
 
     private void defineDisposalMethod()
     {
-        Set<AnnotatedMethod<? super P>> annotatedMethods = producerMethod.getDeclaringType().getMethods();
+        Set<Annotation> producerQualifiers = bean.getWebBeansContext().getAnnotationManager().getQualifierAnnotations(producerMethod.getAnnotations());
+        if (producerQualifiers.size() == 1 && producerQualifiers.iterator().next().annotationType().equals(Default.class))
+        {
+            producerQualifiers = Collections.<Annotation>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 = producerMethod.getDeclaringType().getMethods();        
         for (AnnotatedMethod<? super P> annotatedMethod : annotatedMethods)
         {            
             if (annotatedMethod.getDeclaringType().equals(producerMethod.getDeclaringType()))
@@ -64,6 +82,43 @@ public class ProducerMethodProducerBuild
                 {
                     if (annotatedParameter.isAnnotationPresent(Disposes.class))
                     {
+                        Set<Annotation> producerQualifiersToCompare = producerQualifiers;
+                        Set<Annotation> disposalQualifiers = bean.getWebBeansContext().getAnnotationManager().getQualifierAnnotations(annotatedParameter.getAnnotations());
+                        if (disposalQualifiers.size() == 1 && disposalQualifiers.iterator().next().annotationType().equals(Default.class))
+                        {
+                            disposalQualifiers = Collections.<Annotation>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;
+                        }
                         disposalMethod = (AnnotatedMethod<P>)annotatedMethod;
                         break;
                     }

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=1436797&r1=1436796&r2=1436797&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 Tue Jan 22 08:41:46 2013
@@ -72,7 +72,7 @@ public class ProducerMethodProducer<T, P
                 parentInstance = (P)webBeansContext.getBeanManagerImpl().getReference(owner, owner.getBeanClass(), parentCreationalContext);
             }
             
-            m = new InjectableMethod<T>(producerMethod.getJavaMember(), parentInstance, this, (CreationalContextImpl<T>) parentCreationalContext);
+            m = new InjectableMethod<T>(producerMethod.getJavaMember(), parentInstance, this, (CreationalContextImpl<T>) creationalContext);
             
             return m.doInjection();