[weld-commits] Weld SVN: r5216 - in extensions/trunk/core/src: test/java/org/jboss/weld/test/extensions/util and 1 other directory.

weld-commits at lists.jboss.org weld-commits at lists.jboss.org
Sat Dec 5 19:39:11 EST 2009


Author: swd847
Date: 2009-12-05 19:39:10 -0500 (Sat, 05 Dec 2009)
New Revision: 5216

Added:
   extensions/trunk/core/src/main/java/org/jboss/weld/extensions/util/NullMemberException.java
Modified:
   extensions/trunk/core/src/main/java/org/jboss/weld/extensions/util/AnnotationInvocationHandler.java
   extensions/trunk/core/src/test/java/org/jboss/weld/test/extensions/util/AnnotationInstanceProviderTest.java
   extensions/trunk/core/src/test/java/org/jboss/weld/test/extensions/util/IntMemberAnnotation.java
Log:
WELDX-56 Support for default values in AnnotationInstanceProvider 



Modified: extensions/trunk/core/src/main/java/org/jboss/weld/extensions/util/AnnotationInvocationHandler.java
===================================================================
--- extensions/trunk/core/src/main/java/org/jboss/weld/extensions/util/AnnotationInvocationHandler.java	2009-12-05 21:25:26 UTC (rev 5215)
+++ extensions/trunk/core/src/main/java/org/jboss/weld/extensions/util/AnnotationInvocationHandler.java	2009-12-06 00:39:10 UTC (rev 5216)
@@ -8,6 +8,7 @@
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.util.Arrays;
+import java.util.HashMap;
 import java.util.Map;
 
 /**
@@ -25,7 +26,13 @@
  * Numeric types do not have to match exactly, as they are converted using
  * java.lang.Number's xxxValue methods.
  * 
+ * If am member does not have a corresponding entry in the value map then the
+ * annotations default value will be used. 
  * 
+ * If the annotation member does not have a default value then a NullMemberException
+ * will be thrown
+ * 
+ * 
  * @author Stuart Douglas
  * 
  */
@@ -58,11 +65,27 @@
 
    private final Method[] members;
 
-   AnnotationInvocationHandler(Map<String, Object> valueMap, Class<? extends Annotation> annotationType)
+   AnnotationInvocationHandler(Map<String, Object> values, Class<? extends Annotation> annotationType)
    {
-      this.valueMap = valueMap;
+      this.valueMap = new HashMap<String, Object>();
+      valueMap.putAll(values);
       this.annotationType = annotationType;
       this.members = annotationType.getDeclaredMethods();
+      for (Method m : members)
+      {
+         Object value = valueMap.get(m.getName());
+         if (value == null)
+         {
+            value = m.getDefaultValue();
+            if (value == null)
+            {
+               throw new NullMemberException(annotationType, m, "Error creating annotation @" + annotationType.getName() + " member " + m.getName() + " was null and does not provide a default value");
+            } else
+            {
+               valueMap.put(m.getName(), value);
+            }
+         }
+      }
    }
    
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
@@ -95,39 +118,36 @@
 
    private Object performTypeCoercion(Object val, Class<?> type)
    {
-      if (val != null)
+      if (Integer.class.isAssignableFrom(type) || type == int.class)
       {
-         if (Integer.class.isAssignableFrom(type) || type == int.class)
+         return ((Number) val).intValue();
+      }
+      else if (Long.class.isAssignableFrom(type) || type == long.class)
+      {
+         return ((Number) val).longValue();
+      }
+      else if (Short.class.isAssignableFrom(type) || type == short.class)
+      {
+         return ((Number) val).shortValue();
+      }
+      else if (Byte.class.isAssignableFrom(type) || type == byte.class)
+      {
+         return ((Number) val).byteValue();
+      }
+      else if (Double.class.isAssignableFrom(type) || type == double.class)
+      {
+         return ((Number) val).doubleValue();
+      }
+      else if (Float.class.isAssignableFrom(type) || type == float.class)
+      {
+         return ((Number) val).floatValue();
+      }
+      else if (Character.class.isAssignableFrom(type) || type == char.class)
+      {
+         if (String.class.isAssignableFrom(val.getClass()))
          {
-            return ((Number) val).intValue();
+            return val.toString().charAt(0);
          }
-         else if (Long.class.isAssignableFrom(type) || type == long.class)
-         {
-            return ((Number) val).longValue();
-         }
-         else if (Short.class.isAssignableFrom(type) || type == short.class)
-         {
-            return ((Number) val).shortValue();
-         }
-         else if (Byte.class.isAssignableFrom(type) || type == byte.class)
-         {
-            return ((Number) val).byteValue();
-         }
-         else if (Double.class.isAssignableFrom(type) || type == double.class)
-         {
-            return ((Number) val).doubleValue();
-         }
-         else if (Float.class.isAssignableFrom(type) || type == float.class)
-         {
-            return ((Number) val).floatValue();
-         }
-         else if (Character.class.isAssignableFrom(type) || type == char.class)
-         {
-            if (String.class.isAssignableFrom(val.getClass()))
-            {
-               return val.toString().charAt(0);
-            }
-         }
       }
       return val;
    }

