Author: rmannibucau
Date: Tue Apr 23 21:40:35 2013
New Revision: 1471157

URL: http://svn.apache.org/r1471157
Log:
OWB-845 @Disposes without @Produces should be validated

Modified:
    
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/ProducerMethodBean.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/event/ObserverMethodImpl.java
    
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/DecoratorHandler.java
    
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/disposes/DisposerMethodBeanTest.java

Modified: 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/ProducerMethodBean.java
URL: 
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/ProducerMethodBean.java?rev=1471157&r1=1471156&r2=1471157&view=diff
==============================================================================
--- 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/ProducerMethodBean.java
 (original)
+++ 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/ProducerMethodBean.java
 Tue Apr 23 21:40:35 2013
@@ -69,6 +69,12 @@ public class ProducerMethodBean<T> exten
         return creatorMethod;
     }
 
+
+    public Method getDisposalMethod()
+    {
+        return disposalMethod;
+    }
+
     /**
      * Sets the method.
      * 

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=1471157&r1=1471156&r2=1471157&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
 Tue Apr 23 21:40:35 2013
@@ -41,6 +41,7 @@ import org.apache.webbeans.exception.Web
 import org.apache.webbeans.portable.ProducerMethodProducer;
 import org.apache.webbeans.util.AnnotationUtil;
 import org.apache.webbeans.util.Asserts;
+import org.apache.webbeans.util.ClassUtil;
 
 public class MethodProducerFactory<P> implements ProducerFactory<P>
 {
@@ -97,6 +98,11 @@ public class MethodProducerFactory<P> im
                 {
                     if (annotatedParameter.isAnnotationPresent(Disposes.class))
                     {
+                        if 
(!ClassUtil.isAssignable(annotatedParameter.getBaseType(), 
producerMethod.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))

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=1471157&r1=1471156&r2=1471157&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
 Tue Apr 23 21:40:35 2013
@@ -18,17 +18,6 @@
  */
 package org.apache.webbeans.component.creation;
 
-import java.util.HashSet;
-import java.util.Set;
-
-import javax.enterprise.event.Observes;
-import javax.enterprise.inject.Disposes;
-import javax.enterprise.inject.Produces;
-import javax.enterprise.inject.Specializes;
-import javax.enterprise.inject.spi.AnnotatedMethod;
-import javax.enterprise.inject.spi.AnnotatedType;
-import javax.inject.Inject;
-
 import org.apache.webbeans.component.BeanAttributesImpl;
 import org.apache.webbeans.component.EnterpriseBeanMarker;
 import org.apache.webbeans.component.InjectionTargetBean;
@@ -37,8 +26,20 @@ import org.apache.webbeans.config.WebBea
 import org.apache.webbeans.exception.WebBeansConfigurationException;
 import org.apache.webbeans.util.AnnotationUtil;
 import org.apache.webbeans.util.Asserts;
+import org.apache.webbeans.util.ClassUtil;
 import org.apache.webbeans.util.WebBeansUtil;
 
+import javax.enterprise.event.Observes;
+import javax.enterprise.inject.Disposes;
+import javax.enterprise.inject.Produces;
+import javax.enterprise.inject.Specializes;
+import javax.enterprise.inject.spi.AnnotatedMethod;
+import javax.enterprise.inject.spi.AnnotatedParameter;
+import javax.enterprise.inject.spi.AnnotatedType;
+import javax.inject.Inject;
+import java.util.HashSet;
+import java.util.Set;
+
 /**
  * Abstract implementation of {@link AbstractBeanBuilder}.
  * 
@@ -114,6 +115,31 @@ public class ProducerMethodBeansBuilder<
             }
             
         }
+
+        // valid all @Disposes have a @Produces
+        for (final AnnotatedMethod<? super T> annotatedMethod : 
annotatedMethods)
+        {
+            for (final AnnotatedParameter<?> param : 
annotatedMethod.getParameters())
+            {
+                if (param.isAnnotationPresent(Disposes.class))
+                {
+                    boolean found = false;
+                    for (final ProducerMethodBean<?> producer : producerBeans)
+                    {
+                        if (ClassUtil.isAssignable(param.getBaseType(), 
producer.getCreatorMethod().getGenericReturnType()))
+                        {
+                            found = true;
+                            break;
+                        }
+                    }
+                    if (!found)
+                    {
+                        throw new WebBeansConfigurationException("@Disposes 
without @Produces " + annotatedMethod.getJavaMember());
+                    }
+                    break;
+                }
+            }
+        }
         
         return producerBeans;
     }

Modified: 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/ObserverMethodImpl.java
URL: 
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/ObserverMethodImpl.java?rev=1471157&r1=1471156&r2=1471157&view=diff
==============================================================================
--- 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/ObserverMethodImpl.java
 (original)
+++ 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/ObserverMethodImpl.java
 Tue Apr 23 21:40:35 2013
@@ -24,6 +24,7 @@ import java.lang.reflect.Modifier;
 import java.lang.reflect.ParameterizedType;
 import java.lang.reflect.Type;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
@@ -55,6 +56,7 @@ import org.apache.webbeans.exception.Web
 import org.apache.webbeans.inject.impl.InjectionPointFactory;
 import org.apache.webbeans.logger.WebBeansLoggerFacade;
 import org.apache.webbeans.proxy.OwbNormalScopeProxy;
+import org.apache.webbeans.spi.plugins.OpenWebBeansEjbPlugin;
 import org.apache.webbeans.util.AnnotationUtil;
 
 /**
@@ -98,7 +100,9 @@ public class ObserverMethodImpl<T> imple
     
     /** the transaction phase */
     private final TransactionPhase phase;
