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/05 12:23:30 UTC

svn commit: r1429263 - in /openwebbeans/trunk: webbeans-ejb/src/main/java/org/apache/webbeans/ejb/common/util/ webbeans-impl/src/main/java/org/apache/webbeans/component/creation/ webbeans-impl/src/main/java/org/apache/webbeans/config/ webbeans-impl/src...

Author: arne
Date: Sat Jan  5 11:23:29 2013
New Revision: 1429263

URL: http://svn.apache.org/viewvc?rev=1429263&view=rev
Log:
OWB-745: Removed DefinitionUtil.defineProducerFields

Modified:
    openwebbeans/trunk/webbeans-ejb/src/main/java/org/apache/webbeans/ejb/common/util/EjbUtility.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/AbstractInjecionTargetBeanCreator.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/DefinitionUtil.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/ManagedBeanConfigurator.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/AnnotatedElementFactory.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/AnnotatedTypeImpl.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/WebBeansAnnotatedTypeUtil.java

Modified: openwebbeans/trunk/webbeans-ejb/src/main/java/org/apache/webbeans/ejb/common/util/EjbUtility.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-ejb/src/main/java/org/apache/webbeans/ejb/common/util/EjbUtility.java?rev=1429263&r1=1429262&r2=1429263&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-ejb/src/main/java/org/apache/webbeans/ejb/common/util/EjbUtility.java (original)
+++ openwebbeans/trunk/webbeans-ejb/src/main/java/org/apache/webbeans/ejb/common/util/EjbUtility.java Sat Jan  5 11:23:29 2013
@@ -188,7 +188,7 @@ public final class EjbUtility
 
         final Set<ProducerMethodBean<?>> producerMethodBeans = util.defineProducerMethods(ejbBean, clazz);
 
