Skip to content

Commit

Permalink
Merge #2897
Browse files Browse the repository at this point in the history
2897: feat(broker): parallel multi-instance sub-process and receive task r=saig0 a=saig0

## Description

* adding support for parallel multi-instance sub-process and receive task
* mainly added test cases to verify the behavior

## Related issues

closes #2846 

#

Co-authored-by: Philipp Ossler <philipp.ossler@gmail.com>
  • Loading branch information
zeebe-bors[bot] and saig0 committed Jul 30, 2019
2 parents 478721c + 59b2609 commit 93088f6
Show file tree
Hide file tree
Showing 12 changed files with 926 additions and 317 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -35,15 +35,16 @@ public abstract class AbstractActivityBuilder<
B extends AbstractActivityBuilder<B, E>, E extends Activity>
extends AbstractFlowNodeBuilder<B, E> implements ZeebeVariablesMappingBuilder<B> {

protected AbstractActivityBuilder(BpmnModelInstance modelInstance, E element, Class<?> selfType) {
protected AbstractActivityBuilder(
final BpmnModelInstance modelInstance, final E element, final Class<?> selfType) {
super(modelInstance, element, selfType);
}

public BoundaryEventBuilder boundaryEvent() {
return boundaryEvent(null);
}

public BoundaryEventBuilder boundaryEvent(String id) {
public BoundaryEventBuilder boundaryEvent(final String id) {
final BoundaryEvent boundaryEvent = createSibling(BoundaryEvent.class, id);
boundaryEvent.setAttachedTo(element);

Expand All @@ -53,7 +54,8 @@ public BoundaryEventBuilder boundaryEvent(String id) {
return boundaryEvent.builder();
}

public BoundaryEventBuilder boundaryEvent(String id, Consumer<BoundaryEventBuilder> consumer) {
public BoundaryEventBuilder boundaryEvent(
final String id, final Consumer<BoundaryEventBuilder> consumer) {
final BoundaryEventBuilder builder = boundaryEvent(id);
consumer.accept(builder);
return builder;
Expand All @@ -66,14 +68,13 @@ public MultiInstanceLoopCharacteristicsBuilder multiInstance() {
return miCharacteristics.builder();
}

public MultiInstanceLoopCharacteristicsBuilder multiInstance(
Consumer<MultiInstanceLoopCharacteristicsBuilder> consumer) {
public B multiInstance(final Consumer<MultiInstanceLoopCharacteristicsBuilder> consumer) {
final MultiInstanceLoopCharacteristicsBuilder builder = multiInstance();
consumer.accept(builder);
return builder;
return myself;
}

protected double calculateXCoordinate(Bounds boundaryEventBounds) {
protected double calculateXCoordinate(final Bounds boundaryEventBounds) {
final BpmnShape attachedToElement = findBpmnShape(element);

double x = 0;
Expand Down Expand Up @@ -120,7 +121,7 @@ protected double calculateXCoordinate(Bounds boundaryEventBounds) {
return x;
}

protected void setBoundaryEventCoordinates(BpmnShape bpmnShape) {
protected void setBoundaryEventCoordinates(final BpmnShape bpmnShape) {
final BpmnShape activity = findBpmnShape(element);
final Bounds boundaryBounds = bpmnShape.getBounds();

Expand All @@ -141,7 +142,7 @@ protected void setBoundaryEventCoordinates(BpmnShape bpmnShape) {
}

@Override
public B zeebeInput(String source, String target) {
public B zeebeInput(final String source, final String target) {
final ZeebeIoMapping ioMapping = getCreateSingleExtensionElement(ZeebeIoMapping.class);
final ZeebeInput input = createChild(ioMapping, ZeebeInput.class);
input.setSource(source);
Expand All @@ -151,7 +152,7 @@ public B zeebeInput(String source, String target) {
}

@Override
public B zeebeOutput(String source, String target) {
public B zeebeOutput(final String source, final String target) {
final ZeebeIoMapping ioMapping = getCreateSingleExtensionElement(ZeebeIoMapping.class);
final ZeebeOutput input = createChild(ioMapping, ZeebeOutput.class);
input.setSource(source);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,8 @@ public abstract class AbstractFlowNodeBuilder<
protected BoundaryEvent compensateBoundaryEvent;
private SequenceFlowBuilder currentSequenceFlowBuilder;

protected AbstractFlowNodeBuilder(BpmnModelInstance modelInstance, E element, Class<?> selfType) {
protected AbstractFlowNodeBuilder(
final BpmnModelInstance modelInstance, final E element, final Class<?> selfType) {
super(modelInstance, element, selfType);
}

Expand All @@ -70,7 +71,7 @@ protected SequenceFlowBuilder getCurrentSequenceFlowBuilder() {
return currentSequenceFlowBuilder;
}

public B condition(String name, String condition) {
public B condition(final String name, final String condition) {
if (name != null) {
getCurrentSequenceFlowBuilder().name(name);
}
Expand All @@ -80,11 +81,11 @@ public B condition(String name, String condition) {
return myself;
}

public B condition(String condition) {
public B condition(final String condition) {
return condition(null, condition);
}

protected void connectTarget(FlowNode target) {
protected void connectTarget(final FlowNode target) {
// check if compensation was started
if (isBoundaryEventWithStartedCompensation()) {
// the target activity should be marked for compensation
Expand All @@ -104,15 +105,15 @@ protected void connectTarget(FlowNode target) {
}
}

protected void connectTargetWithSequenceFlow(FlowNode target) {
protected void connectTargetWithSequenceFlow(final FlowNode target) {
getCurrentSequenceFlowBuilder().from(element).to(target);

final SequenceFlow sequenceFlow = getCurrentSequenceFlowBuilder().getElement();
createEdge(sequenceFlow);
currentSequenceFlowBuilder = null;
}

protected void connectTargetWithAssociation(FlowNode target) {
protected void connectTargetWithAssociation(final FlowNode target) {
final Association association = modelInstance.newInstance(Association.class);
association.setTarget(target);
association.setSource(element);
Expand All @@ -130,16 +131,16 @@ public AbstractFlowNodeBuilder compensationDone() {
}
}

public B sequenceFlowId(String sequenceFlowId) {
public B sequenceFlowId(final String sequenceFlowId) {
getCurrentSequenceFlowBuilder().id(sequenceFlowId);
return myself;
}

private <T extends FlowNode> T createTarget(Class<T> typeClass) {
private <T extends FlowNode> T createTarget(final Class<T> typeClass) {
return createTarget(typeClass, null);
}

protected <T extends FlowNode> T createTarget(Class<T> typeClass, String identifier) {
protected <T extends FlowNode> T createTarget(final Class<T> typeClass, final String identifier) {
final T target = createSibling(typeClass, identifier);

final BpmnShape targetBpmnShape = createBpmnShape(target);
Expand All @@ -150,13 +151,12 @@ protected <T extends FlowNode> T createTarget(Class<T> typeClass, String identif
}

protected <T extends AbstractFlowNodeBuilder, F extends FlowNode> T createTargetBuilder(
Class<F> typeClass) {
final Class<F> typeClass) {
return createTargetBuilder(typeClass, null);
}

@SuppressWarnings("unchecked")
protected <T extends AbstractFlowNodeBuilder, F extends FlowNode> T createTargetBuilder(
Class<F> typeClass, String id) {
final Class<F> typeClass, final String id) {
final AbstractFlowNodeBuilder builder = createTarget(typeClass, id).builder();

if (compensationStarted) {
Expand All @@ -171,11 +171,12 @@ public ServiceTaskBuilder serviceTask() {
return createTargetBuilder(ServiceTask.class);
}

public ServiceTaskBuilder serviceTask(String id) {
public ServiceTaskBuilder serviceTask(final String id) {
return createTargetBuilder(ServiceTask.class, id);
}

public ServiceTaskBuilder serviceTask(String id, Consumer<ServiceTaskBuilder> consumer) {
public ServiceTaskBuilder serviceTask(
final String id, final Consumer<ServiceTaskBuilder> consumer) {
final ServiceTaskBuilder builder = createTargetBuilder(ServiceTask.class, id);
consumer.accept(builder);
return builder;
Expand All @@ -185,63 +186,70 @@ public SendTaskBuilder sendTask() {
return createTargetBuilder(SendTask.class);
}

public SendTaskBuilder sendTask(String id) {
public SendTaskBuilder sendTask(final String id) {
return createTargetBuilder(SendTask.class, id);
}

public UserTaskBuilder userTask() {
return createTargetBuilder(UserTask.class);
}

public UserTaskBuilder userTask(String id) {
public UserTaskBuilder userTask(final String id) {
return createTargetBuilder(UserTask.class, id);
}

public BusinessRuleTaskBuilder businessRuleTask() {
return createTargetBuilder(BusinessRuleTask.class);
}

public BusinessRuleTaskBuilder businessRuleTask(String id) {
public BusinessRuleTaskBuilder businessRuleTask(final String id) {
return createTargetBuilder(BusinessRuleTask.class, id);
}

public ScriptTaskBuilder scriptTask() {
return createTargetBuilder(ScriptTask.class);
}

public ScriptTaskBuilder scriptTask(String id) {
public ScriptTaskBuilder scriptTask(final String id) {
return createTargetBuilder(ScriptTask.class, id);
}

public ReceiveTaskBuilder receiveTask() {
return createTargetBuilder(ReceiveTask.class);
}

public ReceiveTaskBuilder receiveTask(String id) {
public ReceiveTaskBuilder receiveTask(final String id) {
return createTargetBuilder(ReceiveTask.class, id);
}

public ReceiveTaskBuilder receiveTask(
final String id, final Consumer<ReceiveTaskBuilder> consumer) {
final ReceiveTaskBuilder builder = createTargetBuilder(ReceiveTask.class, id);
consumer.accept(builder);
return builder;
}

public ManualTaskBuilder manualTask() {
return createTargetBuilder(ManualTask.class);
}

public ManualTaskBuilder manualTask(String id) {
public ManualTaskBuilder manualTask(final String id) {
return createTargetBuilder(ManualTask.class, id);
}

public EndEventBuilder endEvent() {
return createTarget(EndEvent.class).builder();
}

public EndEventBuilder endEvent(String id) {
public EndEventBuilder endEvent(final String id) {
return createTarget(EndEvent.class, id).builder();
}

public ParallelGatewayBuilder parallelGateway() {
return createTarget(ParallelGateway.class).builder();
}

public ParallelGatewayBuilder parallelGateway(String id) {
public ParallelGatewayBuilder parallelGateway(final String id) {
return createTarget(ParallelGateway.class, id).builder();
}

Expand All @@ -257,28 +265,28 @@ public EventBasedGatewayBuilder eventBasedGateway() {
return createTarget(EventBasedGateway.class).builder();
}

public EventBasedGatewayBuilder eventBasedGateway(String id) {
public EventBasedGatewayBuilder eventBasedGateway(final String id) {
return createTarget(EventBasedGateway.class, id).builder();
}

public ExclusiveGatewayBuilder exclusiveGateway(String id) {
public ExclusiveGatewayBuilder exclusiveGateway(final String id) {
return createTarget(ExclusiveGateway.class, id).builder();
}

public InclusiveGatewayBuilder inclusiveGateway(String id) {
public InclusiveGatewayBuilder inclusiveGateway(final String id) {
return createTarget(InclusiveGateway.class, id).builder();
}

public IntermediateCatchEventBuilder intermediateCatchEvent() {
return createTarget(IntermediateCatchEvent.class).builder();
}

public IntermediateCatchEventBuilder intermediateCatchEvent(String id) {
public IntermediateCatchEventBuilder intermediateCatchEvent(final String id) {
return createTarget(IntermediateCatchEvent.class, id).builder();
}

public IntermediateCatchEventBuilder intermediateCatchEvent(
String id, Consumer<IntermediateCatchEventBuilder> builderConsumer) {
final String id, final Consumer<IntermediateCatchEventBuilder> builderConsumer) {
final IntermediateCatchEventBuilder builder =
createTarget(IntermediateCatchEvent.class, id).builder();
builderConsumer.accept(builder);
Expand All @@ -289,27 +297,27 @@ public IntermediateThrowEventBuilder intermediateThrowEvent() {
return createTarget(IntermediateThrowEvent.class).builder();
}

public IntermediateThrowEventBuilder intermediateThrowEvent(String id) {
public IntermediateThrowEventBuilder intermediateThrowEvent(final String id) {
return createTarget(IntermediateThrowEvent.class, id).builder();
}

public CallActivityBuilder callActivity() {
return createTarget(CallActivity.class).builder();
}

public CallActivityBuilder callActivity(String id) {
public CallActivityBuilder callActivity(final String id) {
return createTarget(CallActivity.class, id).builder();
}

public SubProcessBuilder subProcess() {
return createTarget(SubProcess.class).builder();
}

public SubProcessBuilder subProcess(String id) {
public SubProcessBuilder subProcess(final String id) {
return createTarget(SubProcess.class, id).builder();
}

public SubProcessBuilder subProcess(String id, Consumer<SubProcessBuilder> consumer) {
public SubProcessBuilder subProcess(final String id, final Consumer<SubProcessBuilder> consumer) {

final SubProcessBuilder builder = createTarget(SubProcess.class, id).builder();
consumer.accept(builder);
Expand All @@ -321,12 +329,12 @@ public TransactionBuilder transaction() {
return new TransactionBuilder(modelInstance, transaction);
}

public TransactionBuilder transaction(String id) {
public TransactionBuilder transaction(final String id) {
final Transaction transaction = createTarget(Transaction.class, id);
return new TransactionBuilder(modelInstance, transaction);
}

private <T extends Gateway> T findLastGateway(Class<T> gatewayType) {
private <T extends Gateway> T findLastGateway(final Class<T> gatewayType) {
FlowNode lastGateway = element;
while (true) {
try {
Expand All @@ -349,7 +357,7 @@ public AbstractExclusiveGatewayBuilder<?> moveToLastExclusiveGateway() {
return findLastGateway(ExclusiveGateway.class).builder();
}

public AbstractFlowNodeBuilder<?, ?> moveToNode(String identifier) {
public AbstractFlowNodeBuilder<?, ?> moveToNode(final String identifier) {
final ModelElementInstance instance = modelInstance.getModelElementById(identifier);
if (instance instanceof FlowNode) {
return ((FlowNode) instance).builder();
Expand All @@ -358,8 +366,7 @@ public AbstractExclusiveGatewayBuilder<?> moveToLastExclusiveGateway() {
}
}

@SuppressWarnings("unchecked")
public <T extends AbstractActivityBuilder<?, ?>> T moveToActivity(String identifier) {
public <T extends AbstractActivityBuilder<?, ?>> T moveToActivity(final String identifier) {
final ModelElementInstance instance = modelInstance.getModelElementById(identifier);
if (instance instanceof Activity) {
return (T) ((Activity) instance).builder();
Expand All @@ -368,7 +375,7 @@ public AbstractExclusiveGatewayBuilder<?> moveToLastExclusiveGateway() {
}
}

public AbstractFlowNodeBuilder<?, ?> connectTo(String identifier) {
public AbstractFlowNodeBuilder<?, ?> connectTo(final String identifier) {
final ModelElementInstance target = modelInstance.getModelElementById(identifier);
if (target == null) {
throw new BpmnModelException(
Expand Down

0 comments on commit 93088f6

Please sign in to comment.