package org.infosec.ismp.manager.db; import java.lang.reflect.Field; import java.lang.reflect.Method; import org.apache.commons.lang.StringUtils; import org.infosec.ismp.model.Parm; import org.infosec.ismp.model.Parms; import org.infosec.ismp.model.Value; import org.infosec.ismp.util.ThreadCategory; import org.springframework.util.Assert; /** * @author guoxianwei * @date 2010-12-13 下午05:42:08 * * 由任务节点对象构建任务参数信息 * */ public final class ParamsBuilder { private static final ParamsBuilder m_instance = new ParamsBuilder(); // 默认私有构造函数 private ParamsBuilder() { } /** * 返回一个有传入对象的字段构造的参数集合类 其中该对象父类的字段不包括在内。 */ public Parms buildParams(Object obj) { Assert.notNull(obj, "the class must not be null"); Class<?> clazz = obj.getClass(); Field fields[] = clazz.getDeclaredFields(); Parms params = new Parms(); log().trace(clazz.getName() + "{"); if (fields != null) { for (Field field : fields) { Method getterMethod = getterMethod(clazz, field); Object filedValue = null; try { filedValue = getterMethod.invoke(obj, new Object[] {}); } catch (Exception e) { log().debug("exception occurred during get fieldvalue", e); } String fieldName = field.getName(); fieldName = removePrefix(fieldName); log() .trace( "[name:" + fieldName + " value:" + filedValue + "]"); Value value = new Value(); value.setContent(String.valueOf(filedValue)); Parm parm = new ParamBuilder().parmName(fieldName).value(value) .build(); params.addParm(parm); } } log().trace("}"); return params; } /** * 获得field的getter函数名称. */ private String getterName(Class<?> fieldType, String fieldName) { Assert.notNull(fieldType, "Type required"); Assert.hasText(fieldName, "FieldName required"); fieldName = removePrefix(fieldName); log() .info( "filedType of [" + fieldName + "] is " + fieldType.getName()); if (fieldType.getName().equals("boolean")) { return "is" + StringUtils.capitalize(fieldName); } else { return "get" + StringUtils.capitalize(fieldName); } } private String removePrefix(String str) { return StringUtils.removeStartIgnoreCase(str, "m_"); } /** * 获得field的getter函数,如果找不到该方法,返回null. */ private Method getterMethod(Class<?> clazz, Field field) { try { return clazz .getMethod(getterName(field.getType(), field.getName())); } catch (NoSuchMethodException e) { log().debug( "filed:" + field.getName() + " construct getter method error occurred", e); // logger.error(e.getMessage(), e); } return null; } private static class ParamBuilder { private String m_paramName; private Value m_vaule; public Parm build() { Parm _p = new Parm(); _p.setParmName(m_paramName); _p.setValue(m_vaule); return _p; } public ParamBuilder value(final Value vaule) { m_vaule = vaule; return this; } public ParamBuilder parmName(final String paraname) { m_paramName = paraname; return this; } } public static ParamsBuilder getInstance() { return m_instance; } ThreadCategory log() { return ThreadCategory.getInstance(getClass()); } }