kimi
2020-05-27 c007f0ca1785db093d48f4846cda82fe8e955765
src/main/java/com/highdatas/mdm/process/canvas/ProcessDiagramGenerator.java
@@ -1,285 +1,285 @@
package com.highdatas.mdm.process.canvas;
import org.activiti.bpmn.model.*;
import org.activiti.bpmn.model.Process;
import org.activiti.image.impl.DefaultProcessDiagramCanvas;
import org.activiti.image.impl.DefaultProcessDiagramGenerator;
import java.util.Iterator;
import java.util.List;
public class ProcessDiagramGenerator extends DefaultProcessDiagramGenerator{
    @Override
    protected ProcessDiagramCanvas generateProcessDiagram(BpmnModel bpmnModel, String imageType, List<String> highLightedActivities, List<String> highLightedFlows, String activityFontName, String labelFontName,String annotationFontName,  ClassLoader customClassLoader, double scaleFactor){
      prepareBpmnModel(bpmnModel);
      ProcessDiagramCanvas processDiagramCanvas = initProcessDiagramCanvas(bpmnModel, imageType, activityFontName, labelFontName, customClassLoader);
      for (Pool pool : bpmnModel.getPools()) {
        GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(pool.getId());
        processDiagramCanvas.drawPoolOrLane(pool.getName(), graphicInfo);
      }
      Process process;
      for (Iterator<Process> iter = bpmnModel.getProcesses().iterator(); iter.hasNext(); ) {
       process = (Process)iter.next();
        for (Lane lane : process.getLanes()) {
          GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(lane.getId());
          processDiagramCanvas.drawPoolOrLane(lane.getName(), graphicInfo);
        }
      }
        List<Process> processes = bpmnModel.getProcesses();
        if (!processes.isEmpty()) {
            for (FlowNode flowNode : ((Process) bpmnModel.getProcesses().get(0)).findFlowElementsOfType(FlowNode.class)) {
                drawActivity(processDiagramCanvas, bpmnModel, flowNode, highLightedActivities, highLightedFlows, scaleFactor);
            }
        }
      for (Iterator<Process> iter = bpmnModel.getProcesses().iterator(); iter.hasNext(); ) { process = (Process)iter.next();
        for (Artifact artifact : process.getArtifacts()) {
          drawArtifact(processDiagramCanvas, bpmnModel, artifact);
        }
      }
      return processDiagramCanvas;
    }
    protected static ProcessDiagramCanvas initProcessDiagramCanvas(BpmnModel bpmnModel, String imageType, String activityFontName, String labelFontName, ClassLoader customClassLoader){
       double minX = 1.7976931348623157E+308D;
        double maxX = 0.0D;
        double minY = 1.7976931348623157E+308D;
        double maxY = 0.0D;
        for (Pool pool : bpmnModel.getPools()) {
          GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(pool.getId());
          minX = graphicInfo.getX();
          maxX = graphicInfo.getX() + graphicInfo.getWidth();
          minY = graphicInfo.getY();
          maxY = graphicInfo.getY() + graphicInfo.getHeight();
        }
        List<FlowNode> flowNodes = gatherAllFlowNodes(bpmnModel);
        for (FlowNode flowNode : flowNodes)
        {
          GraphicInfo flowNodeGraphicInfo = bpmnModel.getGraphicInfo(flowNode.getId());
          if (flowNodeGraphicInfo.getX() + flowNodeGraphicInfo.getWidth() > maxX) {
            maxX = flowNodeGraphicInfo.getX() + flowNodeGraphicInfo.getWidth();
          }
          if (flowNodeGraphicInfo.getX() < minX) {
            minX = flowNodeGraphicInfo.getX();
          }
          if (flowNodeGraphicInfo.getY() + flowNodeGraphicInfo.getHeight() > maxY) {
            maxY = flowNodeGraphicInfo.getY() + flowNodeGraphicInfo.getHeight();
          }
          if (flowNodeGraphicInfo.getY() < minY) {
            minY = flowNodeGraphicInfo.getY();
          }
          for (SequenceFlow sequenceFlow : flowNode.getOutgoingFlows()) {
            List<GraphicInfo> graphicInfoList = bpmnModel.getFlowLocationGraphicInfo(sequenceFlow.getId());
            if (graphicInfoList != null) {
              for (GraphicInfo graphicInfo : graphicInfoList)
              {
                if (graphicInfo.getX() > maxX) {
                  maxX = graphicInfo.getX();
                }
                if (graphicInfo.getX() < minX) {
                  minX = graphicInfo.getX();
                }
                if (graphicInfo.getY() > maxY) {
                  maxY = graphicInfo.getY();
                }
                if (graphicInfo.getY() < minY) {
                  minY = graphicInfo.getY();
                }
              }
            }
          }
        }
        GraphicInfo graphicInfo;
        List<Artifact> artifacts = gatherAllArtifacts(bpmnModel);
        for (Artifact artifact : artifacts)
        {
          GraphicInfo artifactGraphicInfo = bpmnModel.getGraphicInfo(artifact.getId());
          if (artifactGraphicInfo != null)
          {
            if (artifactGraphicInfo.getX() + artifactGraphicInfo.getWidth() > maxX) {
              maxX = artifactGraphicInfo.getX() + artifactGraphicInfo.getWidth();
            }
            if (artifactGraphicInfo.getX() < minX) {
              minX = artifactGraphicInfo.getX();
            }
            if (artifactGraphicInfo.getY() + artifactGraphicInfo.getHeight() > maxY) {
              maxY = artifactGraphicInfo.getY() + artifactGraphicInfo.getHeight();
            }
            if (artifactGraphicInfo.getY() < minY) {
              minY = artifactGraphicInfo.getY();
            }
          }
          List<GraphicInfo> graphicInfoList = bpmnModel.getFlowLocationGraphicInfo(artifact.getId());
          if (graphicInfoList != null) {
            for (Iterator<GraphicInfo> iterator = graphicInfoList.iterator(); iterator.hasNext(); ) { graphicInfo = (GraphicInfo)iterator.next();
              if (graphicInfo.getX() > maxX) {
                maxX = graphicInfo.getX();
              }
              if (graphicInfo.getX() < minX) {
                minX = graphicInfo.getX();
              }
              if (graphicInfo.getY() > maxY) {
                maxY = graphicInfo.getY();
              }
              if (graphicInfo.getY() < minY) {
                minY = graphicInfo.getY();
              }
            }
          }
        }
        int nrOfLanes = 0;
        for (Process process : bpmnModel.getProcesses()) {
          for (Lane l : process.getLanes())
          {
            ++nrOfLanes;
            graphicInfo = bpmnModel.getGraphicInfo(l.getId());
            if (graphicInfo.getX() + graphicInfo.getWidth() > maxX) {
              maxX = graphicInfo.getX() + graphicInfo.getWidth();
            }
            if (graphicInfo.getX() < minX) {
              minX = graphicInfo.getX();
            }
            if (graphicInfo.getY() + graphicInfo.getHeight() > maxY) {
              maxY = graphicInfo.getY() + graphicInfo.getHeight();
            }
            if (graphicInfo.getY() < minY) {
              minY = graphicInfo.getY();
            }
          }
        }
        if ((flowNodes.isEmpty()) && (bpmnModel.getPools().isEmpty()) && (nrOfLanes == 0))
        {
          minX = 0.0D;
          minY = 0.0D;
        }
        return  new ProcessDiagramCanvas((int) maxX + 10, (int) maxY + 10,
            (int) minX, (int) minY, imageType);
    }
    @Override
    protected void drawActivity(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode, List<String> highLightedActivities, List<String> highLightedFlows, double scaleFactor){
        ActivityDrawInstruction drawInstruction = (ActivityDrawInstruction)this.activityDrawInstructions.get(flowNode.getClass());
        if (drawInstruction != null)
        {
          drawInstruction.draw(processDiagramCanvas, bpmnModel, flowNode);
          boolean multiInstanceSequential = false; boolean multiInstanceParallel = false; boolean collapsed = false;
          if (flowNode instanceof Activity) {
            Activity activity = (Activity)flowNode;
            MultiInstanceLoopCharacteristics multiInstanceLoopCharacteristics = activity.getLoopCharacteristics();
            if (multiInstanceLoopCharacteristics != null) {
              multiInstanceSequential = multiInstanceLoopCharacteristics.isSequential();
              multiInstanceParallel = !(multiInstanceSequential);
            }
          }
          GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId());
          if (flowNode instanceof SubProcess)
            collapsed = (graphicInfo.getExpanded() != null) && (!(graphicInfo.getExpanded().booleanValue()));
          else if (flowNode instanceof CallActivity) {
            collapsed = true;
          }
          if (scaleFactor == 1.0D)
        {
            processDiagramCanvas.drawActivityMarkers((int)graphicInfo.getX(), (int)graphicInfo.getY(), (int)graphicInfo.getWidth(), (int)graphicInfo.getHeight(), multiInstanceSequential, multiInstanceParallel, collapsed);
        }
            if (highLightedActivities != null && highLightedActivities.contains(flowNode.getId())) {
                processDiagramCanvas.drawHighLight((int)graphicInfo.getX(), (int)graphicInfo.getY(), (int)graphicInfo.getWidth(), (int)graphicInfo.getHeight());
            }
        }
        for (SequenceFlow sequenceFlow : flowNode.getOutgoingFlows()) {
            boolean highLighted = false;
            if (highLightedFlows != null) {
                highLighted = highLightedFlows.contains(sequenceFlow.getId());
            }
              String defaultFlow = null;
              if (flowNode instanceof Activity)
                defaultFlow = ((Activity)flowNode).getDefaultFlow();
              else if (flowNode instanceof Gateway) {
                defaultFlow = ((Gateway)flowNode).getDefaultFlow();
              }
              boolean isDefault = false;
              if ((defaultFlow != null) && (defaultFlow.equalsIgnoreCase(sequenceFlow.getId()))) {
                isDefault = true;
              }
              boolean drawConditionalIndicator = (sequenceFlow.getConditionExpression() != null) && (!(flowNode instanceof Gateway));
              String sourceRef = sequenceFlow.getSourceRef();
              String targetRef = sequenceFlow.getTargetRef();
              FlowElement sourceElement = bpmnModel.getFlowElement(sourceRef);
              FlowElement targetElement = bpmnModel.getFlowElement(targetRef);
              List graphicInfoList = bpmnModel.getFlowLocationGraphicInfo(sequenceFlow.getId());
              if ((graphicInfoList != null) && (graphicInfoList.size() > 0)) {
                graphicInfoList = connectionPerfectionizer(processDiagramCanvas, bpmnModel, sourceElement, targetElement, graphicInfoList);
                int[] xPoints = new int[graphicInfoList.size()];
                int[] yPoints = new int[graphicInfoList.size()];
                for (int i = 1; i < graphicInfoList.size(); ++i) {
                  GraphicInfo graphicInfo = (GraphicInfo)graphicInfoList.get(i);
                  GraphicInfo previousGraphicInfo = (GraphicInfo)graphicInfoList.get(i - 1);
                  if (i == 1) {
                    xPoints[0] = (int)previousGraphicInfo.getX();
                    yPoints[0] = (int)previousGraphicInfo.getY();
                  }
                  xPoints[i] = (int)graphicInfo.getX();
                  yPoints[i] = (int)graphicInfo.getY();
                }
                processDiagramCanvas.drawSequenceflow(xPoints, yPoints, drawConditionalIndicator, isDefault, highLighted, scaleFactor);
                GraphicInfo labelGraphicInfo = bpmnModel.getLabelGraphicInfo(sequenceFlow.getId());
                if (labelGraphicInfo != null) {
                  processDiagramCanvas.drawLabel(sequenceFlow.getName(), labelGraphicInfo, false);
                }
                else {
                    GraphicInfo lineCenter = getLineCenter(graphicInfoList);
                    processDiagramCanvas.drawLabel(sequenceFlow.getName(), lineCenter, false);
                }
          }
    }
     if (flowNode instanceof FlowElementsContainer)
       for (FlowElement nestedFlowElement : ((FlowElementsContainer)flowNode).getFlowElements())
         if (nestedFlowElement instanceof FlowNode)
           drawActivity(processDiagramCanvas, bpmnModel, (FlowNode)nestedFlowElement, highLightedActivities, highLightedFlows, scaleFactor);
    }
}
package com.highdatas.mdm.process.canvas;
import org.activiti.bpmn.model.*;
import org.activiti.bpmn.model.Process;
import org.activiti.image.impl.DefaultProcessDiagramCanvas;
import org.activiti.image.impl.DefaultProcessDiagramGenerator;
import java.util.Iterator;
import java.util.List;
public class ProcessDiagramGenerator extends DefaultProcessDiagramGenerator{
    @Override
    protected ProcessDiagramCanvas generateProcessDiagram(BpmnModel bpmnModel, String imageType, List<String> highLightedActivities, List<String> highLightedFlows, String activityFontName, String labelFontName,String annotationFontName,  ClassLoader customClassLoader, double scaleFactor){
      prepareBpmnModel(bpmnModel);
      ProcessDiagramCanvas processDiagramCanvas = initProcessDiagramCanvas(bpmnModel, imageType, activityFontName, labelFontName, customClassLoader);
      for (Pool pool : bpmnModel.getPools()) {
        GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(pool.getId());
        processDiagramCanvas.drawPoolOrLane(pool.getName(), graphicInfo);
      }
      Process process;
      for (Iterator<Process> iter = bpmnModel.getProcesses().iterator(); iter.hasNext(); ) {
       process = (Process)iter.next();
        for (Lane lane : process.getLanes()) {
          GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(lane.getId());
          processDiagramCanvas.drawPoolOrLane(lane.getName(), graphicInfo);
        }
      }
        List<Process> processes = bpmnModel.getProcesses();
        if (!processes.isEmpty()) {
            for (FlowNode flowNode : ((Process) bpmnModel.getProcesses().get(0)).findFlowElementsOfType(FlowNode.class)) {
                drawActivity(processDiagramCanvas, bpmnModel, flowNode, highLightedActivities, highLightedFlows, scaleFactor);
            }
        }
      for (Iterator<Process> iter = bpmnModel.getProcesses().iterator(); iter.hasNext(); ) { process = (Process)iter.next();
        for (Artifact artifact : process.getArtifacts()) {
          drawArtifact(processDiagramCanvas, bpmnModel, artifact);
        }
      }
      return processDiagramCanvas;
    }
    protected static ProcessDiagramCanvas initProcessDiagramCanvas(BpmnModel bpmnModel, String imageType, String activityFontName, String labelFontName, ClassLoader customClassLoader){
       double minX = 1.7976931348623157E+308D;
        double maxX = 0.0D;
        double minY = 1.7976931348623157E+308D;
        double maxY = 0.0D;
        for (Pool pool : bpmnModel.getPools()) {
          GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(pool.getId());
          minX = graphicInfo.getX();
          maxX = graphicInfo.getX() + graphicInfo.getWidth();
          minY = graphicInfo.getY();
          maxY = graphicInfo.getY() + graphicInfo.getHeight();
        }
        List<FlowNode> flowNodes = gatherAllFlowNodes(bpmnModel);
        for (FlowNode flowNode : flowNodes)
        {
          GraphicInfo flowNodeGraphicInfo = bpmnModel.getGraphicInfo(flowNode.getId());
          if (flowNodeGraphicInfo.getX() + flowNodeGraphicInfo.getWidth() > maxX) {
            maxX = flowNodeGraphicInfo.getX() + flowNodeGraphicInfo.getWidth();
          }
          if (flowNodeGraphicInfo.getX() < minX) {
            minX = flowNodeGraphicInfo.getX();
          }
          if (flowNodeGraphicInfo.getY() + flowNodeGraphicInfo.getHeight() > maxY) {
            maxY = flowNodeGraphicInfo.getY() + flowNodeGraphicInfo.getHeight();
          }
          if (flowNodeGraphicInfo.getY() < minY) {
            minY = flowNodeGraphicInfo.getY();
          }
          for (SequenceFlow sequenceFlow : flowNode.getOutgoingFlows()) {
            List<GraphicInfo> graphicInfoList = bpmnModel.getFlowLocationGraphicInfo(sequenceFlow.getId());
            if (graphicInfoList != null) {
              for (GraphicInfo graphicInfo : graphicInfoList)
              {
                if (graphicInfo.getX() > maxX) {
                  maxX = graphicInfo.getX();
                }
                if (graphicInfo.getX() < minX) {
                  minX = graphicInfo.getX();
                }
                if (graphicInfo.getY() > maxY) {
                  maxY = graphicInfo.getY();
                }
                if (graphicInfo.getY() < minY) {
                  minY = graphicInfo.getY();
                }
              }
            }
          }
        }
        GraphicInfo graphicInfo;
        List<Artifact> artifacts = gatherAllArtifacts(bpmnModel);
        for (Artifact artifact : artifacts)
        {
          GraphicInfo artifactGraphicInfo = bpmnModel.getGraphicInfo(artifact.getId());
          if (artifactGraphicInfo != null)
          {
            if (artifactGraphicInfo.getX() + artifactGraphicInfo.getWidth() > maxX) {
              maxX = artifactGraphicInfo.getX() + artifactGraphicInfo.getWidth();
            }
            if (artifactGraphicInfo.getX() < minX) {
              minX = artifactGraphicInfo.getX();
            }
            if (artifactGraphicInfo.getY() + artifactGraphicInfo.getHeight() > maxY) {
              maxY = artifactGraphicInfo.getY() + artifactGraphicInfo.getHeight();
            }
            if (artifactGraphicInfo.getY() < minY) {
              minY = artifactGraphicInfo.getY();
            }
          }
          List<GraphicInfo> graphicInfoList = bpmnModel.getFlowLocationGraphicInfo(artifact.getId());
          if (graphicInfoList != null) {
            for (Iterator<GraphicInfo> iterator = graphicInfoList.iterator(); iterator.hasNext(); ) { graphicInfo = (GraphicInfo)iterator.next();
              if (graphicInfo.getX() > maxX) {
                maxX = graphicInfo.getX();
              }
              if (graphicInfo.getX() < minX) {
                minX = graphicInfo.getX();
              }
              if (graphicInfo.getY() > maxY) {
                maxY = graphicInfo.getY();
              }
              if (graphicInfo.getY() < minY) {
                minY = graphicInfo.getY();
              }
            }
          }
        }
        int nrOfLanes = 0;
        for (Process process : bpmnModel.getProcesses()) {
          for (Lane l : process.getLanes())
          {
            ++nrOfLanes;
            graphicInfo = bpmnModel.getGraphicInfo(l.getId());
            if (graphicInfo.getX() + graphicInfo.getWidth() > maxX) {
              maxX = graphicInfo.getX() + graphicInfo.getWidth();
            }
            if (graphicInfo.getX() < minX) {
              minX = graphicInfo.getX();
            }
            if (graphicInfo.getY() + graphicInfo.getHeight() > maxY) {
              maxY = graphicInfo.getY() + graphicInfo.getHeight();
            }
            if (graphicInfo.getY() < minY) {
              minY = graphicInfo.getY();
            }
          }
        }
        if ((flowNodes.isEmpty()) && (bpmnModel.getPools().isEmpty()) && (nrOfLanes == 0))
        {
          minX = 0.0D;
          minY = 0.0D;
        }
        return  new ProcessDiagramCanvas((int) maxX + 10, (int) maxY + 10,
            (int) minX, (int) minY, imageType);
    }
    @Override
    protected void drawActivity(DefaultProcessDiagramCanvas processDiagramCanvas, BpmnModel bpmnModel, FlowNode flowNode, List<String> highLightedActivities, List<String> highLightedFlows, double scaleFactor){
        ActivityDrawInstruction drawInstruction = (ActivityDrawInstruction)this.activityDrawInstructions.get(flowNode.getClass());
        if (drawInstruction != null)
        {
          drawInstruction.draw(processDiagramCanvas, bpmnModel, flowNode);
          boolean multiInstanceSequential = false; boolean multiInstanceParallel = false; boolean collapsed = false;
          if (flowNode instanceof Activity) {
            Activity activity = (Activity)flowNode;
            MultiInstanceLoopCharacteristics multiInstanceLoopCharacteristics = activity.getLoopCharacteristics();
            if (multiInstanceLoopCharacteristics != null) {
              multiInstanceSequential = multiInstanceLoopCharacteristics.isSequential();
              multiInstanceParallel = !(multiInstanceSequential);
            }
          }
          GraphicInfo graphicInfo = bpmnModel.getGraphicInfo(flowNode.getId());
          if (flowNode instanceof SubProcess)
            collapsed = (graphicInfo.getExpanded() != null) && (!(graphicInfo.getExpanded().booleanValue()));
          else if (flowNode instanceof CallActivity) {
            collapsed = true;
          }
          if (scaleFactor == 1.0D)
        {
            processDiagramCanvas.drawActivityMarkers((int)graphicInfo.getX(), (int)graphicInfo.getY(), (int)graphicInfo.getWidth(), (int)graphicInfo.getHeight(), multiInstanceSequential, multiInstanceParallel, collapsed);
        }
            if (highLightedActivities != null && highLightedActivities.contains(flowNode.getId())) {
                processDiagramCanvas.drawHighLight((int)graphicInfo.getX(), (int)graphicInfo.getY(), (int)graphicInfo.getWidth(), (int)graphicInfo.getHeight());
            }
        }
        for (SequenceFlow sequenceFlow : flowNode.getOutgoingFlows()) {
            boolean highLighted = false;
            if (highLightedFlows != null) {
                highLighted = highLightedFlows.contains(sequenceFlow.getId());
            }
              String defaultFlow = null;
              if (flowNode instanceof Activity)
                defaultFlow = ((Activity)flowNode).getDefaultFlow();
              else if (flowNode instanceof Gateway) {
                defaultFlow = ((Gateway)flowNode).getDefaultFlow();
              }
              boolean isDefault = false;
              if ((defaultFlow != null) && (defaultFlow.equalsIgnoreCase(sequenceFlow.getId()))) {
                isDefault = true;
              }
              boolean drawConditionalIndicator = (sequenceFlow.getConditionExpression() != null) && (!(flowNode instanceof Gateway));
              String sourceRef = sequenceFlow.getSourceRef();
              String targetRef = sequenceFlow.getTargetRef();
              FlowElement sourceElement = bpmnModel.getFlowElement(sourceRef);
              FlowElement targetElement = bpmnModel.getFlowElement(targetRef);
              List graphicInfoList = bpmnModel.getFlowLocationGraphicInfo(sequenceFlow.getId());
              if ((graphicInfoList != null) && (graphicInfoList.size() > 0)) {
                graphicInfoList = connectionPerfectionizer(processDiagramCanvas, bpmnModel, sourceElement, targetElement, graphicInfoList);
                int[] xPoints = new int[graphicInfoList.size()];
                int[] yPoints = new int[graphicInfoList.size()];
                for (int i = 1; i < graphicInfoList.size(); ++i) {
                  GraphicInfo graphicInfo = (GraphicInfo)graphicInfoList.get(i);
                  GraphicInfo previousGraphicInfo = (GraphicInfo)graphicInfoList.get(i - 1);
                  if (i == 1) {
                    xPoints[0] = (int)previousGraphicInfo.getX();
                    yPoints[0] = (int)previousGraphicInfo.getY();
                  }
                  xPoints[i] = (int)graphicInfo.getX();
                  yPoints[i] = (int)graphicInfo.getY();
                }
                processDiagramCanvas.drawSequenceflow(xPoints, yPoints, drawConditionalIndicator, isDefault, highLighted, scaleFactor);
                GraphicInfo labelGraphicInfo = bpmnModel.getLabelGraphicInfo(sequenceFlow.getId());
                if (labelGraphicInfo != null) {
                  processDiagramCanvas.drawLabel(sequenceFlow.getName(), labelGraphicInfo, false);
                }
                else {
                    GraphicInfo lineCenter = getLineCenter(graphicInfoList);
                    processDiagramCanvas.drawLabel(sequenceFlow.getName(), lineCenter, false);
                }
          }
    }
     if (flowNode instanceof FlowElementsContainer)
       for (FlowElement nestedFlowElement : ((FlowElementsContainer)flowNode).getFlowElements())
         if (nestedFlowElement instanceof FlowNode)
           drawActivity(processDiagramCanvas, bpmnModel, (FlowNode)nestedFlowElement, highLightedActivities, highLightedFlows, scaleFactor);
    }
}