首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Fire Workflow 源碼深度解析 (五):FPDL 序列化與解析核心模組

     編輯:Java 相關知識

Fire Workflow 模組的最後一部分 `org.fireflow.model.io` 專注於流程定義文件 (FPDL) 的序列化與解析。本文詳細剖析序列化器、解析器的雙重實現 (Dom4J/JAXP) 以及輔助工具類。

核心介面與實現

FPDLNames - 規範定義

定義 FPDL 的命名空間、元素名稱與屬性常數,是流程文件格式的規範基石。FPDL 基於 XPDL 擴展,詳細規範參見 官方文檔。

序列化體系

  • IFPDLSerializer:序列化介面,將 `WorkflowProcess` 物件輸出至 `OutputStream`
  • Dom4JFPDLSerializer:基於 Dom4J 實現,核心流程:
    1. `workflowProcessToDom()` 將流程物件轉為 DOM 文檔
    2. 配置 `OutputFormat` (縮排、UTF-8 編碼)
    3. `XMLWriter` 寫入輸出流
  • JAXP_FPDL_Serializer:基於 JAXP 實現,功能等同 Dom4J 版
public void serialize(WorkflowProcess workflowProcess, OutputStream out)
    throws IOException, FPDLSerializerException {
  Document document = workflowProcessToDom(workflowProcess);
  OutputFormat format = new OutputFormat(" ", true);
  format.setEncoding("UTF-8");
  XMLWriter writer = new XMLWriter(out, format);
  writer.write(document);
  out.flush();
}

解析體系

  • IFPDLParser:解析介面,將 XML 輸入流轉為 `WorkflowProcess` 物件
  • Dom4JFPDLParser:使用 `SAXReader` 解析,關鍵點:
    • 設定 `EntityResolver` 忽略外部 DTD (傳入空輸入流)
    • `parse(Document)` 遞迴處理 XML 元素,調用各類 `loadXxx()` 方法
    • `load` 方法內部呼叫對應的 `create` 方法建構領域物件
  • JAXP_FPDL_Parser:JAXP 實現版本
public WorkflowProcess parse(InputStream in) throws IOException, FPDLParserException {
  try {
    SAXReader reader = new SAXReader(new DocumentFactory());
    reader.setEntityResolver(new EntityResolver() {
      String emptyDtd = "";
      ByteArrayInputStream bytels = new ByteArrayInputStream(emptyDtd.getBytes());
      public InputSource resolveEntity(String publicId, String systemId) {
        return new InputSource(bytels);
      }
    });
    Document document = reader.read(in);
    return parse(document);
  } catch (DocumentException e) {
    throw new FPDLParserException("Error parsing document.", e);
  }
}

輔助工具與異常體系

類別用途
DateUtilities日期格式識別與解析,單例模式,支援 ISO8601、XPDL 等多種格式
MySigleton4DocumentFactoryDom4J DocumentFactory 單例策略實現
FPDLSerializerException / FPDLParserException序列化/解析專用異常,包裝底層錯誤
Util4Serializer / Util4JAXPSerializer序列化基礎元素操作封裝
Util4Parser / Util4JAXPParser解析基礎元素操作封裝

關鍵設計亮點

  1. 雙引擎支援:同時提供 Dom4J 與 JAXP 兩種 XML 處理實現,適應不同運行環境偏好
  2. 實體解析器隔離:自定義 `EntityResolver` 避免網路載入 DTD,提升解析穩定性與速度
  3. 單例模式優化:`DateUtilities`、`DocumentFactory` 採用單例減少物件創建開銷
  4. 擴展屬性保留:`ExtendedAttributeNames` 定義框架保留屬性名,避免與用戶自定義屬性衝突

至此 Fire Workflow Model 專案核心模組分析完畢,下一階段將進入 `FireflowEngine` 運行時服務剖析。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved