All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.github.javahao.parser.ConfigParser Maven / Gradle / Ivy

The newest version!
package com.github.javahao.parser;

import com.github.javahao.config.CoreConfig;
import com.github.javahao.config.TableConfig;
import com.github.javahao.entity.Dialog;
import com.github.javahao.entity.Relation;
import com.github.javahao.entity.Template;
import com.github.javahao.util.AnalysisObject;
import com.github.javahao.util.FreeMarkerUtil;
import freemarker.template.TemplateModelException;
import org.dom4j.Attribute;
import org.dom4j.Element;

import java.io.File;
import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * usedfor:配置文件解析类
 * Created by javahao on 2017/7/1.
 * auth:JavaHao
 */
public class ConfigParser {
    /**
     * 配置文件解析
     * @param configPath 配置文件路径
     */
    public static void parserConfig(String configPath){
        System.out.println("[GenCode] |================ Begin Loading [GenCode] Settings Wait Please!  ================|");
        //获取根节点元素对象
        Element node = XmlParser.getDocument(configPath).getRootElement();
        //加载jdbc配置
        parserJdbcConfig(node);
        //加载全局变量
        parserSettings(node.element("settings"));
        System.out.println("[GenCode] |---------------- Loaded Global Variable Configuration Success!  ----------------|");
        //加载到方言配置
        parserDialogs(node.element("dialogs"));
        //加载freemarker模板插件配置
        parserFreeMarkerConfig(node);
        System.out.println("[GenCode] |---------------- Loaded Database Dialogs Configuration Success! ----------------|");
        System.out.println("[GenCode] |================ End Loading [GenCode] Settings Success!        ================|");
    }

