为某个包下的所有实体生成dateSet和xml的国际化文件(xml仅限d7)

1.获取包下的所有实体class工具类

package com.ndcims.core.utils;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

/**  
 * TODO 包的工具类
 * @author 洋洋懒懒小公举  
 * @Date 创建于 2017-9-5 上午9:08:06   
 * @version v1.0 
 * @Copyright 2017 www.rinpo.com Inc. All rights reserved. 
 */
public class PackageUtil {

    /**   
     * TODO 使用举例     
     * @param args
     * @throws ClassNotFoundException 
     *
     * @author 洋洋懒懒小公举
     * @Date Create at 2017-9-5 下午3:41:01  
     */
    public static void main(String[] args) throws ClassNotFoundException {  
        String packageName = "com.ndcims.cms.entity";  
        List<String> classNames = getClassName(packageName);
        //className格式eg:com.ndcims.cms.entity.CmsFirstDaySetting
        for (String className : classNames) {
            //根据类名通过反射机制得到这个类
            Class<?> clzz=Class.forName(className);
            //eg:com.ndcims.cms.entity.CmsFirstDaySetting
            System.out.println(clzz.getName());  
        }  
    }  
    /**   
     * TODO 中间方法,格式化包名,再调用核心方法
     * @param packageName
     * @return 
     * @author 洋洋懒懒小公举
     * @Date Create at 2017-9-5 上午9:31:31  
     */
    public static List<String> getClassName(String packageName) {  
        String filePath = ClassLoader.getSystemResource("").getPath() + packageName.replace(".", "\\");  
        List<String> fileNames = getClassName(packageName,filePath, null);  
        return fileNames;  
    }  
    /**   
     * TODO 核心方法,根据包名获取包下面的所有类名   
     * @param filePath
     * @param className
     * @author 洋洋懒懒小公举
     * @Date Create at 2017-9-5 上午9:30:31  
     */
    private static List<String> getClassName(String packageName,String filePath, List<String> className) {  
        List<String> myClassName = new ArrayList<String>();  
        File file = new File(filePath);  
        File[] childFiles = file.listFiles();  
        for (File childFile : childFiles) {  
            if (childFile.isDirectory()) {  
                myClassName.addAll(getClassName(packageName,childFile.getPath(), myClassName));  
            } else {  
                String childFilePath = childFile.getPath(); 
                //以下的字符串拼接可以根据情况拼接
                childFilePath = childFilePath.substring(childFilePath.indexOf(packageName.replace(".", "\\")), childFilePath.lastIndexOf("."));  
                //格式eg:com.ndcims.cms.entity.CmsFirstDaySetting
                childFilePath = childFilePath.replace("\\", ".");  
                myClassName.add(childFilePath);  
            }  
        }  
        return myClassName;  
    }  
}

2.生成dateSet和xml的国际化文件的工具类

package com.ndcims.core.utils;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.util.List;

import org.dom4j.DocumentException;

import com.bstek.dorado.annotation.PropertyDef;

/**
 * TODO 生成国际化文件工具类
 * @author 洋洋懒懒小公举
 * @Date 创建于 2017-9-4 下午2:47:45
 * @version v1.0
 * @Copyright 2017 www.rinpo.com Inc. All rights reserved.
 */
public class EntityForInternationalUtil {
    public String baseEntityName = "com.ndcims.core.base.BaseEntity";
    /**   
     * TODO 根据包名获取dateSet国际化    
     * @param packageName
     * @throws ClassNotFoundException
     * @throws DocumentException 
     * @author 洋洋懒懒小公举
     * @Date Create at 2017-9-5 上午10:15:52  
     */
    public void generateModelByPackage(String packageName) throws ClassNotFoundException, DocumentException{
          List<String> classNames = PackageUtil.getClassName(packageName);
          //className格式eg:com.ndcims.cms.entity.CmsFirstDaySetting
          for (String className : classNames) {
            //根据类名通过反射机制得到这个类
            Class<?> clzz=Class.forName(className);
            //如果这个类里包含注解(也就是label),就生成国际化文件,否则不需要
            if(this.isHavePropertyDef(clzz)){
                this.generateModelResource(clzz); //生成国际化文件 =第一步
            }
          } 
    }
    /**   
     * TODO 根据包名获取xml文件 代码
     * @param packageName
     * @throws ClassNotFoundException
     * @throws DocumentException 
     * @author 洋洋懒懒小公举
     * @Date Create at 2017-9-5 上午10:15:22  
     */
    public void generateModelXMLByPackage(String packageName,String name) throws ClassNotFoundException, DocumentException{
          System.out.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
          System.out.println("<Model>"); 
          List<String> classNames = PackageUtil.getClassName(packageName);
          for (String className : classNames) {
            //根据类名通过反射机制得到这个类
            Class<?> clzz=Class.forName(className);
            this.generateModelXML(clzz,name);//生成model的label =第二步
          } 
          System.out.println("</Model>"); 
    }
    /**
     * TODO 根据实体类生成国际化资源文件
     * @param clzz
     * @throws DocumentException
     * @author 洋洋懒懒小公举
     * @throws ClassNotFoundException 
     * @Date Create at 2017-9-4 下午3:15:51
     */
    public void generateModelResource(@SuppressWarnings("rawtypes") Class clzz)
            throws DocumentException, ClassNotFoundException {
        // 获取dateSet名称
        String dataSetID = "ds" + clzz.getSimpleName();
        System.out.println("#==========================================");
        System.out.println("#当前DataSet的ID为:" + dataSetID);
        System.out.println("#==========================================");
        // 获取对象中所有的Field
        Field[] fields = clzz.getDeclaredFields();
        this.systemOutDateSetColumn(dataSetID, fields);
        Class<?> baseEntity = Class.forName(baseEntityName);
        //如果继承了baseEntity,便把baseEntity的字段加上去
        if(baseEntity.isAssignableFrom(clzz)){
            Field[] fields1 = baseEntity.getDeclaredFields();
            this.systemOutDateSetColumn(dataSetID, fields1);
        }
    }
    /**
     * TODO 根据实体,以及国际化文件所在文件的名称生成一个dateType的XML
     * @param clzz
     * @param name
     *            dataSet国际化文件所在文件的名称
     * @author 洋洋懒懒小公举
     * @throws ClassNotFoundException 
     * @Date Create at 2017-9-4 下午5:03:59
     */
    @SuppressWarnings("unchecked")
    public void generateModelXML(@SuppressWarnings("rawtypes") Class clzz,
            String name) throws ClassNotFoundException {
        System.out
                .println("  <DataType name=\"dt" + clzz.getSimpleName() + "\">");
        System.out.println("    <Property name=\"matchType\">" + clzz.getName()
                + "</Property>");
        String dataSetID = "ds" + clzz.getSimpleName();
        Field[] fields = clzz.getDeclaredFields();
        this.systemOutXmlColumn(dataSetID,fields,name);
        @SuppressWarnings("rawtypes")
        Class baseEntity = Class.forName(baseEntityName);
        //如果继承了baseEntity,便把baseEntity的字段加上去
        if(baseEntity.isAssignableFrom(clzz)){
            Field[] fields1 = baseEntity.getDeclaredFields();
            this.systemOutXmlColumn(dataSetID,fields1,name);
        }
        System.out.println("  </DataType>");
    }
    /**   
     * TODO 判断某个类中的字段是否含有  PropertyDef注解,没有就无需生成dateSet国际化文件
     * @param clzz
     * @author 洋洋懒懒小公举
     * @Date Create at 2017-9-5 下午3:32:33  
     */
    public boolean isHavePropertyDef(@SuppressWarnings("rawtypes") Class clzz){
        Field[] fields = clzz.getDeclaredFields();
        for (Field field : fields) {
            if (field.isAnnotationPresent(PropertyDef.class)) {
                return true;
            }
        }
        return false;
    }
    /**   
     * TODO  生成实体的列名dateset国际化 
     * @param dataSetID 
     *              指定dateSet名称
     * @param fields 
     * @author 洋洋懒懒小公举
     * @Date Create at 2017-9-6 上午10:31:09  
     */
    public void systemOutDateSetColumn(String dataSetID,Field[] fields){
        for (Field field : fields) {
            if (field.isAnnotationPresent(PropertyDef.class)) {
                // 获取字段名
                String fieldNames = dataSetID + "." + field.getName();
                // 获取字段注解
                Annotation annotation = field.getAnnotation(PropertyDef.class);
                // 获取注解中的字段label
                String label = ((PropertyDef) annotation).label();
                System.out.print(fieldNames + "=");
                System.out.println(label);
            }
        }
    }




    public void systemOutXmlColumn(String dataSetID,Field[] fields,String name){
        // 获取对象中所有的字段
        for (Field field : fields) {
            if(!field.getName().equals("serialVersionUID")){
                // 获取类型
                String dateType = field.getType().getName();
                // 获取字段名
                String fieldNames = dataSetID + "." + field.getName();
                System.out.println("    <PropertyDef name=\"" + field.getName()
                        + "\">");
                if (!dateType.equals("java.lang.String") && !dateType.equals("[B")) {
                    String realDateType = dateType;
                    String[] str = realDateType.split("\\.");
                    if (str.length > 1) {
                        realDateType = str[2];
                    }
                    System.out.println("      <Property name=\"dataType\">"
                            + realDateType + "</Property>");
                }
                //是否有PropertyDef注解
                if (field.isAnnotationPresent(PropertyDef.class)) {
                    String text = "${res[&quot;" + name + "/" + fieldNames
                            + "&quot;]}";
                    System.out.println("      <Property name=\"label\">" + text
                            + "</Property>");
                }
                System.out.println("    </PropertyDef>");
            }
        }
    }
}

3.使用

package com.ndcims.cms.aaaaademo;

import org.dom4j.DocumentException;

import com.ndcims.core.utils.EntityForInternationalUtil;

/**  
 * TODO 生成国际化文件 ,请配置一个txt文件接收输出的国际化文件
 *          Console窗口很可能展示不全
 * @author 洋洋懒懒小公举  
 * @Date 创建于 2017-9-4 下午2:37:40   
 * @version v1.0 
 * @Copyright 2017 www.rinpo.com Inc. All rights reserved. 
 */
public class Demo {

    public static void main(String[] args) throws DocumentException, ClassNotFoundException {
          String packageName = "com.ndcims.cms.entity"; 
          EntityForInternationalUtil t = new EntityForInternationalUtil();
          //t.generateModelByPackage(packageName); //生成国际化文件 =第一步
          t.generateModelXMLByPackage(packageName,"Cms");//生成model的label =第二步
    }
}

花费有效时间约:1天 ~(≧▽≦)/~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值