-    
+
+    private final Method view;
+
     /**Annotated method*/
     private AnnotatedMethod<T> annotatedObserverMethod;
     
@@ -128,13 +132,20 @@ public class ObserverMethodImpl<T> imple
         this.annotatedObserverMethod = annotatedObserverMethod;
         this.ifExist = ifExist;
         observedQualifiers = new HashSet<Annotation>(qualifiers.length);
-        for (Annotation qualifier : qualifiers)
-        {
-            observedQualifiers.add(qualifier);
-        }
+        Collections.addAll(observedQualifiers, qualifiers);
         this.observedEventType = observedEventType;
         phase = 
EventUtil.getObserverMethodTransactionType(annotatedObserverMethod);
 
+        final OpenWebBeansEjbPlugin ejbPlugin = 
getWebBeansContext().getPluginLoader().getEjbPlugin();
+        if (ejbPlugin != null && 
ejbPlugin.isNewSessionBean(bean.getBeanClass()))
+        {
+            view = ejbPlugin.resolveViewMethod(bean , 
annotatedObserverMethod.getJavaMember());
+        }
+        else
+        {
+            view = annotatedObserverMethod.getJavaMember();
+        }
+
     }
 
     /**
@@ -180,17 +191,15 @@ public class ObserverMethodImpl<T> imple
                 args[i++] = param.instance;
             }
 
-            Method observerMethod = annotatedObserverMethod.getJavaMember();
-
             //Static or not
-            if (Modifier.isStatic(observerMethod.getModifiers()))
+            if (Modifier.isStatic(view.getModifiers()))
             {
-                if (!observerMethod.isAccessible())
+                if (!view.isAccessible())
                 {
-                    observerMethod.setAccessible(true);
+                    view.setAccessible(true);
                 }
                 //Invoke Method
-                observerMethod.invoke(null, args);
+                view.invoke(null, args);
             }
             else
             {
@@ -238,12 +247,12 @@ public class ObserverMethodImpl<T> imple
 
                 if (object != null)
                 {
-                    if (!observerMethod.isAccessible())
+                    if (!view.isAccessible())
                     {
-                        
bean.getWebBeansContext().getSecurityService().doPrivilegedSetAccessible(observerMethod,
 true);
+                        
bean.getWebBeansContext().getSecurityService().doPrivilegedSetAccessible(view, 
true);
                     }
 
-                    if (Modifier.isPrivate(observerMethod.getModifiers()))
+                    if (Modifier.isPrivate(view.getModifiers()))
                     {
                         // since private methods cannot be intercepted, we 
have to unwrap anny possible proxy
                         if (object instanceof OwbNormalScopeProxy)
@@ -253,7 +262,7 @@ public class ObserverMethodImpl<T> imple
                     }
 
                     //Invoke Method
-                    observerMethod.invoke(object, args);
+                    view.invoke(object, args);
                 }
             }                        
         }

Modified: 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/DecoratorHandler.java
URL: 
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/DecoratorHandler.java?rev=1471157&r1=1471156&r2=1471157&view=diff
==============================================================================
--- 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/DecoratorHandler.java
 (original)
+++ 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/DecoratorHandler.java
 Tue Apr 23 21:40:35 2013
@@ -58,27 +58,30 @@ public class DecoratorHandler implements
     {
         BusinessMethodInterceptorInfo methodInterceptorInfo = 
interceptorInfo.getBusinessMethodsInfo().get(method);
         LinkedHashMap<Decorator<?>, Method> methodDecorators = 
methodInterceptorInfo.getMethodDecorators();
-        for (int i = index; i < decorators.size(); i++)
+        if (methodDecorators != null)
         {
-            Decorator<?> decorator = decorators.get(i);
-            Method decoratingMethod = methodDecorators.get(decorator);
-            if (decoratingMethod != null)
+            for (int i = index; i < decorators.size(); i++)
             {
-                try
+                Decorator<?> decorator = decorators.get(i);
+                Method decoratingMethod = methodDecorators.get(decorator);
+                if (decoratingMethod != null)
                 {
-                    if (!decoratingMethod.isAccessible())
+                    try
                     {
-                        decoratingMethod.setAccessible(true);
+                        if (!decoratingMethod.isAccessible())
+                        {
+                            decoratingMethod.setAccessible(true);
+                        }
+                        return 
decoratingMethod.invoke(instances.get(decorator), args);
+                    }
+                    catch (InvocationTargetException e)
+                    {
+                        return 
ExceptionUtil.throwAsRuntimeException(e.getTargetException());
+                    }
+                    catch (Exception e)
+                    {
+                        return ExceptionUtil.throwAsRuntimeException(e);
                     }
-                    return decoratingMethod.invoke(instances.get(decorator), 
args);
-                }
-                catch (InvocationTargetException e)
-                {
-                    return 
ExceptionUtil.throwAsRuntimeException(e.getTargetException());
-                }
-                catch (Exception e)
-                {
-                    return ExceptionUtil.throwAsRuntimeException(e);
                 }
             }
         }

Modified: 
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/disposes/DisposerMethodBeanTest.java
URL: 
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/disposes/DisposerMethodBeanTest.java?rev=1471157&r1=1471156&r2=1471157&view=diff
==============================================================================
--- 
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/disposes/DisposerMethodBeanTest.java
 (original)
+++ 
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/newtests/disposes/DisposerMethodBeanTest.java
 Tue Apr 23 21:40:35 2013
@@ -18,19 +18,22 @@
  */
 package org.apache.webbeans.newtests.disposes;
 
