private SMultiInstanceActivityInstanceBuilder createMultiInstanceActivityInstance(final long processDefinitionId, final long rootContainerId, final long parentContainerId, final long rootProcessInstanceId, final long parentProcessInstanceId, final SActivityDefinition activityDefinition, final SMultiInstanceLoopCharacteristics loopCharacteristics) { final SMultiInstanceActivityInstanceBuilder builder = BuilderFactory.get(SMultiInstanceActivityInstanceBuilderFactory.class) .createNewOuterTaskInstance( activityDefinition.getName(), activityDefinition.getId(), rootContainerId, parentContainerId, processDefinitionId, rootProcessInstanceId, parentProcessInstanceId, loopCharacteristics.isSequential()); builder.setLoopDataInputRef(loopCharacteristics.getLoopDataInputRef()); builder.setLoopDataOutputRef(loopCharacteristics.getLoopDataOutputRef()); builder.setDataInputItemRef(loopCharacteristics.getDataInputItemRef()); builder.setDataOutputItemRef(loopCharacteristics.getDataOutputItemRef()); return builder; }
public boolean shouldCreateANewInstance(final SMultiInstanceLoopCharacteristics loopCharacteristics, final int numberOfInstances, final SMultiInstanceActivityInstance miActivityInstance) throws SDataInstanceException { if (loopCharacteristics.getLoopCardinality() != null) { return miActivityInstance.getLoopCardinality() > numberOfInstances; } List<?> possibleValues; try { //FIXME find if a business data is used if instead of try catch final SMultiRefBusinessDataInstance multiRef = (SMultiRefBusinessDataInstance) refBusinessDataService.getRefBusinessDataInstance( loopCharacteristics.getLoopDataInputRef(), miActivityInstance.getParentProcessInstanceId()); possibleValues = multiRef.getDataIds(); } catch (final SBonitaException sbe) { final SDataInstance dataInstance = getDataInstanceService().getDataInstance(loopCharacteristics.getLoopDataInputRef(), miActivityInstance.getId(), DataInstanceContainer.ACTIVITY_INSTANCE.name(), parentContainerResolver); possibleValues = (List<?>) dataInstance.getValue(); } return possibleValues != null && numberOfInstances < possibleValues.size(); }
private void MapMultiInstanceBusinessDataOutput(final SFlowNodeInstance flowNodeInstance, final SMultiInstanceLoopCharacteristics miLoop) throws SRefBusinessDataInstanceNotFoundException, SBonitaReadException, SRefBusinessDataInstanceModificationException { final SRefBusinessDataInstance outputMIRef = refBusinessDataService.getFlowNodeRefBusinessDataInstance( miLoop.getDataOutputItemRef(), flowNodeInstance.getId()); final SRefBusinessDataInstance outputMILoopRef = refBusinessDataService.getRefBusinessDataInstance( miLoop.getLoopDataOutputRef(), flowNodeInstance.getParentProcessInstanceId()); final SMultiRefBusinessDataInstance multiRefBusinessDataInstance = (SMultiRefBusinessDataInstance) outputMILoopRef; List<Long> dataIds = multiRefBusinessDataInstance.getDataIds(); if (dataIds == null) { dataIds = new ArrayList<>(); } final Long dataId = ((SFlowNodeSimpleRefBusinessDataInstance) outputMIRef).getDataId(); dataIds.add(dataId); refBusinessDataService.updateRefBusinessDataInstance(multiRefBusinessDataInstance, dataIds); }
protected void createDataInstancesForMultiInstance(final SActivityDefinition activityDefinition, final SFlowNodeInstance flowNodeInstance, final SExpressionContext expressionContext) throws SDataInstanceException, SExpressionException { final SLoopCharacteristics loopCharacteristics = activityDefinition.getLoopCharacteristics(); final SMultiInstanceLoopCharacteristics miLoop = (SMultiInstanceLoopCharacteristics) loopCharacteristics; createBusinessDataInstancesForMultiInstance(activityDefinition, flowNodeInstance, miLoop); createDataInstances(activityDefinition.getSDataDefinitions(), flowNodeInstance.getId(), DataInstanceContainer.ACTIVITY_INSTANCE, expressionContext, miLoop.getLoopDataInputRef(), flowNodeInstance.getLoopCounter(), miLoop.getDataInputItemRef(), flowNodeInstance.getParentContainerId()); }
private void createBusinessDataInstancesForMultiInstance(SActivityDefinition activityDefinition, SFlowNodeInstance flowNodeInstance, SMultiInstanceLoopCharacteristics miLoop) throws SDataInstanceException { final SBusinessDataDefinition outputBusinessData = activityDefinition.getBusinessDataDefinition(miLoop.getDataOutputItemRef()); final SRefBusinessDataInstanceBuilderFactory instanceFactory = BuilderFactory.get(SRefBusinessDataInstanceBuilderFactory.class); if (outputBusinessData != null) { final SRefBusinessDataInstance outputRefInstance = instanceFactory.createNewInstanceForFlowNode(outputBusinessData.getName(), flowNodeInstance.getId(), null, outputBusinessData.getClassName()).done(); addRefBusinessData(outputRefInstance); } final SBusinessDataDefinition inputBusinessData = activityDefinition.getBusinessDataDefinition(miLoop.getDataInputItemRef()); if (inputBusinessData != null) { try { final SMultiRefBusinessDataInstance loopDataRefInstance = (SMultiRefBusinessDataInstance) refBusinessDataService.getRefBusinessDataInstance( miLoop.getLoopDataInputRef(), flowNodeInstance.getParentProcessInstanceId()); final List<Long> dataIds = loopDataRefInstance.getDataIds(); final SRefBusinessDataInstance inputRefInstance = instanceFactory.createNewInstanceForFlowNode(inputBusinessData.getName(), flowNodeInstance.getId(), dataIds.get(flowNodeInstance.getLoopCounter()), inputBusinessData.getClassName()).done(); addRefBusinessData(inputRefInstance); } catch (final SRefBusinessDataInstanceNotFoundException | SBonitaReadException e) { throw new SDataInstanceException(e); } } }
if (loopCharacteristics instanceof SMultiInstanceLoopCharacteristics) { final SMultiInstanceLoopCharacteristics miLoop = (SMultiInstanceLoopCharacteristics) loopCharacteristics; final SExpression loopCardinality = miLoop.getLoopCardinality(); int numberOfInstanceMax = -1; if (loopCardinality != null) { .getId())); activityInstanceService.setLoopCardinality(multiInstanceActivityInstance, numberOfInstanceMax); } else if (miLoop.getLoopDataInputRef() != null) { numberOfInstanceMax = stateBehaviors.getNumberOfInstancesToCreateFromInputRef(processDefinition, multiInstanceActivityInstance, miLoop, numberOfInstanceMax); stateBehaviors.createInnerInstances(processDefinition.getId(), activity, multiInstanceActivityInstance, miLoop.isSequential() ? 1 : numberOfInstanceMax);
private boolean createDataInstances(final SActivityDefinition activityDefinition, final SFlowNodeInstance flowNodeInstance, final SExpressionContext expressionContext) throws SActivityStateExecutionException { final List<SDataDefinition> sDataDefinitions = activityDefinition.getSDataDefinitions(); final SLoopCharacteristics loopCharacteristics = activityDefinition.getLoopCharacteristics(); try { if (loopCharacteristics instanceof SMultiInstanceLoopCharacteristics && (((SMultiInstanceLoopCharacteristics) loopCharacteristics).getDataInputItemRef() != null || ((SMultiInstanceLoopCharacteristics) loopCharacteristics).getDataOutputItemRef() != null)) { createDataInstancesForMultiInstance(activityDefinition, flowNodeInstance, expressionContext); } else { createDataInstances(sDataDefinitions, flowNodeInstance.getId(), DataInstanceContainer.ACTIVITY_INSTANCE, expressionContext); } if (!sDataDefinitions.isEmpty() && logger.isLoggable(this.getClass(), TechnicalLogSeverity.DEBUG)) { final String message = "Initialized variables for flow node" + LogMessageBuilder.buildFlowNodeContextMessage(flowNodeInstance); logger.log(this.getClass(), TechnicalLogSeverity.DEBUG, message); } return sDataDefinitions.size() > 0; } catch (final SBonitaException e) { throw new SActivityStateExecutionException(e); } }
boolean isBusinessData(final SProcessDefinition processDefinition, final SMultiInstanceLoopCharacteristics miLoop) { final SFlowElementContainerDefinition processContainer = processDefinition.getProcessContainer(); final SBusinessDataDefinition businessData = processContainer.getBusinessDataDefinition(miLoop.getLoopDataOutputRef()); return businessData != null; }
private int getNumberOfInstanceToCreateFromSimpleData(final SProcessDefinition processDefinition, final SFlowNodeInstance flowNodeInstance, final SMultiInstanceLoopCharacteristics miLoop, final int numberOfInstanceMax) throws SDataInstanceException, SActivityStateExecutionException { final SDataInstance loopDataInput = dataInstanceService.getDataInstance(miLoop.getLoopDataInputRef(), flowNodeInstance.getId(), DataInstanceContainer.ACTIVITY_INSTANCE.name(), parentContainerResolver); if (loopDataInput != null) { final Serializable value = loopDataInput.getValue(); if (value instanceof List) { final List<?> loopDataInputCollection = (List<?>) value; return loopDataInputCollection.size(); } throw new SActivityStateExecutionException("The multi instance on activity " + flowNodeInstance.getName() + " of process " + processDefinition.getName() + " " + processDefinition.getVersion() + " have a loop data input which is not a java.util.List"); } return numberOfInstanceMax; }
final SExpression completionCondition = loopCharacteristics.getCompletionCondition(); final Map<String, Object> input = new HashMap<>(1); input.put(ExpressionConstants.NUMBER_OF_ACTIVE_INSTANCES.getEngineConstantName(), miActivity.getNumberOfActiveInstances());
private void MapMultiInstanceBusinessDataOutput(final SFlowNodeInstance flowNodeInstance, final SMultiInstanceLoopCharacteristics miLoop) throws SRefBusinessDataInstanceNotFoundException, SBonitaReadException, SRefBusinessDataInstanceModificationException { final SRefBusinessDataInstance outputMIRef = refBusinessDataService.getFlowNodeRefBusinessDataInstance( miLoop.getDataOutputItemRef(), flowNodeInstance.getId()); final SRefBusinessDataInstance outputMILoopRef = refBusinessDataService.getRefBusinessDataInstance( miLoop.getLoopDataOutputRef(), flowNodeInstance.getParentProcessInstanceId()); final SMultiRefBusinessDataInstance multiRefBusinessDataInstance = (SMultiRefBusinessDataInstance) outputMILoopRef; List<Long> dataIds = multiRefBusinessDataInstance.getDataIds(); if (dataIds == null) { dataIds = new ArrayList<>(); } final Long dataId = ((SFlowNodeSimpleRefBusinessDataInstance) outputMIRef).getDataId(); dataIds.add(dataId); refBusinessDataService.updateRefBusinessDataInstance(multiRefBusinessDataInstance, dataIds); }
private void createBusinessDataInstancesForMultiInstance(SActivityDefinition activityDefinition, SFlowNodeInstance flowNodeInstance, SMultiInstanceLoopCharacteristics miLoop) throws SDataInstanceException { final SBusinessDataDefinition outputBusinessData = activityDefinition.getBusinessDataDefinition(miLoop.getDataOutputItemRef()); final SRefBusinessDataInstanceBuilderFactory instanceFactory = BuilderFactory.get(SRefBusinessDataInstanceBuilderFactory.class); if (outputBusinessData != null) { final SRefBusinessDataInstance outputRefInstance = instanceFactory.createNewInstanceForFlowNode(outputBusinessData.getName(), flowNodeInstance.getId(), null, outputBusinessData.getClassName()).done(); addRefBusinessData(outputRefInstance); } final SBusinessDataDefinition inputBusinessData = activityDefinition.getBusinessDataDefinition(miLoop.getDataInputItemRef()); if (inputBusinessData != null) { try { final SMultiRefBusinessDataInstance loopDataRefInstance = (SMultiRefBusinessDataInstance) refBusinessDataService.getRefBusinessDataInstance( miLoop.getLoopDataInputRef(), flowNodeInstance.getParentProcessInstanceId()); final List<Long> dataIds = loopDataRefInstance.getDataIds(); final SRefBusinessDataInstance inputRefInstance = instanceFactory.createNewInstanceForFlowNode(inputBusinessData.getName(), flowNodeInstance.getId(), dataIds.get(flowNodeInstance.getLoopCounter()), inputBusinessData.getClassName()).done(); addRefBusinessData(inputRefInstance); } catch (final SRefBusinessDataInstanceNotFoundException | SBonitaReadException e) { throw new SDataInstanceException(e); } } }
if (loopCharacteristics instanceof SMultiInstanceLoopCharacteristics) { final SMultiInstanceLoopCharacteristics miLoop = (SMultiInstanceLoopCharacteristics) loopCharacteristics; final SExpression loopCardinality = miLoop.getLoopCardinality(); int numberOfInstanceMax = -1; if (loopCardinality != null) { .getId())); activityInstanceService.setLoopCardinality(multiInstanceActivityInstance, numberOfInstanceMax); } else if (miLoop.getLoopDataInputRef() != null) { numberOfInstanceMax = stateBehaviors.getNumberOfInstancesToCreateFromInputRef(processDefinition, multiInstanceActivityInstance, miLoop, numberOfInstanceMax); stateBehaviors.createInnerInstances(processDefinition.getId(), activity, multiInstanceActivityInstance, miLoop.isSequential() ? 1 : numberOfInstanceMax);
protected void createDataInstancesForMultiInstance(final SActivityDefinition activityDefinition, final SFlowNodeInstance flowNodeInstance, final SExpressionContext expressionContext) throws SDataInstanceException, SExpressionException { final SLoopCharacteristics loopCharacteristics = activityDefinition.getLoopCharacteristics(); final SMultiInstanceLoopCharacteristics miLoop = (SMultiInstanceLoopCharacteristics) loopCharacteristics; createBusinessDataInstancesForMultiInstance(activityDefinition, flowNodeInstance, miLoop); createDataInstances(activityDefinition.getSDataDefinitions(), flowNodeInstance.getId(), DataInstanceContainer.ACTIVITY_INSTANCE, expressionContext, miLoop.getLoopDataInputRef(), flowNodeInstance.getLoopCounter(), miLoop.getDataInputItemRef(), flowNodeInstance.getParentContainerId()); }
private boolean createDataInstances(final SActivityDefinition activityDefinition, final SFlowNodeInstance flowNodeInstance, final SExpressionContext expressionContext) throws SActivityStateExecutionException { final List<SDataDefinition> sDataDefinitions = activityDefinition.getSDataDefinitions(); final SLoopCharacteristics loopCharacteristics = activityDefinition.getLoopCharacteristics(); try { if (loopCharacteristics instanceof SMultiInstanceLoopCharacteristics && (((SMultiInstanceLoopCharacteristics) loopCharacteristics).getDataInputItemRef() != null || ((SMultiInstanceLoopCharacteristics) loopCharacteristics).getDataOutputItemRef() != null)) { createDataInstancesForMultiInstance(activityDefinition, flowNodeInstance, expressionContext); } else { createDataInstances(sDataDefinitions, flowNodeInstance.getId(), DataInstanceContainer.ACTIVITY_INSTANCE, expressionContext); } if (!sDataDefinitions.isEmpty() && logger.isLoggable(this.getClass(), TechnicalLogSeverity.DEBUG)) { final String message = "Initialized variables for flow node" + LogMessageBuilder.buildFlowNodeContextMessage(flowNodeInstance); logger.log(this.getClass(), TechnicalLogSeverity.DEBUG, message); } return sDataDefinitions.size() > 0; } catch (final SBonitaException e) { throw new SActivityStateExecutionException(e); } }
boolean isBusinessData(final SProcessDefinition processDefinition, final SMultiInstanceLoopCharacteristics miLoop) { final SFlowElementContainerDefinition processContainer = processDefinition.getProcessContainer(); final SBusinessDataDefinition businessData = processContainer.getBusinessDataDefinition(miLoop.getLoopDataOutputRef()); return businessData != null; }
private int getNumberOfInstanceToCreateFromSimpleData(final SProcessDefinition processDefinition, final SFlowNodeInstance flowNodeInstance, final SMultiInstanceLoopCharacteristics miLoop, final int numberOfInstanceMax) throws SDataInstanceException, SActivityStateExecutionException { final SDataInstance loopDataInput = dataInstanceService.getDataInstance(miLoop.getLoopDataInputRef(), flowNodeInstance.getId(), DataInstanceContainer.ACTIVITY_INSTANCE.name(), parentContainerResolver); if (loopDataInput != null) { final Serializable value = loopDataInput.getValue(); if (value instanceof List) { final List<?> loopDataInputCollection = (List<?>) value; return loopDataInputCollection.size(); } throw new SActivityStateExecutionException("The multi instance on activity " + flowNodeInstance.getName() + " of process " + processDefinition.getName() + " " + processDefinition.getVersion() + " have a loop data input which is not a java.util.List"); } return numberOfInstanceMax; }
final SExpression completionCondition = loopCharacteristics.getCompletionCondition(); final Map<String, Object> input = new HashMap<>(1); input.put(ExpressionConstants.NUMBER_OF_ACTIVE_INSTANCES.getEngineConstantName(), miActivity.getNumberOfActiveInstances());
private SMultiInstanceActivityInstanceBuilder createMultiInstanceActivityInstance(final long processDefinitionId, final long rootContainerId, final long parentContainerId, final long rootProcessInstanceId, final long parentProcessInstanceId, final SActivityDefinition activityDefinition, final SMultiInstanceLoopCharacteristics loopCharacteristics) { final SMultiInstanceActivityInstanceBuilder builder = BuilderFactory.get(SMultiInstanceActivityInstanceBuilderFactory.class) .createNewOuterTaskInstance( activityDefinition.getName(), activityDefinition.getId(), rootContainerId, parentContainerId, processDefinitionId, rootProcessInstanceId, parentProcessInstanceId, loopCharacteristics.isSequential()); builder.setLoopDataInputRef(loopCharacteristics.getLoopDataInputRef()); builder.setLoopDataOutputRef(loopCharacteristics.getLoopDataOutputRef()); builder.setDataInputItemRef(loopCharacteristics.getDataInputItemRef()); builder.setDataOutputItemRef(loopCharacteristics.getDataOutputItemRef()); return builder; }
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); } } } }