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/07/02 01:12:59 UTC
svn commit: r1607213 - in /openwebbeans/trunk:
webbeans-impl/src/main/java/org/apache/webbeans/config/
webbeans-impl/src/main/java/org/apache/webbeans/container/
webbeans-impl/src/main/java/org/apache/webbeans/event/
webbeans-impl/src/main/java/org/apa...
Author: rmannibucau
Date: Tue Jul 1 23:12:58 2014
New Revision: 1607213
URL: http://svn.apache.org/r1607213
Log:
few more hack on generics and events, not that happy of EventMetadataImpl but didn't find a very good solution to be generic enough tonight
Modified:
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/BeansDeployer.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/BeanManagerImpl.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/EventImpl.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/EventMetadataImpl.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/NotificationManager.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/EventProducer.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/events/discovery/AfterBeanDiscoveryImpl.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/GenericsUtil.java
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansUtil.java
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/portable/ExtensionTest.java
openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/unittests/portable/events/ExtensionTest.java
openwebbeans/trunk/webbeans-tck/testng-dev.xml
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=1607213&r1=1607212&r2=1607213&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 Tue Jul 1 23:12:58 2014
@@ -1360,7 +1360,7 @@ public class BeansDeployer
//Fires ProcessManagedBean
ProcessBeanImpl<T> processBeanEvent = new GProcessManagedBean(managedBean, annotatedType);
- beanManager.fireEvent(processBeanEvent);
+ beanManager.fireEvent(processBeanEvent, true);
webBeansContext.getWebBeansUtil().inspectErrorStack("There are errors that are added by ProcessManagedBean event observers for " +
"managed beans. Look at logs for further details");
@@ -1421,7 +1421,7 @@ public class BeansDeployer
final ProcessBeanAttributesImpl event = new GProcessBeanAttributes(annotatedType.getJavaClass(), annotatedType, beanAttributes);
try
{
- webBeansContext.getBeanManagerImpl().fireEvent(event, AnnotationUtil.EMPTY_ANNOTATION_ARRAY);
+ webBeansContext.getBeanManagerImpl().fireEvent(event, true, AnnotationUtil.EMPTY_ANNOTATION_ARRAY);
}
catch (final Exception e)
{
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/BeanManagerImpl.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/BeanManagerImpl.java?rev=1607213&r1=1607212&r2=1607213&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/BeanManagerImpl.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/BeanManagerImpl.java Tue Jul 1 23:12:58 2014
@@ -407,13 +407,18 @@ public class BeanManagerImpl implements
*/
@Override
public void fireEvent(Object event, Annotation... bindings)
- {
+ {
+ fireEvent(event, false, bindings);
+ }
+
+ public void fireEvent(Object event, boolean containerEvent, Annotation... bindings)
+ {
Type type = event.getClass();
if (GenericsUtil.hasTypeParameters(type))
{
type = GenericsUtil.getParameterizedType(type);
}
- fireEvent(event, new EventMetadataImpl(type, null, bindings, webBeansContext), false);
+ fireEvent(event, new EventMetadataImpl(null, type, null, bindings, webBeansContext), containerEvent);
}
/**
@@ -423,10 +428,10 @@ public class BeanManagerImpl implements
*/
public void fireLifecycleEvent(Object event, Annotation... bindings)
{
- fireEvent(event, new EventMetadataImpl(event.getClass(), null, bindings, webBeansContext), true);
+ fireEvent(event, new EventMetadataImpl(null, event.getClass(), null, bindings, webBeansContext), true);
}
- public void fireEvent(Object event, EventMetadata metadata, boolean isLifecycleEvent)
+ public void fireEvent(Object event, EventMetadataImpl metadata, boolean isLifecycleEvent)
{
notificationManager.fireEvent(event, metadata, isLifecycleEvent);
}
@@ -1116,12 +1121,12 @@ public class BeanManagerImpl implements
@Override
public <T> Set<ObserverMethod<? super T>> resolveObserverMethods(T event, Annotation... qualifiers)
{
- return resolveObserverMethods(event, new EventMetadataImpl(event.getClass(), null, qualifiers, webBeansContext));
+ return resolveObserverMethods(event, new EventMetadataImpl(null, event.getClass(), null, qualifiers, webBeansContext));
}
- public <T> Set<ObserverMethod<? super T>> resolveObserverMethods(T event, EventMetadata metadata)
+ public <T> Set<ObserverMethod<? super T>> resolveObserverMethods(T event, EventMetadataImpl metadata)
{
- return notificationManager.resolveObservers(event, metadata);
+ return notificationManager.resolveObservers(event, metadata, false);
}
@Override
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/EventImpl.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/EventImpl.java?rev=1607213&r1=1607212&r2=1607213&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/EventImpl.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/EventImpl.java Tue Jul 1 23:12:58 2014
@@ -30,7 +30,6 @@ import javax.enterprise.util.TypeLiteral
import org.apache.webbeans.config.WebBeansContext;
import org.apache.webbeans.util.Asserts;
-import org.apache.webbeans.util.GenericsUtil;
/**
* Event implementation.
@@ -69,7 +68,7 @@ public class EventImpl<T> implements Eve
else
{
Set<Annotation> qualifiers = metadata.getQualifiers();
- return new EventMetadataImpl(metadata.getType(), metadata.getInjectionPoint(), qualifiers.toArray(new Annotation[qualifiers.size()]), webBeansContext);
+ return new EventMetadataImpl(null, metadata.getType(), metadata.getInjectionPoint(), qualifiers.toArray(new Annotation[qualifiers.size()]), webBeansContext);
}
}
@@ -80,10 +79,7 @@ public class EventImpl<T> implements Eve
public void fire(T event)
{
Type eventType = event.getClass();
- if (GenericsUtil.hasTypeParameters(eventType))
- {
- eventType = GenericsUtil.resolveType(GenericsUtil.getParameterizedType(eventType), metadata.getType());
- }
+ webBeansContext.getWebBeansUtil().validEventType(eventType.getClass(), metadata.getType());
webBeansContext.getBeanManagerImpl().fireEvent(event, metadata.select(eventType), false);
}
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/EventMetadataImpl.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/EventMetadataImpl.java?rev=1607213&r1=1607212&r2=1607213&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/EventMetadataImpl.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/EventMetadataImpl.java Tue Jul 1 23:12:58 2014
@@ -21,17 +21,25 @@ package org.apache.webbeans.event;
import java.io.IOException;
import java.io.Serializable;
import java.lang.annotation.Annotation;
+import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
+import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
+import java.util.HashMap;
import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
import java.util.Set;
+import java.util.TreeMap;
+import java.util.concurrent.ConcurrentHashMap;
import javax.enterprise.inject.spi.EventMetadata;
import javax.enterprise.inject.spi.InjectionPoint;
import javax.enterprise.util.TypeLiteral;
import org.apache.webbeans.annotation.AnyLiteral;
+import org.apache.webbeans.config.OwbParametrizedTypeImpl;
import org.apache.webbeans.config.WebBeansContext;
import org.apache.webbeans.util.ArrayUtil;
@@ -40,13 +48,15 @@ public class EventMetadataImpl implement
private static final long serialVersionUID = -6401875861180683988L;
private final Type type;
+ private final Type selectType;
private final InjectionPoint injectionPoint;
private final Set<Annotation> qualifiers;
private transient WebBeansContext webBeansContext;
- public EventMetadataImpl(Type type, InjectionPoint injectionPoint, Annotation[] qualifiers, WebBeansContext context)
+ public EventMetadataImpl(Type selectType, Type type, InjectionPoint injectionPoint, Annotation[] qualifiers, WebBeansContext context)
{
context.getAnnotationManager().checkQualifierConditions(qualifiers);
+ this.selectType = selectType;
this.type = type;
this.injectionPoint = injectionPoint;
this.webBeansContext = context;
@@ -73,9 +83,36 @@ public class EventMetadataImpl implement
@Override
public Type getType()
{
+ if (selectType != null
+ && ParameterizedType.class.isInstance(selectType))
+ {
+ final ParameterizedType parameterizedType = ParameterizedType.class.cast(selectType);
+ final Type rawType = parameterizedType.getRawType();
+ if (rawType == type)
+ {
+ return selectType;
+ }
+ else if (rawType == List.class && type == ArrayList.class)
+ {
+ return new OwbParametrizedTypeImpl(parameterizedType.getOwnerType(), type, parameterizedType.getActualTypeArguments());
+ }
+ else if (rawType == Set.class && type == HashSet.class)
+ {
+ return new OwbParametrizedTypeImpl(parameterizedType.getOwnerType(), type, parameterizedType.getActualTypeArguments());
+ }
+ else if (rawType == Map.class && (type == HashMap.class || type == ConcurrentHashMap.class || type == TreeMap.class))
+ {
+ return new OwbParametrizedTypeImpl(parameterizedType.getOwnerType(), type, parameterizedType.getActualTypeArguments());
+ } // TODO: better handling of these kind of types, the idea is to check selectType is a parent of type and param number is ==
+ }
return type;
}
-
+
+ public Type validatedType()
+ {
+ return selectType != null? selectType : type;
+ }
+
@Override
public InjectionPoint getInjectionPoint()
{
@@ -88,18 +125,18 @@ public class EventMetadataImpl implement
return qualifiers;
}
- public EventMetadata select(Annotation... bindings)
+ public EventMetadataImpl select(Annotation... bindings)
{
return select(type, bindings);
}
- public EventMetadata select(TypeLiteral<?> subtype, Annotation... bindings)
+ public EventMetadataImpl select(TypeLiteral<?> subtype, Annotation... bindings)
{
webBeansContext.getWebBeansUtil().checkTypeVariables(subtype);
return select(subtype.getType(), bindings);
}
- public EventMetadata select(Type subtype, Annotation... bindings)
+ public EventMetadataImpl select(Type subtype, Annotation... bindings)
{
Set<Annotation> newQualifiers = ArrayUtil.asSet(bindings);
newQualifiers.addAll(qualifiers);
@@ -107,7 +144,7 @@ public class EventMetadataImpl implement
{
throw new IllegalArgumentException("duplicate qualifier");
}
- return new EventMetadataImpl(subtype, injectionPoint, newQualifiers.toArray(new Annotation[newQualifiers.size()]), webBeansContext);
+ return new EventMetadataImpl(type, subtype, injectionPoint, newQualifiers.toArray(new Annotation[newQualifiers.size()]), webBeansContext);
}
private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/NotificationManager.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/NotificationManager.java?rev=1607213&r1=1607212&r2=1607213&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/NotificationManager.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/NotificationManager.java Tue Jul 1 23:12:58 2014
@@ -38,7 +38,6 @@ import javax.enterprise.inject.spi.Annot
import javax.enterprise.inject.spi.AnnotatedMethod;
import javax.enterprise.inject.spi.AnnotatedParameter;
import javax.enterprise.inject.spi.BeforeBeanDiscovery;
-import javax.enterprise.inject.spi.EventMetadata;
import javax.enterprise.inject.spi.Extension;
import javax.enterprise.inject.spi.ObserverMethod;
import javax.enterprise.inject.spi.ProcessProducer;
@@ -102,12 +101,12 @@ public final class NotificationManager
}
- public <T> Set<ObserverMethod<? super T>> resolveObservers(T event, EventMetadata metadata)
+ public <T> Set<ObserverMethod<? super T>> resolveObservers(T event, EventMetadataImpl metadata, boolean isLifecycleEvent)
{
EventUtil.checkEventBindings(webBeansContext, metadata.getQualifiers());
- Type eventType = metadata.getType();
- Set<ObserverMethod<? super T>> observersMethods = filterByType(event, eventType);
+ Type eventType = metadata.validatedType();
+ Set<ObserverMethod<? super T>> observersMethods = filterByType(event, eventType, isLifecycleEvent);
observersMethods = filterByQualifiers(observersMethods, metadata.getQualifiers());
@@ -120,9 +119,9 @@ public final class NotificationManager
return observersMethods;
}
- private <T> Set<ObserverMethod<? super T>> filterByType(T event, Type declaredEventType)
+ private <T> Set<ObserverMethod<? super T>> filterByType(T event, Type declaredEventType, boolean isLifecycleEvent)
{
- if(WebBeansUtil.isExtensionEventType(declaredEventType))
+ if (isLifecycleEvent)
{
return filterByExtensionEventType(event, declaredEventType);
}
@@ -407,9 +406,14 @@ public final class NotificationManager
return matching;
}
- public void fireEvent(Object event, EventMetadata metadata, boolean isLifecycleEvent)
+ public void fireEvent(Object event, EventMetadataImpl metadata, boolean isLifecycleEvent)
{
- Set<ObserverMethod<? super Object>> observerMethods = resolveObservers(event, metadata);
+ if (!isLifecycleEvent && webBeansContext.getWebBeansUtil().isContainerEventType(event))
+ {
+ throw new IllegalArgumentException("Firing container events is forbidden");
+ }
+
+ Set<ObserverMethod<? super Object>> observerMethods = resolveObservers(event, metadata, isLifecycleEvent);
for (ObserverMethod<? super Object> observer : observerMethods)
{
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/EventProducer.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/EventProducer.java?rev=1607213&r1=1607212&r2=1607213&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/EventProducer.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/EventProducer.java Tue Jul 1 23:12:58 2014
@@ -105,7 +105,7 @@ public class EventProducer<T> extends Ab
try
{
- instance = new EventImpl<T>(new EventMetadataImpl(eventType, injectionPoint, qualifiers, webBeansContext), webBeansContext);
+ instance = new EventImpl<T>(new EventMetadataImpl(null, eventType, injectionPoint, qualifiers, webBeansContext), webBeansContext);
}
catch (Exception e)
{
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/events/discovery/AfterBeanDiscoveryImpl.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/events/discovery/AfterBeanDiscoveryImpl.java?rev=1607213&r1=1607212&r2=1607213&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/events/discovery/AfterBeanDiscoveryImpl.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/events/discovery/AfterBeanDiscoveryImpl.java Tue Jul 1 23:12:58 2014
@@ -72,7 +72,7 @@ public class AfterBeanDiscoveryImpl impl
//Fire Event
ProcessBean<?> processBeanEvent = new GProcessBean(bean,annotatedType);
- beanManager.fireEvent(processBeanEvent, AnnotationUtil.EMPTY_ANNOTATION_ARRAY);
+ beanManager.fireEvent(processBeanEvent, true, AnnotationUtil.EMPTY_ANNOTATION_ARRAY);
if(bean instanceof Interceptor)
{
@@ -175,7 +175,7 @@ public class AfterBeanDiscoveryImpl impl
public void addObserverMethod(ObserverMethod<?> observerMethod)
{
ProcessObserverMethod<?, ?> event = new GProcessObservableMethod(null,observerMethod);
- beanManager.fireEvent(event, AnnotationUtil.EMPTY_ANNOTATION_ARRAY);
+ beanManager.fireEvent(event, true, AnnotationUtil.EMPTY_ANNOTATION_ARRAY);
beanManager.getNotificationManager().addObserver(observerMethod, observerMethod.getObservedType());
}
Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/GenericsUtil.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/GenericsUtil.java?rev=1607213&r1=1607212&r2=1607213&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/GenericsUtil.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/GenericsUtil.java Tue Jul 1 23:12:58 2014
@@ -84,7 +84,8 @@ public final class GenericsUtil
}
else if (requiredType instanceof GenericArrayType)
{
- return isAssignableFrom(isDelegate, (GenericArrayType)requiredType, beanType);
+ return Class.class.isInstance(beanType) && Class.class.cast(beanType).isArray()
+ && isAssignableFrom(isDelegate, (GenericArrayType)requiredType, beanType);
}
else if (requiredType instanceof WildcardType)
{
@@ -317,9 +318,20 @@ public final class GenericsUtil
return true;
}
+ // rules are a bit different when in an array so we handle ParameterizedType manually (not reusing isAssignableFrom)
private static boolean isAssignableFrom(boolean isDelegate, GenericArrayType injectionPointType, Type beanType)
{
- throw new UnsupportedOperationException("Not yet implementeds");
+ final Type genericComponentType = injectionPointType.getGenericComponentType();
+ final Class componentType = Class.class.cast(beanType).getComponentType();
+ if (Class.class.isInstance(genericComponentType))
+ {
+ return Class.class.cast(genericComponentType).isAssignableFrom(componentType);
+ }
+ if (ParameterizedType.class.isInstance(genericComponentType))
+ {
+ return isAssignableFrom(isDelegate, ParameterizedType.class.cast(genericComponentType).getRawType(), componentType);
+ }
+ return isAssignableFrom(isDelegate, genericComponentType, componentType);
}
private static boolean isAssignableFrom(boolean isDelegate, WildcardType injectionPointType, Type beanType)
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=1607213&r1=1607212&r2=1607213&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 Tue Jul 1 23:12:58 2014
@@ -49,6 +49,8 @@ import org.apache.webbeans.component.cre
import org.apache.webbeans.component.creation.ObserverMethodsBuilder;
import org.apache.webbeans.component.creation.ProducerFieldBeansBuilder;
import org.apache.webbeans.component.creation.ProducerMethodBeansBuilder;
+import org.apache.webbeans.config.OwbParametrizedTypeImpl;
+import org.apache.webbeans.config.OwbWildcardTypeImpl;
import org.apache.webbeans.config.WebBeansContext;
import org.apache.webbeans.container.AnnotatedTypeWrapper;
import org.apache.webbeans.container.BeanManagerImpl;
@@ -121,7 +123,11 @@ public final class WebBeansUtil
private static final Logger logger = WebBeansLoggerFacade.getLogger(WebBeansUtil.class);
private final WebBeansContext webBeansContext;
+
+ // cache to skip some validations
private final ConcurrentMap<Type, Boolean> noTypeVariables = new ConcurrentHashMap<Type, Boolean>();
+ private final ConcurrentMap<EventCacheKey, Boolean> validEventType = new ConcurrentHashMap<EventCacheKey, Boolean>();
+ private final ConcurrentMap<Type, Boolean> notContainerEvents = new ConcurrentHashMap<Type, Boolean>();
public WebBeansUtil(WebBeansContext webBeansContext)
{
@@ -930,7 +936,7 @@ public final class WebBeansUtil
GProcessAnnotatedType processAnnotatedEvent = new GProcessAnnotatedType(annotatedType);
//Fires ProcessAnnotatedType
- webBeansContext.getBeanManagerImpl().fireEvent(processAnnotatedEvent,AnnotationUtil.EMPTY_ANNOTATION_ARRAY);
+ webBeansContext.getBeanManagerImpl().fireEvent(processAnnotatedEvent, true, AnnotationUtil.EMPTY_ANNOTATION_ARRAY);
if (processAnnotatedEvent.isModifiedAnnotatedType())
{
@@ -952,7 +958,7 @@ public final class WebBeansUtil
GProcessSyntheticAnnotatedType gProcessSyntheticAnnotatedType = new GProcessSyntheticAnnotatedType(source, annotatedType);
//Fires ProcessSyntheticAnnotatedType
- webBeansContext.getBeanManagerImpl().fireEvent(gProcessSyntheticAnnotatedType, AnnotationUtil.EMPTY_ANNOTATION_ARRAY);
+ webBeansContext.getBeanManagerImpl().fireEvent(gProcessSyntheticAnnotatedType, true, AnnotationUtil.EMPTY_ANNOTATION_ARRAY);
if (gProcessSyntheticAnnotatedType.isModifiedAnnotatedType())
{
@@ -976,7 +982,7 @@ public final class WebBeansUtil
private GProcessInjectionTarget fireProcessInjectionTargetEvent(GProcessInjectionTarget processInjectionTargetEvent)
{
//Fires ProcessInjectionTarget
- webBeansContext.getBeanManagerImpl().fireEvent(processInjectionTargetEvent, AnnotationUtil.EMPTY_ANNOTATION_ARRAY);
+ webBeansContext.getBeanManagerImpl().fireEvent(processInjectionTargetEvent, true, AnnotationUtil.EMPTY_ANNOTATION_ARRAY);
return processInjectionTargetEvent;
}
@@ -1000,7 +1006,7 @@ public final class WebBeansUtil
{
GProcessProducer processProducerEvent = new GProcessProducer(producer, annotatedMember);
//Fires ProcessProducer
- webBeansContext.getBeanManagerImpl().fireEvent(processProducerEvent, AnnotationUtil.EMPTY_ANNOTATION_ARRAY);
+ webBeansContext.getBeanManagerImpl().fireEvent(processProducerEvent, true, AnnotationUtil.EMPTY_ANNOTATION_ARRAY);
webBeansContext.getWebBeansUtil().inspectErrorStack("There are errors that are added by ProcessProducer event observers. Look at logs for further details");
return processProducerEvent.getProducer();
}
@@ -1032,7 +1038,7 @@ public final class WebBeansUtil
//Fires ProcessProducer
- webBeansContext.getBeanManagerImpl().fireEvent(processProducerMethodEvent, AnnotationUtil.EMPTY_ANNOTATION_ARRAY);
+ webBeansContext.getBeanManagerImpl().fireEvent(processProducerMethodEvent, true, AnnotationUtil.EMPTY_ANNOTATION_ARRAY);
}
}
@@ -1046,7 +1052,7 @@ public final class WebBeansUtil
GProcessObservableMethod event = new GProcessObservableMethod(annotatedMethod, observableMethod);
//Fires ProcessProducer
- webBeansContext.getBeanManagerImpl().fireEvent(event, AnnotationUtil.EMPTY_ANNOTATION_ARRAY);
+ webBeansContext.getBeanManagerImpl().fireEvent(event, true, AnnotationUtil.EMPTY_ANNOTATION_ARRAY);
}
}
@@ -1061,7 +1067,7 @@ public final class WebBeansUtil
GProcessProducerField processProducerFieldEvent = new GProcessProducerField(bean, field, null);
//Fire ProcessProducer
- webBeansContext.getBeanManagerImpl().fireEvent(processProducerFieldEvent, AnnotationUtil.EMPTY_ANNOTATION_ARRAY);
+ webBeansContext.getBeanManagerImpl().fireEvent(processProducerFieldEvent, true, AnnotationUtil.EMPTY_ANNOTATION_ARRAY);
}
}
@@ -1602,4 +1608,111 @@ public final class WebBeansUtil
}
noTypeVariables.putIfAbsent(t, true);
}
+
+ public void validEventType(final Type eventType, final Type metadataType)
+ {
+ final EventCacheKey key = new EventCacheKey(eventType, metadataType);
+ if (validEventType.containsKey(key))
+ {
+ return;
+ }
+
+ if (GenericsUtil.hasTypeParameters(eventType))
+ {
+ final Type et = GenericsUtil.resolveType(GenericsUtil.getParameterizedType(eventType), metadataType);
+ if (OwbParametrizedTypeImpl.class.isInstance(et))
+ {
+ for (final Type t : OwbParametrizedTypeImpl.class.cast(et).getActualTypeArguments())
+ {
+ if (OwbWildcardTypeImpl.class.isInstance(t))
+ {
+ throw new IllegalArgumentException("TypeVariable forbidden for events");
+ }
+ }
+ }
+ }
+ validEventType.putIfAbsent(key, true); // we don't care about the value but that's thread safe to use this map
+ }
+
+ public boolean isContainerEventType(final Object event)
+ {
+ if (event == null)
+ {
+ return false;
+ }
+
+ final Class<?> eventType = event.getClass();
+ if (notContainerEvents.containsKey(eventType))
+ {
+ return false;
+ }
+
+ if (AfterBeanDiscovery.class.isInstance(event)
+ || AfterDeploymentValidation.class.isInstance(event)
+ || BeforeShutdown.class.isInstance(event)
+ || ProcessAnnotatedType.class.isInstance(event)
+ || ProcessInjectionPoint.class.isInstance(event)
+ || ProcessInjectionTarget.class.isInstance(event)
+ || ProcessBeanAttributes.class.isInstance(event)
+ || ProcessBean.class.isInstance(event)
+ || ProcessObserverMethod.class.isInstance(event)
+ || ProcessSessionBean.class.isInstance(event)
+ || ProcessProducer.class.isInstance(event)
+ || ProcessProducerField.class.isInstance(event)
+ || ProcessProducerMethod.class.isInstance(event)
+ || BeforeBeanDiscovery.class.isInstance(event))
+ {
+ return true;
+ }
+
+ notContainerEvents.putIfAbsent(eventType, true);
+ return false;
+ }
+
+ private static final class EventCacheKey
+ {
+ private final Type event;
+ private final Type metadata;
+ private final int hashCache;
+
+ private EventCacheKey(final Type event, final Type metadata)
+ {
+ this.event = event;
+ this.metadata = metadata;
+
+ int result = event != null ? event.hashCode() : 0;
+ result = 31 * result + (metadata != null ? metadata.hashCode() : 0);
+ this.hashCache = result;
+ }
+
+ @Override
+ public boolean equals(final Object o)
+ {
+ if (this == o)
+ {
+ return true;
+ }
+ if (o == null || EventCacheKey.class != o.getClass())
+ {
+ return false;
+ }
+
+ final EventCacheKey that = EventCacheKey.class.cast(o);
+ if (event != null ? !event.equals(that.event) : that.event != null)
+ {
+ return false;
+ }
+ if (metadata != null ? !metadata.equals(that.metadata) : that.metadata != null)
+ {
+ return false;
+ }
+ return true;
+ }
+
+ @Override
+ public int hashCode()
+ {
+ return hashCache;
+ }
+ }
}
Modified: openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/portable/ExtensionTest.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/portable/ExtensionTest.java?rev=1607213&r1=1607212&r2=1607213&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/portable/ExtensionTest.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/portable/ExtensionTest.java Tue Jul 1 23:12:58 2014
@@ -28,6 +28,8 @@ import junit.framework.Assert;
import org.apache.webbeans.annotation.DefaultLiteral;
import org.apache.webbeans.config.WebBeansContext;
import javax.enterprise.inject.spi.DefinitionException;
+
+import org.apache.webbeans.container.BeanManagerImpl;
import org.apache.webbeans.test.AbstractUnitTest;
import org.apache.webbeans.test.contexts.SerializationTest;
import org.apache.webbeans.test.portable.alternative.Egg;
@@ -78,7 +80,7 @@ public class ExtensionTest extends Abstr
Assert.assertTrue(getBeanManager().isPassivatingScope(ExternalTestScoped.class));
//Fire shut down
- getBeanManager().fireEvent(new BeforeShutdownImpl());
+ BeanManagerImpl.class.cast(getBeanManager()).fireEvent(new BeforeShutdownImpl(), true);
webBeansContext.getContextFactory().destroyApplicationContext(null);
Modified: openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/unittests/portable/events/ExtensionTest.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/unittests/portable/events/ExtensionTest.java?rev=1607213&r1=1607212&r2=1607213&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/unittests/portable/events/ExtensionTest.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/unittests/portable/events/ExtensionTest.java Tue Jul 1 23:12:58 2014
@@ -27,6 +27,7 @@ import javax.enterprise.inject.spi.Bean;
import junit.framework.Assert;
import org.apache.webbeans.annotation.DefaultLiteral;
+import org.apache.webbeans.container.BeanManagerImpl;
import org.apache.webbeans.test.AbstractUnitTest;
import org.apache.webbeans.portable.events.discovery.BeforeShutdownImpl;
import org.apache.webbeans.test.component.library.BookShop;
@@ -76,7 +77,7 @@ public class ExtensionTest extends Abstr
Assert.assertNotNull(MyExtension.processProducer);
//Fire shut down
- getBeanManager().fireEvent(new BeforeShutdownImpl(), new Annotation[0]);
+ BeanManagerImpl.class.cast(getBeanManager()).fireEvent(new BeforeShutdownImpl(), true);
getWebBeansContext().getContextFactory().destroyApplicationContext(null);
Modified: openwebbeans/trunk/webbeans-tck/testng-dev.xml
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-tck/testng-dev.xml?rev=1607213&r1=1607212&r2=1607213&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-tck/testng-dev.xml (original)
+++ openwebbeans/trunk/webbeans-tck/testng-dev.xml Tue Jul 1 23:12:58 2014
@@ -18,8 +18,11 @@
<suite name="JSR-346-TCK" verbose="2" configfailurepolicy="continue">
<test name="JSR-346 TCK">
<classes>
- <class
- name="org.jboss.cdi.tck.tests.extensions.stereotype.StereotypeExtensionTest" />
+ <class name="org.jboss.cdi.tck.tests.event.observer.wildcardAndTypeVariable.ObserverMethodWithParametertizedTypeTest" />
+ <!--
+ <class name="org.jboss.cdi.tck.tests.event.parameterized.ParameterizedEventTest" />
+ <class name="org.jboss.cdi.tck.tests.event.fires.FireEventTest" />
+ -->
</classes>
<groups>
<run>