-        final Set<ProducerFieldBean<?>> producerFieldBeans = util.defineProducerFields(ejbBean, clazz);
+        final Set<ProducerFieldBean<?>> producerFieldBeans = webBeansContext.getAnnotatedTypeUtil().defineProducerFields(ejbBean, annotatedType);
 
         checkProducerMethods(producerMethodBeans, ejbBean);
 

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/AbstractInjecionTargetBeanCreator.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/AbstractInjecionTargetBeanCreator.java?rev=1429263&r1=1429262&r2=1429263&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/AbstractInjecionTargetBeanCreator.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/AbstractInjecionTargetBeanCreator.java Sat Jan  5 11:23:29 2013
@@ -88,15 +88,7 @@ public abstract class AbstractInjecionTa
      */
     public Set<ProducerFieldBean<?>> defineProducerFields()
     {
-        AbstractInjectionTargetBean bean = getBean();
-        if(isDefaultMetaDataProvider())
-        {
-            return bean.getWebBeansContext().getDefinitionUtil().defineProducerFields(bean);
-        }
-        else
-        {
-            return bean.getWebBeansContext().getAnnotatedTypeUtil().defineProducerFields(bean, getAnnotatedType());
-        }
+        return webBeansContext.getAnnotatedTypeUtil().defineProducerFields(getBean(), getAnnotatedType());
     }
 
     /**

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/DefinitionUtil.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/DefinitionUtil.java?rev=1429263&r1=1429262&r2=1429263&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/DefinitionUtil.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/DefinitionUtil.java Sat Jan  5 11:23:29 2013
@@ -24,7 +24,6 @@ import java.lang.reflect.Constructor;
 import java.lang.reflect.Field;
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
-import java.lang.reflect.ParameterizedType;
 import java.lang.reflect.Type;
 import java.util.ArrayList;
 import java.util.HashSet;
@@ -59,16 +58,13 @@ import org.apache.webbeans.component.Ent
 import org.apache.webbeans.component.InjectionTargetBean;
 import org.apache.webbeans.component.ManagedBean;
 import org.apache.webbeans.component.OwbBean;
-import org.apache.webbeans.component.ProducerFieldBean;
 import org.apache.webbeans.component.ProducerMethodBean;
-import org.apache.webbeans.component.ResourceBean;
 import org.apache.webbeans.config.inheritance.IBeanInheritedMetaData;
 import org.apache.webbeans.container.ExternalScope;
 import org.apache.webbeans.decorator.WebBeansDecoratorConfig;
 import org.apache.webbeans.event.EventUtil;
 import org.apache.webbeans.exception.WebBeansConfigurationException;
 import org.apache.webbeans.intercept.InterceptorData;
-import org.apache.webbeans.spi.api.ResourceReference;
 import org.apache.webbeans.spi.plugins.OpenWebBeansEjbPlugin;
 import org.apache.webbeans.util.AnnotationUtil;
 import org.apache.webbeans.util.Asserts;
@@ -110,7 +106,7 @@ public final class DefinitionUtil
         removeIgnoredInterfaces(bean);
     }
 
-    private static <T> void removeIgnoredInterfaces(AbstractOwbBean<T> bean)
+    public static <T> void removeIgnoredInterfaces(AbstractOwbBean<T> bean)
     {
         Set<String> ignoredInterfaces = bean.getWebBeansContext().getOpenWebBeansConfiguration().getIgnoredInterfaces();
         for (Iterator<Type> i = bean.getTypes().iterator(); i.hasNext(); )
@@ -200,7 +196,7 @@ public final class DefinitionUtil
         removeIgnoredInterfaces(producerBean);
     }
     
-    private static <T> void defineNormalProducerMethodApi(AbstractProducerBean<T> producerBean, Type type)
+    public static <T> void defineNormalProducerMethodApi(AbstractProducerBean<T> producerBean, Type type)
     {
         Set<Type> types = producerBean.getTypes();
         types.add(Object.class);
@@ -614,55 +610,6 @@ public final class DefinitionUtil
     }
 
     /**
-     * Defines the set of {@link ProducerFieldBean} components.
-     * 
-     * @param component producer field owner component
-     * @return the set of producer field components
-     */
-    public Set<ProducerFieldBean<?>> defineProducerFields(InjectionTargetBean<?> component)
-    {
-
-        final Class<?> returnType = component.getReturnType();
-
-        return defineProducerFields(component, returnType);
-    }
-
-    public Set<ProducerFieldBean<?>> defineProducerFields(InjectionTargetBean<?> component, Class<?> returnType)
-    {
-        final Field[] fields = webBeansContext.getSecurityService().doPrivilegedGetDeclaredFields(returnType);
-
-        final Set<ProducerFieldBean<?>> producerFields = new HashSet<ProducerFieldBean<?>>();
-
-        for (Field field : fields)
-        {
-            final Type genericType = field.getGenericType();
-
-            // Producer field
-            if (AnnotationUtil.hasAnnotation(field.getDeclaredAnnotations(), Produces.class))
-            {
-                if(ClassUtil.isParametrizedType(genericType))
-                {
-                    if(!ClassUtil.checkParametrizedType((ParameterizedType)genericType))
-                    {
-                        throw new WebBeansConfigurationException("Producer field : " + field.getName() + " return type in class : " +
-                                field.getDeclaringClass().getName() + " can not be Wildcard type or Type variable");
-                    }
-                }
-
-                final ProducerFieldBean<?> newComponent = createProducerFieldComponent(field.getType(), field, component);
-
-                if (newComponent != null)
-                {
-                    producerFields.add(newComponent);
-                }
-            }
-
-        }
-
-        return producerFields;
-    }
-
-    /**
      * Defines the {@link Bean} producer methods. Moreover, it configures the
      * producer methods with using the {@link Produces} annotations.
      * 
@@ -769,62 +716,6 @@ public final class DefinitionUtil
         return component;
     }
 
-    private <T> ProducerFieldBean<T> createProducerFieldComponent(Class<T> returnType, Field field, InjectionTargetBean<?> parent)
-    {
-        ProducerFieldBean<T> component = new ProducerFieldBean<T>(parent, returnType);
-        
-        //Producer field for resource
-        Annotation resourceAnnotation = AnnotationUtil.hasOwbInjectableResource(field.getDeclaredAnnotations());
-        if(resourceAnnotation != null)
-        {
-            //Check for valid resource annotation
-            //WebBeansUtil.checkForValidResources(field.getDeclaringClass(), field.getType(), field.getName(), field.getDeclaredAnnotations());
-            if(!Modifier.isStatic(field.getModifiers()))
-            {
-                ResourceReference<T,Annotation> resourceRef = new ResourceReference<T, Annotation>(field.getDeclaringClass(), field.getName(),returnType, resourceAnnotation);
-
-                //Can not define EL name
-                if(field.isAnnotationPresent(Named.class))
-                {
-                    throw new WebBeansConfigurationException("Resource producer field : " + field + " can not define EL name");
-                }
-                
-                ResourceBean<T,Annotation> resourceBean = new ResourceBean(returnType,parent, resourceRef);
-                
-                defineProducerMethodApiTypes(resourceBean, field.getGenericType() , field.getDeclaredAnnotations());
-                defineQualifiers(resourceBean, field.getDeclaredAnnotations());
-                resourceBean.setImplScopeType(new DependentScopeLiteral());
-                resourceBean.setProducerField(field);
-                
-                return resourceBean;                
-            }
-        }
-        
-        component.setProducerField(field);
-
-        if (returnType.isPrimitive())
-        {
-            component.setNullable(false);
-        }
-
-        defineSerializable(component);
-        defineStereoTypes(component, field.getDeclaredAnnotations());
-
-        Annotation[] fieldAnns = field.getDeclaredAnnotations();
-
-        webBeansContext.getWebBeansUtil().setBeanEnableFlagForProducerBean(parent, component, fieldAnns);
-
-        defineProducerMethodApiTypes(component, field.getGenericType(), fieldAnns);
-        defineScopeType(component, fieldAnns, "WebBeans producer method : " + field.getName() + " in class " + parent.getReturnType().getName()
-                                                             + " must declare default @Scope annotation", false);
-        webBeansContext.getWebBeansUtil().checkUnproxiableApiType(component, component.getScope());
-        WebBeansUtil.checkProducerGenericType(component,field);
-        defineQualifiers(component, fieldAnns);
-        defineName(component, fieldAnns, field.getName());
-
-        return component;
-    }
-
     /**
      * Configure bean instance interceptor stack.
      * @param bean bean instance

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/ManagedBeanConfigurator.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/ManagedBeanConfigurator.java?rev=1429263&r1=1429262&r2=1429263&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/ManagedBeanConfigurator.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/ManagedBeanConfigurator.java Sat Jan  5 11:23:29 2013
@@ -167,7 +167,7 @@ public final class ManagedBeanConfigurat
             manager.putProducer(producerMethod, new ProducerBeansProducer(producerMethod));
         }
 
-        Set<ProducerFieldBean<?>> producerFields = definitionUtil.defineProducerFields(component);
+        Set<ProducerFieldBean<?>> producerFields = webBeansContext.getAnnotatedTypeUtil().defineProducerFields(component, component.getAnnotatedType());
         for (ProducerFieldBean<?> producerField : producerFields)
         {
             // add them one after the other to enable serialization handling et al

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/AnnotatedElementFactory.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/AnnotatedElementFactory.java?rev=1429263&r1=1429262&r2=1429263&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/AnnotatedElementFactory.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/AnnotatedElementFactory.java Sat Jan  5 11:23:29 2013
@@ -116,7 +116,12 @@ public final class AnnotatedElementFacto
         {
             try
             {
-                annotatedType = new AnnotatedTypeImpl<X>(webBeansContext, annotatedClass);
+                AnnotatedType<? super X> supertype = null;
+                if (annotatedClass.getSuperclass() != null && !annotatedClass.getSuperclass().equals(Object.class))
+                {
+                    supertype = (AnnotatedTypeImpl<? super X>) newAnnotatedType(annotatedClass.getSuperclass());
+                }
+                annotatedType = new AnnotatedTypeImpl<X>(webBeansContext, annotatedClass, (AnnotatedTypeImpl<? super X>) supertype);
 
                 AnnotatedType<X> oldType = (AnnotatedType<X>)annotatedTypeCache.putIfAbsent(annotatedClass, annotatedType);
                 if(oldType != null)

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/AnnotatedTypeImpl.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/AnnotatedTypeImpl.java?rev=1429263&r1=1429262&r2=1429263&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/AnnotatedTypeImpl.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/portable/AnnotatedTypeImpl.java Sat Jan  5 11:23:29 2013
@@ -24,10 +24,8 @@ import org.apache.webbeans.util.ClassUti
 import java.lang.reflect.Constructor;
 import java.lang.reflect.Field;
 import java.lang.reflect.Method;
-import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashSet;
-import java.util.List;
 import java.util.Set;
 
 import javax.enterprise.inject.spi.AnnotatedConstructor;
@@ -44,6 +42,9 @@ import javax.enterprise.inject.spi.Annot
  */
 class AnnotatedTypeImpl<X> extends AbstractAnnotated implements AnnotatedType<X>
 {
+    /**parent class*/
+    private final AnnotatedType<? super X> supertype;
+    
     /**Annotated class*/
     private final Class<X> annotatedClass;
     
@@ -61,9 +62,10 @@ class AnnotatedTypeImpl<X> extends Abstr
      * 
      * @param annotatedClass class
      */
-    AnnotatedTypeImpl(WebBeansContext webBeansContext, Class<X> annotatedClass)
+    AnnotatedTypeImpl(WebBeansContext webBeansContext, Class<X> annotatedClass, AnnotatedTypeImpl<? super X> supertype)
     {
         super(webBeansContext, annotatedClass);
+        this.supertype = supertype;
         this.annotatedClass = annotatedClass;     
         
         setAnnotations(annotatedClass.getDeclaredAnnotations());
@@ -88,32 +90,37 @@ class AnnotatedTypeImpl<X> extends Abstr
                 }
             }
 
