package gnu.java.lang;
import java.util.*;
import java.lang.reflect.*;
public class ClassHelper {
public static String getTruncatedClassName(Class clazz) {
return getTruncatedName(clazz.getName());
}
public static String getTruncatedName(String name) {
int lastInd = name.lastIndexOf('.');
if(lastInd == -1) {
return name;
} else {
return name.substring(lastInd+1);
}
}
public static String getPackagePortion(String name) {
int lastInd = name.lastIndexOf('.');
if(lastInd == -1) {
return "";
} else {
return name.substring(0,lastInd);
}
}
static Hashtable allMethods = new Hashtable();
static Hashtable allMethodsAtDeclaration = new Hashtable();
public static Method[] getAllMethods(Class clazz) {
Method[] retval = (Method[])allMethods.get(clazz);
if(retval == null) {
Method[] superMethods;
if(clazz.getSuperclass() != null) {
superMethods = getAllMethods(clazz.getSuperclass());
} else {
superMethods = new Method[0];
}
Vector v = new Vector();
Method[] currentMethods = clazz.getDeclaredMethods();
for(int i=0;i<currentMethods.length;i++) {
v.addElement(currentMethods[i]);
}
for(int i=0;i<superMethods.length;i++) {
boolean addOK = true;
for(int j=0;j<currentMethods.length;j++) {
if(getTruncatedName(superMethods[i].getName()).equals(getTruncatedName(currentMethods[j].getName()))
&& ArrayHelper.equalsArray(superMethods[i].getParameterTypes(),currentMethods[j].getParameterTypes())) {
addOK = false;
}
}
if(addOK) {
v.addElement(superMethods[i]);
}
}
retval = new Method[v.size()];
v.copyInto(retval);
allMethods.put(clazz,retval);
}
return retval;
}
public static Method[] getAllMethodsAtDeclaration(Class clazz) {
Method[] retval = (Method[])allMethodsAtDeclaration.get(clazz);
if(retval == null) {
Method[] superMethods;
if(clazz.getSuperclass() != null) {
superMethods = getAllMethodsAtDeclaration(clazz.getSuperclass());
} else {
superMethods = new Method[0];
}
Vector v = new Vector();
Method[] currentMethods = clazz.getDeclaredMethods();
for(int i=0;i<superMethods.length;i++) {
v.addElement(superMethods[i]);
}
for(int i=0;i<superMethods.length;i++) {
boolean addOK = true;
for(int j=0;j<currentMethods.length;j++) {
if(getTruncatedName(superMethods[i].getName()).equals(getTruncatedName(currentMethods[j].getName()))
&& ArrayHelper.equalsArray(superMethods[i].getParameterTypes(),currentMethods[j].getParameterTypes())) {
addOK = false;
}
}
if(addOK) {
v.addElement(superMethods[i]);
}
}
retval = new Method[v.size()];
v.copyInto(retval);
allMethodsAtDeclaration.put(clazz,retval);
}
return retval;
}
static Hashtable allFields = new Hashtable();
static Hashtable allFieldsAtDeclaration = new Hashtable();
public static Field[] getAllFields(Class clazz) {
Field[] retval = (Field[])allFields.get(clazz);
if(retval == null) {
Field[] superFields;
if(clazz.getSuperclass() != null) {
superFields = getAllFields(clazz.getSuperclass());
} else {
superFields = new Field[0];
}
Vector v = new Vector();
Field[] currentFields = clazz.getDeclaredFields();
for(int i=0;i<currentFields.length;i++) {
v.addElement(currentFields[i]);
}
for(int i=0;i<superFields.length;i++) {
boolean addOK = true;
for(int j=0;j<currentFields.length;j++) {
if(getTruncatedName(superFields[i].getName()).equals(getTruncatedName(currentFields[j].getName()))) {
addOK = false;
}
}
if(addOK) {
v.addElement(superFields[i]);
}
}
retval = new Field[v.size()];
v.copyInto(retval);
allFields.put(clazz,retval);
}
return retval;
}
public static Field[] getAllFieldsAtDeclaration(Class clazz) {
Field[] retval = (Field[])allFieldsAtDeclaration.get(clazz);
if(retval == null) {
Field[] superFields;
if(clazz.getSuperclass() != null) {
superFields = getAllFieldsAtDeclaration(clazz.getSuperclass());
} else {
superFields = new Field[0];
}
Vector v = new Vector();
Field[] currentFields = clazz.getDeclaredFields();
for(int i=0;i<superFields.length;i++) {
v.addElement(superFields[i]);
}
for(int i=0;i<superFields.length;i++) {
boolean addOK = true;
for(int j=0;j<currentFields.length;j++) {
if(getTruncatedName(superFields[i].getName()).equals(getTruncatedName(currentFields[j].getName()))) {
addOK = false;
}
}
if(addOK) {
v.addElement(superFields[i]);
}
}
retval = new Field[v.size()];
v.copyInto(retval);
allFieldsAtDeclaration.put(clazz,retval);
}
return retval;
}
}