Home | History | Annotate | Download | only in java
      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 
     14 package android.databinding.tool.reflection.java;
     15 
     16 import android.databinding.tool.reflection.ModelClass;
     17 import android.databinding.tool.reflection.ModelField;
     18 import android.databinding.tool.reflection.ModelMethod;
     19 import android.databinding.tool.reflection.TypeUtil;
     20 
     21 import java.lang.reflect.Field;
     22 import java.lang.reflect.Method;
     23 import java.util.List;
     24 
     25 public class JavaClass extends ModelClass {
     26     public final Class mClass;
     27 
     28     public JavaClass(Class clazz) {
     29         mClass = clazz;
     30     }
     31 
     32     @Override
     33     public String toJavaCode() {
     34         return toJavaCode(mClass);
     35     }
     36 
     37     private static String toJavaCode(Class aClass) {
     38         if (aClass.isArray()) {
     39             Class component = aClass.getComponentType();
     40             return toJavaCode(component) + "[]";
     41         } else {
     42             return aClass.getCanonicalName().replace('$', '.');
     43         }
     44     }
     45 
     46     @Override
     47     public boolean isArray() {
     48         return mClass.isArray();
     49     }
     50 
     51     @Override
     52     public ModelClass getComponentType() {
     53         if (mClass.isArray()) {
     54             return new JavaClass(mClass.getComponentType());
     55         } else if (isList() || isMap()) {
     56             return new JavaClass(Object.class);
     57         } else {
     58             return null;
     59         }
     60     }
     61 
     62     @Override
     63     public boolean isNullable() {
     64         return Object.class.isAssignableFrom(mClass);
     65     }
     66 
     67     @Override
     68     public boolean isPrimitive() {
     69         return mClass.isPrimitive();
     70     }
     71 
     72     @Override
     73     public boolean isBoolean() {
     74         return boolean.class.equals(mClass);
     75     }
     76 
     77     @Override
     78     public boolean isChar() {
     79         return char.class.equals(mClass);
     80     }
     81 
     82     @Override
     83     public boolean isByte() {
     84         return byte.class.equals(mClass);
     85     }
     86 
     87     @Override
     88     public boolean isShort() {
     89         return short.class.equals(mClass);
     90     }
     91 
     92     @Override
     93     public boolean isInt() {
     94         return int.class.equals(mClass);
     95     }
     96 
     97     @Override
     98     public boolean isLong() {
     99         return long.class.equals(mClass);
    100     }
    101 
    102     @Override
    103     public boolean isFloat() {
    104         return float.class.equals(mClass);
    105     }
    106 
    107     @Override
    108     public boolean isDouble() {
    109         return double.class.equals(mClass);
    110     }
    111 
    112     @Override
    113     public boolean isGeneric() {
    114         return false;
    115     }
    116 
    117     @Override
    118     public List<ModelClass> getTypeArguments() {
    119         return null;
    120     }
    121 
    122     @Override
    123     public boolean isTypeVar() {
    124         return false;
    125     }
    126 
    127     @Override
    128     public boolean isWildcard() {
    129         return false;
    130     }
    131 
    132     @Override
    133     public boolean isInterface() {
    134         return mClass.isInterface();
    135     }
    136 
    137     @Override
    138     public boolean isVoid() {
    139         return void.class.equals(mClass);
    140     }
    141 
    142     @Override
    143     public ModelClass unbox() {
    144         if (mClass.isPrimitive()) {
    145             return this;
    146         }
    147         if (Integer.class.equals(mClass)) {
    148             return new JavaClass(int.class);
    149         } else if (Long.class.equals(mClass)) {
    150             return new JavaClass(long.class);
    151         } else if (Short.class.equals(mClass)) {
    152             return new JavaClass(short.class);
    153         } else if (Byte.class.equals(mClass)) {
    154             return new JavaClass(byte.class);
    155         } else if (Character.class.equals(mClass)) {
    156             return new JavaClass(char.class);
    157         } else if (Double.class.equals(mClass)) {
    158             return new JavaClass(double.class);
    159         } else if (Float.class.equals(mClass)) {
    160             return new JavaClass(float.class);
    161         } else if (Boolean.class.equals(mClass)) {
    162             return new JavaClass(boolean.class);
    163         } else {
    164             // not a boxed type
    165             return this;
    166         }
    167 
    168     }
    169 
    170     @Override
    171     public JavaClass box() {
    172         if (!mClass.isPrimitive()) {
    173             return this;
    174         }
    175         if (int.class.equals(mClass)) {
    176             return new JavaClass(Integer.class);
    177         } else if (long.class.equals(mClass)) {
    178             return new JavaClass(Long.class);
    179         } else if (short.class.equals(mClass)) {
    180             return new JavaClass(Short.class);
    181         } else if (byte.class.equals(mClass)) {
    182             return new JavaClass(Byte.class);
    183         } else if (char.class.equals(mClass)) {
    184             return new JavaClass(Character.class);
    185         } else if (double.class.equals(mClass)) {
    186             return new JavaClass(Double.class);
    187         } else if (float.class.equals(mClass)) {
    188             return new JavaClass(Float.class);
    189         } else if (boolean.class.equals(mClass)) {
    190             return new JavaClass(Boolean.class);
    191         } else {
    192             // not a valid type?
    193             return this;
    194         }
    195     }
    196 
    197     @Override
    198     public boolean isAssignableFrom(ModelClass that) {
    199         Class thatClass = ((JavaClass) that).mClass;
    200         return mClass.isAssignableFrom(thatClass);
    201     }
    202 
    203     @Override
    204     public ModelClass getSuperclass() {
    205         if (mClass.getSuperclass() == null) {
    206             return null;
    207         }
    208         return new JavaClass(mClass.getSuperclass());
    209     }
    210 
    211     @Override
    212     public String getCanonicalName() {
    213         return mClass.getCanonicalName();
    214     }
    215 
    216     @Override
    217     public ModelClass erasure() {
    218         return this;
    219     }
    220 
    221     @Override
    222     public String getJniDescription() {
    223         return TypeUtil.getInstance().getDescription(this);
    224     }
    225 
    226     @Override
    227     protected ModelField[] getDeclaredFields() {
    228         Field[] fields = mClass.getDeclaredFields();
    229         ModelField[] modelFields;
    230         if (fields == null) {
    231             modelFields = new ModelField[0];
    232         } else {
    233             modelFields = new ModelField[fields.length];
    234             for (int i = 0; i < fields.length; i++) {
    235                 modelFields[i] = new JavaField(fields[i]);
    236             }
    237         }
    238         return modelFields;
    239     }
    240 
    241     @Override
    242     protected ModelMethod[] getDeclaredMethods() {
    243         Method[] methods = mClass.getDeclaredMethods();
    244         if (methods == null) {
    245             return new ModelMethod[0];
    246         } else {
    247             ModelMethod[] classMethods = new ModelMethod[methods.length];
    248             for (int i = 0; i < methods.length; i++) {
    249                 classMethods[i] = new JavaMethod(methods[i]);
    250             }
    251             return classMethods;
    252         }
    253     }
    254 
    255     @Override
    256     public boolean equals(Object obj) {
    257         if (obj instanceof JavaClass) {
    258             return mClass.equals(((JavaClass) obj).mClass);
    259         } else {
    260             return false;
    261         }
    262     }
    263 
    264     @Override
    265     public int hashCode() {
    266         return mClass.hashCode();
    267     }
    268 }
    269