activiti5學習資料11(流程任務高亮顯示) – JAVA編程語言程序開發技術文章

activiti5學習資料11(流程任務高亮顯示)
我們先來看效果圖,高亮的紅色部分代表正在處理中的任務,已經完成的任務我用高亮的綠色來表示:
 

Activiti提供瞭畫流程圖的實現,當我們部署一個流程文件的時候,相應的流程圖就會自動部署到數據庫裡面。我們可以通過Activiti 提供的 API檢索出來。
 
翻閱Activiti的source code,我們看到在org.activiti.engine.impl.bpmn.deployer.BpmnDeployer的deploy() 方法有那麼一段:
[java] 
………… 
for (ProcessDefinitionEntity processDefinition: bpmnParse.getProcessDefinitions()) { 
         processDefinition.setResourceName(resourceName); 
          
         String diagramResourceName = getDiagramResourceForProcess(resourceName, processDefinition.getKey(), resources); 
         if (diagramResourceName==null && processDefinition.isGraphicalNotationDefined()) { 
           try { 
             byte[] diagramBytes = IoUtil.readInputStream(ProcessDiagramGenerator.generatePngDiagram(processDefinition), null); 
             diagramResourceName = getProcessImageResourceName(resourceName, processDefinition.getKey(), "png"); 
             createResource(diagramResourceName, diagramBytes, deployment); 
           } catch (Exception e) { // if anything goes wrong, we don't store the image (the process will still be executable). 
             LOG.log(Level.WARNING, "Error while generating process diagram, image will not be stored in repository", e); 
           } 
         }  
…….. 
byte[] diagramBytes = IoUtil.readInputStream(ProcessDiagramGenerator.generatePngDiagram(processDefinition), null); 表明瞭當流程圖的DI信息存在時,就會去調用 ProcessDiagramGenerator.generatePngDiagram() 生成相應的流程圖,並部署到數據庫中.
 
ProcessDiagramGenerator.generatePngDiagram()生成流程圖的流程大概是以下幾步:
 
1.根據解析出來的流程DI信息,計算出畫佈的大小,即如果最靠右的組件x坐標是300,最靠底部的組件y坐標是400,那麼就生成一個310*410的畫佈,保證瞭畫佈能夠容納整幅流程圖的組件。
 
2.根據流程DI信息各個組件的類型,調用相應的渲染方法,在畫佈上畫圖。
 
3.此時,流程圖畫完瞭,但是左上部分可能會有很多空白的位置,所以根據流程DI信息,計算出最近左邊的組件的x坐標和頂部的組件的y坐標,然後做一個裁剪,使輸出的流程圖大小剛剛好。
 
瞭解瞭Activiti畫圖的過程,我們在流程圖上加工畫高亮就容易多瞭,步驟如下,
 
1.檢索出流程圖原圖。
 
2.解析流程DI信息。
 
3.由於上面畫圖的第三步做瞭個裁剪的操作,DI的坐標信息已經不對瞭,實際的x,y坐標會比DI上的要小瞭,但我們可以根據DI計算出minX,和minY,從而相減計算出真實的坐標。
 
4.加載流程的歷史數據
 
5.根據歷史數據和相應的DI坐標信息,利用java 2D畫圖。
 
在實際應用中,相同的流程,前3步隻需要操作一次就夠瞭,第二次就可以直接共享瞭,沒必要浪費系統資源。
所以可以用一個很簡單的LRU Map (least recently used Map)來緩存流程圖的信息,每次隻需要在圖上加工就可以瞭。

[java] 
public class LRUMap<K, V> extends LinkedHashMap<K, V> { 
 
    private static final long serialVersionUID = -348656573172586525L; 
 
    private final int maxCapacity; 
 
    private static final float DEFAULT_LOAD_FACTOR = 0.75f; 
 
    private Entry<K, V> eldestEntry; 
 
    public LRUMap(int maxCapacity) { 
        super(maxCapacity, DEFAULT_LOAD_FACTOR, true); 
        this.maxCapacity = maxCapacity; 
    } 
 
    @Override 
    protected boolean removeEldestEntry(Entry<K, V> eldest) { 
        boolean remove = size() > maxCapacity; 
        if (remove) { 
            this.eldestEntry = eldest; 
        } 
        return remove; 
    } 
 
    public Entry<K, V> getEldestEntry() { 
        return eldestEntry; 
    } 
 

發佈留言