1919
2020package org .elasticsearch .painless .lookup ;
2121
22- import java .util .Arrays ;
2322import java .util .Collection ;
2423import java .util .Collections ;
2524import java .util .Map ;
3029 */
3130public final class PainlessLookup {
3231
33- public static Class <?> getBoxedType (Class <?> clazz ) {
34- if (clazz == boolean .class ) {
35- return Boolean .class ;
36- } else if (clazz == byte .class ) {
37- return Byte .class ;
38- } else if (clazz == short .class ) {
39- return Short .class ;
40- } else if (clazz == char .class ) {
41- return Character .class ;
42- } else if (clazz == int .class ) {
43- return Integer .class ;
44- } else if (clazz == long .class ) {
45- return Long .class ;
46- } else if (clazz == float .class ) {
47- return Float .class ;
48- } else if (clazz == double .class ) {
49- return Double .class ;
50- }
51-
52- return clazz ;
53- }
54-
55- public static Class <?> getUnboxedype (Class <?> clazz ) {
56- if (clazz == Boolean .class ) {
57- return boolean .class ;
58- } else if (clazz == Byte .class ) {
59- return byte .class ;
60- } else if (clazz == Short .class ) {
61- return short .class ;
62- } else if (clazz == Character .class ) {
63- return char .class ;
64- } else if (clazz == Integer .class ) {
65- return int .class ;
66- } else if (clazz == Long .class ) {
67- return long .class ;
68- } else if (clazz == Float .class ) {
69- return float .class ;
70- } else if (clazz == Double .class ) {
71- return double .class ;
72- }
73-
74- return clazz ;
75- }
76-
77- public static boolean isConstantType (Class <?> clazz ) {
78- return clazz == boolean .class ||
79- clazz == byte .class ||
80- clazz == short .class ||
81- clazz == char .class ||
82- clazz == int .class ||
83- clazz == long .class ||
84- clazz == float .class ||
85- clazz == double .class ||
86- clazz == String .class ;
87- }
88-
89- public Class <?> getClassFromBinaryName (String painlessType ) {
90- return painlessTypesToJavaClasses .get (painlessType .replace ('$' , '.' ));
91- }
92-
93- public static Class <?> ObjectClassTodefClass (Class <?> clazz ) {
94- if (clazz .isArray ()) {
95- Class <?> component = clazz .getComponentType ();
96- int dimensions = 1 ;
97-
98- while (component .isArray ()) {
99- component = component .getComponentType ();
100- ++dimensions ;
101- }
102-
103- if (component == Object .class ) {
104- char [] braces = new char [dimensions ];
105- Arrays .fill (braces , '[' );
106-
107- String descriptor = new String (braces ) + org .objectweb .asm .Type .getType (def .class ).getDescriptor ();
108- org .objectweb .asm .Type type = org .objectweb .asm .Type .getType (descriptor );
109-
110- try {
111- return Class .forName (type .getInternalName ().replace ('/' , '.' ));
112- } catch (ClassNotFoundException exception ) {
113- throw new IllegalStateException ("internal error" , exception );
114- }
115- }
116- } else if (clazz == Object .class ) {
117- return def .class ;
118- }
119-
120- return clazz ;
121- }
122-
123- public static Class <?> defClassToObjectClass (Class <?> clazz ) {
124- if (clazz .isArray ()) {
125- Class <?> component = clazz .getComponentType ();
126- int dimensions = 1 ;
127-
128- while (component .isArray ()) {
129- component = component .getComponentType ();
130- ++dimensions ;
131- }
132-
133- if (component == def .class ) {
134- char [] braces = new char [dimensions ];
135- Arrays .fill (braces , '[' );
136-
137- String descriptor = new String (braces ) + org .objectweb .asm .Type .getType (Object .class ).getDescriptor ();
138- org .objectweb .asm .Type type = org .objectweb .asm .Type .getType (descriptor );
139-
140- try {
141- return Class .forName (type .getInternalName ().replace ('/' , '.' ));
142- } catch (ClassNotFoundException exception ) {
143- throw new IllegalStateException ("internal error" , exception );
144- }
145- }
146- } else if (clazz == def .class ) {
147- return Object .class ;
148- }
149-
150- return clazz ;
151- }
152-
153- public static String ClassToName (Class <?> clazz ) {
154- if (clazz .isLocalClass () || clazz .isAnonymousClass ()) {
155- return null ;
156- } else if (clazz .isArray ()) {
157- Class <?> component = clazz .getComponentType ();
158- int dimensions = 1 ;
159-
160- while (component .isArray ()) {
161- component = component .getComponentType ();
162- ++dimensions ;
163- }
164-
165- if (component == def .class ) {
166- StringBuilder builder = new StringBuilder (def .class .getSimpleName ());
167-
168- for (int dimension = 0 ; dimension < dimensions ; dimension ++) {
169- builder .append ("[]" );
170- }
171-
172- return builder .toString ();
173- }
174- } else if (clazz == def .class ) {
175- return def .class .getSimpleName ();
176- }
177-
178- return clazz .getCanonicalName ().replace ('$' , '.' );
179- }
180-
18132 public Collection <PainlessClass > getStructs () {
18233 return javaClassesToPainlessStructs .values ();
18334 }
@@ -190,6 +41,10 @@ public Collection<PainlessClass> getStructs() {
19041 this .javaClassesToPainlessStructs = Collections .unmodifiableMap (javaClassesToPainlessStructs );
19142 }
19243
44+ public Class <?> getClassFromBinaryName (String painlessType ) {
45+ return painlessTypesToJavaClasses .get (painlessType .replace ('$' , '.' ));
46+ }
47+
19348 public boolean isSimplePainlessType (String painlessType ) {
19449 return painlessTypesToJavaClasses .containsKey (painlessType );
19550 }
@@ -199,59 +54,6 @@ public PainlessClass getPainlessStructFromJavaClass(Class<?> clazz) {
19954 }
20055
20156 public Class <?> getJavaClassFromPainlessType (String painlessType ) {
202- Class <?> javaClass = painlessTypesToJavaClasses .get (painlessType );
203-
204- if (javaClass != null ) {
205- return javaClass ;
206- }
207- int arrayDimensions = 0 ;
208- int arrayIndex = painlessType .indexOf ('[' );
209-
210- if (arrayIndex != -1 ) {
211- int length = painlessType .length ();
212-
213- while (arrayIndex < length ) {
214- if (painlessType .charAt (arrayIndex ) == '[' && ++arrayIndex < length && painlessType .charAt (arrayIndex ++) == ']' ) {
215- ++arrayDimensions ;
216- } else {
217- throw new IllegalArgumentException ("invalid painless type [" + painlessType + "]." );
218- }
219- }
220-
221- painlessType = painlessType .substring (0 , painlessType .indexOf ('[' ));
222- javaClass = painlessTypesToJavaClasses .get (painlessType );
223-
224- char braces [] = new char [arrayDimensions ];
225- Arrays .fill (braces , '[' );
226- String descriptor = new String (braces );
227-
228- if (javaClass == boolean .class ) {
229- descriptor += "Z" ;
230- } else if (javaClass == byte .class ) {
231- descriptor += "B" ;
232- } else if (javaClass == short .class ) {
233- descriptor += "S" ;
234- } else if (javaClass == char .class ) {
235- descriptor += "C" ;
236- } else if (javaClass == int .class ) {
237- descriptor += "I" ;
238- } else if (javaClass == long .class ) {
239- descriptor += "J" ;
240- } else if (javaClass == float .class ) {
241- descriptor += "F" ;
242- } else if (javaClass == double .class ) {
243- descriptor += "D" ;
244- } else {
245- descriptor += "L" + javaClass .getName () + ";" ;
246- }
247-
248- try {
249- return Class .forName (descriptor );
250- } catch (ClassNotFoundException cnfe ) {
251- throw new IllegalStateException ("invalid painless type [" + painlessType + "]" , cnfe );
252- }
253- }
254-
255- throw new IllegalArgumentException ("invalid painless type [" + painlessType + "]" );
57+ return PainlessLookupUtility .painlessTypeNameToPainlessType (painlessType , painlessTypesToJavaClasses );
25658 }
25759}
0 commit comments