package cn.org.rapid_framework.generator; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintStream; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import cn.org.rapid_framework.generator.Generator.GeneratorModel; import cn.org.rapid_framework.generator.provider.db.sql.model.Sql; import cn.org.rapid_framework.generator.provider.db.table.TableFactory; import cn.org.rapid_framework.generator.provider.db.table.model.Table; import cn.org.rapid_framework.generator.provider.java.model.JavaClass; import cn.org.rapid_framework.generator.util.BeanHelper; import cn.org.rapid_framework.generator.util.GLogger; import cn.org.rapid_framework.generator.util.GeneratorException; import cn.org.rapid_framework.generator.util.typemapping.DatabaseTypeUtils; /** * * @author badqiu * */ public class GeneratorFacade { public Generator g = new Generator(); public GeneratorFacade(){ g.setOutRootDir(GeneratorProperties.getProperty("outRoot")); } public static void printAllTableNames() throws Exception { PrintUtils.printAllTableNames(TableFactory.getInstance().getAllTables()); } public void deleteOutRootDir() throws IOException { g.deleteOutRootDir(); } public void generateByMap(Map map,String templateRootDir) throws Exception { new ProcessUtils().processByMap(map, templateRootDir,false); } public void deleteByMap(Map map,String templateRootDir) throws Exception { new ProcessUtils().processByMap(map, templateRootDir,true); } public void generateByAllTable(String templateRootDir) throws Exception { new ProcessUtils().processByAllTable(templateRootDir,false); } public void deleteByAllTable(String templateRootDir) throws Exception { new ProcessUtils().processByAllTable(templateRootDir,true); } public void generateByTable(String tableName,String templateRootDir) throws Exception { new ProcessUtils().processByTable(tableName,templateRootDir,false); } public void deleteByTable(String tableName,String templateRootDir) throws Exception { new ProcessUtils().processByTable(tableName,templateRootDir,true); } public void generateByClass(Class clazz,String templateRootDir) throws Exception { new ProcessUtils().processByClass(clazz, templateRootDir,false); } public void deleteByClass(Class clazz,String templateRootDir) throws Exception { new ProcessUtils().processByClass(clazz, templateRootDir,true); } public void generateBySql(Sql sql,String templateRootDir) throws Exception { new ProcessUtils().processBySql(sql,templateRootDir,false); } public void deleteBySql(Sql sql,String templateRootDir) throws Exception { new ProcessUtils().processBySql(sql,templateRootDir,true); } private Generator getGenerator(String templateRootDir) { g.setTemplateRootDir(new File(templateRootDir).getAbsoluteFile()); return g; } /** 生成器的上下文,存放的变量将可以在模板中引用 */ public static class GeneratorContext { static ThreadLocal<Map> context = new ThreadLocal<Map>(); public static void clear() { Map m = context.get(); if(m != null) m.clear(); } public static Map getContext() { Map map = context.get(); if(map == null) { setContext(new HashMap()); } return context.get(); } public static void setContext(Map map) { context.set(map); } public static void put(String key,Object value) { getContext().put(key, value); } } public class ProcessUtils { public void processByMap(Map params, String templateRootDir,boolean isDelete) throws Exception, FileNotFoundException { Generator g = getGenerator(templateRootDir); GeneratorModel m = GeneratorModelUtils.newFromMap(params); try { if(isDelete) g.deleteBy(m.templateModel, m.filePathModel); else g.generateBy(m.templateModel, m.filePathModel); }catch(GeneratorException ge) { PrintUtils.printExceptionsSumary(ge.getMessage(),getGenerator(templateRootDir).getOutRootDir(),ge.getExceptions()); } } public void processBySql(Sql sql,String templateRootDir,boolean isDelete) throws Exception { Generator g = getGenerator(templateRootDir); GeneratorModel m = GeneratorModelUtils.newFromSql(sql); PrintUtils.printBeginProcess("sql:"+sql.getSourceSql(),isDelete); try { if(isDelete) { g.deleteBy(m.templateModel, m.filePathModel); }else { g.generateBy(m.templateModel, m.filePathModel); } }catch(GeneratorException ge) { PrintUtils.printExceptionsSumary(ge.getMessage(),getGenerator(templateRootDir).getOutRootDir(),ge.getExceptions()); } } public void processByClass(Class clazz, String templateRootDir,boolean isDelete) throws Exception, FileNotFoundException { Generator g = getGenerator(templateRootDir); GeneratorModel m = GeneratorModelUtils.newFromClass(clazz); PrintUtils.printBeginProcess("JavaClass:"+clazz.getSimpleName(),isDelete); try { if(isDelete) g.deleteBy(m.templateModel, m.filePathModel); else g.generateBy(m.templateModel, m.filePathModel); }catch(GeneratorException ge) { PrintUtils.printExceptionsSumary(ge.getMessage(),getGenerator(templateRootDir).getOutRootDir(),ge.getExceptions()); } } public void processByTable(String tableName,String templateRootDir,boolean isDelete) throws Exception { if("*".equals(tableName)) { generateByAllTable(templateRootDir); return; } Generator g = getGenerator(templateRootDir); Table table = TableFactory.getInstance().getTable(tableName); try { processByTable(g,table,isDelete); }catch(GeneratorException ge) { PrintUtils.printExceptionsSumary(ge.getMessage(),getGenerator(templateRootDir).getOutRootDir(),ge.getExceptions()); } } public void processByAllTable(String templateRootDir,boolean isDelete) throws Exception { List<Table> tables = TableFactory.getInstance().getAllTables(); List exceptions = new ArrayList(); for(int i = 0; i < tables.size(); i++ ) { try { processByTable(getGenerator(templateRootDir),tables.get(i),isDelete); }catch(GeneratorException ge) { exceptions.addAll(ge.getExceptions()); } } PrintUtils.printExceptionsSumary("",getGenerator(templateRootDir).getOutRootDir(),exceptions); } public void processByTable(Generator g, Table table,boolean isDelete) throws Exception { GeneratorModel m = GeneratorModelUtils.newFromTable(table); PrintUtils.printBeginProcess(table.getSqlName()+" => "+table.getClassName(),isDelete); if(isDelete) g.deleteBy(m.templateModel,m.filePathModel); else g.generateBy(m.templateModel,m.filePathModel); } } @SuppressWarnings("all") public static class GeneratorModelUtils { public static GeneratorModel newFromTable(Table table) { Map templateModel = new HashMap(); templateModel.put("table", table); setShareVars(templateModel); Map filePathModel = new HashMap(); setShareVars(filePathModel); filePathModel.putAll(BeanHelper.describe(table)); return new GeneratorModel(templateModel,filePathModel); } public static GeneratorModel newFromSql(Sql sql) throws Exception { Map templateModel = new HashMap(); templateModel.put("sql", sql); setShareVars(templateModel); Map filePathModel = new HashMap(); setShareVars(filePathModel); filePathModel.putAll(BeanHelper.describe(sql)); return new GeneratorModel(templateModel,filePathModel); } public static GeneratorModel newFromClass(Class clazz) { Map templateModel = new HashMap(); templateModel.put("clazz", new JavaClass(clazz)); setShareVars(templateModel); Map filePathModel = new HashMap(); setShareVars(filePathModel); filePathModel.putAll(BeanHelper.describe(new JavaClass(clazz))); return new GeneratorModel(templateModel,filePathModel); } public static GeneratorModel newFromMap(Map params) { Map templateModel = new HashMap(); templateModel.putAll(params); setShareVars(templateModel); Map filePathModel = new HashMap(); setShareVars(filePathModel); filePathModel.putAll(params); return new GeneratorModel(templateModel,filePathModel); } public static void setShareVars(Map templateModel) { templateModel.putAll(GeneratorProperties.getProperties()); templateModel.putAll(System.getProperties()); templateModel.put("env", System.getenv()); templateModel.put("now", new Date()); templateModel.put("databaseType", getDatabaseType("databaseType")); templateModel.put("serialVersionUID", String.valueOf(System.currentTimeMillis()).hashCode() + "L"); templateModel.putAll(GeneratorContext.getContext()); } private static String getDatabaseType(String key) { return GeneratorProperties.getProperty(key,DatabaseTypeUtils.getDatabaseTypeByJdbcDriver(GeneratorProperties.getProperty("jdbc.driver"))); } } private static class PrintUtils { private static void printExceptionsSumary(String msg,String outRoot,List<Exception> exceptions) throws FileNotFoundException { File errorFile = new File(outRoot,"generator_error.log"); if(exceptions != null && exceptions.size() > 0) { System.err.println("[Generate Error Summary] : "+msg); PrintStream output = new PrintStream(new FileOutputStream(errorFile)); for(int i = 0; i < exceptions.size(); i++) { Exception e = exceptions.get(i); System.err.println("[GENERATE ERROR]:"+e); if(i == 0) e.printStackTrace(); e.printStackTrace(output); } output.close(); System.err.println("***************************************************************"); System.err.println("* "+"* 输出目录已经生成generator_error.log用于查看错误 "); System.err.println("***************************************************************"); } } private static void printBeginProcess(String displayText,boolean isDatele) { GLogger.println("***************************************************************"); GLogger.println("* BEGIN " + (isDatele ? " delete by " : " generate by ")+ displayText); GLogger.println("***************************************************************"); } public static void printAllTableNames(List<Table> tables) throws Exception { GLogger.println("\n----All TableNames BEGIN----"); for(int i = 0; i < tables.size(); i++ ) { String sqlName = ((Table)tables.get(i)).getSqlName(); GLogger.println("g.generateTable(\""+sqlName+"\");"); } GLogger.println("----All TableNames END----"); } } }