All Downloads are FREE. Search and download functionalities are using the official Maven repository.

nextapp.echo.app.reflect.IntrospectionUtil Maven / Gradle / Ivy

There is a newer version: 3.1.0
Show newest version
/* 
 * This file is part of the Echo Web Application Framework (hereinafter "Echo").
 * Copyright (C) 2002-2009 NextApp, Inc.
 *
 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
 *
 * The contents of this file are subject to the Mozilla Public License Version
 * 1.1 (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.mozilla.org/MPL/
 *
 * Software distributed under the License is distributed on an "AS IS" basis,
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
 * for the specific language governing rights and limitations under the
 * License.
 *
 * Alternatively, the contents of this file may be used under the terms of
 * either the GNU General Public License Version 2 or later (the "GPL"), or
 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
 * in which case the provisions of the GPL or the LGPL are applicable instead
 * of those above. If you wish to allow use of your version of this file only
 * under the terms of either the GPL or the LGPL, and not to allow others to
 * use your version of this file under the terms of the MPL, indicate your
 * decision by deleting the provisions above and replace them with the notice
 * and other provisions required by the GPL or the LGPL. If you do not delete
 * the provisions above, a recipient may use your version of this file under
 * the terms of any one of the MPL, the GPL or the LGPL.
 */

package nextapp.echo.app.reflect;

import java.util.ArrayList;
import java.util.List;

/**
 * Provides stateless utilities used for object introspection.
 */
public class IntrospectionUtil {

    /**
     * Returns a parent type hierarchy as an array containing the provided 
     * type and all of its parent types (excluding 
     * java.lang.Object).  The highest-level types appear first, 
     * with the provided type at the first index.
     * 
     * @param type the top-level type
     * @param classLoader the ClassLoader through which 
     *        introspection may be performed
     * @return the type hierarchy
     */
    public static String[] getTypeHierarchy(String type, ClassLoader classLoader) 
    throws ClassNotFoundException {
        List hierarchy = new ArrayList();
        Class clazz = Class.forName(type, true, classLoader);
        while (clazz != Object.class) {
            hierarchy.add(clazz.getName());
            clazz = clazz.getSuperclass();
        }
        return (String[]) hierarchy.toArray(new String[hierarchy.size()]);
    }
    
    /**
     * Determines if the type specified by testType can be assigned to objects of the type
     * specified by baseType.
     * This simply uses Class.isAssignableFrom after loading classes using the specified ClassLoader.
     * 
     * @param baseType the base type
     * @param testType the test type
     * @param classLoader the ClassLoader to use to load the classes for testing
     */
    public static boolean isAssignableFrom(String testType, String baseType, ClassLoader classLoader) 
    throws ClassNotFoundException {
        Class baseClass = Class.forName(baseType, true, classLoader);
        Class testClass = Class.forName(testType, true, classLoader);
        return baseClass.isAssignableFrom(testClass);
    }

    /**
     * Determines if the provided Class is a 
     * java.util.EventObject.
     * 
     * @param type the Class to analyze
     * @return true if type type extends
     *         java.util.EventObject
     */
    public static boolean isEventObject(Class type) {
        if ("java.util.EventObject".equals(type.getName())) {
            return true;
        } else if ("java.lang.Object".equals(type.getName())) {
            return false;
        } else {
            return isEventObject(type.getSuperclass());
        }
    }
    
    /**
     * Determines if superClass is a superclass of 
     * testClass.
     * 
     * @param testType the name class to test
     * @param superType a class name which may/may not be a superclass of
     *        testClass
     * @param classLoader a ClassLoader to use for the analysis.
     * @return true if superClass is a superclass of 
     *         testClass
     */
    public static boolean isSuperType(String testType, String superType, ClassLoader classLoader) {
        try {
            Class clazz = classLoader.loadClass(testType);
            while (clazz != Object.class) {
                if (clazz.getName().equals(superType)) {
                    return true;
                }
                clazz = clazz.getSuperclass();
            }
            return false;
        } catch (ClassNotFoundException ex) {
            return false;
        }
    }
    
    /**
     * Removes the package name from a type name.
     * 
     * @param type a fully qualified type name
     * @return a relative version of the type name
     */
    public static String removePackageFromType(String type) {
        int lastDot = type.lastIndexOf(".");
        if (lastDot == -1) {
            // Unpackaged object (highly unlikely, or at least a very bad practice).
            return type;
        } else {
            return type.substring(lastDot + 1);
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy