// Path: QuickProject-Generator/src/main/java/chanedi/generator/file/exception/GlobalConfigException.java
// public class GlobalConfigException extends ConfigException {
// 
//     private static final String errorMessage = "全局配置参数错误：";
// 
//     public GlobalConfigException(String configParam) {
//         super(errorMessage + configParam);
//     }
// 
//     public GlobalConfigException(String configParam, String message) {
//         super(errorMessage + configParam + "(" + message + ")");
//     }
// 
//     public GlobalConfigException(String configParam, Throwable cause) {
//         super(errorMessage + configParam, cause);
//     }
// 
//     public GlobalConfigException(String configParam, String message, Throwable cause) {
//         super(errorMessage + configParam + "(" + message + ")", cause);
//     }
// 
// }
// 
// Path: QuickProject-Generator/src/main/java/chanedi/generator/model/Bean.java
// public class Bean {
// 
//     @Getter@Setter
//     private String name;
//     @Getter@Setter
//     private String capitalizeName;
//     @Getter
//     private String tableName;
//     @Getter@Setter
//     private String comment;
//     private Map<String, Property> propertyColumnNameMap = new HashMap<String, Property>(); // 乱序
//     private List<Property> propertyList = new ArrayList<Property>(); // 按加入的顺序
// 
//     public void addProperty(Property property) {
//         propertyColumnNameMap.put(property.getColumnName(), property);
//         propertyList.add(property);
//     }
// 
//     public Property getPropertyByColumnName(String columnName) {
//         return propertyColumnNameMap.get(columnName);
//     }
// 
//     public Collection<Property> getProperties() {
//         return propertyList;
//     }
// 
//     public void setTableName(String tableName) {
//         this.tableName = tableName;
//         setName(StringUtils.uncapitalizeCamelBySeparator(tableName, "_"));
//     }
// 
//     public void setName(String name) {
//         this.name = name;
//         this.capitalizeName = StringUtils.capitalize(name);
//     }
// 
//     public void setCapitalizeName(String capitalizeName) {
//         this.capitalizeName = capitalizeName;
//         this.name = StringUtils.uncapitalize(capitalizeName);;
//     }
// 
// }
// 
// Path: QuickProject-Generator/src/main/java/chanedi/generator/model/Config.java
// @Data
// public class Config {
// 
//     private String javaPackageName;
//     private String javaPackagePath;
// 
// }
// 
// Path: QuickProject-Generator/src/main/java/chanedi/generator/model/Generate.java
// public final class Generate {
// 
//     private static final Generate INSTANCE = new Generate();
// 
//     private Generate() {
//         super();
//     }
// 
//     public static Generate getInstance() {
//         return INSTANCE;
//     }
// 
//     public String getSerialVersionUID() {
//         return "private static final long serialVersionUID = " + UUID.randomUUID().getMostSignificantBits() + "L;";
//     }
// 
// }
// 
// Path: QuickProject-Generator/src/main/java/chanedi/generator/model/Module.java
// public class Module {
// 
//     @Getter
//     private String name;
//     /**
//      * name的大写形式
//      */
//     @Setter
//     private String capName;
//     @Getter
//     private Collection<Bean> beans;
// 
//     public Module(File sqlFile, GlobalConfig globalConfig) throws IOException {
//         name = FileUtils.removeFileExtension(sqlFile.getName());
// 
//         parseBean(sqlFile, globalConfig);
//     }
// 
//     private void parseBean(File sqlFile, GlobalConfig globalConfig) throws IOException {
//         CharStream input = new ANTLRFileStream(sqlFile.getAbsolutePath());
//         CreateTableLexer lexer = new CreateTableLexer(input);
//         CommonTokenStream tokens = new CommonTokenStream(lexer);
//         CreateTableParser parser = new CreateTableParser(tokens);
//         ParseTree tree = parser.sql();
// 
//         ParseTreeWalker walker = new ParseTreeWalker();
//         CreateTableListenerImpl extractor = new CreateTableListenerImpl(globalConfig);
//         walker.walk(extractor, tree);
//         beans = extractor.getTables();
//     }
// 
// }
// 
// Path: QuickProject-Util/src/main/java/chanedi/util/FileUtils.java
// public class FileUtils {
// 
//     public static String getFileExtension(File file) {
//         return getFileExtension(file.getName());
//     }
// 
//     public static String getFileExtension(String fileName) {
//         String[] splits = fileName.split("\\.");
//         return splits[splits.length - 1];
//     }
// 
//     public static String removeFileExtension(String fileName) {
//         int indexOfFileExtension = fileName.lastIndexOf('.');
//         return fileName.substring(0, indexOfFileExtension);
//     }
// 
//     public static String getFullPath(String rootPath, String path) {
//         if (!path.startsWith("/")) {
//             path = "/" + path;
//         }
//         return rootPath + path;
//     }
// 
// }