-            Class<?> currentClass = annotatedClass;
-            List<Method> addedMethods = new ArrayList<Method>();
-            do
+            Field[] decFields = getWebBeansContext().getSecurityService().doPrivilegedGetDeclaredFields(annotatedClass);
+            Method[] decMethods = getWebBeansContext().getSecurityService().doPrivilegedGetDeclaredMethods(annotatedClass);
+            for(Field f : decFields)
             {
-                Field[] decFields = getWebBeansContext().getSecurityService().doPrivilegedGetDeclaredFields(currentClass);
-                Method[] decMethods = getWebBeansContext().getSecurityService().doPrivilegedGetDeclaredMethods(currentClass);
-                for(Field f : decFields)
+                if (!f.isSynthetic())
                 {
-                    if (!f.isSynthetic())
-                    {
-                        AnnotatedField<X> af = new AnnotatedFieldImpl<X>(getWebBeansContext(), f, this);
-                        fields.add(af);
-                    }
+                    AnnotatedField<X> af = new AnnotatedFieldImpl<X>(getWebBeansContext(), f, this);
+                    fields.add(af);
                 }
+            }
 
-                for(Method m : decMethods)
+            for(Method m : decMethods)
+            {
+                if (!m.isSynthetic() && !m.isBridge())
                 {
-                    if (!m.isSynthetic() && !m.isBridge() && !ClassUtil.isOverridden(addedMethods, m))
+                    AnnotatedMethod<X> am = new AnnotatedMethodImpl<X>(getWebBeansContext(), m,this);
+                    methods.add(am);
+                }
+            }
+
+            if (supertype != null)
+            {
+                fields.addAll(supertype.getFields());
+                for (AnnotatedMethod<? super X> method : supertype.getMethods())
+                {
+                    if (!isOverridden(method))
                     {
-                        AnnotatedMethod<X> am = new AnnotatedMethodImpl<X>(getWebBeansContext(), m,this);
-                        methods.add(am);
-                        addedMethods.add(m);
+                        methods.add(method);
                     }
                 }
-                currentClass = currentClass.getSuperclass();
-            } while (currentClass != Object.class);
+            }
         }
     }
 