Added: extensions/trunk/core/src/main/java/org/jboss/weld/extensions/util/NullMemberException.java
===================================================================
--- extensions/trunk/core/src/main/java/org/jboss/weld/extensions/util/NullMemberException.java	                        (rev 0)
+++ extensions/trunk/core/src/main/java/org/jboss/weld/extensions/util/NullMemberException.java	2009-12-06 00:39:10 UTC (rev 5216)
@@ -0,0 +1,33 @@
+package org.jboss.weld.extensions.util;
+
+import java.lang.reflect.Method;
+
+/**
+ * Exception thrown when a annotation is created with a null value
+ * for one of the members. 
+ * @author Stuart Douglas
+ *
+ */
+public class NullMemberException extends RuntimeException
+{
+   Class annotationType;
+   Method method;
+
+   public NullMemberException(Class annotationType, Method method, String message)
+   {
+      super(message);
+      this.annotationType = annotationType;
+      this.method = method;
+   }
+
+   public Class getAnnotationType()
+   {
+      return annotationType;
+   }
+
+   public Method getMethod()
+   {
+      return method;
+   }
+
+}

Modified: extensions/trunk/core/src/test/java/org/jboss/weld/test/extensions/util/AnnotationInstanceProviderTest.java
===================================================================
--- extensions/trunk/core/src/test/java/org/jboss/weld/test/extensions/util/AnnotationInstanceProviderTest.java	2009-12-05 21:25:26 UTC (rev 5215)
+++ extensions/trunk/core/src/test/java/org/jboss/weld/test/extensions/util/AnnotationInstanceProviderTest.java	2009-12-06 00:39:10 UTC (rev 5216)
@@ -5,6 +5,7 @@
 import java.util.Map;
 
 import org.jboss.weld.extensions.util.AnnotationInstanceProvider;
+import org.jboss.weld.extensions.util.NullMemberException;
 import org.testng.annotations.Test;
 
 /**
@@ -87,4 +88,34 @@
       MultipleMembers realAn = AnnotatedClass.class.getAnnotation(MultipleMembers.class);
       assert an.equals(realAn) : "Equality between declared annotation failed";
    }
+
+   /**
+    * Test that an exception is thrown when a member is null
+    */
+   @Test(expectedExceptions = NullMemberException.class)
+   public void testNullMemberException()
+   {
+      AnnotationInstanceProvider provider = new AnnotationInstanceProvider();
+      Map<String, Object> values = new HashMap<String, Object>();
+      values.put("value", Long.valueOf(1));
+      values.put("someMember", null);
+      IntMemberAnnotation an = provider.get(IntMemberAnnotation.class, values);
+
+   }
+
+   /**
+    * Test that an Annotation will use the default values if a member with default 
+    * values is null
+    */
+   @Test
+   public void testDefaultValue()
+   {
+      AnnotationInstanceProvider provider = new AnnotationInstanceProvider();
+      Map<String, Object> values = new HashMap<String, Object>();
+      values.put("someMember", Integer.valueOf(0));
+      IntMemberAnnotation an = provider.get(IntMemberAnnotation.class, values);
+      assert an != null : "Annotation was null";
+      assert an.value() == 1 : "Annotation member was not equal to default value";
+   }
+
 }

Modified: extensions/trunk/core/src/test/java/org/jboss/weld/test/extensions/util/IntMemberAnnotation.java
===================================================================
--- extensions/trunk/core/src/test/java/org/jboss/weld/test/extensions/util/IntMemberAnnotation.java	2009-12-05 21:25:26 UTC (rev 5215)
+++ extensions/trunk/core/src/test/java/org/jboss/weld/test/extensions/util/IntMemberAnnotation.java	2009-12-06 00:39:10 UTC (rev 5216)
@@ -6,7 +6,7 @@
 @Retention(RetentionPolicy.RUNTIME)
 public @interface IntMemberAnnotation
 {
-   int value();
+   int value() default 1;
 
    int someMember();
 }



More information about the weld-commits mailing list