package org.zstack.utils;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;
/**
*/
public class TypeUtils {
private static List<Class> primitivesAndWrapperTypes = new ArrayList<Class>();
private static List<Class> primitivesTypes = new ArrayList<Class>();
static {
primitivesTypes.add(Boolean.TYPE);
primitivesTypes.add(Character.TYPE);
primitivesTypes.add(Byte.TYPE);
primitivesTypes.add(Short.TYPE);
primitivesTypes.add(Integer.TYPE);
primitivesTypes.add(Long.TYPE);
primitivesTypes.add(Float.TYPE);
primitivesTypes.add(Double.TYPE);
primitivesTypes.add(Void.TYPE);
primitivesAndWrapperTypes.add(Boolean.class);
primitivesAndWrapperTypes.add(Character.class);
primitivesAndWrapperTypes.add(Byte.class);
primitivesAndWrapperTypes.add(Short.class);
primitivesAndWrapperTypes.add(Integer.class);
primitivesAndWrapperTypes.add(Long.class);
primitivesAndWrapperTypes.add(Float.class);
primitivesAndWrapperTypes.add(Double.class);
primitivesAndWrapperTypes.add(Void.class);
primitivesAndWrapperTypes.add(String.class);
primitivesAndWrapperTypes.addAll(primitivesTypes);
}
public static boolean isPrimitiveType(Class clazz) {
return primitivesTypes.contains(clazz);
}
public static boolean isPrimitiveOrWrapper(Class clazz) {
return primitivesAndWrapperTypes.contains(clazz);
}
public static boolean isTypeOf(Object val, Class...ts) {
return isTypeOf(val.getClass(), ts);
}
public static boolean isTypeOf(Class t, Class...ts) {
for (Class clz : ts) {
if (clz.isAssignableFrom(t)) {
return true;
}
}
return false;
}
public static boolean isZstackBeanPrimitive(Class clazz) {
return isPrimitiveOrWrapper(clazz) || isTypeOf(clazz, Timestamp.class);
}
private static <T> T toValue(String val, Class<T> clazz) {
if (Integer.class.isAssignableFrom(clazz) || Integer.TYPE.isAssignableFrom(clazz)) {
return (T) Integer.valueOf(val);
} else if (Long.class.isAssignableFrom(clazz) || Long.TYPE.isAssignableFrom(clazz)) {
return (T) Long.valueOf(val);
} else if (Boolean.class.isAssignableFrom(clazz) || Boolean.TYPE.isAssignableFrom(clazz)) {
return (T) Boolean.valueOf(val);
} else if (Float.class.isAssignableFrom(clazz) || Float.TYPE.isAssignableFrom(clazz)) {
return (T) Float.valueOf(val);
} else if (Short.class.isAssignableFrom(clazz) || Short.TYPE.isAssignableFrom(clazz)) {
return (T) Short.valueOf(val);
} else if (Double.class.isAssignableFrom(clazz) || Double.TYPE.isAssignableFrom(clazz)) {
return (T) Double.valueOf(val);
} else if (String.class.isAssignableFrom(clazz)) {
return (T) val;
} else {
return (T) val;
}
}
public static <T> T stringToValue(String str, Class<T> clazz) {
if (str == null && isTypeOf(clazz, Integer.class, Long.class, Float.class, Double.class, String.class)) {
return null;
}
return toValue(str, clazz);
}
public static <T> T stringToValue(String str, Class<T> clazz, T defaultValue) {
try {
return stringToValue(str, clazz);
} catch (Exception e) {
return defaultValue;
}
}
public static List<Class> getAllClassOfClass(Class c) {
List<Class> clzs = new ArrayList<Class>();
while (c != Object.class) {
clzs.add(c);
c = c.getSuperclass();
}
return clzs;
}
public static List<Class> getAllClassOfObject(Object obj) {
List<Class> ret = new ArrayList<Class>();
Class clazz = obj.getClass();
do {
ret.add(clazz);
clazz = clazz.getSuperclass();
} while (clazz!=Object.class);
ret.add(Object.class);
return ret;
}
public static boolean nullSafeEquals(Object a, Object b) {
if (a == null && b == null) {
return true;
} else if (a == null || b == null) {
return false;
} else {
return a.equals(b);
}
}
}