void addBackwardReachableTransitions(SFlowElementContainerDefinition processContainer, SFlowNodeDefinition gatewayDefinition, List<STransitionDefinition> transitions, List<STransitionDefinition> backwardReachable, List<STransitionDefinition> notIn) { for (STransitionDefinition sTransitionDefinition : transitions) { if (!backwardReachable.contains(sTransitionDefinition) && !notIn.contains(sTransitionDefinition)) { backwardReachable.add(sTransitionDefinition); //if the source is the gateway we stop searching backward SFlowNodeDefinition flowNode = processContainer.getFlowNode(sTransitionDefinition.getSource()); if (!flowNode.equals(gatewayDefinition)) { addBackwardReachableTransitions(processContainer, gatewayDefinition, flowNode.getIncomingTransitions(), backwardReachable, notIn); } } } }
private boolean hasLocalOrInheritedData(final SProcessDefinition processDefinition, final SFlowElementContainerDefinition processContainer) { // processContainer is different of processDefinition.getProcessContainer() if it's a sub-process return !processContainer.getDataDefinitions().isEmpty() || !processDefinition.getProcessContainer().getDataDefinitions().isEmpty(); }
@Override public boolean hasConnectors() { return getProcessContainer().getConnectors().size() > 0; }
@Override public SFlowNodeDefinition getNextFlowNode(final SProcessDefinition definition, final String source) { final SFlowElementContainerDefinition processContainer = definition.getProcessContainer(); final STransitionDefinition sourceNode = processContainer.getTransition(source); final long targetId = sourceNode.getTarget(); return processContainer.getFlowNode(targetId); }
private void deleteJobsOnEventSubProcess(final SProcessDefinition processDefinition, final SProcessInstance sProcessInstance) { final Set<SSubProcessDefinition> sSubProcessDefinitions = processDefinition.getProcessContainer().getSubProcessDefinitions(); for (final SSubProcessDefinition sSubProcessDefinition : sSubProcessDefinitions) { final List<SStartEventDefinition> startEventsOfSubProcess = sSubProcessDefinition.getSubProcessContainer().getStartEvents(); deleteJobsOnEventSubProcess(processDefinition, sProcessInstance, sSubProcessDefinition, startEventsOfSubProcess); final List<SIntermediateCatchEventDefinition> intermediateCatchEvents = sSubProcessDefinition.getSubProcessContainer().getIntermediateCatchEvents(); deleteJobsOnEventSubProcess(processDefinition, sProcessInstance, sSubProcessDefinition, intermediateCatchEvents); final List<SBoundaryEventDefinition> sBoundaryEventDefinitions = sSubProcessDefinition.getSubProcessContainer().getBoundaryEvents(); deleteJobsOnEventSubProcess(processDefinition, sProcessInstance, sSubProcessDefinition, sBoundaryEventDefinitions); } }
private boolean hasEventSubProcessCatchingError(final SFlowElementContainerDefinition container, final String errorCode) { boolean found = false; final Iterator<SActivityDefinition> iterator = container.getActivities().iterator(); while (iterator.hasNext() && !found) { final SActivityDefinition activity = iterator.next(); if (SFlowNodeType.SUB_PROCESS.equals(activity.getType()) && ((SSubProcessDefinition) activity).isTriggeredByEvent()) { final SSubProcessDefinition eventSubProcess = (SSubProcessDefinition) activity; final SStartEventDefinition startEventDefinition = eventSubProcess.getSubProcessContainer().getStartEvents().get(0); if (startEventDefinition.getErrorEventTriggerDefinition(errorCode) != null) { found = true; } } } return found; }
@Override public OperationsWithContext getOperations(final SWaitingEvent waitingEvent, final Long triggeringElementID) throws SBonitaException { final SMessageInstance messageInstance = getEventInstanceService().getMessageInstance(triggeringElementID); final SProcessDefinition processDefinition = processDefinitionService.getProcessDefinition(waitingEvent.getProcessDefinitionId()); final SExpressionContext context = new SExpressionContext(messageInstance.getId(), DataInstanceContainer.MESSAGE_INSTANCE.name(), processDefinition.getId()); final SFlowElementContainerDefinition processContainer = processDefinition.getProcessContainer(); final SFlowNodeDefinition targetFlowNode = processContainer.getFlowNode(waitingEvent.getFlowNodeName()); SCatchMessageEventTriggerDefinition messageEventTrigger; if (targetFlowNode instanceof SReceiveTaskDefinition) { messageEventTrigger = ((SReceiveTaskDefinition) targetFlowNode).getTrigger(); } else { SCatchEventDefinition catchEvent; if (SBPMEventType.BOUNDARY_EVENT.equals(waitingEvent.getEventType())) { catchEvent = processContainer.getBoundaryEvent(messageInstance.getTargetFlowNode()); } else { catchEvent = (SCatchEventDefinition) targetFlowNode; } messageEventTrigger = catchEvent.getMessageEventTriggerDefinition(messageInstance.getMessageName()); } final List<SOperation> operations = messageEventTrigger.getOperations(); return new OperationsWithContext(context, operations); }
public void mapDataOutputOfMultiInstance(final SProcessDefinition processDefinition, final SFlowNodeInstance flowNodeInstance) throws SActivityStateExecutionException { if (flowNodeInstance instanceof SActivityInstance && !SFlowNodeType.MULTI_INSTANCE_ACTIVITY.equals(flowNodeInstance.getType())) { final SFlowElementContainerDefinition processContainer = processDefinition.getProcessContainer(); final SActivityDefinition activityDefinition = (SActivityDefinition) processContainer.getFlowNode(flowNodeInstance.getFlowNodeDefinitionId()); if (activityDefinition != null) {// can be null if the activity was added in runtime try { final SLoopCharacteristics loopCharacteristics = activityDefinition.getLoopCharacteristics(); if (loopCharacteristics instanceof SMultiInstanceLoopCharacteristics && ((SMultiInstanceLoopCharacteristics) loopCharacteristics).getDataOutputItemRef() != null) { final SMultiInstanceLoopCharacteristics miLoop = (SMultiInstanceLoopCharacteristics) loopCharacteristics; final SBusinessDataDefinition businessData = processContainer.getBusinessDataDefinition(miLoop.getLoopDataOutputRef()); if (businessData == null) { mapDataOutputOfMultiInstance(flowNodeInstance, miLoop); } else { MapMultiInstanceBusinessDataOutput(flowNodeInstance, miLoop); } } } catch (final SBonitaException sbe) { throw new SActivityStateExecutionException(sbe); } } } }
final SProcessInstance sProcessInstance) throws SBonitaException { final SFlowNodeDefinition sFlowNodeDefinition = processDefinition.getProcessContainer().getFlowNode(child.getFlowNodeDefinitionId()); final FlowNodeTransitionsWrapper transitionsDescriptor = transitionEvaluator.buildTransitionsWrapper(sFlowNodeDefinition, processDefinition, child); if (processDefinition.getProcessContainer().containsInclusiveGateway() && needToReevaluateInclusiveGateways(transitionsDescriptor)) { logger.log(getClass(), TechnicalLogSeverity.DEBUG, "some branches died, will check again all inclusive gateways"); final List<SGatewayInstance> inclusiveGatewaysOfProcessInstance = gatewayInstanceService.getInclusiveGatewaysOfProcessInstanceThatShouldFire(
private void deleteJobsOnProcessInstance(final SProcessDefinition processDefinition, final SProcessInstance sProcessInstance) throws SBonitaReadException { deleteJobsOnCallActivitiesOfProcessInstance(sProcessInstance.getId()); final List<SStartEventDefinition> startEventsOfSubProcess = processDefinition.getProcessContainer().getStartEvents(); deleteJobsOnProcessInstance(processDefinition, sProcessInstance, startEventsOfSubProcess); final List<SIntermediateCatchEventDefinition> intermediateCatchEvents = processDefinition.getProcessContainer().getIntermediateCatchEvents(); deleteJobsOnProcessInstance(processDefinition, sProcessInstance, intermediateCatchEvents); final List<SBoundaryEventDefinition> sBoundaryEventDefinitions = processDefinition.getProcessContainer().getBoundaryEvents(); deleteJobsOnProcessInstance(processDefinition, sProcessInstance, sBoundaryEventDefinitions); deleteJobsOnEventSubProcess(processDefinition, sProcessInstance); }
private List<Problem> checkAllConnectorsHaveImplementation(final ConnectorService connectorService, final SProcessDefinition processDefinition) { final List<SConnectorDefinition> processConnectors = processDefinition.getProcessContainer().getConnectors(); final List<Problem> problems = new ArrayList<Problem>(); if (processConnectors != null) { final Set<SFlowNodeDefinition> flowNodes = processDefinition.getProcessContainer().getFlowNodes(); if (flowNodes != null) { for (final SFlowNodeDefinition sFlowNodeDefinition : flowNodes) {
boolean isBusinessData(final SProcessDefinition processDefinition, final SMultiInstanceLoopCharacteristics miLoop) { final SFlowElementContainerDefinition processContainer = processDefinition.getProcessContainer(); final SBusinessDataDefinition businessData = processContainer.getBusinessDataDefinition(miLoop.getLoopDataOutputRef()); return businessData != null; }
@Override public List<Problem> checkResolution(final SProcessDefinition processDefinition) { final List<SBusinessDataDefinition> businessDataDefinitions = processDefinition.getProcessContainer().getBusinessDataDefinitions(); if (businessDataDefinitions.isEmpty()) { return Collections.emptyList(); } final List<Problem> problems = new ArrayList<>(); final Set<String> entityClassNames = businessDataRepository.getEntityClassNames(); for (final SBusinessDataDefinition sBusinessDataDefinition : businessDataDefinitions) { final String className = sBusinessDataDefinition.getClassName(); if (!entityClassNames.contains(className)) { final Problem problem = new ProblemImpl(Level.ERROR, sBusinessDataDefinition.getName(), "business data", "The business data '" + sBusinessDataDefinition.getName() + "' with the class name '" + className + "', is not managed by the current version of the BDM"); problems.add(problem); } } return problems; }
boolean activityFound = false; final SFlowElementContainerDefinition processContainer = sProcessDefinition.getProcessContainer(); final Set<SActivityDefinition> activityDefList = processContainer.getActivities(); for (final SActivityDefinition sActivityDefinition : activityDefList) { if (activityName.equals(sActivityDefinition.getName())) {
@Override protected SConnectorDefinition getSConnectorDefinition(final ProcessDefinitionService processDefinitionService) throws SProcessDefinitionNotFoundException, SBonitaReadException, SConnectorDefinitionNotFoundException { final SProcessDefinition processDefinition = processDefinitionService.getProcessDefinition(processDefinitionId); final SFlowElementContainerDefinition processContainer = processDefinition.getProcessContainer(); // final SConnectorDefinition sConnectorDefinition = processContainer.getConnectorDefinition(connectorDefinitionId);// FIXME: Uncomment when generate id final SConnectorDefinition sConnectorDefinition = processContainer.getConnectorDefinition(connectorDefinitionName); if (sConnectorDefinition == null) { throw new SConnectorDefinitionNotFoundException(connectorDefinitionName); } return sConnectorDefinition; }
public void interruptAttachedBoundaryEvent(final SProcessDefinition processDefinition, final SActivityInstance activityInstance, final SStateCategory categoryState) throws SActivityStateExecutionException { final SBoundaryEventInstanceBuilderFactory keyProvider = BuilderFactory.get(SBoundaryEventInstanceBuilderFactory.class); try { final List<SBoundaryEventInstance> boundaryEventInstances = eventInstanceService.getActivityBoundaryEventInstances(activityInstance.getId(), 0, QueryOptions.UNLIMITED_NUMBER_OF_RESULTS); for (final SBoundaryEventInstance boundaryEventInstance : boundaryEventInstances) { // don't abort boundary event that put this activity in aborting state if (activityInstance.getAbortedByBoundary() != boundaryEventInstance.getId()) { final boolean stable = boundaryEventInstance.isStable(); final SCatchEventDefinition catchEventDef = processDefinition.getProcessContainer().getBoundaryEvent(boundaryEventInstance.getName()); waitingEventsInterrupter.interruptWaitingEvents(processDefinition, boundaryEventInstance, catchEventDef); activityInstanceService.setStateCategory(boundaryEventInstance, categoryState); if (stable) { containerRegistry.executeFlowNode(processDefinition.getId(), boundaryEventInstance.getLogicalGroup(keyProvider.getParentProcessInstanceIndex()), boundaryEventInstance.getId()); } } } } catch (final SBonitaException e) { throw new SActivityStateExecutionException("Unable cancel boundary events attached to activity " + activityInstance.getName(), e); } }
private void deleteJobsOnEventSubProcess(final SProcessDefinition processDefinition, final SProcessInstance sProcessInstance) { final Set<SSubProcessDefinition> sSubProcessDefinitions = processDefinition.getProcessContainer().getSubProcessDefinitions(); for (final SSubProcessDefinition sSubProcessDefinition : sSubProcessDefinitions) { final List<SStartEventDefinition> startEventsOfSubProcess = sSubProcessDefinition.getSubProcessContainer().getStartEvents(); deleteJobsOnEventSubProcess(processDefinition, sProcessInstance, sSubProcessDefinition, startEventsOfSubProcess); final List<SIntermediateCatchEventDefinition> intermediateCatchEvents = sSubProcessDefinition.getSubProcessContainer().getIntermediateCatchEvents(); deleteJobsOnEventSubProcess(processDefinition, sProcessInstance, sSubProcessDefinition, intermediateCatchEvents); final List<SBoundaryEventDefinition> sBoundaryEventDefinitions = sSubProcessDefinition.getSubProcessContainer().getBoundaryEvents(); deleteJobsOnEventSubProcess(processDefinition, sProcessInstance, sSubProcessDefinition, sBoundaryEventDefinitions); } }
@Override public SFlowNodeDefinition getNextFlowNode(final SProcessDefinition definition, final String source) { final SFlowElementContainerDefinition processContainer = definition.getProcessContainer(); final STransitionDefinition sourceNode = processContainer.getTransition(source); final long targetId = sourceNode.getTarget(); return processContainer.getFlowNode(targetId); }
@Override public OperationsWithContext getOperations(final SWaitingEvent waitingEvent, final Long triggeringElementID) throws SBonitaException { final SMessageInstance messageInstance = getEventInstanceService().getMessageInstance(triggeringElementID); final SProcessDefinition processDefinition = processDefinitionService.getProcessDefinition(waitingEvent.getProcessDefinitionId()); final SExpressionContext context = new SExpressionContext(messageInstance.getId(), DataInstanceContainer.MESSAGE_INSTANCE.name(), processDefinition.getId()); final SFlowElementContainerDefinition processContainer = processDefinition.getProcessContainer(); final SFlowNodeDefinition targetFlowNode = processContainer.getFlowNode(waitingEvent.getFlowNodeName()); SCatchMessageEventTriggerDefinition messageEventTrigger; if (targetFlowNode instanceof SReceiveTaskDefinition) { messageEventTrigger = ((SReceiveTaskDefinition) targetFlowNode).getTrigger(); } else { SCatchEventDefinition catchEvent; if (SBPMEventType.BOUNDARY_EVENT.equals(waitingEvent.getEventType())) { catchEvent = processContainer.getBoundaryEvent(messageInstance.getTargetFlowNode()); } else { catchEvent = (SCatchEventDefinition) targetFlowNode; } messageEventTrigger = catchEvent.getMessageEventTriggerDefinition(messageInstance.getMessageName()); } final List<SOperation> operations = messageEventTrigger.getOperations(); return new OperationsWithContext(context, operations); }
public void mapDataOutputOfMultiInstance(final SProcessDefinition processDefinition, final SFlowNodeInstance flowNodeInstance) throws SActivityStateExecutionException { if (flowNodeInstance instanceof SActivityInstance && !SFlowNodeType.MULTI_INSTANCE_ACTIVITY.equals(flowNodeInstance.getType())) { final SFlowElementContainerDefinition processContainer = processDefinition.getProcessContainer(); final SActivityDefinition activityDefinition = (SActivityDefinition) processContainer.getFlowNode(flowNodeInstance.getFlowNodeDefinitionId()); if (activityDefinition != null) {// can be null if the activity was added in runtime try { final SLoopCharacteristics loopCharacteristics = activityDefinition.getLoopCharacteristics(); if (loopCharacteristics instanceof SMultiInstanceLoopCharacteristics && ((SMultiInstanceLoopCharacteristics) loopCharacteristics).getDataOutputItemRef() != null) { final SMultiInstanceLoopCharacteristics miLoop = (SMultiInstanceLoopCharacteristics) loopCharacteristics; final SBusinessDataDefinition businessData = processContainer.getBusinessDataDefinition(miLoop.getLoopDataOutputRef()); if (businessData == null) { mapDataOutputOfMultiInstance(flowNodeInstance, miLoop); } else { MapMultiInstanceBusinessDataOutput(flowNodeInstance, miLoop); } } } catch (final SBonitaException sbe) { throw new SActivityStateExecutionException(sbe); } } } }