KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > jicengine > expression > ClassParser


1 package org.jicengine.expression;
2
3 import org.jicengine.operation.StaticValue;
4 import java.util.Map JavaDoc;
5 import java.util.HashMap JavaDoc;
6 /**
7  *
8  *
9  * <p>
10  * Copyright (C) 2004 Timo Laitinen
11  * </p>
12  * @author Timo Laitinen
13  * @created 2004-09-20
14  * @since JICE-0.10
15  *
16  */

17
18 public class ClassParser extends StaticValueParser {
19
20     public static final char INNERCLASS_SEPARATOR = '$';
21     public static final String JavaDoc ARRAY_BRACKETS = "[]";
22
23     public static final ClassParser INSTANCE = new ClassParser();
24
25     private static final Map JavaDoc primitives = new HashMap JavaDoc();
26     static {
27         primitives.put("int", Integer.TYPE);
28         primitives.put("double", Double.TYPE);
29         primitives.put("long", Long.TYPE);
30         primitives.put("float", Float.TYPE);
31         primitives.put("boolean", Boolean.TYPE);
32         primitives.put("char", Character.TYPE);
33         primitives.put("byte", Byte.TYPE);
34     // shortcut for string defined here
35
primitives.put("String", String JavaDoc.class);
36     primitives.put("short", Short.TYPE);
37     }
38
39     private static final Map JavaDoc primitiveArrays = new HashMap JavaDoc();
40     static {
41         primitiveArrays.put("int[]", new int[0].getClass());
42         primitiveArrays.put("double[]", new double[0].getClass());
43         primitiveArrays.put("long[]", new long[0].getClass());
44         primitiveArrays.put("float[]", new float[0].getClass());
45         primitiveArrays.put("boolean[]", new boolean[0].getClass());
46         primitiveArrays.put("char[]", new char[0].getClass());
47         primitiveArrays.put("byte[]", new byte[0].getClass());
48     primitiveArrays.put("short[]", new short[0].getClass());
49     
50         // shortcut for string arrays defined here
51
primitiveArrays.put("String[]", new String JavaDoc[0].getClass());
52     }
53
54     public Object JavaDoc parseValue(String JavaDoc expression) throws SyntaxException
55     {
56         char[] chars = expression.toCharArray();
57         char character;
58         if( Character.isLetter(chars[0]) ){
59             for (int i = 1; i < chars.length; i++) {
60                 character = chars[i];
61                 if( character == OPERATION_SEPARATOR || Character.isLetterOrDigit(character) || character == '_' || character == INNERCLASS_SEPARATOR ){
62                     // ok.
63
}
64                 else {
65                     return null;
66                 }
67             }
68             try {
69                 return toClass(expression);
70             } catch (ClassNotFoundException JavaDoc e){
71                 throw new SyntaxException(e.toString());
72             }
73         }
74         else {
75             return null;
76         }
77     }
78
79     public static Class JavaDoc toClass(String JavaDoc classExpression) throws ClassNotFoundException JavaDoc
80     {
81         Class JavaDoc parsedClass;
82         if(classExpression.endsWith(ARRAY_BRACKETS)) {
83             // it is an array
84

85             Class JavaDoc primitiveArray = (Class JavaDoc) primitiveArrays.get(classExpression);
86             if( primitiveArray != null ){
87                 parsedClass = primitiveArray;
88             }
89             else {
90                 // any object-array
91
// transform the class to the format understood by Java.
92
String JavaDoc elementClassName = classExpression.substring(0, classExpression.lastIndexOf("[]"));
93                 String JavaDoc parsedArrayClassName = "[L" + elementClassName + ";";
94                 parsedClass = toClass(parsedArrayClassName);
95             }
96         }
97         else {
98             // not an array
99
Class JavaDoc primitive = (Class JavaDoc) primitives.get(classExpression);
100             if( primitive != null ){
101                 parsedClass = primitive;
102             }
103             else {
104                 ClassLoader JavaDoc loader = ClassLoaderResolver.getClassLoader(ClassParser.class);
105                 parsedClass = Class.forName(classExpression, true, loader);
106             }
107         }
108         return parsedClass;
109     }
110 }
111
Popular Tags