[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