package org.activiti.crystalball.diagram.svg;
import org.activiti.engine.impl.bpmn.diagram.ProcessDiagramCanvas;
import org.activiti.engine.impl.bpmn.diagram.ProcessDiagramGenerator;
import org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity;
import org.activiti.engine.impl.pvm.PvmTransition;
import org.activiti.engine.impl.pvm.process.*;
import java.io.InputStream;
import java.util.Collections;
import java.util.List;
/**
*/
public class SVGProcessDiagramGenerator extends ProcessDiagramGenerator {
public static InputStream generateDiagram(ProcessDefinitionEntity processDefinition, String imageType, List<String> highLightedActivities) {
return generateDiagram(processDefinition, highLightedActivities, Collections.<String> emptyList()).generateImage(imageType);
}
public static InputStream generateDiagram(ProcessDefinitionEntity processDefinition, String imageType, List<String> highLightedActivities, List<String> highLightedFlows) {
return generateDiagram(processDefinition, highLightedActivities, highLightedFlows).generateImage(imageType);
}
protected static ProcessDiagramCanvas generateDiagram(ProcessDefinitionEntity processDefinition, List<String> highLightedActivities, List<String> highLightedFlows) {
ProcessDiagramCanvas processDiagramCanvas = initProcessDiagramCanvas(processDefinition);
// Draw pool shape, if process is participant in collaboration
if(processDefinition.getParticipantProcess() != null) {
ParticipantProcess pProc = processDefinition.getParticipantProcess();
processDiagramCanvas.drawPoolOrLane(pProc.getName(), pProc.getX(), pProc.getY(), pProc.getWidth(), pProc.getHeight());
}
// Draw lanes
if(processDefinition.getLaneSets() != null && processDefinition.getLaneSets().size() > 0) {
for(LaneSet laneSet : processDefinition.getLaneSets()) {
if(laneSet.getLanes() != null && laneSet.getLanes().size() > 0) {
for(Lane lane : laneSet.getLanes()) {
processDiagramCanvas.drawPoolOrLane(lane.getName(), lane.getX(), lane.getY(), lane.getWidth(), lane.getHeight());
}
}
}
}
// Draw activities and their sequence-flows
for (ActivityImpl activity : processDefinition.getActivities()) {
drawActivity(processDiagramCanvas, activity, highLightedActivities, highLightedFlows);
}
return processDiagramCanvas;
}
protected static ProcessDiagramCanvas initProcessDiagramCanvas(ProcessDefinitionEntity processDefinition) {
int minX = Integer.MAX_VALUE;
int maxX = 0;
int minY = Integer.MAX_VALUE;
int maxY = 0;
if(processDefinition.getParticipantProcess() != null) {
ParticipantProcess pProc = processDefinition.getParticipantProcess();
minX = pProc.getX();
maxX = pProc.getX() + pProc.getWidth();
minY = pProc.getY();
maxY = pProc.getY() + pProc.getHeight();
}
for (ActivityImpl activity : processDefinition.getActivities()) {
// width
if (activity.getX() + activity.getWidth() > maxX) {
maxX = activity.getX() + activity.getWidth();
}
if (activity.getX() < minX) {
minX = activity.getX();
}
// height
if (activity.getY() + activity.getHeight() > maxY) {
maxY = activity.getY() + activity.getHeight();
}
if (activity.getY() < minY) {
minY = activity.getY();
}
for (PvmTransition sequenceFlow : activity.getOutgoingTransitions()) {
List<Integer> waypoints = ((TransitionImpl) sequenceFlow).getWaypoints();
for (int i = 0; i < waypoints.size(); i += 2) {
// width
if (waypoints.get(i) > maxX) {
maxX = waypoints.get(i);
}
if (waypoints.get(i) < minX) {
minX = waypoints.get(i);
}
// height
if (waypoints.get(i + 1) > maxY) {
maxY = waypoints.get(i + 1);
}
if (waypoints.get(i + 1) < minY) {
minY = waypoints.get(i + 1);
}
}
}
}
if(processDefinition.getLaneSets() != null && processDefinition.getLaneSets().size() > 0) {
for(LaneSet laneSet : processDefinition.getLaneSets()) {
if(laneSet.getLanes() != null && laneSet.getLanes().size() > 0) {
for(Lane lane : laneSet.getLanes()) {
// width
if (lane.getX() + lane.getWidth() > maxX) {
maxX = lane.getX() + lane.getWidth();
}
if (lane.getX() < minX) {
minX = lane.getX();
}
// height
if (lane.getY() + lane.getHeight() > maxY) {
maxY = lane.getY() + lane.getHeight();
}
if (lane.getY() < minY) {
minY = lane.getY();
}
}
}
}
}
// Special case, see http://jira.codehaus.org/browse/ACT-1431
if ( (processDefinition.getActivities() == null || processDefinition.getActivities().size() == 0)
&& (processDefinition.getLaneSets() == null || processDefinition.getLaneSets().size() == 0)) {
// Nothing to show
minX = 0;
minY = 0;
}
return new SVGProcessDiagramCanvas(maxX + 10, maxY + 10, minX, minY);
}
}