001    /*******************************************************************************
002     * Copyright (c) 2009 Progress Software, Inc.
003     * Copyright (c) 2004, 2008 IBM Corporation and others.
004     *
005     * All rights reserved. This program and the accompanying materials
006     * are made available under the terms of the Eclipse Public License v1.0
007     * which accompanies this distribution, and is available at
008     * http://www.eclipse.org/legal/epl-v10.html
009     *
010     *******************************************************************************/
011    package org.fusesource.hawtjni.generator.model;
012    
013    /**
014     * 
015     * @author <a href="http://hiramchirino.com">Hiram Chirino</a>
016     */
017    public class ReflectType implements JNIType {
018        
019        private Class<?> clazz;
020    
021        public ReflectType(Class<?> clazz) {
022            this.clazz = clazz;
023        }
024    
025        public int hashCode() {
026            return clazz.hashCode();
027        }
028    
029        public boolean equals(Object obj) {
030            if (obj == this)
031                return true;
032            if (!(obj instanceof ReflectType))
033                return false;
034            return ((ReflectType) obj).clazz == clazz;
035        }
036        
037        public Class<?> getWrappedClass() {
038            return clazz;
039        }
040    
041        public ReflectType asType32(boolean allowConversion) {
042            if (allowConversion) {
043                if (clazz == long.class)
044                    return new ReflectType(int.class);
045                else if (clazz == long[].class)
046                    return new ReflectType(int[].class);
047                else if (clazz == double.class)
048                    return new ReflectType(float.class);
049                else if (clazz == double[].class)
050                    return new ReflectType(float[].class);
051            }
052            return this;
053        }
054    
055        public ReflectType asType64(boolean allowConversion) {
056            if (allowConversion) {
057                if (clazz == int.class)
058                    return new ReflectType(long.class);
059                else if (clazz == int[].class)
060                    return new ReflectType(long[].class);
061                else if (clazz == float.class)
062                    return new ReflectType(double.class);
063                else if (clazz == float[].class)
064                    return new ReflectType(double[].class);
065            }
066            return this;
067        }
068    
069        public JNIType getComponentType() {
070            return new ReflectType(clazz.getComponentType());
071        }
072    
073        public String getName() {
074            return clazz.getName();
075        }
076    
077        public String getSimpleName() {
078            return clazz.getSimpleName();
079        }
080    
081        public String getTypeSignature(boolean define) {
082            if (clazz == Void.TYPE)
083                return "V";
084            if (clazz == Integer.TYPE)
085                return define ? "I_J" : "I";
086            if (clazz == Boolean.TYPE)
087                return "Z";
088            if (clazz == Long.TYPE)
089                return define ? "J_J" : "J";
090            if (clazz == Short.TYPE)
091                return "S";
092            if (clazz == Character.TYPE)
093                return "C";
094            if (clazz == Byte.TYPE)
095                return "B";
096            if (clazz == Float.TYPE)
097                return define ? "F_D" : "F";
098            if (clazz == Double.TYPE)
099                return define ? "F_D" : "D";
100            if (clazz == String.class)
101                return "Ljava/lang/String;";
102            if (clazz.isArray()) {
103                if (define)
104                    return getComponentType().getTypeSignature(define) + "Array";
105                return "[" + getComponentType().getTypeSignature(define);
106            }
107            return "L" + clazz.getName().replace('.', '/') + ";";
108        }
109    
110        public String getTypeSignature1(boolean define) {
111            if (clazz == Void.TYPE)
112                return "Void";
113            if (clazz == Integer.TYPE)
114                return define ? "IntLong" : "Int";
115            if (clazz == Boolean.TYPE)
116                return "Boolean";
117            if (clazz == Long.TYPE)
118                return define ? "IntLong" : "Long";
119            if (clazz == Short.TYPE)
120                return "Short";
121            if (clazz == Character.TYPE)
122                return "Char";
123            if (clazz == Byte.TYPE)
124                return "Byte";
125            if (clazz == Float.TYPE)
126                return define ? "FloatDouble" : "Float";
127            if (clazz == Double.TYPE)
128                return define ? "FloatDouble" : "Double";
129            if (clazz == String.class)
130                return "String";
131            return "Object";
132        }
133    
134        public String getTypeSignature2(boolean define) {
135            if (clazz == Void.TYPE)
136                return "void";
137            if (clazz == Integer.TYPE)
138                return define ? "jintLong" : "jint";
139            if (clazz == Boolean.TYPE)
140                return "jboolean";
141            if (clazz == Long.TYPE)
142                return define ? "jintLong" : "jlong";
143            if (clazz == Short.TYPE)
144                return "jshort";
145            if (clazz == Character.TYPE)
146                return "jchar";
147            if (clazz == Byte.TYPE)
148                return "jbyte";
149            if (clazz == Float.TYPE)
150                return define ? "jfloatDouble" : "jfloat";
151            if (clazz == Double.TYPE)
152                return define ? "jfloatDouble" : "jdouble";
153            if (clazz == String.class)
154                return "jstring";
155            if (clazz == Class.class)
156                return "jclass";
157            if (clazz.isArray()) {
158                return getComponentType().getTypeSignature2(define) + "Array";
159            }
160            return "jobject";
161        }
162    
163        public String getTypeSignature3(boolean define) {
164            if (clazz == Void.TYPE)
165                return "void";
166            if (clazz == Integer.TYPE)
167                return "int";
168            if (clazz == Boolean.TYPE)
169                return "boolean";
170            if (clazz == Long.TYPE)
171                return "long";
172            if (clazz == Short.TYPE)
173                return "short";
174            if (clazz == Character.TYPE)
175                return "char";
176            if (clazz == Byte.TYPE)
177                return "byte";
178            if (clazz == Float.TYPE)
179                return "float";
180            if (clazz == Double.TYPE)
181                return "double";
182            if (clazz == String.class)
183                return "String";
184            if (clazz.isArray()) {
185                return getComponentType().getTypeSignature3(define) + "[]";
186            }
187            return clazz.getName();
188        }
189    
190        public String getTypeSignature4(boolean define, boolean struct) {
191            if (clazz == Void.TYPE)
192                return "void";
193            if (clazz == Integer.TYPE)
194                return define ? "jintLong" : "jint";
195            if (clazz == Boolean.TYPE)
196                return "jboolean";
197            if (clazz == Long.TYPE)
198                return define ? "jintLong" : "jlong";
199            if (clazz == Short.TYPE)
200                return "jshort";
201            if (clazz == Character.TYPE)
202                return "jchar";
203            if (clazz == Byte.TYPE)
204                return "jbyte";
205            if (clazz == Float.TYPE)
206                return define ? "jfloatDouble" : "jfloat";
207            if (clazz == Double.TYPE)
208                return define ? "jfloatDouble" : "jdouble";
209            if (clazz == String.class)
210                return "jstring";
211            if (clazz.isArray()) {
212                String sig = getComponentType().getTypeSignature4(define, struct);
213                return struct ? sig : sig + " *";
214            }
215            String sig = getSimpleName();
216            return struct ? sig : sig + " *";
217        }
218    
219        public boolean isArray() {
220            return clazz.isArray();
221        }
222    
223        public boolean isPrimitive() {
224            return clazz.isPrimitive();
225        }
226    
227        public boolean isType(String type) {
228            return clazz.getName().equals(type);
229        }
230    
231    }