@@ -207,4 +214,15 @@ class AnnotatedTypeImpl<X> extends Abstr
         return Collections.unmodifiableSet(methods);
     }
 
+    private boolean isOverridden(AnnotatedMethod<? super X> superclassMethod)
+    {
+        for (AnnotatedMethod<? super X> subclassMethod : methods)
+        {
+            if (ClassUtil.isOverridden(subclassMethod.getJavaMember(), superclassMethod.getJavaMember()))
+            {
+                return true;
+            }
+        }
+        return false;
+    }
 }

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=1429263&r1=1429262&r2=1429263&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 Sat Jan  5 11:23:29 2013
@@ -316,14 +316,14 @@ public final class ClassUtil
 
     /**
      * Check if the method is already defined in a subclass
-     * @param methods
-     * @param method
+     * @param subclassMethods
+     * @param superclassMethod
      */
-    public static boolean isOverridden(final List<Method> methods, final Method method)
+    public static boolean isOverridden(final List<Method> subclassMethods, final Method superclassMethod)
     {
-        for (final Method m : methods)
+        for (final Method m : subclassMethods)
         {
-            if (isOverridden(m, method))
+            if (isOverridden(m, superclassMethod))
             {
                 return true;
             }

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansAnnotatedTypeUtil.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansAnnotatedTypeUtil.java?rev=1429263&r1=1429262&r2=1429263&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansAnnotatedTypeUtil.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansAnnotatedTypeUtil.java Sat Jan  5 11:23:29 2013
@@ -403,10 +403,14 @@ public final class WebBeansAnnotatedType
         Set<AnnotatedField<? super X>> annotatedFields = annotatedType.getFields();        
         for(AnnotatedField<? super X> annotatedField: annotatedFields)
         {
-            if(annotatedField.isAnnotationPresent(Produces.class))
+            if(annotatedField.isAnnotationPresent(Produces.class) && annotatedField.getDeclaringType().equals(annotatedType))
             {
                 Type genericType = annotatedField.getBaseType();
                 
+                if(ClassUtil.isTypeVariable(genericType))
+                {
+                    throw new WebBeansConfigurationException("Producer annotated field : " + annotatedField + " can not be Wildcard type or Type variable");
+                }
                 if(ClassUtil.isParametrizedType(genericType))
                 {
                     if(!ClassUtil.checkParametrizedType((ParameterizedType)genericType))
@@ -451,18 +455,23 @@ public final class WebBeansAnnotatedType
                     ProducerFieldBean<X> producerFieldBean = new ProducerFieldBean<X>(bean, (Class<X>)ClassUtil.getClass(annotatedField.getBaseType()));
                     producerFieldBean.setProducerField(field);
                     
-                    if (ClassUtil.getClass(annotatedField.getBaseType()).isPrimitive())
+                    if (producerFieldBean.getReturnType().isPrimitive())
                     {
                         producerFieldBean.setNullable(false);
                     }                    
 
                     definitionUtil.defineSerializable(producerFieldBean);
                     definitionUtil.defineStereoTypes(producerFieldBean, anns);
-                    webBeansContext.getWebBeansUtil().setBeanEnableFlagForProducerBean(bean,
-                                                                                                      producerFieldBean,
-                                                                                                      anns);
-                    Set<Type> types = annotatedField.getTypeClosure();
-                    producerFieldBean.getTypes().addAll(types);
+                    webBeansContext.getWebBeansUtil().setBeanEnableFlagForProducerBean(bean, producerFieldBean, anns);
+                    if (producerFieldBean.getReturnType().isArray())
+                    {
+                        producerFieldBean.getTypes().add(Object.class);
+                        producerFieldBean.getTypes().add(producerFieldBean.getReturnType());
+                    }
+                    else
+                    {
+                        producerFieldBean.getTypes().addAll(annotatedField.getTypeClosure());
+                    }
                     definitionUtil.defineScopeType(producerFieldBean, anns, "Annotated producer field: " + annotatedField +  "must declare default @Scope annotation", false);
                     webBeansContext.getWebBeansUtil().checkUnproxiableApiType(producerFieldBean,
                                                                                              producerFieldBean.getScope());
@@ -488,7 +497,7 @@ public final class WebBeansAnnotatedType
         
         for(AnnotatedMethod<? super X> annotatedMethod: annotatedMethods)
         {
-            if(annotatedMethod.isAnnotationPresent(Produces.class))
+            if(annotatedMethod.isAnnotationPresent(Produces.class) && annotatedMethod.getDeclaringType().equals(annotatedType))
             {
                 checkProducerMethodForDeployment(annotatedMethod);
                 boolean specialize = false;