[webbeans-commits] Webbeans SVN: r439 - in ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans: introspector and 2 other directories.

webbeans-commits at lists.jboss.org webbeans-commits at lists.jboss.org
Sun Dec 7 12:08:46 EST 2008


Author: gavin.king at jboss.com
Date: 2008-12-07 12:08:46 -0500 (Sun, 07 Dec 2008)
New Revision: 439

Added:
   ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bean/ProducerBean.java
   ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bean/ProducerFieldBean.java
Modified:
   ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bean/ProducerMethodBean.java
   ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/introspector/AnnotatedField.java
   ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/introspector/jlr/AbstractAnnotatedMember.java
   ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/introspector/jlr/AnnotatedFieldImpl.java
   ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/util/Reflections.java
Log:
basic support for producer fields (untested)

Added: ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bean/ProducerBean.java
===================================================================
--- ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bean/ProducerBean.java	                        (rev 0)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bean/ProducerBean.java	2008-12-07 17:08:46 UTC (rev 439)
@@ -0,0 +1,72 @@
+package org.jboss.webbeans.bean;
+
+import java.lang.annotation.Annotation;
+import java.util.HashSet;
+
+import org.jboss.webbeans.ManagerImpl;
+
+public abstract class ProducerBean<T, S> extends AbstractBean<T, S> {
+
+   protected AbstractClassBean<?> declaringBean;
+
+   public ProducerBean(ManagerImpl manager, AbstractClassBean<?> declaringBean) {
+      super(manager);
+      this.declaringBean = declaringBean;
+   }
+
+   @Override
+   protected Class<? extends Annotation> getDefaultDeploymentType() {
+      return deploymentType = declaringBean.getDeploymentType();
+   }
+
+   /**
+    * Initializes the API types
+    */
+   @Override
+   protected void initApiTypes() {
+      if (getType().isArray() || getType().isPrimitive())
+      {
+         apiTypes = new HashSet<Class<?>>();
+         apiTypes.add(getType());
+         apiTypes.add(Object.class);
+      }
+      else if (getType().isInterface())
+      {
+         super.initApiTypes();
+         apiTypes.add(Object.class);
+      }
+      else
+      {
+         super.initApiTypes();
+      }
+   }
+
+   /**
+    * Initializes the type
+    */
+   @Override
+   protected void initType()
+   {
+      try
+      {
+         if (getAnnotatedItem() != null)
+         {
+            this.type = getAnnotatedItem().getType();
+         }
+      }
+      catch (ClassCastException e) 
+      {
+         throw new RuntimeException(" Cannot cast producer type " + getAnnotatedItem().getType() + " to bean type " + (getDeclaredBeanType() == null ? " unknown " : getDeclaredBeanType()), e);
+      }
+   }
+   
+   /**
+    * Returns the declaring bean
+    * 
+    * @return The bean representation
+    */
+   public AbstractClassBean<?> getDeclaringBean() {
+      return declaringBean;
+   }
+
+}
\ No newline at end of file

