@Override public void find(ActivityDefinition activityDefinition, long expressionDefinitionId) { findExpressionFromNotNullContainer(activityDefinition.getDisplayName(), expressionDefinitionId); findExpressionFromNotNullContainer(activityDefinition.getLoopCharacteristics(), expressionDefinitionId); for (BusinessDataDefinition businessDataDefinition : activityDefinition.getBusinessDataDefinitions()) { findExpressionFromNotNullContainer(businessDataDefinition, expressionDefinitionId); } for (DataDefinition dataDefinition : activityDefinition.getDataDefinitions()) { findExpressionFromNotNullContainer(dataDefinition, expressionDefinitionId); } getExpressionFromOperationList(activityDefinition.getOperations(), expressionDefinitionId); for (BoundaryEventDefinition boundaryEventDefinition : activityDefinition.getBoundaryEventDefinitions()) { findExpressionFromNotNullContainer(boundaryEventDefinition, expressionDefinitionId); } }
private void validateOperationsInActivities(final FlowElementContainerDefinition flowElementContainer) { for (ActivityDefinition activity : flowElementContainer.getActivities()) { if (activity.getOperations().size() > 1) { validateOperations(activity.getOperations(), activity.getName()); } validateConnectors(activity.getConnectors()); } }
ConnectorDefinitionBuilder(final ProcessDefinitionBuilder processDefinitionBuilder, final FlowElementContainerDefinitionImpl container, final String name, final String connectorId, final String version, final ConnectorEvent activationEvent, final ActivityDefinition activity) { super(container, processDefinitionBuilder); this.processDefinitionBuilder = processDefinitionBuilder; connectorDefinition = new ConnectorDefinitionImpl(name, connectorId, version, activationEvent); activity.addConnector(connectorDefinition); }
private boolean isReferenceValid(final String dataReference, final ActivityDefinition activity) { final FlowElementContainerDefinition processContainer = process.getProcessContainer(); return dataReference == null || activity.getBusinessDataDefinition(dataReference) != null || processContainer.getBusinessDataDefinition(dataReference) != null || activity.getDataDefinition(dataReference) != null || processContainer.getDataDefinition(dataReference) != null; }
public SActivityDefinitionImpl(final ActivityDefinition activityDefinition, final Map<String, STransitionDefinition> transitionsMap) { super(activityDefinition, transitionsMap); final List<DataDefinition> dataDefinitions = activityDefinition.getDataDefinitions(); for (final DataDefinition dataDefinition : dataDefinitions) { sDataDefinitions.add(ServerModelConvertor.convertDataDefinition(dataDefinition)); } for (final BusinessDataDefinition businessDataDefinition : activityDefinition.getBusinessDataDefinitions()) { businessDataDefinitions.add(ServerModelConvertor.convertBusinessDataDefinition(businessDataDefinition)); } final List<Operation> operations = activityDefinition.getOperations(); for (final Operation operation : operations) { sOperations.add(ServerModelConvertor.convertOperation(operation)); } final LoopCharacteristics loop = activityDefinition.getLoopCharacteristics(); if (loop != null) { if (loop instanceof StandardLoopCharacteristics) { loopCharacteristics = new SStandardLoopCharacteristicsImpl((StandardLoopCharacteristics) loop); } else { loopCharacteristics = new SMultiInstanceLoopCharacteristicsImpl((MultiInstanceLoopCharacteristics) loop); } } addBoundaryEvents(activityDefinition, transitionsMap); }
List<ActivityDefinition> asList = Arrays.asList(procAct1, procAct2, procAct3); for (final ActivityDefinition activityDefinition : asList) { if (activityDefinition.getName().equals("auto1")) { orgAuto1 = activityDefinition; } else if (activityDefinition.getName().equals("user1")) { orgUser1 = activityDefinition; } else if (activityDefinition.getName().equals("manual1")) { orgManual1 = activityDefinition; asList = Arrays.asList(resAct1, resAct2, resAct3); for (final ActivityDefinition activityDefinition : asList) { if (activityDefinition.getName().equals("auto1")) { auto1 = activityDefinition; } else if (activityDefinition.getName().equals("user1")) { user1 = activityDefinition; } else if (activityDefinition.getName().equals("manual1")) { manual1 = activityDefinition; assertEquals("auto task not same", orgAuto1, auto1); assertEquals("manual task not same", orgManual1, manual1); assertEquals(3, user1.getDataDefinitions().size()); final DataDefinition dataDefinition1 = user1.getDataDefinitions().get(0); final DataDefinition dataDefinition2 = user1.getDataDefinitions().get(1); final DataDefinition dataDefinition3 = user1.getDataDefinitions().get(2); assertEquals("testData", dataDefinition1.getName()); assertEquals("shortText", dataDefinition2.getName()); assertFalse(((TextDataDefinition) dataDefinition2).isLongText()); assertTrue(((TextDataDefinition) dataDefinition3).isLongText());
final LoopCharacteristics loopCharacteristics = activity.getLoopCharacteristics(); if (loopCharacteristics instanceof MultiInstanceLoopCharacteristics) { if (businessDataDefinition.getName().equals(((MultiInstanceLoopCharacteristics) loopCharacteristics).getLoopDataInputRef()) && !businessDataDefinition.isMultiple()) { addError("The business data " + businessDataDefinition.getName() + " used in the multi instance " + activity.getName() + " must be multiple"); final List<BusinessDataDefinition> dataDefinitions = activity.getBusinessDataDefinitions(); if (activity.getLoopCharacteristics() instanceof MultiInstanceLoopCharacteristics) { final MultiInstanceLoopCharacteristics multiInstanceCharacteristics = (MultiInstanceLoopCharacteristics) activity.getLoopCharacteristics(); final String loopDataInputRef = multiInstanceCharacteristics.getLoopDataInputRef(); if (!isReferenceValid(loopDataInputRef)) { addError("The activity " + activity.getName() + " contains a reference " + loopDataInputRef + " for the loop data input to an unknown data"); addError("The activity " + activity.getName() + " contains a reference " + dataInputItemRef + " for the data input item to an unknown data"); addError("The activity " + activity.getName() + " contains a reference " + dataOutputItemRef + " for the data output item to an unknown data"); addError("The activity " + activity.getName() + " contains a reference " + loopDataOutputRef + " for the loop data output to an unknown data"); addError("The activity " + activity.getName() + " contains business data but this activity does not have the multiple instance behaviour"); for (BusinessDataDefinition businessDataDefinition : activity.getBusinessDataDefinitions()) { if (!names.add(businessDataDefinition.getName())) { addError("The activity " + activity.getName() + " contains more than one business data with the name " + businessDataDefinition.getName());
private void validateBoundaryEvents(final FlowElementContainerDefinition processContainer) { for (final ActivityDefinition activity : processContainer.getActivities()) { if (!activity.getBoundaryEventDefinitions().isEmpty() && !supportAllBoundaryEvents(activity)) { for (final BoundaryEventDefinition boundary : activity.getBoundaryEventDefinitions()) { if (!boundary.getTimerEventTriggerDefinitions().isEmpty()) { designErrors.add("Timer boundary events are not supported in automatic, receive and send tasks: " + activity.getName()); designErrors.add("Signal boundary events are not supported in automatic, receive and send tasks: " + activity.getName()); designErrors.add("Message boundary events are not supported in automatic, receive and send tasks: " + activity.getName()); for (final BoundaryEventDefinition boundaryEvent : activity.getBoundaryEventDefinitions()) { if (boundaryEvent.getOutgoingTransitions().isEmpty()) { designErrors.add("A boundary event must have outgoing transitions: " + boundaryEvent.getName());
private List<BoundaryEventDefinition> getBoundaryEvents() { final List<BoundaryEventDefinition> boundaryEvents = new ArrayList<>(3); for (final ActivityDefinition activity : activities) { boundaryEvents.addAll(activity.getBoundaryEventDefinitions()); } return boundaryEvents; }
private void validateMultiInstances(final FlowElementContainerDefinition processContainer) { for (final ActivityDefinition activity : processContainer.getActivities()) { if (activity.getLoopCharacteristics() != null && activity.getLoopCharacteristics() instanceof MultiInstanceLoopCharacteristics) { final MultiInstanceLoopCharacteristics loopCharacteristics = (MultiInstanceLoopCharacteristics) activity.getLoopCharacteristics(); if (loopCharacteristics.getLoopDataInputRef() != null && !loopCharacteristics.getLoopDataInputRef().isEmpty() && (loopCharacteristics.getLoopDataInputRef() == null || loopCharacteristics.getLoopDataInputRef().isEmpty())) { designErrors.add("The multi instance has got a data input reference but does not have a loop data input on activity" + activity.getName()); } if (loopCharacteristics.getDataOutputItemRef() != null && !loopCharacteristics.getDataOutputItemRef().isEmpty() && (loopCharacteristics.getLoopDataOutputRef() == null || loopCharacteristics.getLoopDataOutputRef().isEmpty())) { designErrors .add("The multi instance has got a data output reference but does not have a loop data output on activity" + activity.getName()); } // TODO add validation on data existence } } }
private void validateEventsSubProcess() { final FlowElementContainerDefinition processContainer = process.getProcessContainer(); for (final ActivityDefinition activity : processContainer.getActivities()) { if (activity instanceof SubProcessDefinition) { final FlowElementContainerDefinition subProcessContainer = ((SubProcessDefinition) activity).getSubProcessContainer(); if (subProcessContainer == null) { designErrors.add("The subprocess " + activity.getName() + " does not have any element," + " add at least one element using the builder that can be retrieved on the subprocess activity:" + " org.bonitasoft.engine.bpm.process.impl.SubProcessActivityDefinitionBuilder.getSubProcessBuilder()"); return; } if (((SubProcessDefinition) activity).isTriggeredByEvent()) { if (subProcessContainer.getStartEvents().size() != 1) { designErrors.add("An event sub process must have one and only one start events, but " + subProcessContainer.getStartEvents().size() + " were found : " + activity); } if (!subProcessContainer.getStartEvents().isEmpty() && subProcessContainer.getStartEvents().get(0).getEventTriggers().isEmpty()) { designErrors.add("The event sub process have no start event with a not NONE trigger : " + activity); } if (activity.getIncomingTransitions().size() > 0) { designErrors.add("An event sub process cannot have incoming transitions : " + activity); } if (activity.getOutgoingTransitions().size() > 0) { designErrors.add("An event sub process cannot have outgoing transitions : " + activity); } } validateProcess(subProcessContainer, false); } } }
protected UserTaskDefinition findActivityWithName(List<ActivityDefinition> activities, String task) { if (task != null && activities != null) { for (ActivityDefinition activity : activities) { if (task.equals(activity.getName()) && activity instanceof UserTaskDefinition) { return (UserTaskDefinition) activity; } } } return null; } }
public SActivityDefinitionImpl(final ActivityDefinition activityDefinition, final Map<String, STransitionDefinition> transitionsMap) { super(activityDefinition, transitionsMap); final List<DataDefinition> dataDefinitions = activityDefinition.getDataDefinitions(); for (final DataDefinition dataDefinition : dataDefinitions) { sDataDefinitions.add(ServerModelConvertor.convertDataDefinition(dataDefinition)); } for (final BusinessDataDefinition businessDataDefinition : activityDefinition.getBusinessDataDefinitions()) { businessDataDefinitions.add(ServerModelConvertor.convertBusinessDataDefinition(businessDataDefinition)); } final List<Operation> operations = activityDefinition.getOperations(); for (final Operation operation : operations) { sOperations.add(ServerModelConvertor.convertOperation(operation)); } final LoopCharacteristics loop = activityDefinition.getLoopCharacteristics(); if (loop != null) { if (loop instanceof StandardLoopCharacteristics) { loopCharacteristics = new SStandardLoopCharacteristicsImpl((StandardLoopCharacteristics) loop); } else { loopCharacteristics = new SMultiInstanceLoopCharacteristicsImpl((MultiInstanceLoopCharacteristics) loop); } } addBoundaryEvents(activityDefinition, transitionsMap); }
final LoopCharacteristics loopCharacteristics = activity.getLoopCharacteristics(); if (loopCharacteristics instanceof MultiInstanceLoopCharacteristics) { if (businessDataDefinition.getName().equals(((MultiInstanceLoopCharacteristics) loopCharacteristics).getLoopDataInputRef()) && !businessDataDefinition.isMultiple()) { addError("The business data " + businessDataDefinition.getName() + " used in the multi instance " + activity.getName() + " must be multiple"); final List<BusinessDataDefinition> dataDefinitions = activity.getBusinessDataDefinitions(); if (activity.getLoopCharacteristics() instanceof MultiInstanceLoopCharacteristics) { final MultiInstanceLoopCharacteristics multiInstanceCharacteristics = (MultiInstanceLoopCharacteristics) activity.getLoopCharacteristics(); final String loopDataInputRef = multiInstanceCharacteristics.getLoopDataInputRef(); if (!isReferenceValid(loopDataInputRef)) { addError("The activity " + activity.getName() + " contains a reference " + loopDataInputRef + " for the loop data input to an unknown data"); addError("The activity " + activity.getName() + " contains a reference " + dataInputItemRef + " for the data input item to an unknown data"); addError("The activity " + activity.getName() + " contains a reference " + dataOutputItemRef + " for the data output item to an unknown data"); addError("The activity " + activity.getName() + " contains a reference " + loopDataOutputRef + " for the loop data output to an unknown data"); addError("The activity " + activity.getName() + " contains business data but this activity does not have the multiple instance behaviour"); for (BusinessDataDefinition businessDataDefinition : activity.getBusinessDataDefinitions()) { if (!names.add(businessDataDefinition.getName())) { addError("The activity " + activity.getName() + " contains more than one business data with the name " + businessDataDefinition.getName());
private void validateBoundaryEvents(final FlowElementContainerDefinition processContainer) { for (final ActivityDefinition activity : processContainer.getActivities()) { if (!activity.getBoundaryEventDefinitions().isEmpty() && !supportAllBoundaryEvents(activity)) { for (final BoundaryEventDefinition boundary : activity.getBoundaryEventDefinitions()) { if (!boundary.getTimerEventTriggerDefinitions().isEmpty()) { designErrors.add("Timer boundary events are not supported in automatic, receive and send tasks: " + activity.getName()); designErrors.add("Signal boundary events are not supported in automatic, receive and send tasks: " + activity.getName()); designErrors.add("Message boundary events are not supported in automatic, receive and send tasks: " + activity.getName()); for (final BoundaryEventDefinition boundaryEvent : activity.getBoundaryEventDefinitions()) { if (boundaryEvent.getOutgoingTransitions().isEmpty()) { designErrors.add("A boundary event must have outgoing transitions: " + boundaryEvent.getName());
private List<BoundaryEventDefinition> getBoundaryEvents() { final List<BoundaryEventDefinition> boundaryEvents = new ArrayList<>(3); for (final ActivityDefinition activity : activities) { boundaryEvents.addAll(activity.getBoundaryEventDefinitions()); } return boundaryEvents; }
private void validateMultiInstances(final FlowElementContainerDefinition processContainer) { for (final ActivityDefinition activity : processContainer.getActivities()) { if (activity.getLoopCharacteristics() != null && activity.getLoopCharacteristics() instanceof MultiInstanceLoopCharacteristics) { final MultiInstanceLoopCharacteristics loopCharacteristics = (MultiInstanceLoopCharacteristics) activity.getLoopCharacteristics(); if (loopCharacteristics.getLoopDataInputRef() != null && !loopCharacteristics.getLoopDataInputRef().isEmpty() && (loopCharacteristics.getLoopDataInputRef() == null || loopCharacteristics.getLoopDataInputRef().isEmpty())) { designErrors.add("The multi instance has got a data input reference but does not have a loop data input on activity" + activity.getName()); } if (loopCharacteristics.getDataOutputItemRef() != null && !loopCharacteristics.getDataOutputItemRef().isEmpty() && (loopCharacteristics.getLoopDataOutputRef() == null || loopCharacteristics.getLoopDataOutputRef().isEmpty())) { designErrors .add("The multi instance has got a data output reference but does not have a loop data output on activity" + activity.getName()); } // TODO add validation on data existence } } }
private void validateEventsSubProcess() { final FlowElementContainerDefinition processContainer = process.getProcessContainer(); for (final ActivityDefinition activity : processContainer.getActivities()) { if (activity instanceof SubProcessDefinition) { final FlowElementContainerDefinition subProcessContainer = ((SubProcessDefinition) activity).getSubProcessContainer(); if (subProcessContainer == null) { designErrors.add("The subprocess " + activity.getName() + " does not have any element," + " add at least one element using the builder that can be retrieved on the subprocess activity:" + " org.bonitasoft.engine.bpm.process.impl.SubProcessActivityDefinitionBuilder.getSubProcessBuilder()"); return; } if (((SubProcessDefinition) activity).isTriggeredByEvent()) { if (subProcessContainer.getStartEvents().size() != 1) { designErrors.add("An event sub process must have one and only one start events, but " + subProcessContainer.getStartEvents().size() + " were found : " + activity); } if (!subProcessContainer.getStartEvents().isEmpty() && subProcessContainer.getStartEvents().get(0).getEventTriggers().isEmpty()) { designErrors.add("The event sub process have no start event with a not NONE trigger : " + activity); } if (activity.getIncomingTransitions().size() > 0) { designErrors.add("An event sub process cannot have incoming transitions : " + activity); } if (activity.getOutgoingTransitions().size() > 0) { designErrors.add("An event sub process cannot have outgoing transitions : " + activity); } } validateProcess(subProcessContainer, false); } } }
protected UserTaskDefinition findActivityWithName(List<ActivityDefinition> activities, String task) { if (task != null && activities != null) { for (ActivityDefinition activity : activities) { if (task.equals(activity.getName()) && activity instanceof UserTaskDefinition) { return (UserTaskDefinition) activity; } } } return null; } }
private boolean isReferenceValid(final String dataReference, final ActivityDefinition activity) { final FlowElementContainerDefinition processContainer = process.getProcessContainer(); return dataReference == null || activity.getBusinessDataDefinition(dataReference) != null || processContainer.getBusinessDataDefinition(dataReference) != null || activity.getDataDefinition(dataReference) != null || processContainer.getDataDefinition(dataReference) != null; }