use of de.hpi.bpt.scylla.exception.ScyllaRuntimeException in project scylla by bptlab.
the class SubprocessTBPlugin method eventRoutine.
@Override
public void eventRoutine(TaskBeginEvent desmojEvent, ProcessInstance processInstance) throws ScyllaRuntimeException {
ProcessModel processModel = processInstance.getProcessModel();
int nodeId = desmojEvent.getNodeId();
ProcessModel subProcess = processModel.getSubProcesses().get(nodeId);
if (subProcess != null) {
int indexOfTaskTerminateEvent = 0;
desmojEvent.getTimeSpanToNextEventMap().remove(indexOfTaskTerminateEvent);
TaskTerminateEvent event = (TaskTerminateEvent) desmojEvent.getNextEventMap().get(indexOfTaskTerminateEvent);
String name = processInstance.getName();
SubprocessPluginUtils pluginInstance = SubprocessPluginUtils.getInstance();
Map<Integer, TaskTerminateEvent> eventsOnHoldMap = pluginInstance.getEventsOnHold().get(name);
if (eventsOnHoldMap == null) {
pluginInstance.getEventsOnHold().put(name, new HashMap<Integer, TaskTerminateEvent>());
}
pluginInstance.getEventsOnHold().get(name).put(nodeId, event);
desmojEvent.getNextEventMap().remove(indexOfTaskTerminateEvent);
String source = desmojEvent.getSource();
ProcessSimulationComponents desmojObjects = desmojEvent.getDesmojObjects();
SimulationModel model = (SimulationModel) desmojEvent.getModel();
TimeInstant currentSimulationTime = model.presentTime();
boolean showInTrace = model.traceIsOn();
int processInstanceId = processInstance.getId();
try {
ProcessSimulationComponents desmojObjectsOfSubProcess = desmojObjects.getChildren().get(nodeId);
Integer startNodeId = subProcess.getStartNode();
ProcessInstance subProcessInstance = new ProcessInstance(model, subProcess, processInstanceId, showInTrace);
subProcessInstance.setParent(processInstance);
ScyllaEvent subProcessEvent = new BPMNStartEvent(model, source, currentSimulationTime, desmojObjectsOfSubProcess, subProcessInstance, startNodeId);
TimeSpan timeSpan = new TimeSpan(0);
int index = desmojEvent.getNewEventIndex();
desmojEvent.getNextEventMap().put(index, subProcessEvent);
desmojEvent.getTimeSpanToNextEventMap().put(index, timeSpan);
} catch (NodeNotFoundException | MultipleStartNodesException | NoStartNodeException e) {
DebugLogger.error(e.getMessage());
DebugLogger.log("Start node of process model " + subProcess.getId() + " not found.");
throw new ScyllaRuntimeException("Start node of process model " + subProcess.getId() + " not found.");
}
}
}
use of de.hpi.bpt.scylla.exception.ScyllaRuntimeException in project scylla by bptlab.
the class BPMNEndEvent method eventRoutine.
@Override
public void eventRoutine(ProcessInstance processInstance) throws SuspendExecution {
super.eventRoutine(processInstance);
SimulationModel model = (SimulationModel) getModel();
ProcessModel processModel = processInstance.getProcessModel();
try {
Map<EventDefinitionType, Map<String, String>> definitions = processModel.getEventDefinitions().get(nodeId);
Set<String> messages = new HashSet<String>();
for (EventDefinitionType definition : definitions.keySet()) {
if (definition == EventDefinitionType.MESSAGE) {
String message = "Message End Event: " + displayName;
messages.add(message);
} else if (definition == EventDefinitionType.ESCALATION) {
String message = "Escalation End Event: " + displayName;
messages.add(message);
} else if (definition == EventDefinitionType.ERROR) {
String message = "Error End Event: " + displayName;
messages.add(message);
} else if (definition == EventDefinitionType.CANCEL) {
String message = "Cancel End Event: " + displayName;
messages.add(message);
// TODO for transaction subprocesses only
} else if (definition == EventDefinitionType.COMPENSATION) {
String message = "Compensation End Event: " + displayName;
messages.add(message);
// TODO run compensation
} else if (definition == EventDefinitionType.SIGNAL) {
String message = "Signal End Event: " + displayName;
messages.add(message);
} else if (definition == EventDefinitionType.TERMINATE) {
String message = "Terminate End Event: " + displayName;
messages.add(message);
// unschedule events of this process instance
processInstance.cancel();
}
}
if (messages.isEmpty()) {
String message = "None End Event: " + displayName;
messages.add(message);
}
for (String message : messages) {
sendTraceNote(message);
}
// unless current one is BPMN timer event with timerDuration
BPMNEndEventPluggable.runPlugins(this, processInstance);
scheduleNextEvents();
if (!QueueManager.isAnyEventScheduledOrQueued(model)) {
model.getExperiment().stop();
}
} catch (ScyllaRuntimeException e) {
System.err.println(e.getMessage());
e.printStackTrace();
SimulationUtils.abort(model, processInstance, nodeId, traceIsOn());
}
}
use of de.hpi.bpt.scylla.exception.ScyllaRuntimeException in project scylla by bptlab.
the class BPMNIntermediateEvent method eventRoutine.
@Override
public void eventRoutine(ProcessInstance processInstance) throws SuspendExecution {
super.eventRoutine(processInstance);
SimulationModel model = (SimulationModel) getModel();
ProcessModel processModel = processInstance.getProcessModel();
try {
EventType type = processModel.getEventTypes().get(nodeId);
// Long duration = null;
// TimeUnit timeUnit = null;
Map<EventDefinitionType, Map<String, String>> definitions = processModel.getEventDefinitions().get(nodeId);
Set<String> messages = new HashSet<String>();
for (EventDefinitionType definition : definitions.keySet()) {
// TODO what about implicit throw events?
if (definition == EventDefinitionType.CANCEL) {
// TODO: cancel event only in transaction sub-process
// isInterrupting?
boolean cancelActivity = processModel.getCancelActivities().get(nodeId);
if (type == EventType.BOUNDARY && cancelActivity) {
String message = "Boundary Cancel Event: " + displayName;
messages.add(message);
} else {
SimulationUtils.sendElementNotSupportedTraceNote(model, processModel, displayName, nodeId);
SimulationUtils.abort(model, processInstance, nodeId, traceIsOn());
return;
}
} else if (definition == EventDefinitionType.COMPENSATION) {
// isInterrupting?
boolean cancelActivity = processModel.getCancelActivities().get(nodeId);
if (type == EventType.BOUNDARY && cancelActivity) {
String message = "Boundary Compensation Event: " + displayName;
messages.add(message);
} else {
SimulationUtils.sendElementNotSupportedTraceNote(model, processModel, displayName, nodeId);
SimulationUtils.abort(model, processInstance, nodeId, traceIsOn());
return;
}
} else if (definition == EventDefinitionType.CONDITIONAL) {
if (type == EventType.BOUNDARY) {
// isInterrupting?
boolean cancelActivity = processModel.getCancelActivities().get(nodeId);
if (cancelActivity) {
String message = "Boundary Conditional Event (Interrupting): " + displayName;
messages.add(message);
} else {
String message = "Boundary Conditional Event (Non-Interrupting): " + displayName;
messages.add(message);
}
} else if (type == EventType.INTERMEDIATE_CATCH) {
String message = "Intermediate Conditional Event (Catching): " + displayName;
messages.add(message);
} else {
SimulationUtils.sendElementNotSupportedTraceNote(model, processModel, displayName, nodeId);
SimulationUtils.abort(model, processInstance, nodeId, traceIsOn());
return;
}
} else if (definition == EventDefinitionType.ERROR) {
// isInterrupting?
boolean cancelActivity = processModel.getCancelActivities().get(nodeId);
if (type == EventType.BOUNDARY && cancelActivity) {
String message = "Boundary Error Event: " + displayName;
messages.add(message);
} else {
SimulationUtils.sendElementNotSupportedTraceNote(model, processModel, displayName, nodeId);
SimulationUtils.abort(model, processInstance, nodeId, traceIsOn());
return;
}
} else if (definition == EventDefinitionType.ESCALATION) {
if (type == EventType.BOUNDARY) {
// isInterrupting?
boolean cancelActivity = processModel.getCancelActivities().get(nodeId);
if (cancelActivity) {
String message = "Boundary Escalation Event (Interrupting): " + displayName;
messages.add(message);
} else {
String message = "Boundary Escalation Event (Non-Interrupting): " + displayName;
messages.add(message);
}
} else if (type == EventType.INTERMEDIATE_THROW) {
String message = "Intermediate Escalation Event (Throwing): " + displayName;
messages.add(message);
} else {
SimulationUtils.sendElementNotSupportedTraceNote(model, processModel, displayName, nodeId);
SimulationUtils.abort(model, processInstance, nodeId, traceIsOn());
return;
}
} else if (definition == EventDefinitionType.LINK) {
if (type == EventType.INTERMEDIATE_CATCH) {
String message = "Intermediate Link Event (Catching): " + displayName;
messages.add(message);
} else if (type == EventType.INTERMEDIATE_THROW) {
String message = "Intermediate Link Event (Throwing): " + displayName;
messages.add(message);
} else {
SimulationUtils.sendElementNotSupportedTraceNote(model, processModel, displayName, nodeId);
SimulationUtils.abort(model, processInstance, nodeId, traceIsOn());
return;
}
} else if (definition == EventDefinitionType.MESSAGE) {
if (type == EventType.BOUNDARY) {
// isInterrupting?
boolean cancelActivity = processModel.getCancelActivities().get(nodeId);
if (cancelActivity) {
String message = "Boundary Message Event (Interrupting): " + displayName;
messages.add(message);
} else {
String message = "Boundary Message Event (Non-Interrupting): " + displayName;
messages.add(message);
}
} else if (type == EventType.INTERMEDIATE_CATCH) {
String message = "Intermediate Message Event (Catching): " + displayName;
messages.add(message);
} else if (type == EventType.INTERMEDIATE_THROW) {
String message = "Intermediate Message Event (Throwing): " + displayName;
messages.add(message);
} else {
SimulationUtils.sendElementNotSupportedTraceNote(model, processModel, displayName, nodeId);
SimulationUtils.abort(model, processInstance, nodeId, traceIsOn());
return;
}
} else if (definition == EventDefinitionType.SIGNAL) {
if (type == EventType.BOUNDARY) {
// isInterrupting?
boolean cancelActivity = processModel.getCancelActivities().get(nodeId);
if (cancelActivity) {
String message = "Boundary Signal Event (Interrupting): " + displayName;
messages.add(message);
} else {
String message = "Boundary Signal Event (Non-Interrupting): " + displayName;
messages.add(message);
}
} else if (type == EventType.INTERMEDIATE_CATCH) {
String message = "Intermediate Signal Event (Catching): " + displayName;
messages.add(message);
} else if (type == EventType.INTERMEDIATE_THROW) {
String message = "Intermediate Signal Event (Throwing): " + displayName;
messages.add(message);
} else {
SimulationUtils.sendElementNotSupportedTraceNote(model, processModel, displayName, nodeId);
SimulationUtils.abort(model, processInstance, nodeId, traceIsOn());
return;
}
} else if (definition == EventDefinitionType.TIMER) {
if (type == EventType.BOUNDARY) {
// isInterrupting?
boolean cancelActivity = processModel.getCancelActivities().get(nodeId);
if (cancelActivity) {
String message = "Boundary Timer Event (Interrupting): " + displayName;
messages.add(message);
} else {
String message = "Boundary Timer Event (Non-Interrupting): " + displayName;
messages.add(message);
}
} else if (type == EventType.INTERMEDIATE_CATCH) {
String message = "Intermediate Timer Event (Catching): " + displayName;
messages.add(message);
} else {
SimulationUtils.sendElementNotSupportedTraceNote(model, processModel, displayName, nodeId);
SimulationUtils.abort(model, processInstance, nodeId, traceIsOn());
return;
}
} else {
// None Event
if (messages.isEmpty()) {
if (type == EventType.INTERMEDIATE_THROW) {
String message = "Intermediate None Event (Throwing): " + displayName;
messages.add(message);
} else {
SimulationUtils.sendElementNotSupportedTraceNote(model, processModel, displayName, nodeId);
SimulationUtils.abort(model, processInstance, nodeId, traceIsOn());
}
}
}
}
for (String message : messages) {
sendTraceNote(message);
}
// get next node(s)
Set<Integer> idsOfNextNodes = processModel.getIdsOfNextNodes(nodeId);
// BPMN intermediate event must not have more than successor
if (idsOfNextNodes.size() != 1) {
throw new ScyllaValidationException("Event " + nodeId + " does not have 1 successor, but " + idsOfNextNodes.size() + ".");
}
Integer nextNodeId = idsOfNextNodes.iterator().next();
// schedule event for next node
List<ScyllaEvent> events = SimulationUtils.createEventsForNextNode(this, pSimComponents, processInstance, nextNodeId);
// next event occurs immediately after start event
TimeSpan timeSpan = new TimeSpan(0);
for (ScyllaEvent event : events) {
int index = getNewEventIndex();
nextEventMap.put(index, event);
timeSpanToNextEventMap.put(index, timeSpan);
}
// unless current one is BPMN timer event with timerDuration
BPMNIntermediateEventPluggable.runPlugins(this, processInstance);
scheduleNextEvents();
} catch (NodeNotFoundException | ScyllaValidationException | ScyllaRuntimeException e) {
System.err.println(e.getMessage());
e.printStackTrace();
SimulationUtils.abort(model, processInstance, nodeId, traceIsOn());
return;
}
}
use of de.hpi.bpt.scylla.exception.ScyllaRuntimeException in project scylla by bptlab.
the class BPMNStartEvent method eventRoutine.
@Override
public void eventRoutine(ProcessInstance processInstance) throws SuspendExecution {
super.eventRoutine(processInstance);
SimulationModel model = (SimulationModel) getModel();
ProcessModel processModel = processInstance.getProcessModel();
Map<EventDefinitionType, Map<String, String>> definitions = processModel.getEventDefinitions().get(nodeId);
Set<String> messages = new HashSet<String>();
for (EventDefinitionType definition : definitions.keySet()) {
if (definition == EventDefinitionType.MESSAGE) {
String message = "Message Start Event: " + displayName;
messages.add(message);
} else if (definition == EventDefinitionType.TIMER) {
String message = "Timer Start Event: " + displayName;
messages.add(message);
} else if (definition == EventDefinitionType.CONDITIONAL) {
String message = "Conditional Start Event: " + displayName;
messages.add(message);
} else if (definition == EventDefinitionType.SIGNAL) {
String message = "Signal Start Event: " + displayName;
messages.add(message);
}
}
if (messages.isEmpty()) {
String message = "None Start Event: " + displayName;
messages.add(message);
}
for (String message : messages) {
sendTraceNote(message);
}
try {
// get next node(s)
Set<Integer> idsOfNextNodes = processModel.getIdsOfNextNodes(nodeId);
// BPMN start event must not have more than successor
if (idsOfNextNodes.size() != 1) {
throw new ScyllaValidationException("Start event " + nodeId + " does not have 1 successor, but " + idsOfNextNodes.size() + ".");
}
Integer nextNodeId = idsOfNextNodes.iterator().next();
List<ScyllaEvent> events = SimulationUtils.createEventsForNextNode(this, pSimComponents, processInstance, nextNodeId);
// next event occurs immediately after start event
TimeSpan timeSpan = new TimeSpan(0);
for (ScyllaEvent event : events) {
int index = getNewEventIndex();
nextEventMap.put(index, event);
timeSpanToNextEventMap.put(index, timeSpan);
}
// unless current one is BPMN timer event with timerDuration
BPMNStartEventPluggable.runPlugins(this, processInstance);
scheduleNextEvents();
} catch (NodeNotFoundException | ScyllaValidationException | ScyllaRuntimeException e) {
DebugLogger.error(e.getMessage());
e.printStackTrace();
SimulationUtils.abort(model, processInstance, nodeId, traceIsOn());
return;
}
}
use of de.hpi.bpt.scylla.exception.ScyllaRuntimeException in project scylla by bptlab.
the class ProcessInstanceGenerationEvent method eventRoutine.
// TODO XSD validation
// TODO fixed cost per task
@Override
public void eventRoutine(ProcessInstance processInstance) throws SuspendExecution {
this.processInstance = processInstance;
SimulationModel model = (SimulationModel) getModel();
TimeInstant currentSimulationTime = model.presentTime();
TimeUnit timeUnit = DateTimeUtils.getReferenceTimeUnit();
long currentTime = currentSimulationTime.getTimeRounded(timeUnit);
if (currentTime >= endTimeRelativeToGlobalStart) {
// if the end time is reached
return;
}
boolean showInTrace = traceIsOn();
String name = getName();
ProcessSimulationComponents desmojObjects = model.getDesmojObjectsMap().get(processId);
ProcessModel processModel = desmojObjects.getProcessModel();
try {
Integer startNodeId = processModel.getStartNode();
timeSpanToStartEvent = new TimeSpan(0);
ProcessInstanceGenerationEventPluggable.runPlugins(this, processInstance);
BPMNStartEvent event = new BPMNStartEvent(model, name, currentSimulationTime, desmojObjects, processInstance, startNodeId);
int processInstanceId = desmojObjects.incrementProcessInstancesStarted();
// schedule next process instance start event
if (processInstanceId <= desmojObjects.getSimulationConfiguration().getNumberOfProcessInstances()) {
double duration = desmojObjects.getDistributionSample(startNodeId);
TimeUnit unit = desmojObjects.getDistributionTimeUnit(startNodeId);
ProcessInstance nextProcessInstance = new ProcessInstance(model, processModel, processInstanceId, showInTrace);
timeSpanToNextProcessInstance = new TimeSpan(duration, unit);
ProcessInstanceGenerationEvent nextEvent = new ProcessInstanceGenerationEvent(model, processId, endTimeRelativeToGlobalStart, showInTrace);
nextEvent.schedule(nextProcessInstance, timeSpanToNextProcessInstance);
}
// schedule for start of simulation
event.schedule(processInstance, timeSpanToStartEvent);
} catch (NodeNotFoundException | MultipleStartNodesException | NoStartNodeException | ScyllaRuntimeException e) {
DebugLogger.error(e.getMessage());
e.printStackTrace();
DebugLogger.log("Error during instantiation of process model " + processModel.getId() + ".");
// no node initialized, use zero
int nodeId = 0;
SimulationUtils.abort(model, processInstance, nodeId, showInTrace);
}
}
Aggregations