編程生活

             :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            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 閱讀(1830) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 将乐县| 香格里拉县| 牡丹江市| 平度市| 莎车县| 永仁县| 新野县| 长宁县| 泸水县| 芒康县| 黄龙县| 腾冲县| 新化县| 阿城市| 古田县| 曲靖市| 沐川县| 富阳市| 辛集市| 温泉县| 郎溪县| 辽中县| 潮州市| 辽宁省| 济南市| 新竹县| 兴和县| 红原县| 高平市| 晋江市| 莆田市| 电白县| 祁阳县| 玉门市| 台中县| 尼勒克县| 屯门区| 永德县| 郴州市| 遂昌县| 宣化县|