[jboss-svn-commits] JBoss Common SVN: r4777 - in arquillian/trunk/testenrichers/resource: src and 8 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Mon Jul 19 14:02:58 EDT 2010
Author: aslak
Date: 2010-07-19 14:02:57 -0400 (Mon, 19 Jul 2010)
New Revision: 4777
Added:
arquillian/trunk/testenrichers/resource/src/test/
arquillian/trunk/testenrichers/resource/src/test/java/
arquillian/trunk/testenrichers/resource/src/test/java/org/
arquillian/trunk/testenrichers/resource/src/test/java/org/jboss/
arquillian/trunk/testenrichers/resource/src/test/java/org/jboss/arquillian/
arquillian/trunk/testenrichers/resource/src/test/java/org/jboss/arquillian/testenricher/
arquillian/trunk/testenrichers/resource/src/test/java/org/jboss/arquillian/testenricher/resource/
arquillian/trunk/testenrichers/resource/src/test/java/org/jboss/arquillian/testenricher/resource/ResourceInjectionEnricherTestCase.java
arquillian/trunk/testenrichers/resource/src/test/resources/
Modified:
arquillian/trunk/testenrichers/resource/pom.xml
arquillian/trunk/testenrichers/resource/src/main/java/org/jboss/arquillian/testenricher/resource/ResourceInjectionEnricher.java
Log:
ARQ-201 Added support for primitive field injection. Primitive fields previously set to default value (e.g. 0) in a previous enricher will be tried re-injected since there is no way to separate between a primitive set to 0 and default to 0.
Modified: arquillian/trunk/testenrichers/resource/pom.xml
===================================================================
--- arquillian/trunk/testenrichers/resource/pom.xml 2010-07-19 06:34:33 UTC (rev 4776)
+++ arquillian/trunk/testenrichers/resource/pom.xml 2010-07-19 18:02:57 UTC (rev 4777)
@@ -39,23 +39,28 @@
<version>${project.version}</version>
</dependency>
-
<dependency>
<groupId>org.jboss.shrinkwrap</groupId>
<artifactId>shrinkwrap-impl-base</artifactId>
<scope>test</scope>
</dependency>
+
+ <!--
+ External Projects
+ -->
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>jsr250-api</artifactId>
<version>1.0</version>
<scope>provided</scope>
</dependency>
+
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
+
</dependencies>
</project>
Modified: arquillian/trunk/testenrichers/resource/src/main/java/org/jboss/arquillian/testenricher/resource/ResourceInjectionEnricher.java
===================================================================
--- arquillian/trunk/testenrichers/resource/src/main/java/org/jboss/arquillian/testenricher/resource/ResourceInjectionEnricher.java 2010-07-19 06:34:33 UTC (rev 4776)
+++ arquillian/trunk/testenrichers/resource/src/main/java/org/jboss/arquillian/testenricher/resource/ResourceInjectionEnricher.java 2010-07-19 18:02:57 UTC (rev 4777)
@@ -20,6 +20,7 @@
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.List;
+import java.util.logging.Logger;
import javax.annotation.Resource;
import javax.naming.InitialContext;
@@ -28,7 +29,10 @@
import org.jboss.arquillian.spi.TestEnricher;
/**
- * Enricher that provide @Resource class and method argument injection.
+ * Enricher that provide @Resource field and method argument injection. <br/>
+ * <br/>
+ * Field Resources will only be injected if the current value is NULL or primitive default value.
+ *
*
* @author <a href="mailto:aknutsen at redhat.com">Aslak Knutsen</a>
* @version $Revision: $
@@ -38,6 +42,10 @@
private static final String RESOURCE_LOOKUP_PREFIX = "java:/comp/env";
private static final String ANNOTATION_NAME = "javax.annotation.Resource";
+
+ private static final Logger log = Logger.getLogger(ResourceInjectionEnricher.class.getName());
+
+
/* (non-Javadoc)
* @see org.jboss.arquillian.spi.TestEnricher#enrich(org.jboss.arquillian.spi.Context, java.lang.Object)
*/
@@ -70,7 +78,12 @@
for(Field field : annotatedFields)
{
- if(field.get(testCase) == null) // only try to lookup fields that are not already set
+ /*
+ * only try to lookup fields that are not already set or primitives
+ * (we don't really know if they have been set or not)
+ */
+ Object currentValue = field.get(testCase);
+ if(shouldInject(field, currentValue))
{
Object resource = lookup(getResourceName(field));
field.set(testCase, resource);
@@ -94,7 +107,6 @@
Object resource = lookup(getResourceName(method.getAnnotation(Resource.class)));
method.invoke(testCase, resource);
}
-
}
catch (Exception e)
{
@@ -102,6 +114,45 @@
}
}
+ private boolean shouldInject(Field field, Object currentValue)
+ {
+ Class<?> type = field.getType();
+ if(type.isPrimitive())
+ {
+ if(isPrimitiveNull(currentValue))
+ {
+ log.fine("Primitive field " + field.getName() + " has been detected to have the default primitive value, " +
+ "can not determine if it has already been injected. Re-injecting field.");
+ return true;
+ }
+ }
+ else
+ {
+ if(currentValue == null)
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private boolean isPrimitiveNull(Object currentValue)
+ {
+ String stringValue = String.valueOf(currentValue);
+ if("0".equals(stringValue) || "0.0".equals(stringValue) || "false".equals(stringValue))
+ {
+ return true;
+ }
+ else if(Character.class.isInstance(currentValue))
+ {
+ if( Character.class.cast(currentValue) == (char)0)
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+
protected Object lookup(String jndiName) throws Exception
{
// TODO: figure out test context ?
Added: arquillian/trunk/testenrichers/resource/src/test/java/org/jboss/arquillian/testenricher/resource/ResourceInjectionEnricherTestCase.java
===================================================================
--- arquillian/trunk/testenrichers/resource/src/test/java/org/jboss/arquillian/testenricher/resource/ResourceInjectionEnricherTestCase.java (rev 0)
+++ arquillian/trunk/testenrichers/resource/src/test/java/org/jboss/arquillian/testenricher/resource/ResourceInjectionEnricherTestCase.java 2010-07-19 18:02:57 UTC (rev 4777)
@@ -0,0 +1,185 @@
+package org.jboss.arquillian.testenricher.resource;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.annotation.Resource;
+
+import junit.framework.Assert;
+
+import org.junit.Test;
+
+public class ResourceInjectionEnricherTestCase
+{
+ private final Map<String, Object> injectionValueMap = new HashMap<String, Object>();
+ {
+ injectionValueMap.put("primitive_char", '1');
+ injectionValueMap.put("primitive_byte", new Byte("1"));
+ injectionValueMap.put("primitive_int", 10);
+ injectionValueMap.put("primitive_short", (short)10);
+ injectionValueMap.put("primitive_long", 10l);
+ injectionValueMap.put("primitive_float", 10f);
+ injectionValueMap.put("primitive_double", 10d);
+ injectionValueMap.put("primitive_boolean", true);
+ injectionValueMap.put("primitive_non_default_value", 120);
+
+ injectionValueMap.put("primitive", 100);
+ injectionValueMap.put("primitive2", 100);
+ injectionValueMap.put("object", this);
+ injectionValueMap.put("object2", this);
+ }
+
+ @Test
+ public void shouldInjectResourcesIntoObject() throws Exception
+ {
+ InjectableTestClass testClass = new InjectableTestClass();
+
+ new ResourceInjectionEnricher()
+ {
+ protected Object lookup(String jndiName) throws Exception
+ {
+ return injectionValueMap.get(jndiName);
+ };
+ }.injectClass(testClass);
+
+ Assert.assertEquals(
+ "Should be able to inject into primitive field",
+ injectionValueMap.get("primitive"),
+ testClass.getPrimitive());
+
+ Assert.assertEquals(
+ "Should be able to inject into primitive setter",
+ injectionValueMap.get("primitive2"),
+ testClass.getPrimitive2());
+
+ Assert.assertEquals(
+ "Should be able to inject into object field",
+ injectionValueMap.get("object"),
+ testClass.getObject());
+
+ Assert.assertEquals(
+ "Should be able to inject into object ssetter",
+ injectionValueMap.get("object2"),
+ testClass.getObject2());
+
+ Assert.assertEquals(
+ "Should inject primitive if it has default value",
+ injectionValueMap.get("primitive_char"),
+ testClass.primitive_char);
+
+ Assert.assertEquals(
+ "Should inject primitive if it has default value",
+ injectionValueMap.get("primitive_byte"),
+ testClass.primitive_byte);
+
+ Assert.assertEquals(
+ "Should inject primitive if it has default value",
+ injectionValueMap.get("primitive_int"),
+ testClass.primitive_int);
+
+ Assert.assertEquals(
+ "Should inject primitive if it has default value",
+ injectionValueMap.get("primitive_short"),
+ testClass.primitive_short);
+
+ Assert.assertEquals(
+ "Should inject primitive if it has default value",
+ injectionValueMap.get("primitive_long"),
+ testClass.primitive_long);
+
+ Assert.assertEquals(
+ "Should inject primitive if it has default value",
+ injectionValueMap.get("primitive_float"),
+ testClass.primitive_float);
+
+ Assert.assertEquals(
+ "Should inject primitive if it has default value",
+ injectionValueMap.get("primitive_double"),
+ testClass.primitive_double);
+
+ Assert.assertEquals(
+ "Should inject primitive if it has default value",
+ injectionValueMap.get("primitive_boolean"),
+ testClass.primitive_boolean);
+
+ Assert.assertNotSame(
+ "Should not inject primitive if it does not have default value",
+ injectionValueMap.get("primitive_non_default_value"),
+ testClass.primitive_non_default_value);
+
+ }
+
+ private static class InjectableTestClass
+ {
+ @Resource(mappedName = "primitive")
+ private int primitive;
+
+ protected int primitive2;
+
+ @Resource(mappedName = "primitive_char")
+ public char primitive_char;
+
+ @Resource(mappedName = "primitive_byte")
+ byte primitive_byte;
+
+ @Resource(mappedName = "primitive_int")
+ int primitive_int;
+
+ @Resource(mappedName = "primitive_short")
+ short primitive_short;
+
+ @Resource(mappedName = "primitive_long")
+ long primitive_long;
+
+ @Resource(mappedName = "primitive_float")
+ float primitive_float;
+
+ @Resource(mappedName = "primitive_double")
+ double primitive_double;
+
+ @Resource(mappedName = "primitive_boolean")
+ boolean primitive_boolean;
+
+ @Resource(mappedName = "primitive_non_default_value")
+ int primitive_non_default_value = 100;
+
+ @Resource(mappedName = "object")
+ private Object object;
+
+ private Object object2;
+
+ public int getPrimitive()
+ {
+ return primitive;
+ }
+
+ public int getPrimitive2()
+ {
+ return primitive2;
+ }
+
+ public Object getObject()
+ {
+ return object;
+ }
+
+ public Object getObject2()
+ {
+ return object2;
+ }
+
+ @SuppressWarnings("unused")
+ @Resource(mappedName = "primitive")
+ public void setPrimitive2(int primitive2)
+ {
+ this.primitive2 = primitive2;
+ }
+
+ @SuppressWarnings("unused")
+ @Resource(mappedName = "object")
+ public void setObject2(Object object2)
+ {
+ this.object2 = object2;
+ }
+ }
+}
More information about the jboss-svn-commits
mailing list