public void addTransition(final STransitionDefinition transition) { transitions.add(transition); transitionsMap.put(transition.getId().toString(), transition); }
public Boolean evaluateCondition(final STransitionDefinition sTransitionDefinition, final SExpressionContext contextDependency) throws SBonitaException { SExpression condition = sTransitionDefinition.getCondition(); if (condition == null) {// no condition == true but return null to say it was a transition without condition -- return null; } if (!Boolean.class.getName().equals(condition.getReturnType())) { throw new SExpressionEvaluationException("Condition expression must return a boolean, on transition: " + sTransitionDefinition.getName(), condition.getName()); } return (Boolean) resolverService.evaluate(condition, contextDependency); }
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); } } } }
boolean transitionsContainsAToken(List<STransitionDefinition> transitions, SFlowNodeDefinition gatewayDefinition, long processInstanceId, SFlowElementContainerDefinition processContainer) throws SBonitaReadException { List<SFlowNodeDefinition> sourceElements = new ArrayList<SFlowNodeDefinition>(); List<SFlowNodeDefinition> targetElements = new ArrayList<SFlowNodeDefinition>(); logger.log(TAG, TechnicalLogSeverity.DEBUG, "Check if there is a token on "+transitions); for (STransitionDefinition sTransitionDefinition : transitions) { SFlowNodeDefinition source = processContainer.getFlowNode(sTransitionDefinition.getSource()); if (!source.equals(gatewayDefinition) && !sourceElements.contains(source)) { sourceElements.add(source); } SFlowNodeDefinition target = processContainer.getFlowNode(sTransitionDefinition.getTarget()); if (!target.equals(gatewayDefinition) && !targetElements.contains(target)) { targetElements.add(target); } } List<SFlowNodeDefinition> sourceAndTarget = extractElementThatAreSourceAndTarget(sourceElements, targetElements); if (containsToken(processInstanceId, sourceAndTarget, null)) return true; if (containsToken(processInstanceId, sourceElements, true)) return true; if (containsToken(processInstanceId, targetElements, false)) return true; logger.log(TAG, TechnicalLogSeverity.DEBUG, "No token to wait, gateway will fire"); return false; }
private SGatewayDefinition getGateway(STransitionDefinition gatewaysTransition, SProcessDefinition processDefinition) { return (SGatewayDefinition) processDefinition.getProcessContainer().getFlowNode(gatewaysTransition.getTarget()); }
private List<STransitionDefinition> evaluateNonDefaultTransitions(final SExpressionContext sExpressionContext, final List<STransitionDefinition> outgoingTransitionDefinitions) throws SBonitaException { final List<STransitionDefinition> chosenTransitions = new ArrayList<>(outgoingTransitionDefinitions.size()); boolean found = false; Iterator<STransitionDefinition> iterator = outgoingTransitionDefinitions.iterator(); while (iterator.hasNext() && strategy.shouldContinue(found)) { STransitionDefinition transitionDefinition = iterator.next(); Boolean shouldTakeTransition = evaluator.evaluateCondition(transitionDefinition, sExpressionContext); if(!transitionDefinition.hasCondition() || (shouldTakeTransition != null && shouldTakeTransition)) { chosenTransitions.add(transitionDefinition); found = true; } } return chosenTransitions; }
boolean transitionsContainsAToken(List<STransitionDefinition> transitions, SFlowNodeDefinition gatewayDefinition, long processInstanceId, SFlowElementContainerDefinition processContainer) throws SBonitaReadException { List<SFlowNodeDefinition> sourceElements = new ArrayList<SFlowNodeDefinition>(); List<SFlowNodeDefinition> targetElements = new ArrayList<SFlowNodeDefinition>(); logger.log(TAG, TechnicalLogSeverity.DEBUG, "Check if there is a token on "+transitions); for (STransitionDefinition sTransitionDefinition : transitions) { SFlowNodeDefinition source = processContainer.getFlowNode(sTransitionDefinition.getSource()); if (!source.equals(gatewayDefinition) && !sourceElements.contains(source)) { sourceElements.add(source); } SFlowNodeDefinition target = processContainer.getFlowNode(sTransitionDefinition.getTarget()); if (!target.equals(gatewayDefinition) && !targetElements.contains(target)) { targetElements.add(target); } } List<SFlowNodeDefinition> sourceAndTarget = extractElementThatAreSourceAndTarget(sourceElements, targetElements); if (containsToken(processInstanceId, sourceAndTarget, null)) return true; if (containsToken(processInstanceId, sourceElements, true)) return true; if (containsToken(processInstanceId, targetElements, false)) return true; logger.log(TAG, TechnicalLogSeverity.DEBUG, "No token to wait, gateway will fire"); return false; }
private SGatewayDefinition getGateway(STransitionDefinition gatewaysTransition, SProcessDefinition processDefinition) { return (SGatewayDefinition) processDefinition.getProcessContainer().getFlowNode(gatewaysTransition.getTarget()); }
private List<STransitionDefinition> evaluateNonDefaultTransitions(final SExpressionContext sExpressionContext, final List<STransitionDefinition> outgoingTransitionDefinitions) throws SBonitaException { final List<STransitionDefinition> chosenTransitions = new ArrayList<>(outgoingTransitionDefinitions.size()); boolean found = false; Iterator<STransitionDefinition> iterator = outgoingTransitionDefinitions.iterator(); while (iterator.hasNext() && strategy.shouldContinue(found)) { STransitionDefinition transitionDefinition = iterator.next(); Boolean shouldTakeTransition = evaluator.evaluateCondition(transitionDefinition, sExpressionContext); if(!transitionDefinition.hasCondition() || (shouldTakeTransition != null && shouldTakeTransition)) { chosenTransitions.add(transitionDefinition); found = true; } } return chosenTransitions; }
public void addTransition(final STransitionDefinition transition) { transitions.add(transition); transitionsMap.put(transition.getId().toString(), transition); }
@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); }
public Boolean evaluateCondition(final STransitionDefinition sTransitionDefinition, final SExpressionContext contextDependency) throws SBonitaException { SExpression condition = sTransitionDefinition.getCondition(); if (condition == null) {// no condition == true but return null to say it was a transition without condition -- return null; } if (!Boolean.class.getName().equals(condition.getReturnType())) { throw new SExpressionEvaluationException("Condition expression must return a boolean, on transition: " + sTransitionDefinition.getName(), condition.getName()); } return (Boolean) resolverService.evaluate(condition, contextDependency); }
private void evaluateTransition(final EvaluatedTransitions evaluatedTransitions, final STransitionDefinition sTransitionDefinition, final SExpressionContext sExpressionContext) throws SBonitaException { final Boolean condition = conditionEvaluator.evaluateCondition(sTransitionDefinition, sExpressionContext); if (!sTransitionDefinition.hasCondition()) { evaluatedTransitions.addUnconditionalTransition(sTransitionDefinition); } else { if (condition != null && condition) { evaluatedTransitions.addTrueTransition(sTransitionDefinition); } else { evaluatedTransitions.addFalseTransition(sTransitionDefinition); } } }
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); } } } }
@Override public int getTransitionIndex(final Long transitionId) { int index = 1; boolean found = false; final Iterator<STransitionDefinition> iterator = incomings.iterator(); while (!found && iterator.hasNext()) { final STransitionDefinition next = iterator.next(); if (next.getId().equals(transitionId)) { found = true; } else { index++; } } return index; }
@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 evaluateTransition(final EvaluatedTransitions evaluatedTransitions, final STransitionDefinition sTransitionDefinition, final SExpressionContext sExpressionContext) throws SBonitaException { final Boolean condition = conditionEvaluator.evaluateCondition(sTransitionDefinition, sExpressionContext); if (!sTransitionDefinition.hasCondition()) { evaluatedTransitions.addUnconditionalTransition(sTransitionDefinition); } else { if (condition != null && condition) { evaluatedTransitions.addTrueTransition(sTransitionDefinition); } else { evaluatedTransitions.addFalseTransition(sTransitionDefinition); } } }
@Override public int getTransitionIndex(final Long transitionId) { int index = 1; boolean found = false; final Iterator<STransitionDefinition> iterator = incomings.iterator(); while (!found && iterator.hasNext()) { final STransitionDefinition next = iterator.next(); if (next.getId().equals(transitionId)) { found = true; } else { index++; } } return index; }
private void executeGateway(final SProcessDefinition sProcessDefinition, final STransitionDefinition sTransitionDefinition, final SFlowNodeInstance flowNodeThatTriggeredTheTransition) throws SBonitaException { final long parentProcessInstanceId = flowNodeThatTriggeredTheTransition.getParentProcessInstanceId(); final long rootProcessInstanceId = flowNodeThatTriggeredTheTransition.getRootProcessInstanceId(); final SFlowNodeDefinition sFlowNodeDefinition = processDefinitionService.getNextFlowNode(sProcessDefinition, String.valueOf(sTransitionDefinition.getId())); try { List<SGatewayInstance> gatewaysToExecute = new ArrayList<>(1); final SProcessInstance parentProcessInstance = processInstanceService.getProcessInstance(parentProcessInstanceId); final SStateCategory stateCategory = parentProcessInstance.getStateCategory(); final SGatewayInstance gatewayInstance = getActiveGatewayOrCreateIt(sProcessDefinition, sFlowNodeDefinition, stateCategory, parentProcessInstanceId, rootProcessInstanceId); gatewayInstanceService.hitTransition(gatewayInstance, sFlowNodeDefinition.getTransitionIndex(sTransitionDefinition.getId())); if (gatewayInstanceService.checkMergingCondition(sProcessDefinition, gatewayInstance)) { gatewaysToExecute.add(gatewayInstance); gatewaysToExecute.addAll(gatewayInstanceService.setFinishAndCreateNewGatewayForRemainingToken(sProcessDefinition, gatewayInstance)); } for (final SGatewayInstance gatewayToExecute : gatewaysToExecute) { executeFlowNode(gatewayToExecute.getId(), null, null); } } catch (final SBonitaException e) { setExceptionContext(sProcessDefinition, flowNodeThatTriggeredTheTransition, e); logger.log(this.getClass(), TechnicalLogSeverity.ERROR, e); throw e; } }
private void executeGateway(final SProcessDefinition sProcessDefinition, final STransitionDefinition sTransitionDefinition, final SFlowNodeInstance flowNodeThatTriggeredTheTransition) throws SBonitaException { final long parentProcessInstanceId = flowNodeThatTriggeredTheTransition.getParentProcessInstanceId(); final long rootProcessInstanceId = flowNodeThatTriggeredTheTransition.getRootProcessInstanceId(); final SFlowNodeDefinition sFlowNodeDefinition = processDefinitionService.getNextFlowNode(sProcessDefinition, String.valueOf(sTransitionDefinition.getId())); try { List<SGatewayInstance> gatewaysToExecute = new ArrayList<>(1); final SProcessInstance parentProcessInstance = processInstanceService.getProcessInstance(parentProcessInstanceId); final SStateCategory stateCategory = parentProcessInstance.getStateCategory(); final SGatewayInstance gatewayInstance = getActiveGatewayOrCreateIt(sProcessDefinition, sFlowNodeDefinition, stateCategory, parentProcessInstanceId, rootProcessInstanceId); gatewayInstanceService.hitTransition(gatewayInstance, sFlowNodeDefinition.getTransitionIndex(sTransitionDefinition.getId())); if (gatewayInstanceService.checkMergingCondition(sProcessDefinition, gatewayInstance)) { gatewaysToExecute.add(gatewayInstance); gatewaysToExecute.addAll(gatewayInstanceService.setFinishAndCreateNewGatewayForRemainingToken(sProcessDefinition, gatewayInstance)); } for (final SGatewayInstance gatewayToExecute : gatewaysToExecute) { executeFlowNode(gatewayToExecute.getId(), null, null); } } catch (final SBonitaException e) { setExceptionContext(sProcessDefinition, flowNodeThatTriggeredTheTransition, e); logger.log(this.getClass(), TechnicalLogSeverity.ERROR, e); throw e; } }