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 }