由于項目需要做了一個從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;
}
}
}