    /**
     * 增加freemarker插件的配置类
     * @param node config节点
     */
    public static void parserFreeMarkerConfig(Element node){
        if(node!=null){
            Element freemarker = node.element("freemarker");
            if(freemarker!=null){
                List plugins = freemarker.elements();
                if(plugins!=null&&plugins.size()>0){
                    for(Element p : plugins){
                        try {
                            FreeMarkerUtil.addSharedVariable(p.attributeValue("name"),Class.forName(p.attributeValue("value")).newInstance());
                        } catch (InstantiationException e) {
                            e.printStackTrace();
                        } catch (IllegalAccessException e) {
                            e.printStackTrace();
                        } catch (ClassNotFoundException e) {
                            e.printStackTrace();
                        } catch (TemplateModelException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }
    }
    /**
     * 解析jdbc配置
     * @param node settings节点
     */
    public static void parserJdbcConfig(Element node){
        if(node!=null){
            Element jdbcConfig = node.element("jdbcConfig");
            if(jdbcConfig!=null){
                List properties = jdbcConfig.elements();
                if(properties!=null&&properties.size()>0){
                    for(Element e : properties){
                        CoreConfig.addJdbcConfig(e.getName(),e.getText());
                    }
                }
            }
        }
    }
    /**
     * 解析设置配置
     * @param node settings节点
     */
    public static void parserSettings(Element node){
        if(node!=null){
            CoreConfig.addVars(parserVars(node));
            CoreConfig.setLibDir(FreeMarkerUtil.render(node.elementText("libDir")));
            CoreConfig.setTemplatePath(FreeMarkerUtil.render(node.elementText("templatePath")));
            CoreConfig.setGenPath(FreeMarkerUtil.render(node.elementText("genPath")));
            CoreConfig.setEncoding(FreeMarkerUtil.render(node.elementText("encoding")));
            CoreConfig.addGens(parserGens(node));
        }
    }

    /**
     * 加载生成表的配置
     * @param node settings节点
     * @return 返回生成配置
     */
    public static List parserGens(Element node){
        List tableConfigs = new ArrayList();
        if(node!=null){
            Element gensE = node.element("gens");
            if(gensE!=null){
                List tables = gensE.elements("table");
                if(tables!=null&&tables.size()>0){
                    for(Element te : tables){
                        final TableConfig tc = new TableConfig();
                        //模板配置
                        List templates = te.elements("template");
                        if(templates!=null&&templates.size()>0){
                            for(Element teme : templates){
                                final Template temp = new Template();
                                fillObj(temp,teme,false,new ParserHandler() {
                                    public void handler(String field, Object value) {
                                        temp.addExtVars(field,value);
                                    }
                                });
                                tc.addTemplateConfig(temp.getName(),temp);
                            }
                        }else
                            tc.addTemplateConfig(getTemplates());
                        //关系配置
                        List relations = te.elements("relation");
                        if(relations!=null&&relations.size()>0){
                            for(Element r : relations){
                                final Relation relation = new Relation();
                                fillObj(relation,r,false,null);
                                tc.addRelations(relation);
                            }
                        }
                        tableConfigs.add(fillObj(tc, te, true, new ParserHandler() {
                            public void handler(String field, Object value) {
                                tc.addExtVars(field,value);
                            }
                        }));
                        CoreConfig.addConfigMap(tc.getVar(),tc);
                    }
                }
            }
        }
        return tableConfigs;
    }
    /**
     * 获取模板路径下的所有模板文件
     * @return 所有模板文件
     */
    public static Map getTemplates(){
        File tempFolder = new File(CoreConfig.getTemplatePath());
        File[] files = null;
        if(tempFolder.exists()&&tempFolder.isDirectory()){
            files = tempFolder.listFiles(new FilenameFilter() {
                public boolean accept(File dir, String name) {
                    return true;
                    //name.endsWith(".ftl");
                }
            });
        }
        Map templateConfig =  new HashMap();
        for(File f : files){
            templateConfig.put(f.getName(),new Template(f.getName(),CoreConfig.getGenPath()));
        }
        return templateConfig;
    }
    /**
     * 解析变量配置
     * @param node  settings节点
     * @return 返回解析完的所有变量
     */
    public static Map parserVars(Element node){
        Map vars = new HashMap();
        if(node!=null){
            Element varE = node.element("vars");
            if(varE!=null){
                //加在普通变量
                List childs = varE.elements("var");
                if(childs!=null&&childs.size()>0){
                    for(Element c:childs){
                        vars.put(c.attributeValue("name"),c.attributeValue("value"));
                    }
                }
                //加载map变量
                vars.putAll(parserVarMap(varE));
                //加载list变量
                vars.putAll(parserVarList(varE));
            }
        }
        return vars;
    }

    /**
     * 解析全局变量map类型
     * @param node vars节点
     * @return 返回map类型全局变量
     */
    public static Map parserVarMap(Element node){
        Map vars = new HashMap();
        if(node!=null){
            List childs = node.elements("map");
            if(childs!=null&&childs.size()>0){
                for(Element map:childs){
                    Map mapItems = new HashMap();
                    List mapValues = map.elements();
                    if(mapValues!=null&&mapValues.size()>0){
                        for(Element value : mapValues){
                            mapItems.put(value.attributeValue("name"),value.attributeValue("value"));
                        }
                    }
                    vars.put(map.attributeValue("name"),mapItems);
                }
            }
        }
        return vars;
    }

    /**
     * 解析list类型全局变量
     * @param node vars节点
     * @return 返回所有list类型变量
     */
    public static Map parserVarList(Element node){
        Map vars = new HashMap();
        if(node!=null){
            List childs = node.elements("list");
            if(childs!=null&&childs.size()>0){
                for(Element list : childs){
                    List itemsE = list.elements();
                    List itemsContainer = new ArrayList();
                    for(Element item : itemsE){
                        itemsContainer.add(item.getText());
                    }
                    vars.put(list.attributeValue("name"),itemsContainer);
                }
            }
        }
        return vars;
    }
    /**
     * 加载方言配置
     * @param node 方言节点
     */
    public static void parserDialogs(Element node){
        if(null!=node){
            //设置当前使用的数据库方言
            CoreConfig.setUse(node.attribute("use").getValue());
            System.out.println("[GenCode] |---------------- Use Database Dialogs Configuration ["+node.attribute("use").getValue()+"]! --------------|");
            List elements = node.elements("dialog");
            for(Element e : elements){
                Dialog dialog = new Dialog();
                CoreConfig.addDialogs(fillObj(dialog,e));
            }
        }
    }

    /**
     * 将指定节点的属性设置到对象里面
     * @param obj 对象
     * @param element 节点
     * @return 返回结果
     */
    public static  T fillObj(T obj, Element element){
        return fillObj(obj,element,true,null);
    }
    /**
     * 将指定节点的属性设置到对象里面
     * @param obj 对象
     * @param element 节点
     * @param tempflag 模板化标识
     * @return 返回结果
     */
    public static  T fillObj(T obj, Element element,boolean tempflag,ParserHandler parserHandler){
        if(element!=null){
            List attributes = element.attributes();
            for(Attribute a:attributes){
                if(parserHandler!=null&&!AnalysisObject.containsField(obj.getClass(),a.getName())){
                    parserHandler.handler(a.getName(),a.getValue());
                    continue;
                }
                AnalysisObject.invokeSetter(obj,a.getName(),
                        tempflag?FreeMarkerUtil.render(a.getValue()):a.getValue());
            }
        }
        return obj;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy