package sushi.bpmn.decomposition;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import sushi.bpmn.element.AbstractBPMNElement;
import sushi.bpmn.element.BPMNEndEvent;
import sushi.bpmn.element.BPMNProcess;
import sushi.bpmn.element.BPMNStartEvent;
import sushi.bpmn.element.BPMNXORGateway;
public class BPMNProcessPreprocessor {
/**
* Tries to adapt parts of the BPMN process for a processing with the RPST.
* @param process
* @return
*/
public static BPMNProcess structureProcess(BPMNProcess process) {
mergeStartEvents(process);
mergeEndEvents(process);
return process;
}
/**
* Creates one start event for the process, if there is more than one.
* @param process
*/
private static void mergeStartEvents(BPMNProcess process) {
//TODO: Was ist, wenn StartEvent MonitoringPoints hat
if(process.getStartEvents().size() > 1){
BPMNStartEvent newStartEvent = new BPMNStartEvent("Start1", "MergedStartEvent", null);
List<BPMNStartEvent> startEvents = new ArrayList<BPMNStartEvent>(process.getStartEvents());
for(BPMNStartEvent startEvent : startEvents){
for(AbstractBPMNElement successor : startEvent.getSuccessors()){
AbstractBPMNElement.disconnectElements(startEvent, successor);
AbstractBPMNElement.connectElements(newStartEvent, successor);
}
process.removeBPMNElement(startEvent);
}
process.addBPMNElement(newStartEvent);
}
}
/**
* Creates one end event for the process, if there is more than one.
* The old events are removed and all predecessors of old end events are
* joined in one XOR-Gateway and a succeding new end event.
* @param process
*/
private static void mergeEndEvents(BPMNProcess process) {
//TODO: MonitoringPoints der EndEvents in neues EndEvent übernehmen
//Eigentlich müsste man die alten EndEvents mit XOR --> alte EndEvents --> XOR --> neues EndEvent zusammenführen,
//um nicht die Information über die MonitoringPoints zu verlieren
if(process.getEndEvents().size() > 1){
BPMNEndEvent newEndEvent = new BPMNEndEvent("End1", "MergedEndEvent", null);
BPMNXORGateway mergingXOR = new BPMNXORGateway("MergingXOR" + new Date().getTime(), "MergeXORBeforeEndEvent", null);
List<BPMNEndEvent> endEvents = new ArrayList<BPMNEndEvent>(process.getEndEvents());
for(BPMNEndEvent endEvent : endEvents){
for(AbstractBPMNElement predecessor : endEvent.getPredecessors()){
AbstractBPMNElement.disconnectElements(predecessor, endEvent);
AbstractBPMNElement.connectElements(predecessor, mergingXOR);
}
process.removeBPMNElement(endEvent);
}
process.addBPMNElement(mergingXOR);
process.addBPMNElement(newEndEvent);
AbstractBPMNElement.connectElements(mergingXOR, newEndEvent);
}
}
}