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;


Reply via email to