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 2014/04/24 08:47:19 UTC

svn commit: r1589607 - in /openwebbeans/trunk/webbeans-impl/src: main/java/org/apache/webbeans/container/ main/java/org/apache/webbeans/event/ main/java/org/apache/webbeans/portable/ main/java/org/apache/webbeans/util/ test/java/org/apache/webbeans/tes...

Author: arne
Date: Thu Apr 24 06:47:19 2014
New Revision: 1589607

URL: http://svn.apache.org/r1589607
Log:
OWB-946: Moved event-related checks to EventMetadataImpl

Removed:
    openwebbeans/trunk/webbeans-impl/src/test/java/org/apache/webbeans/test/unittests/config/ClassTest.java
Modified:
    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/EventUtil.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/util/ClassUtil.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

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=1589607&r1=1589606&r2=1589607&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 Thu Apr 24 06:47:19 2014
@@ -417,7 +417,7 @@ public class BeanManagerImpl extends Abs
         {
             type = new OwbParametrizedTypeImpl(event.getClass().getDeclaringClass(), event.getClass(), event.getClass().getTypeParameters());
         }
-        fireEvent(event, new EventMetadataImpl(type, null, bindings), false);
+        fireEvent(event, new EventMetadataImpl(type, null, bindings, webBeansContext), false);
     }
 
     /**
@@ -427,7 +427,7 @@ public class BeanManagerImpl extends Abs
      */
     public void fireLifecycleEvent(Object event, Annotation... bindings)
     {
-        fireEvent(event, new EventMetadataImpl(event.getClass(), null, bindings), true);
+        fireEvent(event, new EventMetadataImpl(event.getClass(), null, bindings, webBeansContext), true);
     }
 
     public void fireEvent(Object event, EventMetadata metadata, boolean isLifecycleEvent)
@@ -964,16 +964,11 @@ public class BeanManagerImpl extends Abs
     @Override
     public <T> Set<ObserverMethod<? super T>> resolveObserverMethods(T event, Annotation... qualifiers)
     {
-        return resolveObserverMethods(event, new EventMetadataImpl(event.getClass(), null, qualifiers));
+        return resolveObserverMethods(event, new EventMetadataImpl(event.getClass(), null, qualifiers, webBeansContext));
     }
 
     public <T> Set<ObserverMethod<? super T>> resolveObserverMethods(T event, EventMetadata metadata) 
     {
-        if(ClassUtil.isDefinitionContainsTypeVariables(ClassUtil.getClass(metadata.getType())))
-        {
-            throw new IllegalArgumentException("Event type can not contain type variables. Event class is : " + event.getClass());
-        }
-        
         return notificationManager.resolveObservers(event, metadata);
     }
 

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=1589607&r1=1589606&r2=1589607&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 Thu Apr 24 06:47:19 2014
@@ -23,17 +23,13 @@ import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
 import java.io.Serializable;
 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.event.Event;
-import javax.enterprise.inject.spi.InjectionPoint;
 import javax.enterprise.util.TypeLiteral;
 
 import org.apache.webbeans.config.WebBeansContext;
-import org.apache.webbeans.util.ClassUtil;
+import org.apache.webbeans.util.Asserts;
 import org.apache.webbeans.util.OwbCustomObjectInputStream;
 import org.apache.webbeans.util.WebBeansUtil;
 
