Skip to content

Commit

Permalink
Add support for input parameters for a BPMN error handling
Browse files Browse the repository at this point in the history
  • Loading branch information
filiphr committed May 24, 2023
1 parent 737e2d7 commit c1f852c
Show file tree
Hide file tree
Showing 30 changed files with 774 additions and 41 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -608,7 +608,9 @@ protected void writeErrorDefinition(Event parentEvent, ErrorEventDefinition erro
writeQualifiedAttribute(ATTRIBUTE_ERROR_VARIABLE_TRANSIENT, errorDefinition.getErrorVariableTransient().toString(), xtw);
}

boolean didWriteExtensionStartElement = BpmnXMLUtil.writeExtensionElements(errorDefinition, false, model.getNamespaces(), xtw);
boolean didWriteExtensionStartElement = BpmnXMLUtil.writeIOParameters(BpmnXMLConstants.ELEMENT_IN_PARAMETERS, errorDefinition.getInParameters(),
false, xtw);
didWriteExtensionStartElement = BpmnXMLUtil.writeExtensionElements(errorDefinition, didWriteExtensionStartElement, model.getNamespaces(), xtw);
if (didWriteExtensionStartElement) {
xtw.writeEndElement();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,9 @@
*/
package org.flowable.bpmn.converter.child;

import java.util.HashMap;
import java.util.Map;

import javax.xml.stream.XMLStreamReader;

import org.flowable.bpmn.converter.util.BpmnXMLUtil;
Expand All @@ -25,6 +28,13 @@
*/
public class ErrorEventDefinitionParser extends BaseChildElementParser {

protected Map<String, BaseChildElementParser> childParserMap = new HashMap<>();

public ErrorEventDefinitionParser() {
InParameterParser inParameterParser = new InParameterParser();
childParserMap.put(inParameterParser.getElementName(), inParameterParser);
}

@Override
public String getElementName() {
return ELEMENT_EVENT_ERRORDEFINITION;
Expand All @@ -47,7 +57,7 @@ public void parseChildElement(XMLStreamReader xtr, BaseElement parentElement, Bp
eventDefinition.setErrorVariableLocalScope(
Boolean.parseBoolean(xtr.getAttributeValue(FLOWABLE_EXTENSIONS_NAMESPACE, ATTRIBUTE_ERROR_VARIABLE_LOCAL_SCOPE)));

BpmnXMLUtil.parseChildElements(ELEMENT_EVENT_ERRORDEFINITION, eventDefinition, xtr, model);
BpmnXMLUtil.parseChildElements(ELEMENT_EVENT_ERRORDEFINITION, eventDefinition, xtr, childParserMap, model);

((Event) parentElement).getEventDefinitions().add(eventDefinition);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import org.flowable.bpmn.model.CaseServiceTask;
import org.flowable.bpmn.model.Event;
import org.flowable.bpmn.model.ExtensionAttribute;
import org.flowable.bpmn.model.HasInParameters;
import org.flowable.bpmn.model.IOParameter;

public class InParameterParser extends BaseChildElementParser {
Expand Down Expand Up @@ -67,14 +68,8 @@ public void parseChildElement(XMLStreamReader xtr, BaseElement parentElement, Bp
parameter.setTransient(true);
}

if (parentElement instanceof CallActivity) {
((CallActivity) parentElement).getInParameters().add(parameter);

} else if (parentElement instanceof CaseServiceTask) {
((CaseServiceTask) parentElement).getInParameters().add(parameter);

} else if (parentElement instanceof Event) {
((Event) parentElement).getInParameters().add(parameter);
if (parentElement instanceof HasInParameters) {
((HasInParameters) parentElement).addInParameter(parameter);
}

BpmnXMLUtil.addCustomAttributes(xtr, parameter, defaultInParameterAttributes);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,8 @@
import org.flowable.bpmn.model.BaseElement;
import org.flowable.bpmn.model.BpmnModel;
import org.flowable.bpmn.model.CallActivity;
import org.flowable.bpmn.model.CaseServiceTask;
import org.flowable.bpmn.model.Event;
import org.flowable.bpmn.model.ExtensionAttribute;
import org.flowable.bpmn.model.HasOutParameters;
import org.flowable.bpmn.model.IOParameter;

public class OutParameterParser extends BaseChildElementParser {
Expand Down Expand Up @@ -64,15 +63,8 @@ public void parseChildElement(XMLStreamReader xtr, BaseElement parentElement, Bp

BpmnXMLUtil.addCustomAttributes(xtr, parameter, defaultOutParameterAttributes);

if (parentElement instanceof CallActivity) {
CallActivity callActivity = (CallActivity) parentElement;
callActivity.getOutParameters().add(parameter);

} else if (parentElement instanceof CaseServiceTask) {
((CaseServiceTask) parentElement).getOutParameters().add(parameter);

} else if (parentElement instanceof Event) {
((Event) parentElement).getOutParameters().add(parameter);
if (parentElement instanceof HasOutParameters) {
((HasOutParameters) parentElement).addOutParameter(parameter);
}

} else if (parentElement instanceof CallActivity) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -411,7 +411,7 @@ protected static void writeExtensionElement(ExtensionElement extensionElement, M

public static boolean writeIOParameters(String elementName, List<IOParameter> parameterList, boolean didWriteExtensionStartElement, XMLStreamWriter xtw) throws Exception {

if (parameterList.isEmpty()) {
if (parameterList == null || parameterList.isEmpty()) {
return didWriteExtensionStartElement;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -789,6 +789,7 @@
<attribute name="source" type="string" use="optional"/>
<attribute name="sourceExpression" type="tns:tExpression" use="optional"/>
<attribute name="target" type="string" use="required" />
<attribute name="transient" type="boolean" default="false" use="optional" />
</complexType>
</element>
<element name="out">
Expand All @@ -802,6 +803,7 @@
<attribute name="source" type="string" use="optional"/>
<attribute name="sourceExpression" type="tns:tExpression" use="optional"/>
<attribute name="target" type="string" use="required" />
<attribute name="transient" type="boolean" default="false" use="optional"/>
</complexType>
</element>

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
/* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.flowable.editor.language.xml;

import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.tuple;

import org.flowable.bpmn.model.BoundaryEvent;
import org.flowable.bpmn.model.BpmnModel;
import org.flowable.bpmn.model.ErrorEventDefinition;
import org.flowable.bpmn.model.FlowElement;
import org.flowable.bpmn.model.IOParameter;
import org.flowable.editor.language.xml.util.BpmnXmlConverterTest;

/**
* @author Filip Hrisafov
*/
class BoundaryErrorEventConverterTest {

@BpmnXmlConverterTest("boundaryErrorEventWithInParameters.bpmn")
void validateErrorBoundaryWithOutParameters(BpmnModel model) {
FlowElement flowElement = model.getFlowElement("theErrorBoundary");
assertThat(flowElement).isInstanceOfSatisfying(BoundaryEvent.class, event -> {
assertThat(event.getEventDefinitions())
.singleElement()
.isInstanceOfSatisfying(ErrorEventDefinition.class, errorDefinition -> {
assertThat(errorDefinition.getInParameters())
.extracting(IOParameter::getTarget, IOParameter::getSource, IOParameter::getSourceExpression)
.containsExactlyInAnyOrder(
tuple("targetErrorVar", "sourceVar", null),
tuple("targetErrorVarFromExpression", null, "${'test'}")
);
});
});
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:flowable="http://flowable.org/bpmn" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
exporter="Yaoqiang BPMN Editor" exporterVersion="2.2.12 (GPLv3, Non-Commercial)" expressionLanguage="http://www.w3.org/1999/XPath"
id="_1384552647085" name="" targetNamespace="http://sourceforge.net/bpmn/definitions/_1384552647085"
typeLanguage="http://www.w3.org/2001/XMLSchema"
xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL http://bpmn.sourceforge.net/schemas/BPMN20.xsd">
<error id="errorOne" name="Error One" errorCode="errorOne"/>
<process id="testProcess" isExecutable="true" name="Test Process">
<startEvent id="theStart"/>
<sequenceFlow id="flow1" sourceRef="theStart" targetRef="theTask"/>
<serviceTask id="theTask" flowable:expression="${true}"/>
<sequenceFlow id="flow2" sourceRef="theTask" targetRef="theEnd"/>
<boundaryEvent id="theErrorBoundary" attachedToRef="theTask">
<errorEventDefinition id="one" errorRef="errorOne">
<extensionElements>
<flowable:in target="targetErrorVar" source="sourceVar"/>
<flowable:in target="targetErrorVarFromExpression" sourceExpression="${'test'}"/>
</extensionElements>
</errorEventDefinition>
</boundaryEvent>
<endEvent id="theEnd"/>
</process>
</definitions>
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
* @author Tijs Rademakers
* @author Joram Barrez
*/
public class CallActivity extends Activity {
public class CallActivity extends Activity implements HasOutParameters, HasInParameters {

protected String calledElement;
protected String calledElementType;
Expand Down Expand Up @@ -59,18 +59,32 @@ public void setSameDeployment(boolean sameDeployment) {
this.sameDeployment = sameDeployment;
}

@Override
public List<IOParameter> getInParameters() {
return inParameters;
}

@Override
public void addInParameter(IOParameter inParameter) {
inParameters.add(inParameter);
}

@Override
public void setInParameters(List<IOParameter> inParameters) {
this.inParameters = inParameters;
}

@Override
public List<IOParameter> getOutParameters() {
return outParameters;
}

@Override
public void addOutParameter(IOParameter outParameter) {
this.outParameters.add(outParameter);
}

@Override
public void setOutParameters(List<IOParameter> outParameters) {
this.outParameters = outParameters;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
/**
* @author Tijs Rademakers
*/
public class CaseServiceTask extends ServiceTask {
public class CaseServiceTask extends ServiceTask implements HasOutParameters, HasInParameters {

protected String caseDefinitionKey;
protected String caseInstanceName;
Expand Down Expand Up @@ -79,18 +79,32 @@ public void setFallbackToDefaultTenant(boolean fallbackToDefaultTenant) {
this.fallbackToDefaultTenant = fallbackToDefaultTenant;
}

@Override
public List<IOParameter> getInParameters() {
return inParameters;
}

@Override
public void addInParameter(IOParameter inParameter) {
inParameters.add(inParameter);
}

@Override
public void setInParameters(List<IOParameter> inParameters) {
this.inParameters = inParameters;
}

@Override
public List<IOParameter> getOutParameters() {
return outParameters;
}

@Override
public void addOutParameter(IOParameter outParameter) {
this.outParameters.add(outParameter);
}

@Override
public void setOutParameters(List<IOParameter> outParameters) {
this.outParameters = outParameters;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,15 +12,19 @@
*/
package org.flowable.bpmn.model;

import java.util.ArrayList;
import java.util.List;

/**
* @author Tijs Rademakers
*/
public class ErrorEventDefinition extends EventDefinition {
public class ErrorEventDefinition extends EventDefinition implements HasInParameters {

protected String errorCode;
protected String errorVariableName;
protected Boolean errorVariableTransient;
protected Boolean errorVariableLocalScope;
protected List<IOParameter> inParameters;

public String getErrorCode() {
return errorCode;
Expand Down Expand Up @@ -54,6 +58,24 @@ public void setErrorVariableLocalScope(Boolean errorVariableLocalScope) {
this.errorVariableLocalScope = errorVariableLocalScope;
}

@Override
public List<IOParameter> getInParameters() {
return inParameters;
}

@Override
public void addInParameter(IOParameter inParameter) {
if (this.inParameters == null) {
this.inParameters = new ArrayList<>();
}
this.inParameters.add(inParameter);
}

@Override
public void setInParameters(List<IOParameter> inParameters) {
this.inParameters = inParameters;
}

@Override
public ErrorEventDefinition clone() {
ErrorEventDefinition clone = new ErrorEventDefinition();
Expand All @@ -67,5 +89,15 @@ public void setValues(ErrorEventDefinition otherDefinition) {
setErrorVariableName(otherDefinition.getErrorVariableName());
setErrorVariableLocalScope(otherDefinition.getErrorVariableLocalScope());
setErrorVariableTransient(otherDefinition.getErrorVariableTransient());

List<IOParameter> otherInParameters = otherDefinition.getInParameters();
if (otherInParameters != null && !otherInParameters.isEmpty()) {
this.inParameters = new ArrayList<>(otherInParameters.size());
for (IOParameter parameter : otherInParameters) {
this.inParameters.add(parameter.clone());
}
} else {
this.inParameters = null;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
/**
* @author Tijs Rademakers
*/
public abstract class Event extends FlowNode {
public abstract class Event extends FlowNode implements HasOutParameters, HasInParameters {

protected List<EventDefinition> eventDefinitions = new ArrayList<>();
protected List<IOParameter> inParameters = new ArrayList<>();
Expand All @@ -36,18 +36,32 @@ public void addEventDefinition(EventDefinition eventDefinition) {
eventDefinitions.add(eventDefinition);
}

@Override
public List<IOParameter> getInParameters() {
return inParameters;
}

@Override
public void addInParameter(IOParameter inParameter) {
inParameters.add(inParameter);
}

@Override
public void setInParameters(List<IOParameter> inParameters) {
this.inParameters = inParameters;
}

@Override
public List<IOParameter> getOutParameters() {
return outParameters;
}

@Override
public void addOutParameter(IOParameter outParameter) {
this.outParameters.add(outParameter);
}

@Override
public void setOutParameters(List<IOParameter> outParameters) {
this.outParameters = outParameters;
}
Expand Down
Loading

0 comments on commit c1f852c

Please sign in to comment.