[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