@@ -47,14 +43,7 @@ public class EventImpl<T> implements Eve
 {
     private static final long serialVersionUID = -9035218380365451350L;
     
-    /**Event binding types*/
-    private Annotation[] injectedBindings;
-
-    /**Event types*/
-    private Type eventType;
-    
-    /**injection point of the event*/
-    private InjectionPoint injectionPoint;
+    private EventMetadataImpl metadata;
 
     private transient WebBeansContext webBeansContext;
 
@@ -65,38 +54,33 @@ public class EventImpl<T> implements Eve
      * @param eventType event type
      * @param webBeansContext
      */
-    public EventImpl(Annotation[] injectedBindings, Type eventType, InjectionPoint injectionPoint, WebBeansContext webBeansContext)
+    public EventImpl(EventMetadata metadata, WebBeansContext webBeansContext)
     {
+        Asserts.assertNotNull(metadata, "event metadata may not be null");
+        this.metadata = wrapMetadata(metadata);
         this.webBeansContext = webBeansContext;
-        this.injectedBindings = injectedBindings;
-        this.eventType = eventType;
-        this.injectionPoint = injectionPoint;
     }
 
-    /**
-     * Fires event with given event object.
-     */
-    @Override
-    public void fire(T event)
+    private EventMetadataImpl wrapMetadata(EventMetadata metadata)
     {
-        webBeansContext.getBeanManagerImpl().fireEvent(event, new EventMetadataImpl(eventType, injectionPoint, injectedBindings), false);
+        if (metadata instanceof EventMetadataImpl)
+        {
+            return (EventMetadataImpl)metadata;
+        }
+        else
+        {
+            Set<Annotation> qualifiers = metadata.getQualifiers();
+            return new EventMetadataImpl(metadata.getType(), metadata.getInjectionPoint(), qualifiers.toArray(new Annotation[qualifiers.size()]), webBeansContext);
+        }
     }
 
     /**
-     * Returns total binding annotations.
-     * 
-     * @param annotations new annotations
-     * @return total binding annotations
+     * Fires event with given event object.
      */
-    private Annotation[] getEventBindings(Annotation... annotations)
+    @Override
+    public void fire(T event)
     {
-        webBeansContext.getAnnotationManager().checkQualifierConditions(annotations);
-
-        Set<Annotation> eventBindings = new HashSet<Annotation>();
-        Collections.addAll(eventBindings, injectedBindings);
-        Collections.addAll(eventBindings, annotations);
-
-        return eventBindings.toArray(new Annotation[eventBindings.size()]);
+        webBeansContext.getBeanManagerImpl().fireEvent(event, metadata, false);
     }
 
     /**
@@ -105,9 +89,8 @@ public class EventImpl<T> implements Eve
     @Override
     public Event<T> select(Annotation... bindings)
     {
-        Event<T> sub = new EventImpl<T>(getEventBindings(bindings), eventType, injectionPoint, webBeansContext);
         
-        return sub;
+        return new EventImpl<T>(metadata.select(bindings), webBeansContext);
     }
     
     /**
@@ -116,24 +99,7 @@ public class EventImpl<T> implements Eve
     @Override
     public <U extends T> Event<U> select(Class<U> subtype, Annotation... bindings)
     {
-        if(ClassUtil.isDefinitionContainsTypeVariables(subtype))
-        {
-            throw new IllegalArgumentException("Class : " + subtype + " cannot contain type variable");
-        }
-        Type sub = subtype;
-        return select(sub, bindings);
-    }
-
-    private <U extends T> Event<U> select(Type sub, Annotation... bindings)
-    {
-        if(sub == null)
-        {
-            sub = eventType;
-        }
-        
-        Event<U> subEvent = new EventImpl<U>(getEventBindings(bindings),sub, injectionPoint, webBeansContext);
-        
-        return subEvent;
+        return new EventImpl<U>(metadata.select(subtype, bindings), webBeansContext);
     }
     
     /**
@@ -142,15 +108,13 @@ public class EventImpl<T> implements Eve
     @Override
     public <U extends T> Event<U> select(TypeLiteral<U> subtype, Annotation... bindings)
     {
-        //TODO check for type variables
-        return select(subtype.getType(), bindings);
+        return new EventImpl<U>(metadata.select(subtype, bindings), webBeansContext);
     }
     
     private void writeObject(java.io.ObjectOutputStream op) throws IOException
     {
         ObjectOutputStream oos = new ObjectOutputStream(op);
-        oos.writeObject(eventType);
-        oos.writeObject(injectedBindings);
+        oos.writeObject(metadata);
         
         oos.flush();
     }
@@ -158,8 +122,7 @@ public class EventImpl<T> implements Eve
     private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException
     {
         final ObjectInputStream inputStream = new OwbCustomObjectInputStream(in, WebBeansUtil.getCurrentClassLoader());
-        eventType = (Type)inputStream.readObject();
-        injectedBindings = (Annotation[])inputStream.readObject();
+        metadata = (EventMetadataImpl)inputStream.readObject();
 
         webBeansContext = WebBeansContext.currentInstance();
     }

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=1589607&r1=1589606&r2=1589607&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 Thu Apr 24 06:47:19 2014
@@ -18,6 +18,7 @@
  */
 package org.apache.webbeans.event;
 
+import java.io.Serializable;
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Type;
 import java.util.Arrays;
@@ -26,21 +27,32 @@ import java.util.HashSet;
 import java.util.Set;
 
 import javax.enterprise.inject.spi.InjectionPoint;
+import javax.enterprise.util.TypeLiteral;
 
 import org.apache.webbeans.annotation.AnyLiteral;
+import org.apache.webbeans.config.WebBeansContext;
 import org.apache.webbeans.util.AnnotationUtil;
+import org.apache.webbeans.util.ArrayUtil;
+import org.apache.webbeans.util.GenericsUtil;
 
-public class EventMetadataImpl implements EventMetadata
+public class EventMetadataImpl implements EventMetadata, Serializable
 {
 
     private final Type type;
     private final InjectionPoint injectionPoint;
     private final Set<Annotation> qualifiers;
+    private final WebBeansContext context;
     
-    public EventMetadataImpl(Type type, InjectionPoint injectionPoint, Annotation... qualifiers)
+    public EventMetadataImpl(Type type, InjectionPoint injectionPoint, Annotation[] qualifiers, WebBeansContext context)
     {
+        if (GenericsUtil.containsTypeVariable(type))
+        {
+            throw new IllegalArgumentException("event type may not contain type variable: " + type);
+        }
+        context.getAnnotationManager().checkQualifierConditions(qualifiers);
         this.type = type;
         this.injectionPoint = injectionPoint;
+        this.context = context;
         Set<Annotation> completeQualifiers;
         if (qualifiers.length == 0)
         {
@@ -78,4 +90,25 @@ public class EventMetadataImpl implement
     {
         return qualifiers;
     }
+    
+    public EventMetadata select(Annotation... bindings)
+    {
+        return select(type, bindings);
+    }
+    
+    public EventMetadata select(TypeLiteral<?> subtype, Annotation... bindings)
+    {
+        return select(subtype.getType(), bindings);
+    }
+    
+    public EventMetadata select(Type subtype, Annotation... bindings)
+    {
+        Set<Annotation> newQualifiers = ArrayUtil.asSet(bindings);
+        newQualifiers.addAll(qualifiers);
+        if (newQualifiers.size() != qualifiers.size() + bindings.length)
+        {
+            throw new IllegalArgumentException("duplicate qualifier");
+        }
+        return new EventMetadataImpl(subtype, injectionPoint, newQualifiers.toArray(new Annotation[newQualifiers.size()]), context);
+    }
 }

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/EventUtil.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/EventUtil.java?rev=1589607&r1=1589606&r2=1589607&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/EventUtil.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/event/EventUtil.java Thu Apr 24 06:47:19 2014
@@ -34,7 +34,6 @@ import javax.enterprise.inject.spi.Injec
 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.ClassUtil;
 
 public final class EventUtil
@@ -44,16 +43,6 @@ public final class EventUtil
 
     }
 
-    public static void checkEventType(Class<?> eventType)
-    {
-        Asserts.assertNotNull(eventType, "eventType parameter can not be null");
-
-        if (ClassUtil.isDefinitionContainsTypeVariables(eventType))
-        {
-            throw new IllegalArgumentException("Event type : " + eventType.getName() + " can not be generic");
-        }
-    }
-
     //expensive check needed by the TCK (EventBindingTypesTest#testFireEventWithNonRuntimeBindingTypeFails) - see OWB-798
     public static void checkQualifierImplementations(Set<Annotation> qualifiers)
     {

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=1589607&r1=1589606&r2=1589607&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 Thu Apr 24 06:47:19 2014
@@ -82,8 +82,6 @@ public final class NotificationManager
 
     public <T> void addObserver(ObserverMethod<T> observer, TypeLiteral<T> typeLiteral)
     {
-        EventUtil.checkEventType(typeLiteral.getRawType());
-
         addObserver(observer, typeLiteral.getType());
     }
 
@@ -152,7 +150,11 @@ public final class NotificationManager
         
         Set<ObserverMethod<? super T>> matching = new HashSet<ObserverMethod<? super T>>();
 
-        Set<Type> eventTypes = GenericsUtil.getTypeClosure(declaredEventType, eventClass); 
+        Set<Type> eventTypes = GenericsUtil.getTypeClosure(declaredEventType, eventClass);
+        if (GenericsUtil.containTypeVariable(eventTypes))
+        {
+            throw new IllegalArgumentException("event type may not contain unbound type variable: " + eventTypes);
+        }
 
         Set<Type> observedTypes = observers.keySet();
 

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=1589607&r1=1589606&r2=1589607&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 Thu Apr 24 06:47:19 2014
@@ -30,6 +30,7 @@ import javax.enterprise.inject.spi.Inter
 import org.apache.webbeans.config.WebBeansContext;
 import org.apache.webbeans.context.creational.CreationalContextImpl;
 import org.apache.webbeans.event.EventImpl;
+import org.apache.webbeans.event.EventMetadataImpl;
 import org.apache.webbeans.exception.WebBeansException;
 
 public class EventProducer<T> extends AbstractProducer<Event<T>>
@@ -75,7 +76,7 @@ public class EventProducer<T> extends Ab
             
             try
             {
-                instance = new EventImpl<T>(qualifiers, eventType, injectionPoint, webBeansContext);
+                instance = new EventImpl<T>(new EventMetadataImpl(eventType, injectionPoint, qualifiers, webBeansContext), webBeansContext);
             }
             catch (Exception e)
             {

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/ClassUtil.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/ClassUtil.java?rev=1589607&r1=1589606&r2=1589607&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/ClassUtil.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/ClassUtil.java Thu Apr 24 06:47:19 2014
@@ -708,20 +708,6 @@ public final class ClassUtil
     }
 
     /**
-     * Learn whether the specified class is defined with type parameters.
-     * @param type to check
-     * @return true if there are type parameters
-     * @since 1.1.1
-     */
-    public static boolean isDefinitionContainsTypeVariables(Type type)
-    {
-        Class<?> clazz = ClassUtil.getClass(type);
-        Asserts.nullCheckForClass(clazz);
-        
-        return clazz.getTypeParameters().length > 0;
-    }
-
-    /**
      * Returns declared type arguments if {@code type} is a
      * {@link ParameterizedType} instance, else an empty array.
      * Get the actual type arguments of a type.

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=1589607&r1=1589606&r2=1589607&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 Thu Apr 24 06:47:19 2014
@@ -30,6 +30,7 @@ import java.lang.reflect.Type;
 import java.lang.reflect.TypeVariable;
 import java.lang.reflect.WildcardType;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
@@ -341,6 +342,58 @@ public final class GenericsUtil
     }
     
     /**
+     * @return <tt>true</tt>, if the specified type declaration contains an unresolved type variable.
+     */
+    public static boolean containsTypeVariable(Type type)
+    {
+        if (type instanceof Class)
+        {
+            return false;
+        }
+        else if (type instanceof TypeVariable)
+        {
+            return true;
+        }
+        else if (type instanceof ParameterizedType)
+        {
+            ParameterizedType parameterizedType = (ParameterizedType)type;
+            return containTypeVariable(parameterizedType.getActualTypeArguments());
+        }
+        else if (type instanceof WildcardType)
+        {
+            WildcardType wildcardType = (WildcardType)type;
+            return containTypeVariable(wildcardType.getUpperBounds()) || containTypeVariable(wildcardType.getLowerBounds());
+        }
+        else if (type instanceof GenericArrayType)
+        {
+            GenericArrayType arrayType = (GenericArrayType)type;
+            return containsTypeVariable(arrayType.getGenericComponentType());
+        }
+        else
+        {
+            throw new IllegalArgumentException("Unsupported type " + type.getClass().getName());
+        }
+
+    }
+    
+    public static boolean containTypeVariable(Collection<? extends Type> types)
+    {
+        return containTypeVariable(types.toArray(new Type[types.size()]));
+    }
+    
+    public static boolean containTypeVariable(Type[] types)
+    {
+        for (Type type: types)
+        {
+            if (containsTypeVariable(type))
+            {
+                return true;
+            }
+        }
+        return false;
+    }
+    
+    /**
      * Resolves the actual type of the specified field for the type hierarchy specified by the given subclass
      */
     public static Type resolveType(Class<?> subclass, Field field)

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=1589607&r1=1589606&r2=1589607&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 Thu Apr 24 06:47:19 2014
@@ -165,7 +165,7 @@ public final class WebBeansUtil
     {
         Asserts.assertNotNull(clazz);
 
-        if (ClassUtil.isDefinitionContainsTypeVariables(clazz))
+        if (clazz.getTypeParameters().length > 0)
         {
             if(!scope.equals(Dependent.class))
             {