【前言】
假如大家有做过模型绑定或者代码生成的父子表之类的话,那么,如何获得整个模型的树形结构将会是大家遇到的一个问题,
这里我直接用遍历及递归方式来获取---当然,每次接收到一个类都遍历及递归一次效率十分低,可以加一个缓存什么的来提高效率。
package CodeGen.BetterModel.Core;
import CodeGen.JavaDataType;
import CodeGen.Utils.JAVA.*;
import CodeGen.Utils.Annotations.*;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.util.*;
/**
* Created with IntelliJ IDEA.
* User: Administrator
* Date: 13-5-14
* Time: 上午10:28
* To change this template use File | Settings | File Templates.
*/
public class FormFactory {
public FormModel model2FormInfo(Class clazz){
FormModel formInfo=new FormModel();
String modelClassName=clazz.getName();
formInfo.ClassPath=modelClassName;
if(modelClassName.lastIndexOf('.')!=-1&&modelClassName.lastIndexOf('.')+1<modelClassName.length()){
formInfo.className=modelClassName.substring(modelClassName.lastIndexOf('.')+1);
}
else{
formInfo.className=modelClassName;
}
formInfo.formID="form1";
formInfo.formName_ZH="表单";
/*
* 判断是否枚举,假如是的话,就不要傻傻递归了,无限循环。
* */
if(clazz.isEnum()){
ArrayList<FormParameter> plist= getEnumFormParameters(clazz);
for (FormParameter fi: plist){
formInfo.paralist.add(fi);
}
return formInfo;
}
//--开始用反射了。
try{
Annotation ano_form= clazz.getAnnotation(Form.class);
if(ano_form!=null){
Form ano_tmp=(Form)ano_form;
// formInfo.className= ano_tmp.name();
formInfo.formName_ZH=ano_tmp.name_ZH();
formInfo.formID=ano_tmp.formID();
}
//--接下来获取所有参数
Field[] fields=clazz.getFields();
if(fields!=null){
for (Field tfiled:fields){
/*判断是否enum,假如是enum,那么就注意了,不要出现无限循环,需要额外处理*/
Class SuperClazz= tfiled.getClass().getSuperclass();
if(SuperClazz!=null){
String t3= tfiled.getClass().getName();
String t1= SuperClazz.getName();
String t2="";
}
FormParameter formParameter=recuision_getParameter(tfiled);
//--递归遍历相关参数
formInfo.paralist.add(formParameter);
}
}
}
catch (Exception e){}
return formInfo;
}
private ArrayList<FormParameter> getEnumFormParameters(Class clazz){
ArrayList<FormParameter> paralist=new ArrayList<FormParameter>();
Class c=clazz;
try {
Object[] objs = c.getEnumConstants();
ArrayList<String> _enumValueList=new ArrayList<String>();
for (Object objs1: objs){
String valueName1=objs1.toString().trim();
if(valueName1.contains(".")||valueName1.contains("[")||valueName1.contains("@")){}
else{
_enumValueList.add(valueName1);
}
}
for (String str_key: _enumValueList){
FormParameter fparameter=new FormParameter();
fparameter.parameterName=str_key;
fparameter.objectType= JavaDataType.INTEGER;
paralist.add(fparameter);
}
} catch (Exception e) {
e.printStackTrace();
}
return paralist;
}
private FormParameter recuision_getParameter(Field field){
FormParameter formParameter=new FormParameter();
String tt1= field.getName();
formParameter.parameterMeta=ParameterHelper.getParameterMeta(field);
formParameter.displayType=UI.Text;
formParameter.parameterName=field.getName();
formParameter.name_ZH=field.getName();
/*当前display参数*/
//--判断display 注解
Annotation antemp1= field.getAnnotation(Display.class);
if(antemp1!=null){
Display d_ano=(Display)antemp1;
formParameter.displayType=d_ano.ui();
formParameter.name_ZH=d_ano.name();
formParameter.defaultValue=d_ano.defaultValue();
/***********************************************************************/
}
/*字段是否枚举类型。是的话就不要遍历了,直接获取下面几个值*/
if(field.isEnumConstant()){
ArrayList<FormParameter> plist=getEnumFormParameters(field.getClass());
for (FormParameter fp:plist){
formParameter.childList.add(fp);
}
return formParameter;
}
//--默认值
if(formParameter.parameterMeta.getBaseType()==JavaBaseType.baseType_boolean||formParameter.parameterMeta.getObjectType()==JavaObjectType.ObjectType_Boolean){
formParameter.defaultValue="false";
}
//--获取参数默认的默认规则
ValidateInput v_para_default=getValidateInputByParaMeta(formParameter.parameterMeta,formParameter.name_ZH);
if(v_para_default!=null){
if(formParameter.validatelist.containsKey(v_para_default.getRuleName())){
formParameter.validatelist.remove(v_para_default.getRuleName());
}
formParameter.validatelist.put(v_para_default.getRuleName(),v_para_default);
}
//--获取当前UI的默认规则
ValidateInput v_ui_rule=getValidateInputByHtmlUI(formParameter.displayType,formParameter.name_ZH);
if(v_ui_rule!=null){
if(formParameter.validatelist.containsKey(v_ui_rule.getRuleName())){
formParameter.validatelist.remove(v_ui_rule.getRuleName());
}
formParameter.validatelist.put(v_ui_rule.getRuleName(),v_ui_rule);
}
//--获取当前参数所有附着的规则。
ArrayList<ValidateInput> arrList=getValidateList(field);
if(arrList!=null||arrList.size()>0){
for(ValidateInput vrule:arrList){
if(formParameter.validatelist.containsKey(vrule.getRuleName())){
formParameter.validatelist.remove(vrule.getRuleName());
}
formParameter.validatelist.put(vrule.getRuleName(),vrule);
}
}
//--获取所有附着的extUI规则
ArrayList<ExtUI> extList=getExtUIlistByField(field);
if(extList.size()>0){
for (ExtUI eui:extList){
formParameter.extuiList.put(eui.getExtUIname(),eui);
}
}
/*
* 判断是否复杂类型,是否需要递归来获取树形结构
* */
if(formParameter.parameterMeta!=null&&formParameter.parameterMeta.isCustomObjectType==true){
try{
Class TmpClazz=Class.forName(formParameter.parameterMeta.classPath);
formParameter.childList=new ArrayList<FormParameter>();
Field[] childFileds=TmpClazz.getFields();
if(childFileds!=null){
for (Field ttField: childFileds){
FormParameter para2=recuision_getParameter(ttField);
if(para2!=null){
formParameter.childList.add(para2);
}
}
}
}
catch (Exception e){
e.printStackTrace();
}
}
return formParameter;
}
/**
* 获取一个参数的所有附着验证规则
* **/
private ArrayList<ValidateInput> getValidateList(Field tField){
ArrayList<ValidateInput> arrList=new ArrayList<ValidateInput>();
//--判断验证规则
//--自定义正则表达式
ValidateRuleType ruletypename=new ValidateRuleType();
Annotation antemp1=tField.getAnnotation(Validate_CustomRegex.class);
if(antemp1!=null){
Validate_CustomRegex c_ano=(Validate_CustomRegex)antemp1;
ValidateInput vi=new ValidateInput();
vi.setRuleName(ruletypename.rule_CustomRegex);
vi.setErrorMessage(c_ano.ErrorMessage());
vi.set("regex",c_ano.Value());
arrList.add(vi);
}
//--是否布尔值
antemp1=tField.getAnnotation(Validate_isBoolean.class);
if(antemp1!=null){
Validate_isBoolean c_ano=(Validate_isBoolean)antemp1;
ValidateInput vi=new ValidateInput();
vi.setRuleName(ruletypename.rule_isBoolean);
vi.setErrorMessage(c_ano.ErrorMessage());
//vi.set("regex",c_ano.Value());
arrList.add(vi);
}
//--是否颜色
antemp1=tField.getAnnotation(Validate_isColor.class);
if(antemp1!=null){
Validate_isColor c_ano=(Validate_isColor)antemp1;
ValidateInput vi=new ValidateInput();
vi.setRuleName(ruletypename.rule_isColor);
vi.setErrorMessage(c_ano.ErrorMessage());
//vi.set("regex",c_ano.Value());
arrList.add(vi);
}
//--是否日期
antemp1=tField.getAnnotation(Validate_isDateTime.class);
if(antemp1!=null){
Validate_isDateTime c_ano=(Validate_isDateTime)antemp1;
ValidateInput vi=new ValidateInput();
vi.setRuleName(ruletypename.rule_isDateTime);
vi.setErrorMessage(c_ano.ErrorMessage());
//vi.set("regex",c_ano.Value());
arrList.add(vi);
}
//--是否Email地址
antemp1=tField.getAnnotation(Validate_isEmailAddr.class);
if(antemp1!=null){
Validate_isEmailAddr c_ano=(Validate_isEmailAddr)antemp1;
ValidateInput vi=new ValidateInput();
vi.setRuleName(ruletypename.rule_isEmailAddr);
vi.setErrorMessage(c_ano.ErrorMessage());
//vi.set("regex",c_ano.Value());
arrList.add(vi);
}
//--是否整数
antemp1=tField.getAnnotation(Validate_isInteger.class);
if(antemp1!=null){
Validate_isInteger c_ano=(Validate_isInteger)antemp1;
ValidateInput vi=new ValidateInput();
vi.setRuleName(ruletypename.rule_isInteger);
vi.setErrorMessage(c_ano.ErrorMessage());
//vi.set("regex",c_ano.Value());
arrList.add(vi);
}
//--是否Numberic
antemp1=tField.getAnnotation(Validate_isNumberic.class);
if(antemp1!=null){
Validate_isNumberic c_ano=(Validate_isNumberic)antemp1;
ValidateInput vi=new ValidateInput();
vi.setRuleName(ruletypename.rule_isNumberic);
vi.setErrorMessage(c_ano.ErrorMessage());
//vi.set("regex",c_ano.Value());
arrList.add(vi);
}
//--是否电话号码
antemp1=tField.getAnnotation(Validate_isPhoneNumber.class);
if(antemp1!=null){
Validate_isPhoneNumber c_ano=(Validate_isPhoneNumber)antemp1;
ValidateInput vi=new ValidateInput();
vi.setRuleName(ruletypename.rule_isPhoneNumber);
vi.setErrorMessage(c_ano.ErrorMessage());
//vi.set("regex",c_ano.Value());
arrList.add(vi);
}
//--是否必须
antemp1=tField.getAnnotation(Validate_isRequired.class);
if(antemp1!=null){
Validate_isRequired c_ano=(Validate_isRequired)antemp1;
ValidateInput vi=new ValidateInput();
vi.setRuleName(ruletypename.rule_isRequired);
vi.setErrorMessage(c_ano.ErrorMessage());
//vi.set("regex",c_ano.Value());
arrList.add(vi);
}
//--是否网址
antemp1=tField.getAnnotation(Validate_isURL.class);
if(antemp1!=null){
Validate_isURL c_ano=(Validate_isURL)antemp1;
ValidateInput vi=new ValidateInput();
vi.setRuleName(ruletypename.rule_isURL);
vi.setErrorMessage(c_ano.ErrorMessage());
//vi.set("regex",c_ano.Value());
arrList.add(vi);
}
//--数字范围
antemp1=tField.getAnnotation(Validate_NumberRange.class);
if(antemp1!=null){
Validate_NumberRange c_ano=(Validate_NumberRange)antemp1;
ValidateInput vi=new ValidateInput();
vi.setRuleName(ruletypename.rule_NumberRange);
vi.setErrorMessage(c_ano.ErrorMessage());
vi.set("min",c_ano.min());
vi.set("max",c_ano.max());
arrList.add(vi);
}
//--字符串范围
antemp1=tField.getAnnotation(Validate_StringRange.class);
if(antemp1!=null){
Validate_StringRange c_ano=(Validate_StringRange)antemp1;
ValidateInput vi=new ValidateInput();
vi.setRuleName(ruletypename.rule_StringRange);
vi.setErrorMessage(c_ano.ErrorMessage());
vi.set("minLen",c_ano.minLen());
vi.set("maxLen",c_ano.maxLen());
arrList.add(vi);
}
//--是否对其他参数进行比较
antemp1=tField.getAnnotation(Validate_CompareTo.class);
if(antemp1!=null){
Validate_CompareTo c_ano=(Validate_CompareTo)antemp1;
ValidateInput vi=new ValidateInput();
vi.setRuleName(ruletypename.rule_CompareTo);
vi.setErrorMessage(c_ano.ErrorMessage());
vi.set("list", c_ano.list());
arrList.add(vi); }
return arrList;
}
private ArrayList<ExtUI> getExtUIlistByField(Field tField){
ArrayList<ExtUI> extlist=new ArrayList<ExtUI>();
ExtUItype exttype=new ExtUItype();
/*ExtUI额外UI类型*/
//--是否显示密码强度
Annotation antemp1=tField.getAnnotation(ExtUI_passwordStrength.class);
if(antemp1!=null){
ExtUI_passwordStrength c_ano=(ExtUI_passwordStrength)antemp1;
ExtUI extInfo=new ExtUI();
extInfo.setExtUIname(exttype.getExtUI_passwordStrength());
extlist.add(extInfo);
}
antemp1=tField.getAnnotation(ExtUI_TitleList.class);
if(antemp1!=null){
ExtUI_TitleList c_ano=(ExtUI_TitleList)antemp1;
ExtUI extInfo=new ExtUI();
extInfo.setExtUIname(exttype.getExtUI_TitleList());
extInfo.set("titleField",c_ano.titleField());
extInfo.set("keyField",c_ano.keyField());
extlist.add(extInfo);
}
antemp1=tField.getAnnotation(ExtUI_AlbumsList.class);
if(antemp1!=null){
ExtUI_AlbumsList c_ano=(ExtUI_AlbumsList)antemp1;
ExtUI extInfo=new ExtUI();
extInfo.setExtUIname(exttype.getExtUI_AlbumsList());
extInfo.set("imgField",c_ano.imgField());
extInfo.set("titleField",c_ano.titleField());
extInfo.set("keyField",c_ano.keyField());
extlist.add(extInfo);
}
return extlist;
}
private ValidateInput getValidateInputByParaMeta(ParameterMeta pMeta,String name_ZH){
if(pMeta==null){
return null;
}
ValidateRuleType _vtype=new ValidateRuleType();
if(pMeta.baseType== JavaBaseType.baseType_int||pMeta.baseType==JavaBaseType.baseType_short||pMeta.baseType==JavaBaseType.baseType_long||pMeta.objectType== JavaObjectType.ObjectType_Integer||pMeta.objectType==JavaObjectType.ObjectType_Short||pMeta.objectType==JavaObjectType.ObjectType_Long){
ValidateInput v=new ValidateInput();
v.setErrorMessage(""+name_ZH+"必须为整数!");
v.setRuleName(_vtype.getRule_isInteger());
return v;
}
if(pMeta.baseType==JavaBaseType.baseType_float||pMeta.baseType==JavaBaseType.baseType_double||pMeta.objectType==JavaObjectType.ObjectType_Float||pMeta.objectType==JavaObjectType.ObjectType_Double){
ValidateInput v=new ValidateInput();
v.setErrorMessage(""+name_ZH+"必须为小数!");
v.setRuleName(_vtype.getRule_isNumberic());
return v;
}
if(pMeta.objectType==JavaObjectType.ObjectType_Date){
ValidateInput v=new ValidateInput();
v.setErrorMessage(""+name_ZH+"必须为日期!");
v.setRuleName(_vtype.getRule_isDateTime());
return v;
}
return null;
}
private ValidateInput getValidateInputByHtmlUI(UI ui,String name_ZH){
ValidateRuleType vtype=new ValidateRuleType();
if(ui==UI.ColorPicker){
ValidateInput v=new ValidateInput();
v.setErrorMessage(name_ZH+"颜色只能由字母及数字组成。");
v.setRuleName(vtype.getRule_isColor());
return v;
}
if(ui==UI.Checkbox||ui==UI.Radio){
ValidateInput v=new ValidateInput();
v.setErrorMessage(name_ZH+"必须为布尔值。");
v.setRuleName(vtype.getRule_isBoolean());
return v;
}
if(ui==UI.DateTimePicker){
ValidateInput v=new ValidateInput();
v.setErrorMessage(name_ZH+"必须为日期(格式:2012-02-12)。");
v.setRuleName(vtype.getRule_isDateTime());
return v;
}
if(ui==UI.Email){
ValidateInput v=new ValidateInput();
v.setErrorMessage(name_ZH+"必须为邮箱格式(例如:xxx@qq.com)");
v.setRuleName(vtype.getRule_isEmailAddr());
return v;
}
if(ui==UI.AttachFile||ui==UI.AttachImage){
ValidateInput v=new ValidateInput();
v.setErrorMessage(name_ZH+"网址格式错误。");
v.setRuleName(vtype.getRule_isURL());
return v;
}
return null;
}
}