[jboss-cvs] JBossAS SVN: r66063 - in projects/microcontainer/trunk/container/src: tests/org/jboss/test/metadata and 2 other directories.
jboss-cvs-commits at lists.jboss.org
jboss-cvs-commits at lists.jboss.org
Thu Oct 11 20:53:29 EDT 2007
Author: genman
Date: 2007-10-11 20:53:28 -0400 (Thu, 11 Oct 2007)
New Revision: 66063
Added:
projects/microcontainer/trunk/container/src/tests/org/jboss/test/metadata/spi/
projects/microcontainer/trunk/container/src/tests/org/jboss/test/metadata/spi/signature/
projects/microcontainer/trunk/container/src/tests/org/jboss/test/metadata/spi/signature/SignatureTest.java
Modified:
projects/microcontainer/trunk/container/src/main/org/jboss/metadata/spi/signature/Signature.java
Log:
Add unit test for Signature; which was not loading array classes properly
Fix Signature. Should investigate using/merging with org.jboss.util.Classes
Modified: projects/microcontainer/trunk/container/src/main/org/jboss/metadata/spi/signature/Signature.java
===================================================================
--- projects/microcontainer/trunk/container/src/main/org/jboss/metadata/spi/signature/Signature.java 2007-10-12 00:49:28 UTC (rev 66062)
+++ projects/microcontainer/trunk/container/src/main/org/jboss/metadata/spi/signature/Signature.java 2007-10-12 00:53:28 UTC (rev 66063)
@@ -21,6 +21,8 @@
*/
package org.jboss.metadata.spi.signature;
+import java.lang.reflect.Array;
+import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
@@ -40,7 +42,7 @@
public static final String[] NO_PARAMETERS = new String[0];
/** No Parameters Types */
- public static final Class[] NO_PARAMETER_TYPES = new Class[0];
+ public static final Class<?>[] NO_PARAMETER_TYPES = new Class[0];
/** The name */
private String name;
@@ -49,14 +51,15 @@
private String[] parameters;
/** The parameter types */
- private Class[] parameterTypes;
+ private Class<?>[] parameterTypes;
/** The cached hashcode */
private transient int cachedHashCode = Integer.MIN_VALUE;
/** The primitive types indexed by names */
- private static final Map<String, Class> primitiveTypes = new HashMap<String, Class>();
+ private static final Map<String, Class<?>> primitiveTypes = new HashMap<String, Class<?>>();
private static final Map<String, String> primitiveArrayTypes = new HashMap<String, String>();
+ private static final Map<String, Class<?>> primitiveArrayTypesClassMap = new HashMap<String, Class<?>>();
static
{
primitiveTypes.put(Byte.TYPE.getName(), Byte.TYPE);
@@ -76,6 +79,15 @@
primitiveArrayTypes.put(Integer.TYPE.getName(), "I");
primitiveArrayTypes.put(Long.TYPE.getName(), "J");
primitiveArrayTypes.put(Short.TYPE.getName(), "S");
+
+ primitiveArrayTypesClassMap.put("B", Byte.TYPE);
+ primitiveArrayTypesClassMap.put("Z", Boolean.TYPE);
+ primitiveArrayTypesClassMap.put("C", Character.TYPE);
+ primitiveArrayTypesClassMap.put("D", Double.TYPE);
+ primitiveArrayTypesClassMap.put("F", Float.TYPE);
+ primitiveArrayTypesClassMap.put("I", Integer.TYPE);
+ primitiveArrayTypesClassMap.put("J", Long.TYPE);
+ primitiveArrayTypesClassMap.put("S", Short.TYPE);
}
public static String getPrimativeArrayType(String name)
@@ -131,6 +143,44 @@
}
/**
+ * Loads a class by name.
+ *
+ * TODO A similar method exists in org.jboss.util.Classes ...
+ */
+ private static Class<?> loadClass(ClassLoader cl, String name) throws ClassNotFoundException
+ {
+ Class<?> primitive = primitiveTypes.get(name);
+ if (primitive != null)
+ {
+ return primitive;
+ }
+
+ int index = name.lastIndexOf('[');
+ if (index >= 0)
+ {
+ // count opening braces
+ int arrayDimension = 0;
+ while (name.charAt(arrayDimension) == '[')
+ arrayDimension++;
+ Class<?> componentType;
+ if (name.charAt(arrayDimension) == 'L')
+ {
+ String arrayType = name.substring(arrayDimension + 1, name.length() - 1);
+ componentType = loadClass(cl, arrayType);
+ }
+ else
+ {
+ String arrayType = name.substring(arrayDimension);
+ componentType = primitiveArrayTypesClassMap.get(arrayType);
+ }
+
+ // construct array class
+ return Array.newInstance(componentType, new int[arrayDimension]).getClass();
+ }
+ return cl.loadClass(name);
+ }
+
+ /**
* Convert classes to string
*
* @param cl the classloader
@@ -145,34 +195,12 @@
if (parameters == null || parameters.length == 0)
return NO_PARAMETER_TYPES;
- Class[] result = new Class[parameters.length];
+ Class<?>[] result = new Class[parameters.length];
for (int i = 0; i < result.length; ++i)
{
- String param = parameters[i];
- int index = param.lastIndexOf('[');
- if (index >= 0)
- {
- //For arrays we will want to load the class, the ArrayInfoImpl generates names in an invalid format, resolve this here
- String primitiveCandidate = param.substring(index + 1);
- String componentType = primitiveArrayTypes.get(primitiveCandidate);
- if (componentType != null)
- {
- param = param.substring(0, index + 1) + componentType;
- }
- }
- else
- {
- Class primitive = primitiveTypes.get(param);
- if (primitive != null)
- {
- result[i] = primitive;
- continue;
- }
- }
-
try
{
- result[i] = cl.loadClass(param);
+ result[i] = loadClass(cl, parameters[i]);
}
catch (ClassNotFoundException e)
{
@@ -266,8 +294,18 @@
}
/**
- * Get the name.
+ * Constructs a new Signature.
*
+ * @param method class method
+ */
+ public Signature(Method method)
+ {
+ this(method.getName(), method.getParameterTypes());
+ }
+
+ /**
+ * Returns the name.
+ *
* @return the name.
*/
public String getName()
@@ -276,7 +314,7 @@
}
/**
- * Get the parameters.
+ * Returns the parameters.
*
* @return the parameters.
*/
@@ -286,7 +324,7 @@
}
/**
- * Get the parameter types.
+ * Returns the parameter types.
*
* @param clazz the reference class
* @return the parameter types.
Added: projects/microcontainer/trunk/container/src/tests/org/jboss/test/metadata/spi/signature/SignatureTest.java
===================================================================
--- projects/microcontainer/trunk/container/src/tests/org/jboss/test/metadata/spi/signature/SignatureTest.java (rev 0)
+++ projects/microcontainer/trunk/container/src/tests/org/jboss/test/metadata/spi/signature/SignatureTest.java 2007-10-12 00:53:28 UTC (rev 66063)
@@ -0,0 +1,30 @@
+package org.jboss.test.metadata.spi.signature;
+
+import java.lang.reflect.Method;
+import java.util.Arrays;
+
+import org.jboss.metadata.spi.signature.Signature;
+
+import junit.framework.TestCase;
+
+public class SignatureTest extends TestCase
+{
+
+ public void testArray() throws Exception
+ {
+ Method method = getClass().getMethod("method", String.class, byte[].class, Byte[].class, String[][].class);
+ Signature s = new Signature(method);
+ Class<?>[] parametersTypes = s.getParametersTypes(getClass());
+ assertEquals(4, parametersTypes.length);
+
+ String p[] = { String.class.getName(), byte[].class.getName(), Byte[].class.getName(), String[][].class.getName()};
+ Signature s2 = new Signature("method", p);
+ Class<?>[] parametersTypes2 = s2.getParametersTypes(getClass());
+ assert Arrays.equals(parametersTypes, parametersTypes2);
+ }
+
+ public void method(String s, byte b[], Byte b2[], String[][] sa)
+ {
+ }
+
+}
More information about the jboss-cvs-commits
mailing list