package org.quickbundle.mda.gc;
import java.io.File;
import java.net.MalformedURLException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.eclipse.jface.dialogs.MessageDialogWithToggle;
import org.eclipse.swt.widgets.Combo;
import org.quickbundle.tools.helper.io.RmFileHelper;
import org.quickbundle.tools.helper.xml.RmXmlHelper;
public class GenerateCodeRule {
private static String RULE_XML_FILE = "generateCode.xml";
//generateCode.xml的路径
private String mainRulePath = null;
//每个表的xml文档
private Map<String, Document> mTableDocs = new HashMap<String, Document>();
//generateCode.xml文档
private Document mainRule = null;
private Connection connection = null;
//定义的容器
private Config1MainRuleWizardPage config1MainRuleWizardPage = null;
public GenerateCodeRule() throws MalformedURLException, DocumentException, Exception {
File file = initMainRuleFile();
this.mainRulePath = file.toString();
mainRule = RmXmlHelper.parse(file.toString());
}
public void clearTableTo() {
Element thisTableTos = (Element) mainRule.selectSingleNode("/rules/database/tableTos");
if (thisTableTos != null) {
thisTableTos.clearContent();
}
}
/**
* 功能: 从temp目录获得xml文件
*
* @return
* @throws Exception
*/
private File initMainRuleFile() throws Exception {
File fMailRule = new File(RmXmlHelper.formatToFile(QbXmlGenerateCodePlugin.qbGenerateCodeHome + File.separatorChar + RULE_XML_FILE));
if (fMailRule.exists()) {
Document thisTempDoc = RmXmlHelper.parse(fMailRule.getPath());
Document thisSourceDoc = RmXmlHelper.parse(RmXmlHelper.formatToFile(QbXmlGenerateCodePlugin.baseConfigPath + RULE_XML_FILE));
if (thisSourceDoc.valueOf("/rules/@rulesVersion").equals(thisTempDoc.valueOf("/rules/@rulesVersion"))) {
return fMailRule;
}
}
File rulePlugin = new File(RmXmlHelper.formatToFile(QbXmlGenerateCodePlugin.baseConfigPath + RULE_XML_FILE));
if (rulePlugin.exists()) {
try {
RmFileHelper.copyFile(rulePlugin, fMailRule);
} catch (Exception e) {
e.printStackTrace();
throw e;
}
}
return fMailRule;
}
public void save() throws Exception {
//同步rule.xml中的数据到每一个table.xml中
{
List<Element> lTableTo = getMainRule().selectNodes("/rules/database/tableTos/tableTo");
for (Element thisTableTo : lTableTo) {
Document thisTableDoc = (Document) getMTableDocs().get(thisTableTo.getText());
thisTableDoc.selectSingleNode("/meta/database/driver").setText(getMainRule().valueOf("/rules/database/@driver"));
thisTableDoc.selectSingleNode("/meta/database/url").setText(getMainRule().valueOf("/rules/database/@url"));
thisTableDoc.selectSingleNode("/meta/database/userName").setText(getMainRule().valueOf("/rules/database/@userName"));
thisTableDoc.selectSingleNode("/meta/database/password").setText(getMainRule().valueOf("/rules/database/@password"));
RmXmlHelper.deepCopyElementWithClear((Element)getMainRule().selectSingleNode("/rules/project"),
(Element)thisTableDoc.selectSingleNode("/meta/project"));
RmXmlHelper.saveXmlToPath(thisTableDoc, RmXmlHelper.formatToFile(QbXmlGenerateCodePlugin.qbGenerateCodeHome + "/"
+ thisTableTo.valueOf("@xmlName")));
}
}
//回写rule.xml
RmXmlHelper.saveXmlToPath(getMainRule(), mainRulePath);
//QbXmlGenerateCodePlugin.log("save '" + mainRulePath);
}
public void initTableDoc(String currentTable, File currentTableXmlFile, PdmParser pdmParser, Config1MainRuleWizardPage config1MainRuleWizardPage) throws Exception {
Map mTempDisplayName = new HashMap();
Map mTempOtherConfig = new HashMap();
{ //从deployInterprets取出内置的扩展字段的表显示名称
java.util.List lColumn = mainRule.selectNodes("//dataType/deployInterprets/deployInterpret");
for (Iterator itLColumn = lColumn.iterator(); itLColumn.hasNext();) {
Node thisColumn = (Node) itLColumn.next();
String[] defaultInit = new String[5]; //0,是否构建;1,列显示名称;2,人性化方式;3,人性化方式关键字; 4,是否构建list
defaultInit[0] = thisColumn.valueOf("@isBuild");;
defaultInit[1] = thisColumn.valueOf("@displayName");
defaultInit[2] = "default";
defaultInit[3] = "";
defaultInit[4] = defaultInit[0];
mTempDisplayName.put((currentTable + thisColumn.getText()).toLowerCase(), defaultInit);
}
}
Document oldDocTable = null;
if (currentTableXmlFile.exists()) { //如果已经存在tableXml,取冗余
oldDocTable = RmXmlHelper.parse(currentTableXmlFile.getPath());
java.util.List<Element> lColumn = oldDocTable.selectNodes("//column");
for (Element thisColumn : lColumn) {
String[] defaultInit = new String[5]; //0,是否构建;1,列显示名称;2,人性化方式;3,人性化方式关键字; 4,是否构建list
defaultInit[0] = thisColumn.valueOf("@isBuild");
defaultInit[1] = thisColumn.valueOf("@columnNameDisplay");
defaultInit[2] = thisColumn.valueOf("@humanDisplayType");
defaultInit[3] = thisColumn.valueOf("@humanDisplayTypeKeyword");
defaultInit[4] = thisColumn.valueOf("@isBuild_list");
mTempDisplayName.put(thisColumn.valueOf("../@tableName") + thisColumn.valueOf("@columnName"), defaultInit);
}
mTempOtherConfig.put("tableFilterKeyword", oldDocTable.valueOf("/meta/tables/table[1]/@tableFilterKeyword"));
mTempOtherConfig.put("tableDirName", oldDocTable.valueOf("/meta/tables/table[1]/@tableDirName"));
mTempOtherConfig.put("tableNameDisplay", oldDocTable.valueOf("/meta/tables/table[1]/@tableNameDisplay"));
mTempOtherConfig.put("statisticColumn", oldDocTable.valueOf("/meta/tables/table[1]/@statisticColumn"));
mTempOtherConfig.put("keyColumn", oldDocTable.valueOf("/meta/tables/table[1]/@keyColumn"));
mTempOtherConfig.put("customBundleCode", oldDocTable.valueOf("/meta/tables/table[1]/@customBundleCode"));
}
Document docTable = MetadataHelper.getMetaDataXml(getConnection(),
((Combo) config1MainRuleWizardPage.getMContainer("catalog")).getText().length() == 0 ? null : ((Combo) config1MainRuleWizardPage.getMContainer("catalog")).getText(),
((Combo) config1MainRuleWizardPage.getMContainer("schemaPattern")).getText().length() == 0 ? null : ((Combo) config1MainRuleWizardPage.getMContainer("schemaPattern")).getText(),
currentTable,
mainRule,
pdmParser);
{
//回写列显示名称(即中文名)
java.util.List lColumn = docTable.selectNodes("//column");
for (Iterator itLColumn = lColumn.iterator(); itLColumn.hasNext();) {
Node thisColumn = (Node) itLColumn.next();
String key = thisColumn.valueOf("../@tableName") + thisColumn.valueOf("@columnName");
String keyLower = key.toLowerCase();
if ((mTempDisplayName.get(key) != null && mTempDisplayName.get(key).toString().length() > 0)) { //如果有存储了的值,优先大小写也不差的key
String[] defaultInit = (String[])mTempDisplayName.get(key);
thisColumn.selectSingleNode("@isBuild").setText(defaultInit[0]);
thisColumn.selectSingleNode("@columnNameDisplay").setText(defaultInit[1]);
thisColumn.selectSingleNode("@humanDisplayType").setText(defaultInit[2]);
thisColumn.selectSingleNode("@humanDisplayTypeKeyword").setText(defaultInit[3]);
thisColumn.selectSingleNode("@isBuild_list").setText(defaultInit[4]);
} else if ((mTempDisplayName.get(keyLower) != null && mTempDisplayName.get(keyLower).toString().length() > 0)) { //回写小写后的key
String[] defaultInit = (String[])mTempDisplayName.get(keyLower);
thisColumn.selectSingleNode("@isBuild").setText(defaultInit[0]);
thisColumn.selectSingleNode("@columnNameDisplay").setText(defaultInit[1]);
thisColumn.selectSingleNode("@humanDisplayType").setText(defaultInit[2]);
thisColumn.selectSingleNode("@humanDisplayTypeKeyword").setText(defaultInit[3]);
thisColumn.selectSingleNode("@isBuild_list").setText(defaultInit[4]);
}
}
if(mTempOtherConfig.get("tableNameDisplay") != null) {
docTable.selectSingleNode("/meta/tables/table[1]/@tableNameDisplay").setText(mTempOtherConfig.get("tableNameDisplay").toString());
}
if(mTempOtherConfig.get("tableFilterKeyword") != null) {
docTable.selectSingleNode("/meta/tables/table[1]/@tableFilterKeyword").setText(mTempOtherConfig.get("tableFilterKeyword").toString());
}
if(mTempOtherConfig.get("tableDirName") != null) {
docTable.selectSingleNode("/meta/tables/table[1]/@tableDirName").setText(mTempOtherConfig.get("tableDirName").toString());
}
if(mTempOtherConfig.get("statisticColumn") != null ) {
String statisticColumn = mTempOtherConfig.get("statisticColumn").toString();
//只有确定这个statisticColumn仍然是有效的列时
if(docTable.selectNodes("//column[@columnName='" + statisticColumn + "']").size() > 0) {
docTable.selectSingleNode("/meta/tables/table[1]/@statisticColumn").setText(mTempOtherConfig.get("statisticColumn").toString());
}
}
if(mTempOtherConfig.get("keyColumn") != null ) {
String keyColumn = mTempOtherConfig.get("keyColumn").toString();
//只有确定这个keyColumn仍然是有效的列时
if(docTable.selectNodes("//column[@columnName='" + keyColumn + "']").size() > 0) {
docTable.selectSingleNode("/meta/tables/table[1]/@keyColumn").setText(mTempOtherConfig.get("keyColumn").toString());
}
}
if(mTempOtherConfig.get("customBundleCode") != null) {
docTable.selectSingleNode("/meta/tables/table[1]/@customBundleCode").setText(mTempOtherConfig.get("customBundleCode").toString());
}
}
if(oldDocTable != null && oldDocTable.selectNodes("/meta/relations/mainTable").size() > 0){ //回写表关系
Element eleOldMainTable = (Element)oldDocTable.selectSingleNode("/meta/relations/mainTable");
Element newRelation = (Element)docTable.selectSingleNode("/meta/relations");
newRelation.add(eleOldMainTable.createCopy());
}
mTableDocs.put(currentTable, docTable);
}
public String getMainRulePath() {
return mainRulePath;
}
/**
* 功能: 获得保存xml配置信息的map对象
*/
public Map getMTableDocs() {
return mTableDocs;
}
public void setMTableDocs(Map mTableDocs) {
this.mTableDocs = mTableDocs;
}
/**
* 功能: 获得rule.xml文档
*/
public Document getMainRule() {
return mainRule;
}
public void setMainRule(Document mainDoc) {
this.mainRule = mainDoc;
}
/**
* 功能: 获得表的元数据的xml
*/
public Document getTableDoc(String tableName) {
return (Document) getMTableDocs().get(tableName);
}
public void refreshTableColumn(Map mPdmColumn, Config1MainRuleWizardPage config1MainRuleWizardPage) {
List<String[]> lToUpdate = updateDisplayNameValue(mPdmColumn, false);
if(lToUpdate.size() > 0) {
StringBuilder updateInfo = new StringBuilder();
int count = 0;
for(String[] toUpdate : lToUpdate) {
updateInfo.append(toUpdate[0]).append(":").append(toUpdate[1]).append(" ").append(toUpdate[2]).append("->").append(toUpdate[3]).append("\n");
if(count ++ > 20) {
updateInfo.append("...").append("\n").append("total: ").append(lToUpdate.size());
break;
}
}
MessageDialogWithToggle dialog = new MessageDialogWithToggle(config1MainRuleWizardPage.getShell(), "是否更新pdm信息到已设置的表中?", null,
updateInfo.toString(), MessageDialogWithToggle.CONFIRM , new String[]{"OK", "Cancel"}, 0, null, false);
dialog.create();
if(dialog.open() == 0) {
updateDisplayNameValue(mPdmColumn, true);
}
}
}
List<String[]> updateDisplayNameValue(Map mPdmColumn, boolean realExecute) {
List<String[]> lToUpdate = new ArrayList<String[]>();
for(Map.Entry<String, Document> en : mTableDocs.entrySet()) {
String tableName = en.getKey();
Document tableDoc = en.getValue();
List<Element> lTable = tableDoc.selectNodes("/meta/tables/table");
for(Element table : lTable) {
String docTableName = table.valueOf("@tableName");
if(mPdmColumn.containsKey(docTableName) && !table.valueOf("@tableNameDisplay").equalsIgnoreCase(getMPdmColumnValue(mPdmColumn, docTableName))) {
if(realExecute) {
table.addAttribute("tableNameDisplay", getMPdmColumnValue(mPdmColumn, docTableName));
} else {
lToUpdate.add(new String[]{docTableName, "", table.valueOf("@tableNameDisplay"), getMPdmColumnValue(mPdmColumn, docTableName)});
}
}
List<Element> lColumn = table.selectNodes("column");
for(Element column : lColumn) {
String docColumnName = column.valueOf("@columnName");
if(mPdmColumn.containsKey(docTableName + ":" + docColumnName) && !column.valueOf("@columnNameDisplay").equalsIgnoreCase(getMPdmColumnValue(mPdmColumn, docTableName + ":" + docColumnName))) {
if(realExecute) {
column.addAttribute("columnNameDisplay", getMPdmColumnValue(mPdmColumn, docTableName + ":" + docColumnName));
} else {
lToUpdate.add(new String[]{docColumnName, docColumnName, column.valueOf("@columnNameDisplay"), getMPdmColumnValue(mPdmColumn, docTableName + ":" + docColumnName)});
}
}
}
}
}
return lToUpdate;
}
private String getMPdmColumnValue(Map mPdmColumn, String key) {
if(mPdmColumn == null || !mPdmColumn.containsKey(key)) {
return null;
}
String[] aTableInfo = (String[]) mPdmColumn.get(key);
if(aTableInfo == null || aTableInfo.length == 0) {
return null;
}
return aTableInfo[0];
}
public Connection getConnection() {
boolean needConnection = false;
try {
if(connection != null && connection.isClosed()) {
needConnection = true;
}
} catch (SQLException e) {
e.printStackTrace();
connection = null;
needConnection = true;
}
if(needConnection) {
connectDatabase(config1MainRuleWizardPage.getMContainerText("driver"), config1MainRuleWizardPage.getMContainerText("url"), config1MainRuleWizardPage.getMContainerText("userName"), config1MainRuleWizardPage.getMContainerText("password"));
}
return connection;
}
public void setConnection(Connection connection) {
this.connection = connection;
}
/**
* 连接数据库
* @param driver
* @param url
* @param userName
* @param password
* @return
*/
public String connectDatabase(String driver, String url, String userName, String password) {
try {
if (connection == null || connection.isClosed()) {
Class.forName(driver); //初始化数据库连接
connection = DriverManager.getConnection(url, userName, password);
return null;
} else {
return null;
}
} catch (UnsupportedClassVersionError e) {
return "当前JDK版本太低,不能载入类:" + driver + " " + e.toString();
} catch (Throwable e) {
e.printStackTrace();
return e.toString();
}
}
public void closeConnection() {
if(connection == null) {
return;
}
try {
if(connection.isClosed()) {
return;
}
connection.close();
} catch (SQLException e) {
e.printStackTrace();
} finally {
connection = null;
}
}
public Config1MainRuleWizardPage getConfig1MainRuleWizardPage() {
return config1MainRuleWizardPage;
}
public void setConfig1MainRuleWizardPage(Config1MainRuleWizardPage config1MainRuleWizardPage) {
this.config1MainRuleWizardPage = config1MainRuleWizardPage;
}
}