ModelAnalyzer.java revision 97d6ddf47f4ff1abb3ed5201ce5232163f5325b1
11b9940e612fc73202837fbe9db2f9035f307b5d1George Mount/* 21b9940e612fc73202837fbe9db2f9035f307b5d1George Mount * Copyright (C) 2015 The Android Open Source Project 31b9940e612fc73202837fbe9db2f9035f307b5d1George Mount * 41b9940e612fc73202837fbe9db2f9035f307b5d1George Mount * Licensed under the Apache License, Version 2.0 (the "License"); 51b9940e612fc73202837fbe9db2f9035f307b5d1George Mount * you may not use this file except in compliance with the License. 61b9940e612fc73202837fbe9db2f9035f307b5d1George Mount * You may obtain a copy of the License at 71b9940e612fc73202837fbe9db2f9035f307b5d1George Mount * 81b9940e612fc73202837fbe9db2f9035f307b5d1George Mount * http://www.apache.org/licenses/LICENSE-2.0 91b9940e612fc73202837fbe9db2f9035f307b5d1George Mount * 101b9940e612fc73202837fbe9db2f9035f307b5d1George Mount * Unless required by applicable law or agreed to in writing, software 111b9940e612fc73202837fbe9db2f9035f307b5d1George Mount * distributed under the License is distributed on an "AS IS" BASIS, 121b9940e612fc73202837fbe9db2f9035f307b5d1George Mount * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131b9940e612fc73202837fbe9db2f9035f307b5d1George Mount * See the License for the specific language governing permissions and 141b9940e612fc73202837fbe9db2f9035f307b5d1George Mount * limitations under the License. 151b9940e612fc73202837fbe9db2f9035f307b5d1George Mount */ 161b9940e612fc73202837fbe9db2f9035f307b5d1George Mountpackage com.android.databinding.reflection; 171b9940e612fc73202837fbe9db2f9035f307b5d1George Mount 1879fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mountimport com.google.common.base.Preconditions; 1997d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyarimport com.android.databinding.reflection.annotation.AnnotationAnalyzer; 2097d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyarimport com.android.databinding.util.L; 211b9940e612fc73202837fbe9db2f9035f307b5d1George Mount 221b9940e612fc73202837fbe9db2f9035f307b5d1George Mountimport java.net.URL; 231b9940e612fc73202837fbe9db2f9035f307b5d1George Mountimport java.util.List; 24a7e767e576adebcddf043ad34ccb8dd167f777b3George Mountimport java.util.Map; 251b9940e612fc73202837fbe9db2f9035f307b5d1George Mountimport javax.annotation.processing.ProcessingEnvironment; 261b9940e612fc73202837fbe9db2f9035f307b5d1George Mount 2779fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mountpublic abstract class ModelAnalyzer { 2897d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar 2997d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar public static final String[] LIST_CLASS_NAMES = { 3097d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar "java.util.List", 3197d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar "android.util.SparseArray", 3297d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar "android.util.SparseBooleanArray", 3397d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar "android.util.SparseIntArray", 3497d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar "android.util.SparseLongArray", 3597d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar "android.util.LongSparseArray", 3697d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar "android.support.v4.util.LongSparseArray", 3797d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar }; 3897d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar 3997d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar public static final String MAP_CLASS_NAME = "java.util.Map"; 4097d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar 4197d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar public static final String STRING_CLASS_NAME = "java.lang.String"; 4297d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar 4397d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar public static final String OBJECT_CLASS_NAME = "java.lang.Object"; 4497d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar 4597d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar static ModelAnalyzer instance; 4697d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar 4797d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar public static final String OBSERVABLE_CLASS_NAME = "android.binding.Observable"; 4897d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar 4997d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar public static final String OBSERVABLE_LIST_CLASS_NAME = "android.binding.ObservableList"; 5097d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar 5197d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar public static final String OBSERVABLE_MAP_CLASS_NAME = "android.binding.ObservableMap"; 5297d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar 5397d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar public static final String[] OBSERVABLE_FIELDS = { 5497d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar "com.android.databinding.library.ObservableBoolean", 5597d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar "com.android.databinding.library.ObservableByte", 5697d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar "com.android.databinding.library.ObservableChar", 5797d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar "com.android.databinding.library.ObservableShort", 5897d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar "com.android.databinding.library.ObservableInt", 5997d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar "com.android.databinding.library.ObservableLong", 6097d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar "com.android.databinding.library.ObservableFloat", 6197d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar "com.android.databinding.library.ObservableDouble", 6297d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar "com.android.databinding.library.ObservableField", 6397d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar }; 6497d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar 6597d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar public static final String I_VIEW_DATA_BINDER 6697d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar = "com.android.databinding.library.IViewDataBinder"; 6797d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar 6879fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount private static ModelAnalyzer sAnalyzer; 691b9940e612fc73202837fbe9db2f9035f307b5d1George Mount 7097d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar protected void setInstance(ModelAnalyzer analyzer) { 7197d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar sAnalyzer = analyzer; 7297d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar } 7397d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar 7479fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount public abstract boolean isDataBinder(ModelClass modelClass); 751b9940e612fc73202837fbe9db2f9035f307b5d1George Mount 7679fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount public abstract Callable findMethod(ModelClass modelClass, String name, 7718243f6f1b7527272ef4feccdf4327d80d9f2241George Mount List<ModelClass> args, boolean staticAccess); 781b9940e612fc73202837fbe9db2f9035f307b5d1George Mount 7979fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount public abstract boolean isObservable(ModelClass modelClass); 801b9940e612fc73202837fbe9db2f9035f307b5d1George Mount 8179fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount public abstract boolean isObservableField(ModelClass modelClass); 821b9940e612fc73202837fbe9db2f9035f307b5d1George Mount 8379fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount public abstract boolean isBindable(ModelField field); 841b9940e612fc73202837fbe9db2f9035f307b5d1George Mount 8579fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount public abstract boolean isBindable(ModelMethod method); 861b9940e612fc73202837fbe9db2f9035f307b5d1George Mount 8718243f6f1b7527272ef4feccdf4327d80d9f2241George Mount public abstract Callable findMethodOrField(ModelClass modelClass, String name, 8818243f6f1b7527272ef4feccdf4327d80d9f2241George Mount boolean staticAccess); 891b9940e612fc73202837fbe9db2f9035f307b5d1George Mount 9079fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount public ModelClass findCommonParentOf(ModelClass modelClass1, 9179fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount ModelClass modelClass2) { 9279fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount ModelClass curr = modelClass1; 9379fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount while (curr != null && !curr.isAssignableFrom(modelClass2)) { 9479fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount curr = curr.getSuperclass(); 951b9940e612fc73202837fbe9db2f9035f307b5d1George Mount } 9679fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount if (curr == null) { 9779fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount ModelClass primitive1 = modelClass1.unbox(); 9879fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount ModelClass primitive2 = modelClass2.unbox(); 9979fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount if (!modelClass1.equals(primitive1) || !modelClass2.equals(primitive2)) { 10079fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount return findCommonParentOf(primitive1, primitive2); 1011b9940e612fc73202837fbe9db2f9035f307b5d1George Mount } 1021b9940e612fc73202837fbe9db2f9035f307b5d1George Mount } 10379fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount Preconditions.checkNotNull(curr, 10479fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount "must be able to find a common parent for " + modelClass1 + " and " + modelClass2); 10579fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount return curr; 1061b9940e612fc73202837fbe9db2f9035f307b5d1George Mount 1071b9940e612fc73202837fbe9db2f9035f307b5d1George Mount } 1081b9940e612fc73202837fbe9db2f9035f307b5d1George Mount 10979fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount public abstract ModelClass loadPrimitive(String className); 1101b9940e612fc73202837fbe9db2f9035f307b5d1George Mount 11179fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount public static ModelAnalyzer getInstance() { 11279fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount return sAnalyzer; 1131b9940e612fc73202837fbe9db2f9035f307b5d1George Mount } 1141b9940e612fc73202837fbe9db2f9035f307b5d1George Mount 11579fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount public static void setProcessingEnvironment(ProcessingEnvironment processingEnvironment) { 11697d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar if (sAnalyzer != null) { 11797d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar throw new IllegalStateException("processing env is already created, you cannot " 11897d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar + "change class loader after that"); 11997d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar } 12097d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar L.d("setting processing env to %s", processingEnvironment); 12179fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount AnnotationAnalyzer annotationAnalyzer = new AnnotationAnalyzer(processingEnvironment); 12279fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount sAnalyzer = annotationAnalyzer; 1231b9940e612fc73202837fbe9db2f9035f307b5d1George Mount } 1241b9940e612fc73202837fbe9db2f9035f307b5d1George Mount 12579fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount public String getDefaultValue(String className) { 12697d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar if ("int".equals(className)) { 12779fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount return "0"; 1281b9940e612fc73202837fbe9db2f9035f307b5d1George Mount } 12997d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar if ("short".equals(className)) { 13079fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount return "0"; 1311b9940e612fc73202837fbe9db2f9035f307b5d1George Mount } 13297d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar if ("long".equals(className)) { 13379fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount return "0L"; 1341b9940e612fc73202837fbe9db2f9035f307b5d1George Mount } 13597d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar if ("float".equals(className)) { 13679fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount return "0f"; 1371b9940e612fc73202837fbe9db2f9035f307b5d1George Mount } 13897d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar if ("double".equals(className)) { 13979fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount return "0.0"; 1401b9940e612fc73202837fbe9db2f9035f307b5d1George Mount } 14197d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar if ("boolean".equals(className)) { 14279fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount return "false"; 1431b9940e612fc73202837fbe9db2f9035f307b5d1George Mount } 14479fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount if ("char".equals(className)) { 14579fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount return "'\\u0000'"; 1461b9940e612fc73202837fbe9db2f9035f307b5d1George Mount } 14779fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount if ("byte".equals(className)) { 14879fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount return "0"; 1491b9940e612fc73202837fbe9db2f9035f307b5d1George Mount } 15079fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount return "null"; 1511b9940e612fc73202837fbe9db2f9035f307b5d1George Mount } 1521b9940e612fc73202837fbe9db2f9035f307b5d1George Mount 153a7e767e576adebcddf043ad34ccb8dd167f777b3George Mount public abstract ModelClass findClass(String className, Map<String, String> imports); 1541b9940e612fc73202837fbe9db2f9035f307b5d1George Mount 15579fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount public abstract List<URL> getResources(String name); 1561b9940e612fc73202837fbe9db2f9035f307b5d1George Mount 15779fc7f3727815ab35bb1bb2e060bfb7db3176eedGeorge Mount public abstract ModelClass findClass(Class classType); 15897d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar 15997d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar public abstract TypeUtil createTypeUtil(); 1601b9940e612fc73202837fbe9db2f9035f307b5d1George Mount} 161