package nebula.util;
import java.io.Serializable;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Enumeration;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class PrintObejct {
final static int ALLOW_LEVEL = 1;
public static void print(Class<?> clazz, Object instance) {
Log log = LogFactory.getLog(instance.getClass());
log.trace("");
log.trace("=====Start PrintObject ======== " + clazz.getName() + " ===============");
print(clazz, instance, 0);
log.trace("-----End PrintObject -------- " + clazz.getName() + " ---------------");
log.trace("");
}
private static String indent(int level) {
String indent = "";
for (int i = 0; i < level; i++) {
indent += "\t";
}
return indent;
}
private static void print(Class<?> clz, Object instance, int level) {
Log log = LogFactory.getLog(instance.getClass());
// Class<?> clz = instance.getClass();
try {
for (Method m : clz.getMethods()) {
if (Modifier.isStatic(m.getModifiers())) {
continue;
}
if (m.getName().equals("getClass")) {
continue;
}
if (m.getParameterTypes().length == 0 && m.getName().startsWith("get")) {
if (m.getAnnotation(Deprecated.class) != null) {
continue;
}
Class<?> returnType = m.getReturnType();
if (returnType.isArray()) {
log.trace(indent(level) + toFriendlyName(m.getName()) + ">> [" + returnType.getName() + "]");
Object[] va = (Object[]) m.invoke(instance);
if (va == null) {
log.trace(indent(level), null);
continue;
}
for (int i = 0; i < va.length; i++) {
log.trace(indent(level + 1) + va[i].toString());
}
} else if (returnType.isPrimitive()) {
log.trace(indent(level) + toFriendlyName(m.getName()) + ": " + m.invoke(instance).toString());
} else if (m.getName().endsWith("Stream") || m.getName().endsWith("Reader")
|| m.getName().endsWith("Writer")) {
log.trace(indent(level) + m.getName() + "[[ " + m.getReturnType().getName() + " ]]");
} else {
Object returnValue = m.invoke(instance);
if (returnValue == null) {
log.trace(indent(level) + toFriendlyName(m.getName()) + ": " + null);
} else if (returnValue instanceof String) {
log.trace(indent(level) + toFriendlyName(m.getName()) + ": " + (String) returnValue);
} else if (returnValue instanceof Class<?>) {
log.trace(indent(level) + toFriendlyName(m.getName()) + "[[ Class<" + ((Class<?>) returnValue).getName()
+ "> ]]");
} else if (returnValue instanceof Iterable<?>) {
log.trace(indent(level) + m.getName() + ">> [" + returnType.getName() + "]");
Iterable<?> va = (Iterable<?>) returnValue;
// if (m.getName().endsWith("Names")) {
// String getName = m.getName().substring(0, m.getName().length() - "Names".length());
// Method getitem = clz.getMethod(getName, String.class);
//
// if (getitem != null) {
// for (Object o : va) {
// String key = o.toString();
// log.trace(indent(level + 1) + key + ": "
// + getitem.invoke(instance, key).toString());
// }
// continue;
// }
// }
for (Object o : va) {
log.trace(indent(level + 1) + o.toString());
}
} else if (returnValue instanceof Enumeration<?>) {
log.trace(indent(level) + toFriendlyName(m.getName()) + ">> [" + returnType.getName() + "]");
Enumeration<?> va = (Enumeration<?>) returnValue;
if (m.getName().endsWith("Names")) {
String getName = m.getName().substring(0, m.getName().length() - "Names".length());
Method getitem = clz.getMethod(getName, String.class);
if (getitem != null) {
while (va.hasMoreElements()) {
String key = va.nextElement().toString();
log.trace(indent(level + 1) + key + ": "
+ getitem.invoke(instance, key).toString());
}
continue;
}
}
while (va.hasMoreElements()) {
log.trace(indent(level + 1) + va.nextElement().toString());
}
} else if (returnValue instanceof Serializable) {
log.trace(indent(level) + toFriendlyName(m.getName()) + ">> [" + returnType.getName() + "]");
Serializable so = (Serializable) returnValue;
if (level < ALLOW_LEVEL) {
print(returnType, so, level + 1);
}
} else {
if (level < ALLOW_LEVEL) {
log.trace(indent(level) + toFriendlyName(m.getName()) + ">> [" + returnType.getName() + "]");
print(returnType, returnValue, level + 1);
} else {
log.trace(indent(level) + toFriendlyName(m.getName()) + returnType.getName() + "[["
+ returnValue.toString() + "]]");
}
// log.trace(m.getName(), "[[ " +
// m.getReturnType().getName() + " ]]");
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
static private String toFriendlyName(String methodName){
if("get".equals(methodName.subSequence(0, 3))){
return methodName.substring(3);
}else{
return methodName;
}
}
}