import chanedi.generator.file.exception.GlobalConfigException;
import chanedi.generator.model.Bean;
import chanedi.generator.model.Config;
import chanedi.generator.model.Generate;
import chanedi.generator.model.Module;
import chanedi.util.FileUtils;
import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import lombok.Getter;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.*;
import java.util.*;
package chanedi.generator.file;



/**
 * @author Chanedi
 */
public class FilesGenerator {

    protected final Logger logger = LoggerFactory.getLogger(getClass());

    @Getter
    private GlobalConfig globalConfig;
    private List<Module> modules;
    private List<TemplateRoot> templateRoots;
    private Generate generate;
    private Config config;

    public FilesGenerator() {
        globalConfig = GlobalConfig.getInstance();
        modules = new ArrayList<Module>();
        templateRoots = new ArrayList<TemplateRoot>();
        generate = Generate.getInstance();
    }

    public void process() throws GlobalConfigException {
        parseModule();
        parseTmpl();

// Path: QuickProject-Generator/src/main/java/chanedi/generator/file/exception/GlobalConfigException.java
// public class GlobalConfigException extends ConfigException {
// 
//     private static final String errorMessage = "全局配置参数错误：";
// 
//     public GlobalConfigException(String configParam) {
//         super(errorMessage + configParam);
//     }
// 
//     public GlobalConfigException(String configParam, String message) {
//         super(errorMessage + configParam + "(" + message + ")");
//     }
// 
//     public GlobalConfigException(String configParam, Throwable cause) {
//         super(errorMessage + configParam, cause);
//     }
// 
//     public GlobalConfigException(String configParam, String message, Throwable cause) {
//         super(errorMessage + configParam + "(" + message + ")", cause);
//     }
// 
// }
// 
// Path: QuickProject-Generator/src/main/java/chanedi/generator/model/Bean.java
// public class Bean {
// 
//     @Getter@Setter
//     private String name;
//     @Getter@Setter
//     private String capitalizeName;
//     @Getter
//     private String tableName;
//     @Getter@Setter
//     private String comment;
//     private Map<String, Property> propertyColumnNameMap = new HashMap<String, Property>(); // 乱序
//     private List<Property> propertyList = new ArrayList<Property>(); // 按加入的顺序
// 
//     public void addProperty(Property property) {
//         propertyColumnNameMap.put(property.getColumnName(), property);
//         propertyList.add(property);
//     }
// 
//     public Property getPropertyByColumnName(String columnName) {
//         return propertyColumnNameMap.get(columnName);
//     }
// 
//     public Collection<Property> getProperties() {
//         return propertyList;
//     }
// 
//     public void setTableName(String tableName) {
//         this.tableName = tableName;
//         setName(StringUtils.uncapitalizeCamelBySeparator(tableName, "_"));
//     }
// 
//     public void setName(String name) {
//         this.name = name;
//         this.capitalizeName = StringUtils.capitalize(name);
//     }
// 
//     public void setCapitalizeName(String capitalizeName) {
//         this.capitalizeName = capitalizeName;
//         this.name = StringUtils.uncapitalize(capitalizeName);;
//     }
// 
// }
// 
// Path: QuickProject-Generator/src/main/java/chanedi/generator/model/Config.java
// @Data
// public class Config {
// 
//     private String javaPackageName;
//     private String javaPackagePath;
// 
// }
// 
// Path: QuickProject-Generator/src/main/java/chanedi/generator/model/Generate.java
// public final class Generate {
// 
//     private static final Generate INSTANCE = new Generate();
// 
//     private Generate() {
//         super();
//     }
// 
//     public static Generate getInstance() {
//         return INSTANCE;
//     }
// 
//     public String getSerialVersionUID() {
//         return "private static final long serialVersionUID = " + UUID.randomUUID().getMostSignificantBits() + "L;";
//     }
// 
// }
// 
// Path: QuickProject-Generator/src/main/java/chanedi/generator/model/Module.java
// public class Module {
// 
//     @Getter
//     private String name;
//     /**
//      * name的大写形式
//      */
//     @Setter
//     private String capName;
//     @Getter
//     private Collection<Bean> beans;
// 
//     public Module(File sqlFile, GlobalConfig globalConfig) throws IOException {
//         name = FileUtils.removeFileExtension(sqlFile.getName());
// 
//         parseBean(sqlFile, globalConfig);
//     }
// 
//     private void parseBean(File sqlFile, GlobalConfig globalConfig) throws IOException {
//         CharStream input = new ANTLRFileStream(sqlFile.getAbsolutePath());
//         CreateTableLexer lexer = new CreateTableLexer(input);
//         CommonTokenStream tokens = new CommonTokenStream(lexer);
//         CreateTableParser parser = new CreateTableParser(tokens);
//         ParseTree tree = parser.sql();
// 
//         ParseTreeWalker walker = new ParseTreeWalker();
//         CreateTableListenerImpl extractor = new CreateTableListenerImpl(globalConfig);
//         walker.walk(extractor, tree);
//         beans = extractor.getTables();
//     }
// 
// }
// 
// Path: QuickProject-Util/src/main/java/chanedi/util/FileUtils.java
// public class FileUtils {
// 
//     public static String getFileExtension(File file) {
//         return getFileExtension(file.getName());
//     }
// 
//     public static String getFileExtension(String fileName) {
//         String[] splits = fileName.split("\\.");
//         return splits[splits.length - 1];
//     }
// 
//     public static String removeFileExtension(String fileName) {
//         int indexOfFileExtension = fileName.lastIndexOf('.');
//         return fileName.substring(0, indexOfFileExtension);
//     }
// 
//     public static String getFullPath(String rootPath, String path) {
//         if (!path.startsWith("/")) {
//             path = "/" + path;
//         }
//         return rootPath + path;
//     }
// 
// }


// Path: QuickProject-Generator/src/main/java/chanedi/generator/file/FilesGenerator.java
import chanedi.generator.file.exception.GlobalConfigException;
import chanedi.generator.model.Bean;
import chanedi.generator.model.Config;
import chanedi.generator.model.Generate;
import chanedi.generator.model.Module;
import chanedi.util.FileUtils;
import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import lombok.Getter;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.*;
import java.util.*;

package chanedi.generator.file;



/**
 * @author Chanedi
 */
public class FilesGenerator {

    protected final Logger logger = LoggerFactory.getLogger(getClass());

    @Getter
    private GlobalConfig globalConfig;
    private List<Module> modules;
    private List<TemplateRoot> templateRoots;
    private Generate generate;
    private Config config;

    public FilesGenerator() {
        globalConfig = GlobalConfig.getInstance();
        modules = new ArrayList<Module>();
        templateRoots = new ArrayList<TemplateRoot>();
        generate = Generate.getInstance();
    }

    public void process() throws GlobalConfigException {
        parseModule();
        parseTmpl();

        config = new Config();