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