由于項目需要做了一個從pdm中讀取表/字段的代碼,為以后使用方便記在此處
public class PDMHandler extends DefaultHandler2 {
private static final String DBMS = "/" + Target.dbms.id;

private static final String DBMS_NAME = DBMS + "/" + Target.dbmsName.id;

private static final String DBMS_CODE = DBMS + "/" + Target.dbmsCode.id;

private static final String TABLES = "/" + Target.tables.id;

private static final String TABLES_TABLE = TABLES + "/" + Target.table.id;

private static final String TABLES_TABLE_NAME = TABLES_TABLE + "/" + Target.tableName.id;

private static final String TABLES_TABLE_CODE = TABLES_TABLE + "/" + Target.tableCode.id;

private static final String TABLES_TABLE_COLUMNS = TABLES_TABLE + "/" + Target.columns.id;

private static final String TABLES_TABLE_COLUMNS_COLUMN = TABLES_TABLE_COLUMNS + "/" + Target.column.id;

private static Log log = LogFactory.getLog(PDMHandler.class);

// 是否正在處理
private boolean doing;

// 結果對象
private Tables tables = new Tables();

// 上一次的表對象
private Table lastTable;

// 上一次的列對象
private Column lastColumn;

// 上一次處理的對象
private Target lastObject;

// 上一次路徑,元素之間用/進行分隔,屬性則采用@來標識,這是借用了XPath的規范
private String lastPath = "";

/**
* 開始文檔解析
*
* @see org.xml.sax.helpers.DefaultHandler#startDocument()
*/
@Override
public void startDocument() throws SAXException {
log.debug("powerdesigner pdm document parse start.");
}

/**
* 結束文檔解析
*
* @see org.xml.sax.helpers.DefaultHandler#endDocument()
*/
@Override
public void endDocument() throws SAXException {
log.debug("powerdesigner pdm document parse finish.");
}

/**
* 啟動元素解析
*
* @see org.xml.sax.helpers.DefaultHandler#startElement(java.lang.String,
* java.lang.String, java.lang.String, org.xml.sax.Attributes)
*/
@Override
public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException {
// 首先處理dbms的解釋
if (Target.dbms.id.equals(name) || Target.tables.id.equals(name))
doing = true;

// 如果沒有開始,則直接退出
if (!doing)
return;

// 設置路徑
String tempPath = lastPath + "/" + name;

log.debug("開始解析:" + name);
// DBMS
if (lastPath.equals(DBMS)) {
if (tempPath.equals(DBMS_NAME)) {
lastObject = Target.dbmsName;
} else if (tempPath.equals(DBMS_CODE)) {
lastObject = Target.dbmsCode;
}
// TABLE
} else if (lastPath.equals(TABLES)) {
if (tempPath.equals(TABLES_TABLE)) {
// 新建一個表
lastTable = new Table();
tables.add(lastTable);
}
// TABLE的屬性
} else if (lastPath.equals(TABLES_TABLE)) {
if (tempPath.equals(TABLES_TABLE_NAME)) {
lastObject = Target.tableName;
} else if (tempPath.equals(TABLES_TABLE_CODE)) {
lastObject = Target.tableCode;
}
// 列
} else if (lastPath.equals(TABLES_TABLE_COLUMNS)) {
if (tempPath.equals(TABLES_TABLE_COLUMNS_COLUMN)) {
// 新建列
lastColumn = new Column();
lastTable.add(lastColumn);
}
} else if (lastPath.equals(TABLES_TABLE_COLUMNS_COLUMN)) {
// 只處理列的屬性
lastObject = findTarget(Group.column, name);
}
lastPath = tempPath;
}

/**
* 結束元素解析
*
* @see org.xml.sax.helpers.DefaultHandler#endElement(java.lang.String,
* java.lang.String, java.lang.String)
*/
@Override
public void endElement(String uri, String localName, String name) throws SAXException {
// 管理是否結束schema的解析
if (!doing)
return;

log.debug("完成解析:" + name);
if (Target.dbms.id.equals(name) || Target.tables.id.equals(name))
doing = false;

// 恢復路徑狀態
lastPath = StringUtils.substringBeforeLast(lastPath, "/" + name);
}

@Override
public void characters(char[] ch, int start, int length) throws SAXException {
if (lastObject != null && lastObject.ob != null) {
Object dest = Group.table.equals(lastObject.og) ? lastTable : Group.column.equals(lastObject.og) ? lastColumn : tables;
try {
BeanUtils.setProperty(dest, lastObject.ob, new String(ch, start, length));
lastObject = null;
} catch (Exception e) {
throw new SAXException(e);
}
}
}

/**
* 取得解析成功的Table定義信息
*
* @return
*/
public Tables getTables() {
return tables;
}

/**
* 根據標識找符合標識的東西
*
* @param group
* @param id
* @return
*/
private static Target findTarget(Group group, String id) {
for (Target item : Target.class.getEnumConstants()) {
if (group == item.og && item.id.equals(id))
return item;
}
return null;
}

/**
* 操作的組分類
*
* @author wilesun
* @create 2007-11-3
*/
private enum Group {
dbms, table, column
}

/**
* 解析操作碼
*
* @author wilesun
* @create 2007-11-3
*/
private enum Target {
/**
* dbms
*/
dbms("o:DBMS"),
/**
* dbms名稱
*/
dbmsName("a:Name", "dbmsName", Group.dbms),
/**
* dbms編碼
*/
dbmsCode("a:Code", "dbmsCode", Group.dbms),
/**
* 表集合
*/
tables("c:Tables"),
/**
* 表
*/
table("o:Table"),
/**
* 表名稱
*/
tableName("a:Name", "name", Group.table),
/**
* 表編碼
*/
tableCode("a:Code", "code", Group.table),
/**
* 列集合
*/
columns("c:Columns"),
/**
* 列
*/
column("o:Column"),
/**
* 列名稱
*/
columnName("a:Name", "name", Group.column),
/**
* 列編號
*/
columnCode("a:Code", "code", Group.column),
/**
* 列格式
*/
columnFormat("a:Format", "format", Group.column),
/**
* 列下拉
*/
columnList("a:ListOfValues", "list", Group.column),
/**
* 列類型
*/
columnDataType("a:DataType", "dataType", Group.column),
/**
* 列長度
*/
columnLength("a:Length", "length", Group.column),
/**
* 列強制
*/
columnMandatory("a:Mandatory", "mandatory", Group.column);

// 操作碼標識
private String id;

private String ob;

private Group og;

/**
* 只根據標識,無組和操作構造
*
* @param id
*/
Target(String id) {
this.id = id;
}

/**
* 根據標識和操作做內部構造
*
* @param id
*/
Target(String id, String ob, Group og) {
this.id = id;
this.ob = ob;
this.og = og;
}
}
}
























































































































































































































































































