编程生活

   :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  113 随笔 :: 0 文章 :: 18 评论 :: 0 Trackbacks
由于项目需要做了一个从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;
        }

    }

}
posted on 2007-11-14 23:09 wilesun 阅读(1803) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航: