JavaClass.java revision fead9ca09b117136b35bc5bf137340a754f9eddd
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 isVoid() {
113        return void.class.equals(mClass);
114    }
115
116    @Override
117    public ModelClass unbox() {
118        if (mClass.isPrimitive()) {
119            return this;
120        }
121        if (Integer.class.equals(mClass)) {
122            return new JavaClass(int.class);
123        } else if (Long.class.equals(mClass)) {
124            return new JavaClass(long.class);
125        } else if (Short.class.equals(mClass)) {
126            return new JavaClass(short.class);
127        } else if (Byte.class.equals(mClass)) {
128            return new JavaClass(byte.class);
129        } else if (Character.class.equals(mClass)) {
130            return new JavaClass(char.class);
131        } else if (Double.class.equals(mClass)) {
132            return new JavaClass(double.class);
133        } else if (Float.class.equals(mClass)) {
134            return new JavaClass(float.class);
135        } else if (Boolean.class.equals(mClass)) {
136            return new JavaClass(boolean.class);
137        } else {
138            // not a boxed type
139            return this;
140        }
141
142    }
143
144    @Override
145    public JavaClass box() {
146        if (!mClass.isPrimitive()) {
147            return this;
148        }
149        if (int.class.equals(mClass)) {
150            return new JavaClass(Integer.class);
151        } else if (long.class.equals(mClass)) {
152            return new JavaClass(Long.class);
153        } else if (short.class.equals(mClass)) {
154            return new JavaClass(Short.class);
155        } else if (byte.class.equals(mClass)) {
156            return new JavaClass(Byte.class);
157        } else if (char.class.equals(mClass)) {
158            return new JavaClass(Character.class);
159        } else if (double.class.equals(mClass)) {
160            return new JavaClass(Double.class);
161        } else if (float.class.equals(mClass)) {
162            return new JavaClass(Float.class);
163        } else if (boolean.class.equals(mClass)) {
164            return new JavaClass(Boolean.class);
165        } else {
166            // not a valid type?
167            return this;
168        }
169    }
170
171    @Override
172    public boolean isAssignableFrom(ModelClass that) {
173        Class thatClass = ((JavaClass) that).mClass;
174        return mClass.isAssignableFrom(thatClass);
175    }
176
177    @Override
178    public ModelClass getSuperclass() {
179        if (mClass.getSuperclass() == null) {
180            return null;
181        }
182        return new JavaClass(mClass.getSuperclass());
183    }
184
185    @Override
186    public String getCanonicalName() {
187        return mClass.getCanonicalName();
188    }
189
190    @Override
191    public ModelClass erasure() {
192        return this;
193    }
194
195    @Override
196    public String getJniDescription() {
197        return TypeUtil.getInstance().getDescription(this);
198    }
199
200    @Override
201    protected ModelField[] getDeclaredFields() {
202        Field[] fields = mClass.getDeclaredFields();
203        ModelField[] modelFields;
204        if (fields == null) {
205            modelFields = new ModelField[0];
206        } else {
207            modelFields = new ModelField[fields.length];
208            for (int i = 0; i < fields.length; i++) {
209                modelFields[i] = new JavaField(fields[i]);
210            }
211        }
212        return modelFields;
213    }
214
215    @Override
216    protected ModelMethod[] getDeclaredMethods() {
217        Method[] methods = mClass.getDeclaredMethods();
218        if (methods == null) {
219            return new ModelMethod[0];
220        } else {
221            ModelMethod[] classMethods = new ModelMethod[methods.length];
222            for (int i = 0; i < methods.length; i++) {
223                classMethods[i] = new JavaMethod(methods[i]);
224            }
225            return classMethods;
226        }
227    }
228
229    @Override
230    public boolean equals(Object obj) {
231        if (obj instanceof JavaClass) {
232            return mClass.equals(((JavaClass) obj).mClass);
233        } else {
234            return false;
235        }
236    }
237
238    @Override
239    public int hashCode() {
240        return mClass.hashCode();
241    }
242}
243