package com.jqmobile.core.utils.plain;
import java.lang.reflect.Field;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import com.jqmobile.core.orm.DBColumn;
import com.jqmobile.core.orm.exception.ORMException;
/**
* 对象处理UTILS工具类
* <p>
* 20130810 对象拷贝,按属性拷贝(安全风险,仅限内部使用)
*
* @author modi
*
*/
public final class BeanUtils {
private BeanUtils() {
}
//
public static BeanUtils getInstance() {
return new BeanUtils();
}
private static final Map<Class<?>, Field[]> map = new HashMap<Class<?>, Field[]>();
public static Field[] getAllFields_Cache(Class<?> c) {
synchronized (map) {
if (!map.containsKey(c)) {
map.put(c, getAllFields(c));
}
}
return map.get(c);
}
public static Field[] getAllFields(Class<?> c) {
List<Field> list = new ArrayList<Field>();
while (c != Object.class) {
list.addAll(Arrays.asList(c.getDeclaredFields()));
c = c.getSuperclass();
}
// List<Field> result = new ArrayList<Field>();
// for(Field f : list){
// if(f.getName().contains("$")){
// continue;
// }
// result.add(f);
// }
return list.toArray(new Field[list.size()]);
}
//
public interface ToFilter {
/**
* 字段转换拦截处理器
*
* @param from
* @param to
* @return 处理成功返回true(跳入下一次处理),处理失败返回false(继续本次处理)
* @throws Throwable
* 异常表示处理失败
*/
boolean filter(Field from, Field to) throws Throwable;
}
private final List<ToFilter> filters = new ArrayList<ToFilter>();
/**
* add filter
*
* @param filter
*/
public BeanUtils addFilter(ToFilter filter) {
filters.add(filter);
return this;
}
/**
* remove filter
*
* @param filter
*/
public void removeFilter(ToFilter filter) {
filters.remove(filter);
}
/**
* clear filter
*/
public void clear() {
filters.clear();
}
/**
* 对象拷贝
*
* @param from
* @param to
*/
public void to(Object from, Object to) {
Field[] fs = getAllFields(from.getClass());
Field[] ts = getAllFields(to.getClass());
L1: for (Field t : ts) {
for (Field f : fs) {
for (ToFilter filter : filters) {
try {
if (filter.filter(f, t)) {
continue L1;
}
} catch (Throwable e) {
}
}
if (t.getName().equals(f.getName())
&& t.getType().equals(f.getType())) {
t.setAccessible(true);
f.setAccessible(true);
try {
t.set(to, f.get(from));
} catch (Exception e) {
// e.printStackTrace();
Log.getLog(getClass()).e(e);
continue L1;
}
}
}
}
}
/**
* 用于万能对象与实体类之间的转换, 需要手动设置表名
*
* @param bean
* 万能对象或实体对象
* @return 万能对象或尸体对象
* @throws ORMException
* @throws IllegalAccessException
* @throws IllegalArgumentException
*/
@SuppressWarnings("unchecked")
public static <T> T copy(Object bean, Class<?> entityClass) throws ORMException {
if (bean != null) {
ModBean modiBean = new ModBean();
if (bean instanceof ModBean) {
// 初始化各属性值
modiBean = (ModBean) bean;
ModColumn mc = new ModColumn();
List<ModColumn> mcList = modiBean.getModiColumns();
T obj = null;
try {
obj = (T) entityClass.newInstance();
// 循环赋值
for (int i = 0; i < mcList.size(); i++) {
mc = mcList.get(i);
for (Field field : entityClass.getDeclaredFields()) {
field.setAccessible(true);
if (mc.getName().equals(field.getName())) {
System.out.println(field.getName());
if((field.getAnnotation(DBColumn.class)!=null)&&(field.getAnnotation(DBColumn.class).primaryId()||field.getAnnotation(DBColumn.class).id())){
if(field.getType().isAssignableFrom(String.class)){
field.set(obj, (UUIDUtils.getUUID((byte[]) mc.getValue()).toString()));
continue;
}else if(field.getType().isAssignableFrom(UUID.class)){
field.set(obj, (UUIDUtils.getUUID((byte[]) mc.getValue())));
continue;
}else{
throw new ORMException("类型映射错误,不支持此类型");
}
}
System.out.println(mc.getType().toString().toLowerCase());
if(mc.getType().toString().toLowerCase().equals("date")){
field.set(obj, ((Timestamp)mc.getValue()).getTime());
continue;
}
field.set(obj, mc.getValue());
}
}
}
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return obj;
} else {
// 传入实体类
Class<?> c = bean.getClass();
Field[] beanFields = c.getDeclaredFields();
for (int i = 0; i < beanFields.length; i++) {
Field field = beanFields[i];
field.setAccessible(true);
try {
Copy(beanFields[i], modiBean, bean);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
return (T) modiBean;
}
}
return null;
}
/**
* 将对象属性转换成万能对象column列对象并添加到万能对象中
*
* @param field
* 对象中的属性对象
* @param modiBean
* 将要转换的万能对象
* @param bean
* 传入的实体bean
* @throws ORMException
*/
private static void Copy(Field field, ModBean modiBean, Object bean)
throws IllegalArgumentException, IllegalAccessException, ORMException {
// TODO Auto-generated method stub
ModColumn modiColumn = new ModColumn();
if(field.getAnnotation(DBColumn.class)!=null&&(field.getAnnotation(DBColumn.class).id()||field.getAnnotation(DBColumn.class).primaryId())){
modiColumn.setPaimaryId(true);
}
modiColumn.setName(field.getName());
FieldType type = getFieldType(field);
modiColumn.setType(type);
modiColumn.setValue(field.get(bean));
modiBean.addColumn(modiColumn);
}
/**
* INT,SHORT,
* LONG,
* DOUBLE,FLOAT,STRING,
* UUID,GUID,
* DATE
*
* @param field.getType()
* @return
* @throws ORMException
*/
private static FieldType getFieldType(Field field) throws ORMException {
String type=field.getType().toString().toUpperCase();
if (type.contains("INT")) {
return FieldType.INT;
} else if (type.contains("SHORT")) {
return FieldType.SHORT;
} else if (type.contains("LONG")) {
if(field.getAnnotation(DBColumn.class)!=null&&field.getAnnotation(DBColumn.class).date()){
return FieldType.DATE;
}
return FieldType.LONG;
} else if (type.contains("DOUBLE")) {
return FieldType.DOUBLE;
} else if (type.contains("FLOAT")) {
return FieldType.FLOAT;
} else if (type.contains("STRING")) {
return FieldType.STRING;
} else if (type.contains("UUID")) {
return FieldType.UUID;
} else{
throw new ORMException("类型映射错误,不支持此类型");
}
}
public static ModBean getModiBean(Object entityObject) throws ORMException {
// TODO Auto-generated method stub
return copy(entityObject, null);
}
}