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
+ }
+ }
}