/**
* @(#) CodeGeneratorFactory.java
* module : codegenerator
* version : 版本管理系统中的文件版本
* date : 2008-12-7
* name : 马仁配
*/
package com.allinpay.generator.ibatis;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import com.allinpay.framework.dao.ibatis.MetaDataRetriever;
import com.allinpay.frameworkdao.ibatis.metadata.TableMetaData;
import com.allinpay.generator.ibatis.generator.BuildFileGenerator;
import com.allinpay.generator.ibatis.generator.DaoCodeGenerator;
import com.allinpay.generator.ibatis.generator.DaoContextXmlGenerator;
import com.allinpay.generator.ibatis.generator.DaoInterfaceCodeGenerator;
import com.allinpay.generator.ibatis.generator.ModelCodeGenerator;
import com.allinpay.generator.ibatis.generator.ModelPkCodeGenerator;
import com.allinpay.generator.ibatis.generator.SqlMapCodeGenerator;
import com.allinpay.generator.ibatis.generator.SqlMapConfigXmlGenerator;
import com.allinpay.util.DateUtil;
/**
*
* 如果有任何对代码的修改,请按下面的格式注明修改的内容. 序号 时间 作者 修改内容 1. 2008-12-7 马仁配 created this
* class.
*/
public class CodeGeneratorFactory {
/**
* Singleton instance.
*/
private static CodeGeneratorFactory factory = new CodeGeneratorFactory();
/**
* All regiested generators.
*/
private List<ICodeGenerator> generators = new ArrayList<ICodeGenerator>();
/**
* 当filterTables不为空时,只有表在此列表中的才创建代码.
*/
private List filterTables = new ArrayList();
/**
* 当filterModules不为空时,只有在此列表中的模块的表才创建代码.
*/
private List filterModules = new ArrayList();
/**
* 缺省的自动生成的文件保存目录.
*/
private String defaultDistDir;
/**
* 表模块别名,别名被用于类的包名的最后一部分. key为表名前缀,value为模块名.
*/
private static Map tableModuleAlias = new HashMap();
static {
tableModuleAlias.put("gw", "gateway");
tableModuleAlias.put("mb", "member");
tableModuleAlias.put("sys", "system");
tableModuleAlias.put("biz", "biz");
tableModuleAlias.put("batch", "batch");
tableModuleAlias.put("dkf", "dkf");
tableModuleAlias.put("boss", "boss");
tableModuleAlias.put("gp", "guarantee");
tableModuleAlias.put("stl", "settle");
tableModuleAlias.put("clr", "clearing");
}
/**
* Singleton method.
*
* @return
*/
public static CodeGeneratorFactory getFactory() {
return factory;
}
/**
* Default constructor.
*/
public CodeGeneratorFactory() {
super();
try {
String path = CodeGeneratorFactory.class.getResource(".").getFile();
path = URLDecoder.decode(path);
new FreeMarkerConfig().configureFreeMarker(path);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* @return the defaultDistDir
*/
public String getDefaultDistDir() {
return defaultDistDir;
}
/**
* @param defaultDistDir
* the defaultDistDir to set
*/
public void setDefaultDistDir(String defaultDistDir) {
this.defaultDistDir = defaultDistDir;
}
public void addFilterTables(String tableName) {
filterTables.add(tableName);
}
public void addFilterModules(String moduleName) {
filterModules.add(moduleName);
}
public void register(ICodeGenerator generator) {
generators.add(generator);
generator.setGeneratedRootFilePath(getDefaultDistDir());
}
public void generate(String packageName, String author, String time) {
// get table meta data.
String context = "com/allinpay/generator/ibatis/context-dao.xml";
MetaDataRetriever retriever = new MetaDataRetriever(context);
List tables = retriever.getAllTables();
for (int i = 0; i < tables.size(); i++) {
String tableName = ((String) tables.get(i)).toLowerCase();
String moduleName = getModuleNameFromTableName(tableName);
if (filterModules.size() == 0
|| (filterModules.size() > 0 && filterModules
.contains(moduleName))) {
if (filterTables.size() == 0
|| (filterTables.size() > 0 && filterTables
.contains(tableName))) {
System.out.println("Generate table:" + tableName);
generate(packageName, tableName, author, time, retriever);
}
}
}
}
protected String getModuleNameFromTableName(String tableName) {
int index = tableName.indexOf('_');
if (index <= 0) {
return "";
}
return tableName.substring(0, index);
}
protected String getModuleAliasNameFromTableName(String tableName) {
String moduleName = getModuleNameFromTableName(tableName);
return (String) tableModuleAlias.get(moduleName);
}
public void generate(String packageName, String tableName, String author,
String time) throws Exception {
// get table meta data.
String context = "com/allinpay/generator/ibatis/context-dao.xml";
MetaDataRetriever retriever = new MetaDataRetriever(context);
generate(packageName, tableName, author, time, retriever);
}
private void generate(String packageName, String tableName, String author,
String time, MetaDataRetriever retriever) {
TableMetaData metaData = retriever.getTableMetaData(tableName);
String moduleName = getModuleNameFromTableName(metaData.getTableName());
String moduleAliasName = getModuleAliasNameFromTableName(metaData
.getTableName());
// set template model.
Map data = new HashMap();
data.put("tmd", metaData);
data.put("prefixPackage", packageName);
data.put("lastPackageName", tableModuleAlias.get(metaData
.getTablePrefixName()));
data.put("author", author);
data.put("time", time);
data.put("moduleName", moduleName);
data.put("moduleAliasName", moduleAliasName);
// register meta data info.
Iterator it = generators.iterator();
while (it.hasNext()) {
ICodeGenerator generator = (ICodeGenerator) it.next();
generator.register(data);
}
// generate configure files.
it = generators.iterator();
while (it.hasNext()) {
ICodeGenerator generator = (ICodeGenerator) it.next();
generator.generate(data);
}
}
/**
* @param args
*/
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
CodeGeneratorFactory factory = CodeGeneratorFactory.getFactory();
factory.setDefaultDistDir("E:\\dev-workspace\\generated");
factory.register(new SqlMapCodeGenerator());
factory.register(new ModelCodeGenerator());
factory.register(new DaoCodeGenerator());
factory.register(new DaoContextXmlGenerator());
factory.register(new DaoInterfaceCodeGenerator());
factory.register(new ModelPkCodeGenerator());
factory.register(new SqlMapConfigXmlGenerator());
factory.register(new BuildFileGenerator());
// 小写
// factory.addFilterTables("SYS_ORGANIZATION".toLowerCase());
// factory.addFilterTables("GW_PAYMENT_REQUEST".toLowerCase());
// factory.addFilterTables("GW_PAYMENT_RESPONSE".toLowerCase());
factory.addFilterTables("GW_PAYMENT_ORDER".toLowerCase());
// factory.addFilterTables("GW_GATEWAY_ORDER".toLowerCase());
// factory.addFilterTables("GW_ACCTINFO_ORDER".toLowerCase());
// factory.addFilterTables("GW_TRANSACTION_REQUEST".toLowerCase());
// factory.addFilterTables("GW_TRANSACTION_RESPONSE".toLowerCase());
// factory.addFilterTables("GW_TRANSACTION_CHANNEL".toLowerCase());
// factory.addFilterTables("GW_TRANSACTION_CONNECTION".toLowerCase());
// factory.addFilterTables("GW_TRANSACTION_CONN_PARA".toLowerCase());
// factory.addFilterTables("GW_TRANSACTION_ROUTER".toLowerCase());
// factory.addFilterTables("GW_PAY_TYPE_CONFIG".toLowerCase());
// factory.addFilterTables("GW_PAY_TRANS_CONFIG".toLowerCase());
// factory.addFilterTables("GW_PAY_ISSUER_CONFIG".toLowerCase());
// 小写
factory.addFilterModules("gw");
factory.generate("com.allinpay.api", "nilomiao", DateUtil
.formatCurrDateTime(DateUtil.DF_YYYY_MM_DD));
}
}