[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