Search in sources :

Example 51 with ProcessModel

use of de.hpi.bpt.scylla.model.process.ProcessModel 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());
    }
}
Also used : ScyllaRuntimeException(de.hpi.bpt.scylla.exception.ScyllaRuntimeException) ProcessModel(de.hpi.bpt.scylla.model.process.ProcessModel) EventDefinitionType(de.hpi.bpt.scylla.model.process.node.EventDefinitionType) Map(java.util.Map) SimulationModel(de.hpi.bpt.scylla.simulation.SimulationModel) HashSet(java.util.HashSet)

Example 52 with ProcessModel

use of de.hpi.bpt.scylla.model.process.ProcessModel in project scylla by bptlab.

the class BPMNEvent method addToLogAsCanceled.

public void addToLogAsCanceled(ProcessInstance processInstance) {
    long timestamp = Math.round(getModel().presentTime().getTimeRounded(DateTimeUtils.getReferenceTimeUnit()));
    String taskName = displayName;
    Set<String> resources = new HashSet<String>();
    SimulationModel model = (SimulationModel) getModel();
    ProcessModel processModel = processInstance.getProcessModel();
    String processScopeNodeId = SimulationUtils.getProcessScopeNodeId(processModel, nodeId);
    ProcessNodeInfo info;
    info = new ProcessNodeInfo(nodeId, processScopeNodeId, source, timestamp, taskName, resources, ProcessNodeTransitionType.CANCEL);
    model.addNodeInfo(processModel, processInstance, info);
}
Also used : ProcessModel(de.hpi.bpt.scylla.model.process.ProcessModel) ProcessNodeInfo(de.hpi.bpt.scylla.logger.ProcessNodeInfo) SimulationModel(de.hpi.bpt.scylla.simulation.SimulationModel)

Example 53 with ProcessModel

use of de.hpi.bpt.scylla.model.process.ProcessModel 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;
    }
}
Also used : ScyllaRuntimeException(de.hpi.bpt.scylla.exception.ScyllaRuntimeException) ProcessModel(de.hpi.bpt.scylla.model.process.ProcessModel) EventType(de.hpi.bpt.scylla.model.process.node.EventType) EventDefinitionType(de.hpi.bpt.scylla.model.process.node.EventDefinitionType) TimeSpan(desmoj.core.simulator.TimeSpan) ScyllaValidationException(de.hpi.bpt.scylla.exception.ScyllaValidationException) NodeNotFoundException(de.hpi.bpt.scylla.model.process.graph.exception.NodeNotFoundException) Map(java.util.Map) SimulationModel(de.hpi.bpt.scylla.simulation.SimulationModel) HashSet(java.util.HashSet)

Example 54 with ProcessModel

use of de.hpi.bpt.scylla.model.process.ProcessModel 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;
    }
}
Also used : ScyllaRuntimeException(de.hpi.bpt.scylla.exception.ScyllaRuntimeException) ProcessModel(de.hpi.bpt.scylla.model.process.ProcessModel) EventDefinitionType(de.hpi.bpt.scylla.model.process.node.EventDefinitionType) TimeSpan(desmoj.core.simulator.TimeSpan) ScyllaValidationException(de.hpi.bpt.scylla.exception.ScyllaValidationException) NodeNotFoundException(de.hpi.bpt.scylla.model.process.graph.exception.NodeNotFoundException) Map(java.util.Map) SimulationModel(de.hpi.bpt.scylla.simulation.SimulationModel) HashSet(java.util.HashSet)

Example 55 with ProcessModel

use of de.hpi.bpt.scylla.model.process.ProcessModel 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);
    }
}
Also used : ScyllaRuntimeException(de.hpi.bpt.scylla.exception.ScyllaRuntimeException) ProcessModel(de.hpi.bpt.scylla.model.process.ProcessModel) MultipleStartNodesException(de.hpi.bpt.scylla.model.process.graph.exception.MultipleStartNodesException) TimeSpan(desmoj.core.simulator.TimeSpan) NodeNotFoundException(de.hpi.bpt.scylla.model.process.graph.exception.NodeNotFoundException) ProcessSimulationComponents(de.hpi.bpt.scylla.simulation.ProcessSimulationComponents) TimeUnit(java.util.concurrent.TimeUnit) ProcessInstance(de.hpi.bpt.scylla.simulation.ProcessInstance) SimulationModel(de.hpi.bpt.scylla.simulation.SimulationModel) TimeInstant(desmoj.core.simulator.TimeInstant) NoStartNodeException(de.hpi.bpt.scylla.model.process.graph.exception.NoStartNodeException)

Aggregations

ProcessModel (de.hpi.bpt.scylla.model.process.ProcessModel)73 SimulationModel (de.hpi.bpt.scylla.simulation.SimulationModel)42 TimeSpan (desmoj.core.simulator.TimeSpan)26 ScyllaValidationException (de.hpi.bpt.scylla.exception.ScyllaValidationException)22 NodeNotFoundException (de.hpi.bpt.scylla.model.process.graph.exception.NodeNotFoundException)19 ScyllaRuntimeException (de.hpi.bpt.scylla.exception.ScyllaRuntimeException)18 ProcessInstance (de.hpi.bpt.scylla.simulation.ProcessInstance)18 ScyllaEvent (de.hpi.bpt.scylla.simulation.event.ScyllaEvent)16 Map (java.util.Map)16 HashMap (java.util.HashMap)14 ProcessNodeInfo (de.hpi.bpt.scylla.logger.ProcessNodeInfo)13 ProcessSimulationComponents (de.hpi.bpt.scylla.simulation.ProcessSimulationComponents)13 Element (org.jdom2.Element)13 TimeInstant (desmoj.core.simulator.TimeInstant)12 HashSet (java.util.HashSet)12 SimulationConfiguration (de.hpi.bpt.scylla.model.configuration.SimulationConfiguration)10 TimeUnit (java.util.concurrent.TimeUnit)10 EventDefinitionType (de.hpi.bpt.scylla.model.process.node.EventDefinitionType)8 ArrayList (java.util.ArrayList)8 Namespace (org.jdom2.Namespace)8