数据库建模pdm⽂件的解析、简单删除表和保存
⼯具的开发背景:
crm系统以ework为基础改造⽽来,以前简单起见和ework混合了代码和表的,现在需要分析,就需要重新分析,哪些是共⽤的,哪些是私有的。
通过⽇志中打印的表名,可以分析出哪些表是crm独有的。
通过pdm⽂件表的创建记录确定哪些表是新表,新的表少,再除去crm独有的,所以⽅便⼈⼯检查哪些是crm专有的。
另外分析了us系统那边⽤到的表(那边⽤到的就肯定不能公⽤),
cas、权限、⽤户、组织单位、数据字典的肯定是公⽤的。
另外考虑以前开发中折中,偷懒,有些⽅法混合了ework、crm⼀⽅使⽤⽆需⽤到的表,⽬前⼀时没法剥离,需要确定备忘。
总体思路:
⽇志(或初始化sql脚本)或pdm中分析出来的表名列表结果分别存到集合包⾥⾯,通过⾥⾯的CollectionTool.java做集合的运算、打印(打印表名、编码、pdm中所属包⽅便⼈⼯判断)、保存。
⼯具编写匆忙,可能有少量bug和注释不统⼀的地⽅,不懂的请研究代码,恕不做技术⽀持。
pdm解析的
l.pdm;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
ParseException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.TreeSet;
import llections.CollectionUtils;
import org.apachemons.lang.StringUtils;
import org.apachemons.lang.time.DateUtils;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
l.collections.CollectionTool;
l.pdm.pojo.Column;
l.pdm.pojo.PhysicalDiagram;
l.pdm.pojo.Table;
/**
* pdm⽂件解析出 PhysicalDiagram、Table、Column<br>
* 演⽰了pdm元素的查、删除、保存。 <br>
* 如果⽂件很⼤导致内存溢出,请配置运⾏的vm参数,如:-Xms400m -Xmx1024m<br>
* <br>
* dom4j的xpath查xml的指定节点 <br>
* blog.csdn/sidihuo/article/details/41310727<br>
* xpath表达式如: <br>
* "//div[@style][@id='BlogArticleDetail']/[1]"<br>
* "//div[@class='PageSkip_1']//a[@title]/[1]/text()"<br>
* "//div[@class='PageSkip_1']//a/text()"<br>
* "//div[@class='ArticleTitle']/text()[1]"<br>
* "//div[@class='ArticleTitle']/text()[1]"<br>
* "//div[@class='PageSkip_1']//a[@title]/[1]/text()" <br>
*
* @author 陈⼩稳 33881270@qq
*/
public class PdmParser {
private File pdmFile;
private Document doc;
private ArrayList<Table> tableList = null;
// <;表id,表>
private HashMap<String, Table> idTableMap = null;
// <;表code,表>
private HashMap<String, Table> codeTableMap = null;
// <;表id,表所属PhysicalDiagram>
private HashMap<String, PhysicalDiagram> idPhysicalDiagramMap = null;
private ArrayList<PhysicalDiagram> PhysicalDiagramsList = null;
private boolean hasParseColumns;
private boolean hasParsePhysicalDiagrams;
private boolean hasParseTables;
public static void main(String[] args) throws Exception {
File pdmFile = new File("D:\\Desktop\\PhysicalData_1.pdm");
PdmParser parseTool = new PdmParser(pdmFile);
// //按 PhysicalDiagram>表>字段打印
// parseTool.printAllInfo();
// //按 PhysicalDiagram>表>字段打印指定⽇期后新增的表和字段信息
/
/ parseTool.printAddedInfoAfterDate("2016-12-10 00:01");
// //打印指定⽇期后新增的表的信息
// parseTool.printAddedTablesAfterDate("2016-12-10 00:01");
// // 指定⽇期后新增的表的信息输出到集合⽂件
// parseTool.writeAddedTablesAfterDateToCollectionFile("2016-06-01",
// "z.");
// // 将所有表名输⼊到表名集合⽂件
// parseTool.printAllTablesToCollectionFile("4.txt");
// //将所有pdm⽂件中有表定义没所属包的表的表名输⼊到表名集合⽂件
// parseTool.printTablesWithOutSymbolToCollectionFile("4.txt");
// // 编辑保存
/
/ parseTool.deleteTableByCode("t_3,Table_1");
// File file = new File("D:\\Desktop\\new.pdm");
// parseTool.saveToFile(file);
// String datastr="2016-12-9 23:24";//查询的⽇期转换成pdm格式的时间
// Date date1 = DateUtils.parseDate(datastr, new String[]{"yyyy-MM-dd
// HH:mm","yyyy-MM-dd"});
// String compareDate = Time()/1000+"";
// System.out.println(compareDate);//1481297040
// System.out.println(System.currentTimeMillis());//1481297096391
// String creationDate="1481286082";//pdm格式的时间转换为⼀般可视化⽇期  // Long timeMillis = Long.parseLong(creationDate)*1000;
// Date date2 = new Date(timeMillis);
// String datastr2 = DateFormatUtils.format(date2, "yyyy-MM-dd
// HH:mm:ss");
// System.out.println(datastr2);//2016-12-09 20:21:22
}
/**使用dom4j解析xml文件
* 根据表名删除指定节点
* 根据表名删除指定节点
*
* @param parseTool
* @param string
* @throws DocumentException
*/
public void deleteTableByCode(String tableCodes) throws DocumentException {
String[] codes = tableCodes.split(",");
if (!this.hasParseTables) {
parseTables();
}
if (!this.hasParsePhysicalDiagrams) {
parsePhysicalDiagrams();
}
for (int i = 0; i < codes.length; i++) {
String code = codes[i];
if (StringUtils.isEmpty(code)) {
continue;
}
Table table = (code);
if (table == null) {
continue;
}
String tableid = Id();
// 根据table 的Id属性过滤
String xpath = "//c:Tables/o:Table[@Id='" + tableid + "']";
/
/ 根据表格的code节点的⽂本内容查到code节点,再获得上级(也就是表格)
// String xpath = "//c:Tables/o:Table/a:Code[text()='" + code +
// "']/..";
List<Element> composites = Doc().selectNodes(xpath);
if (CollectionUtils.isEmpty(composites)) {
} else if (composites.size() > 1) {
} else {
Element tableElement = (0);
// String tableid = tableElement.attributeValue("Id");
System.out.println("删除表,编号为 " + code + ",id=" + tableid
+ " 位置:" + (tableid).getName());
// 删表
// 删除表所属包的关系
String xpath2 = "//c:PhysicalDiagrams//c:Symbols//o:Table[@Ref='"
+ tableid + "']";// 简写部分关键路径
// String xpath2 =
// "//c:PhysicalDiagrams//o:PhysicalDiagram//c:Symbols//o:TableSymbol//c:Object//o:Table[@Ref='"    // + tableid + "']";//完整路径
List<Element> composites2 = Doc().selectNodes(xpath2);
if (CollectionUtils.isNotEmpty(composites2)) {
System.out.println("删表(编号为 " + code + ")的包、表关系 "
+ composites2.size() + " 处");
for (Iterator iterator = composites2.iterator(); iterator
.hasNext();) {
Element element = (Element) ();
// 删表的引⽤
Element oTableSymbolElement = Parent()
.getParent();
oTableSymbolElement);
}
}
} else {
}
// 删除表所属外键的关系
String xpath3 = "//c:References//o:Table[@Ref='" + tableid
+ "']";// 简写部分关键路径
List<Element> composites3 = Doc().selectNodes(xpath3);
if (CollectionUtils.isNotEmpty(composites3)) {
System.out.println("删表(编号为 " + code + ")的外键 "
+ composites3.size() + " 处");
for (Iterator iterator = composites3.iterator(); iterator
.hasNext();) {
Element element = (Element) ();
Element oReferenceElement = Parent()
.getParent();
}
} else {
System.out.println("删表编号为 " + code + "的表,不到相关外键");    }
}
}
}
public HashMap<String, PhysicalDiagram> getIdPhysicalDiagramMap() {  return idPhysicalDiagramMap;
}
public void setIdPhysicalDiagramMap(
HashMap<String, PhysicalDiagram> idPhysicalDiagramMap) {
this.idPhysicalDiagramMap = idPhysicalDiagramMap;
}
public void saveToFile(File file) {
try {
if (ists()) {
System.out.println("del " + AbsolutePath());
file.delete();
}
/*
* OutputFormat format = new OutputFormat();// 指定XML的输出样式    * atePrettyPrint() format.setEncoding("UTF-8"); //
* 指定XML编码 XMLWriter writer = new XMLWriter(new FileWriter(file),    * format); Document doc = Doc();
* doc.setXMLEncoding("UTF-8"); writer.write(doc); writer.close();
*/
// 解决输出乱码问题
OutputFormat format = new OutputFormat();
format.setEncoding("UTF-8");
OutputStream out = new FileOutputStream(file);
XMLWriter writer = new XMLWriter(out, format);
writer.Doc());
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 解析 PhysicalDiagram、表、字段信息
*
* @param parseTool
* @param parseTool
* @throws DocumentException
*/
public void parseAllInfo() throws DocumentException {
if (!this.hasParseTables) {
parseTables();
}
if (!this.hasParseColumns) {
parseColumns();
}
if (!this.hasParsePhysicalDiagrams) {
parsePhysicalDiagrams();
}
}
/**
* 解析多个pdm⽂件的表和模块
*
* @param pdmFiles
* @return
* @throws DocumentException
*/
public static PdmParser parseTablesAndPhysicalDiagrams(String[] pdmFiles)
throws DocumentException {
// <;表code,表>
HashMap<String, Table> codeTableMap = new HashMap<String, Table>();
// <;表id,表所属PhysicalDiagram>
HashMap<String, PhysicalDiagram> idPhysicalDiagramMap = new HashMap<String, PhysicalDiagram>();  for (int i = 0; i < pdmFiles.length; i++) {
File pdmFile1 = new File(pdmFiles[i]);
PdmParser parseTool1 = new PdmParser(pdmFile1);
parseTool1.parseTables();
parseTool1.parsePhysicalDiagrams();
HashMap<String, Table> codeTableMap1 = CodeTableMap();
HashMap<String, PhysicalDiagram> idPhysicalDiagramMap1 = parseTool1
.getIdPhysicalDiagramMap();
codeTableMap.putAll(codeTableMap1);
idPhysicalDiagramMap.putAll(idPhysicalDiagramMap1);
}
PdmParser r = new PdmParser(null);
r.setIdPhysicalDiagramMap(idPhysicalDiagramMap);
r.setCodeTableMap(codeTableMap);
return r;
}
/**
* 按 PhysicalDiagram>表>字段打印指定⽇期后新增的表和字段信息
*
* @param parseTool
* @param datastr
*            查询的时间,如:"2016-12-9 20:21:22"
* @throws ParseException
* @throws DocumentException
*/
public void printAddedInfoAfterDate(String datastr) throws ParseException,
DocumentException {
if (!this.hasParseTables) {
parseTables();
}
if (!this.hasParseColumns) {
parseColumns();
}
if (!this.hasParsePhysicalDiagrams) {
parsePhysicalDiagrams();
}
// 如果表是新增的,则在表上标记新增。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。