-import java.util.ArrayList;
-import java.util.Collection;
-
-import javax.enterprise.context.spi.CreationalContext;
-import javax.enterprise.inject.spi.Bean;
-
 import junit.framework.Assert;
-
 import org.apache.webbeans.newtests.AbstractUnitTest;
 import org.apache.webbeans.newtests.disposes.beans.DisposeModel;
 import org.apache.webbeans.newtests.disposes.beans.DisposerMethodBean;
 import org.junit.Test;
 
+import javax.enterprise.context.spi.CreationalContext;
+import javax.enterprise.inject.Disposes;
+import javax.enterprise.inject.Produces;
+import javax.enterprise.inject.spi.Bean;
+import javax.enterprise.inject.spi.InjectionPoint;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collection;
+
 public class DisposerMethodBeanTest extends AbstractUnitTest
 {
     @Test
@@ -54,4 +57,40 @@ public class DisposerMethodBeanTest exte
         shutDownContainer();
     }
 
+    @Test
+    public void multipleDisposes()
+    {
+        final Collection<String> beanXmls = new ArrayList<String>();
+
+        final Collection<Class<?>> beanClasses = new ArrayList<Class<?>>();
+        beanClasses.add(MultipleDispose.class);
+
+        startContainer(beanClasses, beanXmls); // we had a regression where we 
were not starting
+        shutDownContainer();
+    }
+
+    public static class MultipleDispose
+    {
+        @Produces
+        public InputStream is(final InjectionPoint ip)
+        {
+            return null;
+        }
+
+        @Produces
+        public URL url(final InjectionPoint ip)
+        {
+            return null;
+        }
+
+        public void dis(final @Disposes InputStream is)
+        {
+            // no-op
+        }
+
+        public void durl(final @Disposes URL url)
+        {
+            // no-op
+        }
+    }
 }


Reply via email to