use of org.activiti.engine.impl.pvm.delegate.ActivityExecution in project Activiti by Activiti.
the class AtomicOperationActivityEnd method eventNotificationsCompleted.
@SuppressWarnings("unchecked")
@Override
protected void eventNotificationsCompleted(InterpretableExecution execution) {
ActivityImpl activity = (ActivityImpl) execution.getActivity();
ActivityImpl parentActivity = activity.getParentActivity();
if (Context.getProcessEngineConfiguration() != null && Context.getProcessEngineConfiguration().getEventDispatcher().isEnabled()) {
if (execution instanceof ExecutionEntity) {
ExecutionEntity executionEntity = (ExecutionEntity) execution;
Context.getProcessEngineConfiguration().getEventDispatcher().dispatchEvent(ActivitiEventBuilder.createActivityEvent(ActivitiEventType.ACTIVITY_COMPLETED, execution.getActivity().getId(), (String) executionEntity.getActivity().getProperties().get("name"), execution.getId(), execution.getProcessInstanceId(), execution.getProcessDefinitionId(), (String) executionEntity.getActivity().getProperties().get("type"), executionEntity.getActivity().getActivityBehavior().getClass().getCanonicalName()));
}
}
// if the execution is a single path of execution inside the process definition scope
if ((parentActivity != null) && (!parentActivity.isScope())) {
execution.setActivity(parentActivity);
execution.performOperation(ACTIVITY_END);
} else if (execution.isProcessInstanceType()) {
// dispatch process completed event
if (Context.getProcessEngineConfiguration() != null && Context.getProcessEngineConfiguration().getEventDispatcher().isEnabled()) {
Context.getProcessEngineConfiguration().getEventDispatcher().dispatchEvent(ActivitiEventBuilder.createEntityEvent(ActivitiEventType.PROCESS_COMPLETED, execution));
}
execution.performOperation(PROCESS_END);
} else if (execution.isScope()) {
ActivityBehavior parentActivityBehavior = (parentActivity != null ? parentActivity.getActivityBehavior() : null);
if (parentActivityBehavior instanceof CompositeActivityBehavior) {
CompositeActivityBehavior compositeActivityBehavior = (CompositeActivityBehavior) parentActivity.getActivityBehavior();
if (activity.isScope() && activity.getOutgoingTransitions().isEmpty()) {
// there is no transition destroying the scope
InterpretableExecution parentScopeExecution = (InterpretableExecution) execution.getParent();
execution.destroy();
execution.remove();
parentScopeExecution.setActivity(parentActivity);
compositeActivityBehavior.lastExecutionEnded(parentScopeExecution);
} else {
execution.setActivity(parentActivity);
compositeActivityBehavior.lastExecutionEnded(execution);
}
} else {
// default destroy scope behavior
InterpretableExecution parentScopeExecution = (InterpretableExecution) execution.getParent();
execution.destroy();
execution.remove();
// and have no outgoing transitions: end the process instance here
if (activity.getParent() == activity.getProcessDefinition()) {
parentScopeExecution.setActivity(activity);
if (activity.getOutgoingTransitions().isEmpty()) {
// we call end() because it sets isEnded on the execution
parentScopeExecution.end();
} else {
// dispatch process completed event
if (Context.getProcessEngineConfiguration().getEventDispatcher().isEnabled()) {
Context.getProcessEngineConfiguration().getEventDispatcher().dispatchEvent(ActivitiEventBuilder.createEntityEvent(ActivitiEventType.PROCESS_COMPLETED, execution));
}
parentScopeExecution.performOperation(PROCESS_END);
}
} else {
parentScopeExecution.setActivity(parentActivity);
parentScopeExecution.performOperation(ACTIVITY_END);
}
}
} else {
// execution.isConcurrent() && !execution.isScope()
execution.remove();
// prune if necessary
InterpretableExecution concurrentRoot = (InterpretableExecution) execution.getParent();
if (concurrentRoot.getExecutions().size() == 1) {
InterpretableExecution lastConcurrent = (InterpretableExecution) concurrentRoot.getExecutions().get(0);
if (!lastConcurrent.isScope()) {
concurrentRoot.setActivity((ActivityImpl) lastConcurrent.getActivity());
lastConcurrent.setReplacedBy(concurrentRoot);
// Move children of lastConcurrent one level up
if (!lastConcurrent.getExecutions().isEmpty()) {
concurrentRoot.getExecutions().clear();
for (ActivityExecution childExecution : lastConcurrent.getExecutions()) {
InterpretableExecution childInterpretableExecution = (InterpretableExecution) childExecution;
// casting ... damn generics
((List) concurrentRoot.getExecutions()).add(childExecution);
childInterpretableExecution.setParent(concurrentRoot);
}
lastConcurrent.getExecutions().clear();
}
// Copy execution-local variables of lastConcurrent
concurrentRoot.setVariablesLocal(lastConcurrent.getVariablesLocal());
// Make sure parent execution is re-activated when the last concurrent child execution is active
if (!concurrentRoot.isActive() && lastConcurrent.isActive()) {
concurrentRoot.setActive(true);
}
lastConcurrent.remove();
} else {
lastConcurrent.setConcurrent(false);
}
}
}
}
use of org.activiti.engine.impl.pvm.delegate.ActivityExecution in project Activiti by Activiti.
the class EventScopeCreatingSubprocess method timerFires.
// used by timers
@SuppressWarnings("unchecked")
public void timerFires(ActivityExecution execution, String signalName, Object signalData) throws Exception {
PvmActivity timerActivity = execution.getActivity();
boolean isInterrupting = (Boolean) timerActivity.getProperty("isInterrupting");
List<ActivityExecution> recyclableExecutions;
if (isInterrupting) {
recyclableExecutions = removeAllExecutions(execution);
} else {
recyclableExecutions = Collections.EMPTY_LIST;
}
execution.takeAll(timerActivity.getOutgoingTransitions(), recyclableExecutions);
}
use of org.activiti.engine.impl.pvm.delegate.ActivityExecution in project Activiti by Activiti.
the class EventScopeCreatingSubprocess method lastExecutionEnded.
/*
* Incoming execution is transformed into an event scope,
* new, non-concurrent execution leaves activity
*/
@SuppressWarnings("unchecked")
public void lastExecutionEnded(ActivityExecution execution) {
ActivityExecution outgoingExecution = execution.getParent().createExecution();
outgoingExecution.setConcurrent(false);
((InterpretableExecution) outgoingExecution).setActivity((ActivityImpl) execution.getActivity());
// eventscope execution
execution.setConcurrent(false);
execution.setActive(false);
((InterpretableExecution) execution).setEventScope(true);
List<PvmTransition> outgoingTransitions = execution.getActivity().getOutgoingTransitions();
if (outgoingTransitions.isEmpty()) {
outgoingExecution.end();
} else {
outgoingExecution.takeAll(outgoingTransitions, Collections.EMPTY_LIST);
}
}
Aggregations