最近一大堆亂七八糟的事情,今天把 org.fireflow.model.io這個包給介紹完,那麼Fire Workflow的 Model項目算是完成了。
主要分兩大塊:序列化和解析。
FPDLNames:這個類定義了FPDL的元素和規范。包括命名空間裡面的基本元素,本類決定流程文件的格 式和規范,由於元素太多,這裡不一一展示了。FPDL基本是對XPDL的擴展,詳細內容可以參見 http://www.fireflow.org/viewthread.php?tid=68&extra=page%3D1。
IFPDLSerializer: FPDL序列化器。將WorkflowProcess對象序列化到一個輸出流。
Dom4JFPDLSerializer: 實現IFPDLSerializer接口。用Dom4J實現。
DEFAULT_XPDL_VERSION和DEFAULT_VENDOR分別表示默認版本和提供者,目前發現沒有什麼用……
對於實現的Serializer(),源代碼如下:
1public void serialize(WorkflowProcess workflowProcess, OutputStream out)
2 throws IOException, FPDLSerializerException {
3//首先調用workflowProcessToDom()方法。此方法將流程文件解析,並返回一個Dom文檔。
4 Document document = workflowProcessToDom(workflowProcess);
5
6 OutputFormat format = new OutputFormat(" ", true);
7 format.setEncoding("UTF-8");
8//調用XMLWriter()方法,將文檔寫入到輸入流
9 XMLWriter writer = new XMLWriter(out, format);
10
11 writer.write(document);
12 out.flush();
13 }
14
workflowProcessToXMLString():將流程文件輸出到一個String。
其他的Write方法都是在XMLWriter()中使用的,分別處理FPDL流程文件中的不同元素。
JAXP_FPDL_Serializer: 實現IFPDLSerializer接口。用JAXP實現,功能和前者完全一致。
IFPDLParser: FPDL解析器,將一個xml格式的fpdl流程定義文件解析成WorkflowProcess對象。
Dom4JFPDLParser: 實現IFPDLParser接口,用Dom4J實現。
parse()的代碼如下:
1public WorkflowProcess parse(InputStream in) throws IOException,
2 FPDLParserException {
3 try {
4 SAXReader reader = new SAXReader(new DocumentFactory ());
5 reader.setEntityResolver(new EntityResolver() {
6//實現EntityResolver()接口
7 String emptyDtd = "";
8 ByteArrayInputStream bytels = new ByteArrayInputStream(emptyDtd.getBytes());
9
10 public InputSource resolveEntity(String publicId,
11 String systemId) throws SAXException, IOException {
12 return new InputSource(bytels);
13 }
14 });
15 //讀入流程文件
16 Document document = reader.read(in);
17 //調用parse(Document)方法進行解析,裡面是一堆xml文件解析,不再詳述,其中//調用 了各種load方法,而load方法中又調用了各自的create方法。
18 WorkflowProcess wp = parse(document);//解析
19 return wp;
20 } catch (DocumentException e) {
21 e.printStackTrace();
22 throw new FPDLParserException("Error parsing document.", e);
23 } finally {
24 }
25 }
26
JAXP_FPDL_Parser: 實現IFPDLParser接口,用JAXP實現。不詳述。
DateUtilities: 關於識別各種日期格式的類。
dateUtilities:這裡用了單件模式,調用getInstance()來獲得對象實例。
formats:存儲各種日期格式,格式有:
"yyyy-MM-dd'T'HH:mm:ss'Z'"
"yyyy-MM-dd'T'HH:mm:ssZ"
"yyyy-MM-dd'T'HH:mm:ssz"
// XPDL examples format
"MM/dd/yyyy HH:mm:ss a"
// alternative formats
"yyyy-MM-dd HH:mm:ss"
構造函數DateUtilities()調用了resetFormats()來重置formats。
parse()方法將字符串轉化為日期格式。
MySigleton4DocumentFactory: 是對org.dom4j.util.SingletonStrategy接口的簡單實現,返回一個 DocumentFactory,配合單件用的。
FPDLSerializerException: 繼承了Exception類,四個重載的構造函數調用的都是父類的方法。
FPDLParserException: 同FPDLSerializerException。
Util4Serializer: 為序列化流程提供基本的元素操作。用Dom4J實現。
Util4JAXPSerializer: 同Util4Serializer,用JAXP實現。
Util4Parser: 為流程文件的解析提供基本的元素操作,用Dom4J實現。
Util4JAXPParser: 同Util4Parser,用JAXP實現。
下次開始講Fire Workflow的另一個項目文件FireflowEngine。