jBPM-Side 是基於 Eclipse GEF (Graphical Editing Framework) 的流程設計器,採用經典 Model-View-Controller 架構,實現 XML 流程定義的可視化編輯。本文剖析其代碼結構、核心組件交互、GEF 整合細節及擴展點。
| 層級 | 套件 | 核心職責 |
|---|---|---|
| XML 框架 | org.jbpmside.xml | E4X + Binding 解析/序列化 XML ↔ Model,每節點類型對應一個 Binding |
| Model 模型層 | org.jbpmside.model | 領域模型:ProcessModel, NodeModel, ConnectionModel 及具體節點類型(StartNode, TaskNode...) |
| View 視圖層 | org.jbpmside.view.component | GEF 視圖組件:SurfaceComponent(畫布), NodeComponent, ConnectionComponent 及具體節點渲染 |
| Controller/GEF 整合 | org.jbpmside.editpart | IGraphicalEditor, IEditPart, Tool, Command 體系,串聯 Model-View |
| 全域狀態 | TheModel | 單例:事件總線、工具欄狀態、剪貼板、跨 Tab 複製貼上 |
| 應用殼 | ProcessDesigner, ProcessEditor | 佈局(菜單、工具欄、TabNavigator)、入口、鍵盤/工具欄事件統一分發 |
ProcessModel:流程定義根節點NodeModel / ConnectionModel:節點/連線基類StartNode, EndNode, ForkNode, JoinNode, TaskNode...org.jbpmside.model.common,jPDL 4 支援在 org.jbpmside.model.jpdl4。SurfaceComponent:畫布容器,繼承 GraphicViewerNodeComponent / ConnectionComponent:節點/連線視圖,繼承 GraphicEditPartIGraphicalEditor:全域編輯器介面,getGraphicViewer() 返回當前活躍 Tab 的畫布。IEditPart:單個圖形編輯元素,核心 getModel()/setModel() 綁定 Model 物件。GraphicViewer→SurfaceComponent,GraphicEditPart→NodeComponent/ConnectionComponent。原生滑鼠/鍵盤事件不直接在 Component 處理,而是委派給 Tool:
// SurfaceComponent 滑鼠點擊
public function mouseClickHandler(event:MouseEvent):void {
this.tool.mouseClick(event, compX, compY);
}
ToolManager(SurfaceToolsManager/NodeToolsManager/ConnectionToolsManager)管理 Tool 切換策略(如選中工具欄「建立節點」後,點擊畫布改為新增節點而非選取)。Tool 無狀態、全域單例。
Command 執行。CommandService 與 SurfaceComponent 1:1 綁定,持有 CommandStack 實現 Undo/Redo。public function parse(xml:String):ProcessDefinition {
var parser:Parser = new Parser();
return parser.createParse().setString(xml).execute().getProcessDefinition();
}
test/ 目錄,為專案唯一單元測試覆蓋區。org.jbpmside.model.common 統一介面GEF 的 Model-View 分離與 Command 體系,讓 jBPM-Side 擁有清晰擴展點,支援複雜流程編輯場景的長期演進。