Added: ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bean/ProducerFieldBean.java
===================================================================
--- ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bean/ProducerFieldBean.java	                        (rev 0)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bean/ProducerFieldBean.java	2008-12-07 17:08:46 UTC (rev 439)
@@ -0,0 +1,149 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2008, Red Hat Middleware LLC, and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,  
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.jboss.webbeans.bean;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Type;
+
+import javax.webbeans.DefinitionException;
+import javax.webbeans.Dependent;
+import javax.webbeans.IllegalProductException;
+
+import org.jboss.webbeans.ManagerImpl;
+import org.jboss.webbeans.introspector.AnnotatedField;
+import org.jboss.webbeans.introspector.jlr.AnnotatedFieldImpl;
+
+/**
+ * Represents a producer method bean
+ * 
+ * @author Pete Muir
+ *
+ * @param <T>
+ */
+public class ProducerFieldBean<T> extends ProducerBean<T, Field>
+{
+   
+   private AnnotatedField<T> field;
+   
+   /**
+    * Constructor
+    * 
+    * @param method The producer method
+    * @param declaringBean The declaring bean instance
+    */
+   public ProducerFieldBean(Field field, AbstractClassBean<?> declaringBean, ManagerImpl manager)
+   {
+      this(new AnnotatedFieldImpl<T>(field, declaringBean.getAnnotatedItem()), declaringBean, manager);
+   }
+   
+   /**
+    * Constructor
+    * 
+    * @param method The producer method abstraction
+    * @param declaringBean The declaring bean
+    */
+   public ProducerFieldBean(AnnotatedField<T> field, AbstractClassBean<?> declaringBean, ManagerImpl manager)
+   {
+      super(manager, declaringBean);
+      this.field = field;
+      init();
+   }
+
+   /**
+    * Creates an instance of the bean
+    * 
+    * @returns The instance
+    */
+   @Override
+   public T create()
+   {
+      T instance = field.get(manager.getInstance(getDeclaringBean()));
+      if (instance == null && !getScopeType().equals(Dependent.class))
+      {
+         throw new IllegalProductException("Cannot return null from a non-dependent producer field");
+      }
+      return instance;
+   }
+
+   /**
+    * Initializes the bean and its metadata
+    */
+   @Override
+   protected void init()
+   {
+      super.init();
+      checkProducerField();
+   }
+   
+   
+   /**
+    * Validates the producer method
+    */
+   protected void checkProducerField()
+   {
+      if (getAnnotatedItem().isStatic())
+      {
+         throw new DefinitionException("Producer method cannot be static " + field);
+      }
+      else if (getAnnotatedItem().getActualTypeArguments().length > 0)
+      {
+         for (Type type : getAnnotatedItem().getActualTypeArguments())
+         {
+            if (!(type instanceof Class))
+            {
+               throw new DefinitionException("Producer field type cannot be parameterized with type parameter or wildcard");
+            }
+         }
+      }
+   }
+
+   /**
+    * Gets the annotated item representing the method
+    * 
+    * @return The annotated item
+    */
+   @Override
+   protected AnnotatedField<T> getAnnotatedItem()
+   {
+      return field;
+   }
+
+   /**
+    * Returns the default name
+    * 
+    * @return The default name
+    */
+   @Override
+   protected String getDefaultName()
+   {
+      return field.getPropertyName();
+   }
+   
+   @Override
+   public String toString()
+   {
+      StringBuilder buffer = new StringBuilder();
+      buffer.append("ProducerFieldBean:\n");
+      buffer.append(super.toString() + "\n");
+      buffer.append("Declaring bean: " + declaringBean.toString() + "\n");
+      buffer.append("Field: " + field.toString() + "\n");
+      return buffer.toString();      
+   }
+
+   
+}

Modified: ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bean/ProducerMethodBean.java
===================================================================
--- ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bean/ProducerMethodBean.java	2008-12-07 16:46:10 UTC (rev 438)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/bean/ProducerMethodBean.java	2008-12-07 17:08:46 UTC (rev 439)
@@ -20,7 +20,6 @@
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Method;
 import java.lang.reflect.Type;
-import java.util.HashSet;
 import java.util.Set;
 
 import javax.webbeans.DefinitionException;
@@ -42,11 +41,10 @@
  *
  * @param <T>
  */
-public class ProducerMethodBean<T> extends AbstractBean<T, Method>
+public class ProducerMethodBean<T> extends ProducerBean<T, Method>
 {
    
    private AnnotatedMethod<T> method;
-   private AbstractClassBean<?> declaringBean;
 
    /**
     * Constructor
@@ -67,9 +65,8 @@
     */
    public ProducerMethodBean(AnnotatedMethod<T> method, AbstractClassBean<?> declaringBean, ManagerImpl manager)
    {
-      super(manager);
+      super(manager, declaringBean);
       this.method = method;
-      this.declaringBean = declaringBean;
       init();
    }
 
@@ -84,7 +81,7 @@
       T instance = method.invoke(manager, manager.getInstance(getDeclaringBean()));
       if (instance == null && !getScopeType().equals(Dependent.class))
       {
-         throw new IllegalProductException("Cannot return null from a non-dependent method");
+         throw new IllegalProductException("Cannot return null from a non-dependent producer method");
       }
       return instance;
    }
@@ -121,12 +118,6 @@
       }
    }
    
-   @Override
-   protected Class<? extends Annotation> getDefaultDeploymentType()
-   {
-      return deploymentType = declaringBean.getDeploymentType();
-   }
-   
    /**
     * Validates the producer method
     */
@@ -154,7 +145,7 @@
          {
             if (!(type instanceof Class))
             {
-               throw new DefinitionException("Producer method cannot return type parameterized with type parameter or wildcard");
+               throw new DefinitionException("Producer method return type cannot be parameterized with type parameter or wildcard");
             }
          }
       }
@@ -201,48 +192,6 @@
    }
 
    /**
-    * Initializes the type
-    */
-   @Override
-   protected void initType()
-   {
-      try
-      {
-         if (getAnnotatedItem() != null)
-         {
-            this.type = getAnnotatedItem().getType();
-         }
-      }
-      catch (ClassCastException e) 
-      {
-         throw new RuntimeException(" Cannot cast producer method return type " + method.getType() + " to bean type " + (getDeclaredBeanType() == null ? " unknown " : getDeclaredBeanType()), e);
-      }
-   }
-   
-   /**
-    * Initializes the API types
-    */
-   @Override
-   protected void initApiTypes()
-   {
-      if (getType().isArray() || getType().isPrimitive())
-      {
-         super.apiTypes = new HashSet<Class<?>>();
-         super.apiTypes.add(getType());
-         super.apiTypes.add(Object.class);
-      }
-      else if (getType().isInterface())
-      {
-         super.initApiTypes();
-         super.apiTypes.add(Object.class);
-      }
-      else
-      {
-         super.initApiTypes();
-      }
-   }
-   
-   /**
     * Returns the disposal method
     * 
     * @return The method representation
@@ -251,16 +200,6 @@
    {
       return removeMethod;
    }
-   
-   /**
-    * Returns the declaring bean
-    * 
-    * @return The bean representation
-    */
-   public AbstractClassBean<?> getDeclaringBean()
-   {
-      return declaringBean;
-   }
 
    @Override
    public String toString()

Modified: ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/introspector/AnnotatedField.java
===================================================================
--- ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/introspector/AnnotatedField.java	2008-12-07 16:46:10 UTC (rev 438)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/introspector/AnnotatedField.java	2008-12-07 17:08:46 UTC (rev 439)
@@ -46,6 +46,13 @@
    public void inject(Manager manager, Object instance);
    
    /**
+    * Injects an instance
+    * 
+    * @param instance The instance to inject
+    */
+   public T get(Object instance);
+   
+   /**
     * Gets an abstraction of the declaring class
     * 
     * @return The declaring class

Modified: ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/introspector/jlr/AbstractAnnotatedMember.java
===================================================================
--- ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/introspector/jlr/AbstractAnnotatedMember.java	2008-12-07 16:46:10 UTC (rev 438)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/introspector/jlr/AbstractAnnotatedMember.java	2008-12-07 17:08:46 UTC (rev 439)
@@ -27,7 +27,6 @@
 import javax.webbeans.BindingType;
 import javax.webbeans.manager.Manager;
 
-import org.jboss.webbeans.ManagerImpl;
 import org.jboss.webbeans.introspector.AnnotatedParameter;
 import org.jboss.webbeans.util.Reflections;
 import org.jboss.webbeans.util.Strings;

Modified: ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/introspector/jlr/AnnotatedFieldImpl.java
===================================================================
--- ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/introspector/jlr/AnnotatedFieldImpl.java	2008-12-07 16:46:10 UTC (rev 438)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/introspector/jlr/AnnotatedFieldImpl.java	2008-12-07 17:08:46 UTC (rev 439)
@@ -126,6 +126,10 @@
    {
       Reflections.setAndWrap(getDelegate(), instance, getValue(manager));
    }
+   
+   public T get(Object instance) {
+      return (T) Reflections.getAndWrap(getDelegate(), instance);
+   }
 
    /**
     * Gets the property name

Modified: ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/util/Reflections.java
===================================================================
--- ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/util/Reflections.java	2008-12-07 16:46:10 UTC (rev 438)
+++ ri/trunk/webbeans-ri/src/main/java/org/jboss/webbeans/util/Reflections.java	2008-12-07 17:08:46 UTC (rev 439)
@@ -469,6 +469,29 @@
    }
 
    /**
+    * Gets value of a field and wraps exceptions
+    * 
+    * @param field The field to set on
+    * @param target The instance to set on
+    * @return The value to set
+    */
+   public static Object getAndWrap(Field field, Object target)
+   {
+      try
+      {
+         return field.get(target);
+      }
+      catch (IllegalArgumentException e)
+      {
+         throw new ExecutionException("Error getting field " + field.getName() + " on " + field.getDeclaringClass(), e);
+      }
+      catch (IllegalAccessException e)
+      {
+         throw new ExecutionException("Error getting field " + field.getName() + " on " + field.getDeclaringClass(), e);
+      }
+   }
+
+   /**
     * Looks up a method in the type hierarchy of an instance
     * 
     * @param method The method to look for




More information about the weld-commits mailing list