You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by hl...@apache.org on 2011/04/06 21:11:00 UTC

svn commit: r1089580 - in /tapestry/tapestry5/trunk/plastic/src: main/java/org/apache/tapestry5/internal/plastic/PlasticInternalUtils.java test/groovy/org/apache/tapestry5/internal/plastic/PlasticUtilsTests.groovy

Author: hlship
Date: Wed Apr  6 19:11:00 2011
New Revision: 1089580

URL: http://svn.apache.org/viewvc?rev=1089580&view=rev
Log:
TAP5-853: Add utility for converting a Java source type name to a Class (handling primitives and arrays)

Modified:
    tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/internal/plastic/PlasticInternalUtils.java
    tapestry/tapestry5/trunk/plastic/src/test/groovy/org/apache/tapestry5/internal/plastic/PlasticUtilsTests.groovy

Modified: tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/internal/plastic/PlasticInternalUtils.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/internal/plastic/PlasticInternalUtils.java?rev=1089580&r1=1089579&r2=1089580&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/internal/plastic/PlasticInternalUtils.java (original)
+++ tapestry/tapestry5/trunk/plastic/src/main/java/org/apache/tapestry5/internal/plastic/PlasticInternalUtils.java Wed Apr  6 19:11:00 2011
@@ -17,6 +17,7 @@ package org.apache.tapestry5.internal.pl
 import java.io.Closeable;
 import java.io.IOException;
 import java.io.PrintWriter;
+import java.lang.reflect.Array;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -293,4 +294,65 @@ public class PlasticInternalUtils
 
         return String.valueOf(Character.toUpperCase(first)) + input.substring(1);
     }
+
+    private static final Map<String, Class> PRIMITIVES = new HashMap<String, Class>();
+
+    static
+    {
+        PRIMITIVES.put("boolean", boolean.class);
+        PRIMITIVES.put("char", char.class);
+        PRIMITIVES.put("byte", byte.class);
+        PRIMITIVES.put("short", short.class);
+        PRIMITIVES.put("int", int.class);
+        PRIMITIVES.put("long", long.class);
+        PRIMITIVES.put("float", float.class);
+        PRIMITIVES.put("double", double.class);
+        PRIMITIVES.put("void", void.class);
+    }
+
+    /**
+     * @param loader
+     *            class loader to look up in
+     * @param javaName
+     *            java name is Java source format (e.g., "int", "int[]", "java.lang.String", "java.lang.String[]", etc.)
+     * @return class instance
+     * @throws ClassNotFoundException
+     */
+    public static Class toClass(ClassLoader loader, String javaName) throws ClassNotFoundException
+    {
+        int depth = 0;
+
+        while (javaName.endsWith("[]"))
+        {
+            depth++;
+            javaName = javaName.substring(0, javaName.length() - 2);
+        }
+
+        Class primitive = PRIMITIVES.get(javaName);
+
+        if (primitive != null)
+        {
+            Class result = primitive;
+            for (int i = 0; i < depth; i++)
+            {
+                result = Array.newInstance(result, 0).getClass();
+            }
+
+            return result;
+        }
+
+        if (depth == 0)
+            return Class.forName(javaName, true, loader);
+
+        StringBuilder builder = new StringBuilder(20);
+
+        for (int i = 0; i < depth; i++)
+        {
+            builder.append("[");
+        }
+
+        builder.append("L").append(javaName).append(";");
+
+        return Class.forName(builder.toString(), true, loader);
+    }
 }

Modified: tapestry/tapestry5/trunk/plastic/src/test/groovy/org/apache/tapestry5/internal/plastic/PlasticUtilsTests.groovy
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/plastic/src/test/groovy/org/apache/tapestry5/internal/plastic/PlasticUtilsTests.groovy?rev=1089580&r1=1089579&r2=1089580&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/plastic/src/test/groovy/org/apache/tapestry5/internal/plastic/PlasticUtilsTests.groovy (original)
+++ tapestry/tapestry5/trunk/plastic/src/test/groovy/org/apache/tapestry5/internal/plastic/PlasticUtilsTests.groovy Wed Apr  6 19:11:00 2011
@@ -44,6 +44,24 @@ class PlasticUtilsTests extends Specific
         'Lfoo/bar/Baz$Biff;' | 'foo.bar.Baz$Biff'
     }
 
+    @Unroll("toClass '#javaName' should be #expectedClass")
+    def "toClass tests"() {
+        expect:
+
+        PlasticInternalUtils.toClass(getClass().classLoader, javaName) == expectedClass
+
+        where:
+
+        javaName | expectedClass
+        "java.lang.String" | String.class
+        "java.lang.Integer[]" | Integer[].class
+        "java.lang.Long[][]" | Long[][].class
+        "void" | void.class
+        "int" | int.class
+        "int[]" | int[].class
+        "float[][]" | float[][].class
+    }
+
     def "not object descriptor is an exception"() {
         when:
         PlasticInternalUtils.objectDescriptorToClassName("I")