com.google.gwt.editor.rebind.model.ModelUtils.java Source code

Java tutorial

Introduction

Here is the source code for com.google.gwt.editor.rebind.model.ModelUtils.java

Source

/*
 * Copyright 2010 Google Inc.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package com.google.gwt.editor.rebind.model;

import com.google.web.bindery.autobean.shared.ValueCodex;
import com.google.gwt.core.ext.typeinfo.JArrayType;
import com.google.gwt.core.ext.typeinfo.JClassType;
import com.google.gwt.core.ext.typeinfo.JParameterizedType;
import com.google.gwt.core.ext.typeinfo.JType;
import com.google.gwt.core.ext.typeinfo.TypeOracle;

import java.util.Collections;
import java.util.HashSet;
import java.util.Set;

/**
 * Utility class for common model methods.
 */
public class ModelUtils {

    static final Set<String> VALUE_TYPE_NAMES;

    static {
        Set<Class<?>> valueTypes = ValueCodex.getAllValueTypes();
        Set<String> names = new HashSet<String>(valueTypes.size());
        for (Class<?> clazz : valueTypes) {
            names.add(clazz.getName());
        }
        VALUE_TYPE_NAMES = Collections.unmodifiableSet(names);
    }

    @SuppressWarnings("unchecked")
    public static <T extends JType> T ensureBaseType(T maybeParameterized) {
        if (maybeParameterized.isArray() != null) {
            JArrayType array = maybeParameterized.isArray();
            return (T) array.getOracle().getArrayType(ensureBaseType(array.getComponentType()));
        }
        if (maybeParameterized.isTypeParameter() != null) {
            return (T) maybeParameterized.isTypeParameter().getBaseType();
        }
        if (maybeParameterized.isParameterized() != null) {
            return (T) maybeParameterized.isParameterized().getBaseType();
        }
        if (maybeParameterized.isRawType() != null) {
            return (T) maybeParameterized.isRawType().getBaseType();
        }
        if (maybeParameterized.isWildcard() != null) {
            return (T) maybeParameterized.isWildcard().getBaseType();
        }
        return maybeParameterized;
    }

    public static JClassType[] findParameterizationOf(JClassType intfType, JClassType subType) {
        assert intfType.isAssignableFrom(subType) : subType.getParameterizedQualifiedSourceName()
                + " is not assignable to " + subType.getParameterizedQualifiedSourceName();

        for (JClassType supertype : subType.getFlattenedSupertypeHierarchy()) {
            JParameterizedType parameterized = supertype.isParameterized();
            if (parameterized != null) {
                // Found the desired supertype
                if (intfType.equals(parameterized.getBaseType())) {
                    return parameterized.getTypeArgs();
                }
            }
        }
        return null;
    }

    /**
     * Given a JType, return the binary name of the class that is most proximately
     * assignable to the type. This method will resolve type parameters as well as
     * wildcard types.
     */
    public static String getQualifiedBaseBinaryName(JType type) {
        return ensureBaseType(type).getErasedType().getQualifiedBinaryName();
    }

    /**
     * Given a JType, return the source name of the class that is most proximately
     * assignable to the type. This method will resolve type parameters as well as
     * wildcard types.
     */
    public static String getQualifiedBaseSourceName(JType type) {
        return ensureBaseType(type).getErasedType().getQualifiedSourceName();
    }

    public static boolean isValueType(TypeOracle oracle, JType type) {
        JClassType classType = type.isClassOrInterface();
        if (classType == null) {
            return true;
        }
        if (type.isEnum() != null) {
            return true;
        }

        for (String valueType : VALUE_TYPE_NAMES) {
            JClassType found = oracle.findType(valueType);
            // null check to accommodate limited mock CompilationStates
            if (found != null && found.equals(classType)) {
                return true;
            }
        }
        return false;
    }

    private ModelUtils() {
    }
}