package com.windowtester.swt.gef.internal.reflector;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
import com.windowtester.internal.runtime.ClassReference;
import com.windowtester.internal.runtime.ClassReference.UnresolvableClass;
/**
* <p>
* Copyright (c) 2007, Instantiations, Inc.<br>
* All Rights Reserved
*
* @author Phil Quitslund
*
*/
public class ClassReflector implements Serializable {
private static final long serialVersionUID = -2064118437541630317L;
private static final ClassReference[] EMPTY_ARRAY = new ClassReference[0];
private final ClassReference _classRef;
private Set _types = null;
public ClassReflector(ClassReference classRef) {
_classRef = classRef;
}
public ClassReference getClassRef() {
return _classRef;
}
/**
* Determines if the class or interface represented by this
* <code>ClassReflector's</code> {@link ClassReference} object is either the same as,
* or is a superclass or superinterface of, the class or interface represented by the specified
* <code>Class</code> parameter.
*/
public boolean isAssignableFrom(Class cls) {
Class myClass = getClassRef().getClassForName();
if (myClass == UnresolvableClass.class)
return isAssignableFrom(myClass, cls);
return myClass.isAssignableFrom(cls);
}
public /* public for testing */ boolean isAssignableFrom(Class myClass, Class cls) {
// TODO Auto-generated method stub
return false;
}
/**
* Returns all superclasses and interfaces implemented by this class.
*/
public ClassReference[] getTypes() {
if (_types == null)
populateTypes();
return (ClassReference[]) _types.toArray(EMPTY_ARRAY);
}
private void populateTypes() {
_types = new HashSet();
Class cls = getClassRef().getClassForName();
collectTypes(_types, cls);
}
/**
* Collect all of this classes types (interfaces and super classes) -- including itself.
*/
public static void collectTypes(Set types, Class cls) {
add(types, cls);
add(types, cls.getSuperclass());
}
private static void add(Set types, Class cls) {
types.add(new ClassReference(cls));
}
}