JavaClass.java revision 91d538470c011e19fa4375cc3531b5dd9ae01d55
1/*
2 * Copyright (C) 2015 The Android Open Source Project
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *      http://www.apache.org/licenses/LICENSE-2.0
7 * Unless required by applicable law or agreed to in writing, software
8 * distributed under the License is distributed on an "AS IS" BASIS,
9 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10 * See the License for the specific language governing permissions and
11 * limitations under the License.
12 */
13
14package android.databinding.tool.reflection.java;
15
16import android.databinding.tool.reflection.ModelClass;
17import android.databinding.tool.reflection.ModelField;
18import android.databinding.tool.reflection.ModelMethod;
19import android.databinding.tool.reflection.TypeUtil;
20
21import java.lang.reflect.Field;
22import java.lang.reflect.Method;
23
24public class JavaClass extends ModelClass {
25    public final Class mClass;
26
27    public JavaClass(Class clazz) {
28        mClass = clazz;
29    }
30
31    @Override
32    public String toJavaCode() {
33        return toJavaCode(mClass);
34    }
35
36    private static String toJavaCode(Class aClass) {
37        if (aClass.isArray()) {
38            Class component = aClass.getComponentType();
39            return toJavaCode(component) + "[]";
40        } else {
41            return aClass.getCanonicalName().replace('$', '.');
42        }
43    }
44
45    @Override
46    public boolean isArray() {
47        return mClass.isArray();
48    }
49
50    @Override
51    public ModelClass getComponentType() {
52        if (mClass.isArray()) {
53            return new JavaClass(mClass.getComponentType());
54        } else if (isList() || isMap()) {
55            return new JavaClass(Object.class);
56        } else {
57            return null;
58        }
59    }
60
61    @Override
62    public boolean isNullable() {
63        return Object.class.isAssignableFrom(mClass);
64    }
65
66    @Override
67    public boolean isPrimitive() {
68        return mClass.isPrimitive();
69    }
70
71    @Override
72    public boolean isBoolean() {
73        return boolean.class.equals(mClass);
74    }
75
76    @Override
77    public boolean isChar() {
78        return char.class.equals(mClass);
79    }
80
81    @Override
82    public boolean isByte() {
83        return byte.class.equals(mClass);
84    }
85
86    @Override
87    public boolean isShort() {
88        return short.class.equals(mClass);
89    }
90
91    @Override
92    public boolean isInt() {
93        return int.class.equals(mClass);
94    }
95
96    @Override
97    public boolean isLong() {
98        return long.class.equals(mClass);
99    }
100
101    @Override
102    public boolean isFloat() {
103        return float.class.equals(mClass);
104    }
105
106    @Override
107    public boolean isDouble() {
108        return double.class.equals(mClass);
109    }
110
111    @Override
112    public boolean isGeneric() {
113        return false;
114    }
115
116    @Override
117    public boolean isVoid() {
118        return void.class.equals(mClass);
119    }
120
121    @Override
122    public ModelClass unbox() {
123        if (mClass.isPrimitive()) {
124            return this;
125        }
126        if (Integer.class.equals(mClass)) {
127            return new JavaClass(int.class);
128        } else if (Long.class.equals(mClass)) {
129            return new JavaClass(long.class);
130        } else if (Short.class.equals(mClass)) {
131            return new JavaClass(short.class);
132        } else if (Byte.class.equals(mClass)) {
133            return new JavaClass(byte.class);
134        } else if (Character.class.equals(mClass)) {
135            return new JavaClass(char.class);
136        } else if (Double.class.equals(mClass)) {
137            return new JavaClass(double.class);
138        } else if (Float.class.equals(mClass)) {
139            return new JavaClass(float.class);
140        } else if (Boolean.class.equals(mClass)) {
141            return new JavaClass(boolean.class);
142        } else {
143            // not a boxed type
144            return this;
145        }
146
147    }
148
149    @Override
150    public JavaClass box() {
151        if (!mClass.isPrimitive()) {
152            return this;
153        }
154        if (int.class.equals(mClass)) {
155            return new JavaClass(Integer.class);
156        } else if (long.class.equals(mClass)) {
157            return new JavaClass(Long.class);
158        } else if (short.class.equals(mClass)) {
159            return new JavaClass(Short.class);
160        } else if (byte.class.equals(mClass)) {
161            return new JavaClass(Byte.class);
162        } else if (char.class.equals(mClass)) {
163            return new JavaClass(Character.class);
164        } else if (double.class.equals(mClass)) {
165            return new JavaClass(Double.class);
166        } else if (float.class.equals(mClass)) {
167            return new JavaClass(Float.class);
168        } else if (boolean.class.equals(mClass)) {
169            return new JavaClass(Boolean.class);
170        } else {
171            // not a valid type?
172            return this;
173        }
174    }
175
176    @Override
177    public boolean isAssignableFrom(ModelClass that) {
178        Class thatClass = ((JavaClass) that).mClass;
179        return mClass.isAssignableFrom(thatClass);
180    }
181
182    @Override
183    public ModelClass getSuperclass() {
184        if (mClass.getSuperclass() == null) {
185            return null;
186        }
187        return new JavaClass(mClass.getSuperclass());
188    }
189
190    @Override
191    public String getCanonicalName() {
192        return mClass.getCanonicalName();
193    }
194
195    @Override
196    public ModelClass erasure() {
197        return this;
198    }
199
200    @Override
201    public String getJniDescription() {
202        return TypeUtil.getInstance().getDescription(this);
203    }
204
205    @Override
206    protected ModelField[] getDeclaredFields() {
207        Field[] fields = mClass.getDeclaredFields();
208        ModelField[] modelFields;
209        if (fields == null) {
210            modelFields = new ModelField[0];
211        } else {
212            modelFields = new ModelField[fields.length];
213            for (int i = 0; i < fields.length; i++) {
214                modelFields[i] = new JavaField(fields[i]);
215            }
216        }
217        return modelFields;
218    }
219
220    @Override
221    protected ModelMethod[] getDeclaredMethods() {
222        Method[] methods = mClass.getDeclaredMethods();
223        if (methods == null) {
224            return new ModelMethod[0];
225        } else {
226            ModelMethod[] classMethods = new ModelMethod[methods.length];
227            for (int i = 0; i < methods.length; i++) {
228                classMethods[i] = new JavaMethod(methods[i]);
229            }
230            return classMethods;
231        }
232    }
233
234    @Override
235    public boolean equals(Object obj) {
236        if (obj instanceof JavaClass) {
237            return mClass.equals(((JavaClass) obj).mClass);
238        } else {
239            return false;
240        }
241    }
242
243    @Override
244    public int hashCode() {
245        return mClass.hashCode();
246    }
247}
248