[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