197d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar/*
297d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar * Copyright (C) 2015 The Android Open Source Project
397d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar * Licensed under the Apache License, Version 2.0 (the "License");
497d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar * you may not use this file except in compliance with the License.
597d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar * You may obtain a copy of the License at
697d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar *      http://www.apache.org/licenses/LICENSE-2.0
797d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar * Unless required by applicable law or agreed to in writing, software
897d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar * distributed under the License is distributed on an "AS IS" BASIS,
997d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1097d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar * See the License for the specific language governing permissions and
1197d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar * limitations under the License.
1297d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar */
1397d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar
14fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountpackage android.databinding.tool.reflection.java;
1597d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar
16fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountimport android.databinding.tool.reflection.ModelClass;
17fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountimport android.databinding.tool.reflection.ModelMethod;
18fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountimport android.databinding.tool.reflection.TypeUtil;
19fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountimport android.databinding.tool.util.L;
2097d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar
2197d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyarimport java.lang.reflect.Array;
2297d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyarimport java.lang.reflect.Method;
2397d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar
2497d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyarpublic class JavaTypeUtil extends TypeUtil {
2597d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar
2697d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar    @Override
2797d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar    public String getDescription(ModelClass modelClass) {
2897d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar        return modelClass.getCanonicalName().replace('.', '/');
2997d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar    }
3097d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar
3197d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar    @Override
3297d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar    public String getDescription(ModelMethod modelMethod) {
3397d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar        Method method = ((JavaMethod) modelMethod).mMethod;
3497d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar        StringBuilder sb  = new StringBuilder();
3597d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar        sb.append(method.getName());
3697d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar        sb.append("(");
3797d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar        for (Class param : method.getParameterTypes()) {
3897d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar            sb.append(getDescription(param));
3997d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar        }
4097d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar        sb.append(")");
4197d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar        sb.append(getDescription(method.getReturnType()));
4297d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar        return sb.toString();
4397d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar    }
4497d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar
4597d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar    private String getDescription(Class klass) {
4697d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar        if (klass == null) {
4797d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar            throw new UnsupportedOperationException();
4897d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar        }
4997d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar        if (boolean.class.equals(klass)) {
5097d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar            return BOOLEAN;
5197d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar        }
5297d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar        if (byte.class.equals(klass)) {
5397d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar            return BYTE;
5497d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar        }
5597d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar        if (short.class.equals(klass)) {
5697d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar            return SHORT;
5797d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar        }
5897d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar        if (int.class.equals(klass)) {
5997d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar            return INT;
6097d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar        }
6197d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar        if (long.class.equals(klass)) {
6297d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar            return LONG;
6397d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar        }
6497d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar        if (char.class.equals(klass)) {
6597d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar            return CHAR;
6697d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar        }
6797d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar        if (float.class.equals(klass)) {
6897d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar            return FLOAT;
6997d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar        }
7097d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar        if (double.class.equals(klass)) {
7197d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar            return DOUBLE;
7297d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar        }
7397d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar        if (void.class.equals(klass)) {
7497d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar            return VOID;
7597d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar        }
7697d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar        if (Object.class.isAssignableFrom(klass)) {
7797d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar            return CLASS_PREFIX + klass.getCanonicalName().replace('.', '/') + CLASS_SUFFIX;
7897d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar        }
7997d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar        if (Array.class.isAssignableFrom(klass)) {
8097d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar            return ARRAY + getDescription(klass.getComponentType());
8197d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar        }
8297d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar
8397d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar        UnsupportedOperationException ex
8497d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar                = new UnsupportedOperationException("cannot understand type "
8597d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar                + klass.toString() + ", kind:");
8697d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar        L.e(ex, "cannot create JNI type for %s", klass.getCanonicalName());
8797d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar        throw ex;
8897d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar    }
8997d6ddf47f4ff1abb3ed5201ce5232163f5325b1Yigit Boyar}
90