`
ccxw1983
  • 浏览: 27022 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

数据库建模pdm文件的解析、简单删除表和保存

阅读更多
工具的开发背景:
crm系统以ework为基础改造而来,以前简单起见和ework混合了代码和表的,现在需要分析,就需要重新分析,哪些是共用的,哪些是私有的。
通过日志中打印的表名,可以分析出哪些表是crm独有的。
通过pdm文件表的创建记录确定哪些表是新表,新的表少,再除去crm独有的,所以方便人工检查哪些是crm专有的。

另外分析了us系统那边用到的表(那边用到的就肯定不能公用),
cas、权限、用户、组织单位、数据字典的肯定是公用的。
另外考虑以前开发中折中,偷懒,有些方法混合了ework、crm一方使用无需用到的表,目前一时没法剥离,需要确定备忘。

总体思路:
日志(或初始化sql脚本)或pdm中分析出来的表名列表结果分别存到集合包里面,通过里面的CollectionTool.java做集合的运算、打印(打印表名、编码、pdm中所属包方便人工判断)、保存。

工具编写匆忙,可能有少量bug和注释不统一的地方,不懂的请研究代码,恕不做技术支持。

pdm解析的
package chenxiaowen.tool.pdm;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.text.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 org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.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;

import chenxiaowen.tool.collections.CollectionTool;
import chenxiaowen.tool.pdm.pojo.Column;
import chenxiaowen.tool.pdm.pojo.PhysicalDiagram;
import chenxiaowen.tool.pdm.pojo.Table;

/**
 * pdm文件解析出 PhysicalDiagram、Table、Column<br>
 * 演示了pdm元素的查找、删除、保存。 <br>
 * 如果文件很大导致内存溢出,请配置运行的vm参数,如:-Xms400m -Xmx1024m<br>
 * <br>
 * dom4j的xpath查找xml的指定节点 <br>
 * http://blog.csdn.net/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='PageSkip_1']//a[@title]/[1]/text()" <br>
 * 
 * @author 陈小稳 33881270@qq.com
 */
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.new_crm.txt");

		// // 将所有表名输入到表名集合文件
		// 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 = date1.getTime()/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

	}

	/**
	 * 根据表名删除指定节点
	 * 
	 * @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 = codeTableMap.get(code);
			if (table == null) {
				System.err.println("要删除的表 " + code + " 不在pdm中");
				continue;
			}
			String tableid = table.getId();

			// 根据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 = this.getDoc().selectNodes(xpath);
			if (CollectionUtils.isEmpty(composites)) {
				System.err.println("没找到编号为 " + code + " 的表");
			} else if (composites.size() > 1) {
				System.err.println("找到编号为 " + code + " 的表,但不唯一");
			} else {
				Element tableElement = composites.get(0);
				// String tableid = tableElement.attributeValue("Id");

				System.out.println("删除表,编号为 " + code + ",id=" + tableid
						+ " 位置:" + idPhysicalDiagramMap.get(tableid).getName());
				// 删表
				tableElement.getParent().remove(tableElement);

				// 删除表所属包的关系
				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 = this.getDoc().selectNodes(xpath2);
				if (CollectionUtils.isNotEmpty(composites2)) {
					System.out.println("删表(编号为 " + code + ")的包、表关系 "
							+ composites2.size() + " 处");
					for (Iterator iterator = composites2.iterator(); iterator
							.hasNext();) {
						Element element = (Element) iterator.next();
						// 删表的引用
						Element oTableSymbolElement = element.getParent()
								.getParent();
						oTableSymbolElement.getParent().remove(
								oTableSymbolElement);
					}
				} else {
					System.err.println("删表编号为 " + code + "的表,找不到所属包");
				}

				// 删除表所属外键的关系
				String xpath3 = "//c:References//o:Table[@Ref='" + tableid
						+ "']";// 简写部分关键路径
				List<Element> composites3 = this.getDoc().selectNodes(xpath3);
				if (CollectionUtils.isNotEmpty(composites3)) {
					System.out.println("删表(编号为 " + code + ")的外键 "
							+ composites3.size() + " 处");
					for (Iterator iterator = composites3.iterator(); iterator
							.hasNext();) {
						Element element = (Element) iterator.next();
						Element oReferenceElement = element.getParent()
								.getParent();
						oReferenceElement.getParent().remove(oReferenceElement);
					}
				} 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 (file.exists()) {
				System.out.println("del " + file.getAbsolutePath());
				file.delete();
			}
			/*
			 * OutputFormat format = new OutputFormat();// 指定XML的输出样式
			 * OutputFormat.createPrettyPrint() format.setEncoding("UTF-8"); //
			 * 指定XML编码 XMLWriter writer = new XMLWriter(new FileWriter(file),
			 * format); Document doc = this.getDoc();
			 * 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.write(this.getDoc());
			writer.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 解析 PhysicalDiagram、表、字段 信息
	 * 
	 * @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 = parseTool1.getCodeTableMap();
			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();
		}
		// 如果表是新增的,则在 表上标记新增。
		// 如果表是旧的,字段是新增的,则在 字段 上标记新增。
		Date date1 = DateUtils.parseDate(datastr, new String[] {
				"yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM-dd" });
		String compareDateTicksStr = date1.getTime() / 1000 + "";
		System.out.println("==打印指定日期 " + datastr + "(" + compareDateTicksStr
				+ ") 之后新增的表格和字段============================");
		for (Iterator iterator = this.getPhysicalDiagramsList().iterator(); iterator
				.hasNext();) {
			PhysicalDiagram pd = (PhysicalDiagram) iterator.next();
			Boolean packHasPrint = false;
			ArrayList<String> tableIds = pd.getTableIds();
			for (Iterator iterator2 = tableIds.iterator(); iterator2.hasNext();) {
				String tableid = (String) iterator2.next();
				Table table = this.getIdTableMap().get(tableid);
				Boolean tableHasPrint = false;
				// 发现指定日期后的表格
				if (table.getCreationDate().compareTo(compareDateTicksStr) >= 0) {
					if (!packHasPrint) {
						packHasPrint = true;
						System.out.println("" + pd);
					}
					tableHasPrint = true;
					System.out.println("\t【new】" + table);
				}
				ArrayList<Column> columns = table.getColumns();
				Boolean tableIsNew = tableHasPrint;
				for (Iterator iterator3 = columns.iterator(); iterator3
						.hasNext();) {
					Column column = (Column) iterator3.next();
					// 发现指定日期后的字段
					if (column.getCreationDate().compareTo(compareDateTicksStr) >= 0) {
						if (!packHasPrint) {
							packHasPrint = true;
							System.out.println("" + pd);
						}
						if (!tableHasPrint) {
							tableHasPrint = true;
							System.out.println("\t" + table);
						}

						System.out.println("\t\t" + (tableIsNew ? "" : "【new】")
								+ column);
					}
				}
			}
		}
	}

	/**
	 * 打印指定日期后新增的表的信息
	 * 
	 * @param datastr
	 * @throws ParseException
	 * @throws DocumentException
	 */
	public void printAddedTablesAfterDate(String datastr)
			throws ParseException, DocumentException {
		if (!this.hasParseTables) {
			parseTables();
		}
		Date date1 = DateUtils.parseDate(datastr, new String[] {
				"yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM-dd" });
		String compareDateTicksStr = date1.getTime() / 1000 + "";
		TreeSet<String> adds = new TreeSet<String>();
		for (Iterator iterator2 = tableList.iterator(); iterator2.hasNext();) {
			Table table = (Table) iterator2.next();
			// 发现指定日期后的表格
			if (table.getCreationDate().compareTo(compareDateTicksStr) >= 0) {
				adds.add(table.getCode());
			}
		}
		for (Iterator iterator = adds.iterator(); iterator.hasNext();) {
			String tablecode = (String) iterator.next();
			System.out.println(tablecode + ",");
		}
	}

	/**
	 * 指定日期后新增的表的信息输出到集合文件
	 * 
	 * @param datastr
	 * @throws ParseException
	 * @throws DocumentException
	 */
	public void writeAddedTablesAfterDateToCollectionFile(String datastr,
			String filename) throws Exception {
		if (!this.hasParseTables) {
			parseTables();
		}
		Date date1 = DateUtils.parseDate(datastr, new String[] {
				"yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM-dd" });
		String compareDateTicksStr = date1.getTime() / 1000 + "";
		TreeSet<String> adds = new TreeSet<String>();
		for (Iterator iterator2 = tableList.iterator(); iterator2.hasNext();) {
			Table table = (Table) iterator2.next();
			// 发现指定日期后的表格
			if (table.getCreationDate().compareTo(compareDateTicksStr) >= 0) {
				adds.add(table.getCode());
			}
		}
		CollectionTool.writeCollectionFile(filename, adds);
	}

	/**
	 * 将所有表名输入到表名集合文件
	 * 
	 * @param filename
	 * @throws DocumentException
	 */
	public void printAllTablesToCollectionFile(String filename)
			throws Exception {
		if (!this.hasParseTables) {
			parseTables();
		}
		TreeSet<String> a = new TreeSet<String>();
		for (Iterator iterator = tableList.iterator(); iterator.hasNext();) {
			Table t = (Table) iterator.next();
			a.add(t.getCode());
		}
		CollectionTool.writeCollectionFile(filename, a);
	}

	/**
	 * 将所有pdm文件中有表定义没所属包的表的表名输入到表名集合文件
	 * 
	 * @param filename
	 * @throws DocumentException
	 */
	public void printTablesWithOutSymbolToCollectionFile(String filename)
			throws Exception {
		if (!this.hasParseTables) {
			parseTables();
		}
		if (!this.hasParsePhysicalDiagrams) {
			parsePhysicalDiagrams();
		}
		TreeSet<String> a = new TreeSet<String>();
		for (Iterator iterator = tableList.iterator(); iterator.hasNext();) {
			Table t = (Table) iterator.next();
			String tbid = t.getId();
			PhysicalDiagram symbol = idPhysicalDiagramMap.get(tbid);
			if (symbol == null) {
				a.add(t.getCode());
			}
		}
		CollectionTool.writeCollectionFile(filename, a);
	}

	/**
	 * 按 PhysicalDiagram>表>字段 打印
	 * 
	 * @param parseTool
	 * @throws DocumentException
	 */
	public void printAllInfo() throws DocumentException {
		if (!this.hasParseTables) {
			parseTables();
		}
		if (!this.hasParseColumns) {
			parseColumns();
		}
		if (!this.hasParsePhysicalDiagrams) {
			parsePhysicalDiagrams();
		}

		System.out
				.println("==按 PhysicalDiagram>表>字段 打印======================================================================");
		for (Iterator iterator = getPhysicalDiagramsList().iterator(); iterator
				.hasNext();) {
			PhysicalDiagram pd = (PhysicalDiagram) iterator.next();
			System.out.println(pd.toString());
			ArrayList<String> tableIds = pd.getTableIds();
			for (Iterator iterator2 = tableIds.iterator(); iterator2.hasNext();) {
				String tableid = (String) iterator2.next();
				Table table = getIdTableMap().get(tableid);
				System.out.println("\t" + table);
				ArrayList<Column> columns = table.getColumns();
				for (Iterator iterator3 = columns.iterator(); iterator3
						.hasNext();) {
					Column column = (Column) iterator3.next();
					System.out.println("\t\t" + column);
				}
			}
		}
	}

	/**
	 * 1.解析所有表格
	 * 
	 * @throws DocumentException
	 */
	public void parseTables() throws DocumentException {
		tableList = new ArrayList<Table>();
		idTableMap = new HashMap<String, Table>();
		codeTableMap = new HashMap<String, Table>();
		Iterator itr = doc.selectNodes("//c:Tables//o:Table").iterator();
		Table table = null;
		while (itr.hasNext()) {
			table = new Table();
			Element tableElement = (Element) itr.next();
			String id = tableElement.attribute("Id").getValue();
			table.setId(id);
			String code = tableElement.elementTextTrim("Code");
			code = code.toLowerCase();
			table.setCode(code);
			table.setName(tableElement.elementTextTrim("Name"));
			table.setCreationDate(tableElement.elementTextTrim("CreationDate"));
			table.setModificationDate(tableElement
					.elementTextTrim("ModificationDate"));
			tableList.add(table);
			idTableMap.put(id, table);
			codeTableMap.put(code, table);
		}
		this.hasParseTables = true;
	}

	/**
	 * 2.解析所有PhysicalDiagram和PhysicalDiagram包含的表
	 * 
	 * @throws DocumentException
	 */
	public void parsePhysicalDiagrams() throws DocumentException {
		PhysicalDiagramsList = new ArrayList<PhysicalDiagram>();
		idPhysicalDiagramMap = new HashMap<String, PhysicalDiagram>();
		Iterator itr = doc.selectNodes(
				"//c:PhysicalDiagrams//o:PhysicalDiagram").iterator();
		PhysicalDiagram physicalDiagram = null;
		while (itr.hasNext()) {
			physicalDiagram = new PhysicalDiagram();
			Element element = (Element) itr.next();
			String id = element.attribute("Id").getValue();
			physicalDiagram.setId(id);
			String code = element.elementTextTrim("Code");
			code = code.toLowerCase();
			physicalDiagram.setName(element.elementTextTrim("Name"));
			physicalDiagram.setCode(code);
			// physicalDiagram.setCreationDate(element.elementTextTrim("CreationDate"));
			// physicalDiagram.setModificationDate(element.elementTextTrim("ModificationDate"));
			PhysicalDiagramsList.add(physicalDiagram);

			// System.out.println("name:"+physicalDiagram.getName()+"
			// id:"+physicalDiagram.getId());
			// 不以“//”开头,表示从下级里面查找
			Iterator ittable = element.selectNodes(
					"c:Symbols//o:TableSymbol//c:Object//o:Table").iterator();
			ArrayList<String> tableIds = new ArrayList<String>();
			while (ittable.hasNext()) {
				Element reftable = (Element) ittable.next();
				String tableid = reftable.attribute("Ref").getValue();
				// System.out.println("ref tableid:"+tableid);
				tableIds.add(tableid);
				idPhysicalDiagramMap.put(tableid, physicalDiagram);
			}
			physicalDiagram.setTableIds(tableIds);
		}
		this.hasParsePhysicalDiagrams = true;
	}

	/**
	 * 3.解析表的字段和pk
	 * 
	 * @param table
	 * @throws DocumentException
	 */

	public void parseColumns() throws DocumentException {
		for (Iterator iterator = getTableList().iterator(); iterator.hasNext();) {
			Table table = (Table) iterator.next();
			parseColumnsOfTable(table);
		}
		this.hasParseColumns = true;
	}

	/**
	 * 解析表的字段和pk
	 * 
	 * @param table
	 * @throws DocumentException
	 */
	public void parseColumnsOfTable(Table table) throws DocumentException {
		ArrayList<Column> columnlist = new ArrayList<Column>();
		Column column = null;
		Element tableElement = getTableElementById(table.getId());
		// Iterator itr1 =
		// tableElement.element("Columns").elements("Column").iterator();
		Iterator itr1 = tableElement.selectNodes("c:Columns//o:Column")
				.iterator();
		while (itr1.hasNext()) {
			column = new Column();
			Element columnElement = (Element) itr1.next();
			String id = columnElement.attributeValue("Id");
			// String id = columnElement.attribute("Id").getValue();
			column.setId(id);
			column.setName(columnElement.elementTextTrim("Name"));
			String code = columnElement.elementTextTrim("Code");
			code = code.toLowerCase();
			column.setCode(code);
			column.setCreationDate(columnElement
					.elementTextTrim("CreationDate"));
			column.setModificationDate(columnElement
					.elementTextTrim("ModificationDate"));
			String length = columnElement.elementTextTrim("Length");
			column.setLength(length == null ? null : Integer.parseInt(length));
			String dataType = columnElement.elementTextTrim("DataType");
			if (dataType.indexOf("(") > 0) {
				column.setType(dataType.substring(0, dataType.indexOf("(")));
			} else {
				column.setType(dataType);
			}
			columnlist.add(column);
		}
		table.setColumns(columnlist);

		// set pk
		if (tableElement.element("Keys") != null) {
			String keys_primarykey_ref_id = tableElement.element("PrimaryKey")
					.element("Key").attributeValue("Ref");
			String keys_key_id = tableElement.element("Keys").element("Key")
					.attributeValue("Id");
			if (keys_primarykey_ref_id.equals(keys_key_id)) {
				String keys_column_ref = tableElement.element("Keys").element(
						"Key").element("Key.Columns").element("Column")
						.attributeValue("Ref");
				for (Iterator iterator = columnlist.iterator(); iterator
						.hasNext();) {
					Column columni = (Column) iterator.next();
					if (keys_column_ref.equals(columni.getId())) {
						columni.setPkFlag(true);
						table.setPkFieldCode(columni.getCode());
					}
				}
			}
		}
	}

	/**
	 * 根据Id找到 PhysicalDiagram 元素
	 * 
	 * @param id
	 * @return
	 * @throws DocumentException
	 */
	public Element getPhysicalDiagramElementById(String id)
			throws DocumentException {
		Element tableElement = getElementByTypePathAndAttrVal(
				"//c:PhysicalDiagrams//o:PhysicalDiagram", "Id", id);
		return tableElement;
	}

	/**
	 * 根据Id找到表元素
	 * 
	 * @param id
	 * @return
	 * @throws DocumentException
	 */
	public Element getTableElementById(String id) throws DocumentException {
		Element tableElement = getElementByTypePathAndAttrVal(
				"//c:Tables//o:Table", "Id", id);
		return tableElement;
	}

	/**
	 * 根据typepath找到指定类型的元素,再根据元素上的属性定位具体的元素
	 * 
	 * @param typepath
	 * @param attrName
	 * @param attrVal
	 * @return
	 * @throws DocumentException
	 */
	public Element getElementByTypePathAndAttrVal(String typepath,
			String attrName, String attrVal) throws DocumentException {
		Iterator itr = doc.selectNodes(typepath).iterator();
		Table table = null;
		while (itr.hasNext()) {
			Element element = (Element) itr.next();
			Attribute attr = element.attribute(attrName);
			if (attr != null) {
				String txt = attr.getValue();
				if (StringUtils.equalsIgnoreCase(attrVal, txt)) {
					return element;
				}
			}
		}
		return null;
	}

	/**
	 * 枚举列出元素上的所有属性
	 * 
	 * @param tableElement
	 */
	private void showAttributes(Element tableElement) {
		List<Attribute> listAttr = tableElement.attributes();// 当前节点的所有属性的list
		for (Attribute attr : listAttr) {// 遍历当前节点的所有属性
			String name = attr.getName();// 属性名称
			String value = attr.getValue();// 属性的值
			System.out.println("属性名称:" + name + "属性值:" + value);
		}
	}

	/**
	 * @deprecated
	 * @throws DocumentException
	 */
	private void printTables() throws DocumentException {
		if (CollectionUtils.isNotEmpty(tableList)) {
			for (Iterator iterator = tableList.iterator(); iterator.hasNext();) {
				Table table = (Table) iterator.next();
				System.out.println(table.getCode() + "\t" + table.getId());
			}
		}
	}

	public PdmParser(File pdmFile) throws DocumentException {
		this.pdmFile = pdmFile;
		if (pdmFile != null && pdmFile.exists()) {
			SAXReader sr = new SAXReader();
			this.doc = sr.read(this.pdmFile);
		}
	}

	public ArrayList<Table> getTableList() {
		return tableList;
	}

	public void setTableList(ArrayList<Table> tableList) {
		this.tableList = tableList;
	}

	public ArrayList<PhysicalDiagram> getPhysicalDiagramsList() {
		return PhysicalDiagramsList;
	}

	public void setPhysicalDiagramsList(
			ArrayList<PhysicalDiagram> physicalDiagramsList) {
		PhysicalDiagramsList = physicalDiagramsList;
	}

	public HashMap<String, Table> getIdTableMap() {
		return idTableMap;
	}

	public void setIdTableMap(HashMap<String, Table> idTableMap) {
		this.idTableMap = idTableMap;
	}

	public Document getDoc() {
		return doc;
	}

	public void setDoc(Document doc) {
		this.doc = doc;
	}

	public HashMap<String, Table> getCodeTableMap() {
		return codeTableMap;
	}

	public void setCodeTableMap(HashMap<String, Table> codeTableMap) {
		this.codeTableMap = codeTableMap;
	}

}

package chenxiaowen.tool.pdm.pojo;

import java.util.ArrayList;

import org.apache.commons.collections.CollectionUtils;

public class Table {
	private String id;
	private String name;
	private String code;
	private String creationDate;
	private String modificationDate;
	private ArrayList<Column> columns;
	private String pkFieldCode;
	

	@Override
	public String toString() {
		return "Table " +
				"{id: " + id 
				+ ", name: " + name 
				+ ", code: " + code
				+ ", creationDate: " + creationDate
				+ ", modificationDate: " + modificationDate
				+ ", columns size: " + (CollectionUtils.isEmpty(columns)?0:columns.size())
				+ "}";
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getCode() {
		return code;
	}

	public void setCode(String code) {
		this.code = code;
	}

	public String getCreationDate() {
		return creationDate;
	}

	public void setCreationDate(String creationDate) {
		this.creationDate = creationDate;
	}

	public String getModificationDate() {
		return modificationDate;
	}

	public void setModificationDate(String modificationDate) {
		this.modificationDate = modificationDate;
	}

	public String getPkFieldCode() {
		return pkFieldCode;
	}

	public void setPkFieldCode(String pkFieldCode) {
		this.pkFieldCode = pkFieldCode;
	}

	public ArrayList<Column> getColumns() {
		return columns;
	}

	public void setColumns(ArrayList<Column> columns) {
		this.columns = columns;
	}

}

package chenxiaowen.tool.pdm.pojo;

import java.util.ArrayList;

import org.apache.commons.collections.CollectionUtils;

/**
 * pdm文件的模块
 * @author 陈小稳 33881270@qq.com
 *
 */
public class PhysicalDiagram {
	private String name;
	private String code;
	private String id;
	private ArrayList<String> tableIds;
	@Override
	public String toString() {
		return "PhysicalDiagram {id: " + id 
				+ ", name: " + name 
				+ ", code: " + code
				+ ", tables in package: " + (CollectionUtils.isEmpty(tableIds)?0:tableIds.size())
				+ "}";
	}

	public ArrayList<String> getTableIds() {
		return tableIds;
	}

	public void setTableIds(ArrayList<String> tableIds) {
		this.tableIds = tableIds;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getCode() {
		return code;
	}

	public void setCode(String code) {
		this.code = code;
	}

}


package chenxiaowen.tool.pdm.pojo;

public class Column {
	private String id;
	private String name;
	private String code;
	private String creationDate;
	private String modificationDate;
	private String type;
	private Integer length;
	private Boolean pkFlag;

	@Override
	public String toString() {
		return "Column {id: " + id + ", name: " + name + ", code: " + code
				+ ", creationDate: " + creationDate + ", modificationDate: "
				+ modificationDate + "}";
	}

	public String getCreationDate() {
		return creationDate;
	}

	public void setCreationDate(String creationDate) {
		this.creationDate = creationDate;
	}

	public String getModificationDate() {
		return modificationDate;
	}

	public void setModificationDate(String modificationDate) {
		this.modificationDate = modificationDate;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getType() {
		return type;
	}

	public void setType(String type) {
		this.type = type;
	}

	public Integer getLength() {
		return length;
	}

	public void setLength(Integer length) {
		this.length = length;
	}

	public String getCode() {
		return code;
	}

	public void setCode(String code) {
		this.code = code;
	}

	public Boolean getPkFlag() {
		return pkFlag;
	}

	public void setPkFlag(Boolean pkFlag) {
		this.pkFlag = pkFlag;
	}
}
  • pdm.zip (8.9 KB)
  • 下载次数: 12
分享到:
评论

相关推荐

    PDM解析后台代码

    - SQL脚本生成:生成创建表、插入数据、设置索引等的SQL语句,以便执行数据库建模和数据迁移。 3. **生成C#实体类文件**:C#实体类是面向对象编程中表示数据库表的对象,它们提供了对数据库记录的封装。这个过程...

    PowerDesigner12.5 数据库建模实例教程

    《PowerDesigner12.5数据库建模实例教程》是一份深度解析数据库设计工具PowerDesigner12.5的实用教程。该教程包含丰富的实例,旨在帮助用户掌握如何利用此工具进行有效的数据建模工作。其中,CDM(Conceptual Data ...

    PDM文件阅读器(最新版)

    "PDM文件查看"是该软件的主要功能,它支持打开和解析PDM文件,展示其中的数据表、关系、索引、外键等关键元素。用户可以浏览模型结构,查看实体与属性,以及它们之间的关联,这对于理解数据库设计和进行数据管理非常...

    SQL转PDM文件模型

    owerDesigner是一种数据库建模和设计工具,它的主要用途和功能包括: 数据建模:可以用于创建和维护数据库模型,包括物理数据模型和逻辑数据模型。 数据字典:提供了数据字典,用于定义数据表、列、关系等对象的...

    PowerDesigner(PDM)文件自动转换为Excel文件格式

    1. **PowerDesigner的PDM文件**:PDM文件是PowerDesigner保存物理数据模型的文件格式,其中包含了表、字段、键、索引、约束和数据库特定的信息。这些信息以XML的形式存储,对于人类阅读来说不够直观。 2. **自动...

    mac下查看pdm文件

    PDM文件是PowerDesigner创建的数据模型文件,它包含了数据库表、关系、属性等元数据信息。 首先,确保你的Mac已经安装了支持PDM文件的PowerDesigner版本。在提供的描述中提到,用户使用的PowerDesigner版本是15,这...

    好用的PDM阅读工具

    1. **PDM文件解析**:能够读取和解析PDM文件的内容,包括数据库表的定义、字段信息、键的设置、索引等。 2. **图形化展示**:将PDM文件中的关系模型以图表的形式展示,帮助用户直观理解数据库结构。 3. **搜索功能...

    pdm.rar_pdm_pdm.rar_pdm变为数据库

    "pdm.rar_pdm_pdm.rar_pdm变为数据库"这个标题和描述提到了一个与数据库物理模型(Physical Data Model,简称PDM)相关的过程,即把PDM转换成XML格式,以便于其他系统进行解析和利用。 PDM是数据库设计的一个阶段,...

    Powerdesigner逆向工程从现有数据库生成PDM

    通过导入上述脚本,PowerDesigner可以自动解析并生成包含“class”和“student”表的物理数据模型。 #### 七、总结 逆向工程是从现有数据库生成PDM的有效方法,尤其适用于那些需要快速更新数据模型或恢复丢失模型的...

    Java反编译工具和关系型数据库建模工具

    对于Java开发者来说,了解和使用Java反编译工具以及关系型数据库建模工具是提升效率和优化项目的关键。下面将详细介绍这两个主题。 首先,Java反编译工具是程序员在面对已编译的.class文件,无法直接查看源代码时的...

    速达5000数据库表结构物理模型

    PDM文件是一种用于数据建模的专业格式,由PowerDesigner工具生成,它直观地描绘了数据库的表、字段、键、关系等元素。"SD5000物理模型.pdm"文件就是速达5000数据库的物理模型,通过PowerDesigner打开,我们可以清晰...

    07 数据库建模工具简介--Power Designer9.0.pdf

    PowerDesigner,作为Sybase公司旗下的一款集成化数据库建模工具,自问世以来便以其强大的功能和灵活性在数据库设计领域占据了一席之地。尤其在PowerDesigner 9.0版本中,其智能化的计算机辅助软件工程(CASE)工具...

    PowerDesigner逆向工程生成PDM模型及数据库

    ### PowerDesigner逆向工程生成PDM模型及...无论是通过ODBC数据源直接连接数据库,还是利用SQL脚本间接生成PDM,都体现了PowerDesigner在数据建模领域的强大功能和灵活性,是现代数据库设计和管理不可或缺的利器。

    PowerDesigner系统分析与数据库建模_1(精细讲解_值得珍藏).pdf

    ### PowerDesigner系统分析与数据库建模精讲 #### PowerDesigner概述及历史变迁 PowerDesigner,由Sybase公司研发,是一款集成了企业架构分析、统一建模语言(UML)和数据建模的CASE(Computer Aided Software ...

    pdm导入导出模板及vb脚本

    PowerDesigner是一款强大的数据库设计和数据建模工具,它允许用户创建、管理和共享复杂的数据库模型。 首先,让我们详细了解一下PowerDesigner中的PDM模型导入和导出功能。PDM模型通常包括实体、关系、属性、约束等...

    PDM转sql语句

    PDM是Sybase PowerDesigner的一个组件,它是一种强大的数据建模工具,用于设计和管理数据库的逻辑结构。Oracle是另一种常用的数据库管理系统,其SQL语法与MySQL有所不同。 在描述中提到,“这个工程能把Oracle所写...

    合同管理系统(PDM)

    PowerDesigner是一款强大的数据库建模工具,广泛应用于数据库设计、数据仓库建模和系统架构设计等领域。在构建合同管理系统时,PowerDesigner能够帮助我们清晰地定义和组织数据,确保系统的高效运行和数据的一致性。...

Global site tag (gtag.js) - Google Analytics