diff --git a/CHANGELOG.md b/CHANGELOG.md
index c97e541..98038a4 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -6,6 +6,8 @@ All notable changes to [zeebe-bpmn-moddle](https://github.com/camunda/zeebe-bpmn
___Note:__ Yet to be released changes appear here._
+* `FEAT`: support `zeebe:LinkedResource` for `bpmn:ServiceTask`
+
## 1.7.0
* `FEAT`: support `zeebe:TaskListener` for `bpmn:UserTask` ([#67](https://github.com/camunda/zeebe-bpmn-moddle/pull/67))
diff --git a/resources/zeebe.json b/resources/zeebe.json
index 9974bf3..6c839b1 100644
--- a/resources/zeebe.json
+++ b/resources/zeebe.json
@@ -298,6 +298,52 @@
}
]
},
+ {
+ "name": "LinkedResource",
+ "superClass": [
+ "Element"
+ ],
+ "meta": {
+ "allowedIn": [
+ "bpmn:ServiceTask"
+ ]
+ },
+ "properties": [
+ {
+ "name": "resourceId",
+ "type": "String",
+ "isAttr": true
+ },
+ {
+ "name": "resourceType",
+ "type": "String",
+ "isAttr": true
+ },
+ {
+ "name": "linkName",
+ "type": "String",
+ "isAttr": true
+ }
+ ]
+ },
+ {
+ "name": "LinkedResources",
+ "superClass": [
+ "Element"
+ ],
+ "meta": {
+ "allowedIn": [
+ "bpmn:ServiceTask"
+ ]
+ },
+ "properties": [
+ {
+ "name": "values",
+ "type": "LinkedResource",
+ "isMany": true
+ }
+ ]
+ },
{
"name": "UserTask",
"superClass": [
@@ -618,7 +664,8 @@
"extends": [
"zeebe:CalledDecision",
"zeebe:CalledElement",
- "zeebe:FormDefinition"
+ "zeebe:FormDefinition",
+ "zeebe:LinkedResource"
],
"properties": [
{
diff --git a/test/fixtures/xml/zeebe-linkedResources.bpmn b/test/fixtures/xml/zeebe-linkedResources.bpmn
new file mode 100644
index 0000000..5a99100
--- /dev/null
+++ b/test/fixtures/xml/zeebe-linkedResources.bpmn
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/fixtures/xml/zeebe-service-task/serviceTask-zeebe-linkedResource.part.bpmn b/test/fixtures/xml/zeebe-service-task/serviceTask-zeebe-linkedResource.part.bpmn
new file mode 100644
index 0000000..ce1fbaa
--- /dev/null
+++ b/test/fixtures/xml/zeebe-service-task/serviceTask-zeebe-linkedResource.part.bpmn
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/test/spec/xml/read.js b/test/spec/xml/read.js
index bb9faec..20bc92a 100644
--- a/test/spec/xml/read.js
+++ b/test/spec/xml/read.js
@@ -317,6 +317,59 @@ describe('read', function() {
});
+ describe('zeebe:linkedResource', function() {
+
+ it('on ServiceTask', async function() {
+
+ // given
+ var xml = readFile('test/fixtures/xml/zeebe-service-task/serviceTask-zeebe-linkedResource.part.bpmn');
+
+ // when
+ const {
+ rootElement: proc
+ } = await moddle.fromXML(xml, 'bpmn:ServiceTask');
+
+ // then
+ expect(proc).to.jsonEqual({
+ $type: 'bpmn:ServiceTask',
+ id: 'collect-money',
+ name: 'Collect Money',
+ extensionElements: {
+ $type: 'bpmn:ExtensionElements',
+ values: [
+ {
+ $type: 'zeebe:LinkedResources',
+ values: [
+ {
+ $type: 'zeebe:LinkedResource',
+ resourceId:'=myScript',
+ resourceType:'RPA',
+ bindingType:'latest'
+ },
+ {
+ $type: 'zeebe:LinkedResource',
+ resourceId: '=myScript',
+ resourceType: 'RPA',
+ bindingType: 'versionTag',
+ versionTag: 'v1'
+ },
+ {
+ $type: 'zeebe:LinkedResource',
+ resourceId: '=myScript',
+ resourceType: 'RPA',
+ bindingType: 'deployment',
+ linkName: 'myScript'
+ }
+ ]
+ }
+ ]
+ }
+ });
+
+ });
+
+ });
+
describe('zeebe:ioMapping / zeebe:Input / zeebe:Output', function() {
it('on ServiceTask', async function() {
diff --git a/test/spec/xml/roundtrip.js b/test/spec/xml/roundtrip.js
index 8fc8a70..52132ae 100644
--- a/test/spec/xml/roundtrip.js
+++ b/test/spec/xml/roundtrip.js
@@ -89,4 +89,11 @@ describe('import -> export roundtrip', function() {
});
+
+ describe('zeebe:LinkedResource', function() {
+
+ it('should keep zeebe:linkedResource', validateExport('test/fixtures/xml/zeebe-linkedResources.bpmn'));
+
+ });
+
});
diff --git a/test/spec/xml/write.js b/test/spec/xml/write.js
index d550cee..63a9aab 100644
--- a/test/spec/xml/write.js
+++ b/test/spec/xml/write.js
@@ -682,6 +682,27 @@ describe('write', function() {
expect(xml).to.eql(expectedXML);
});
+
+ it('on zeebe:LinkedResource', async function() {
+
+ // given
+ const moddleElement = moddle.create('zeebe:LinkedResource', {
+ bindingType: 'versionTag',
+ versionTag: 'v1.0.0'
+ });
+
+ const expectedXML = '';
+
+ // when
+ const xml = await write(moddleElement);
+
+ // then
+ expect(xml).to.eql(expectedXML);
+ });
+
});
});
@@ -712,6 +733,42 @@ describe('write', function() {
expect(xml).to.eql(expectedXML);
});
+
+ it('zeebe:LinkedResource', async function() {
+
+ // given
+ const moddleElement = moddle.create('zeebe:LinkedResource', {
+ resourceId:'=myScript',
+ resourceType:'RPA',
+ linkName:'myScript' });
+
+ const expectedXML = '';
+
+ // when
+ const xml = await write(moddleElement);
+
+ // then
+ expect(xml).to.eql(expectedXML);
+ });
+
+
+ it('zeebe:LinkedResources', async function() {
+
+ // given
+ const moddleElement = moddle.create('zeebe:LinkedResources');
+
+ const expectedXML = '';
+
+ // when
+ const xml = await write(moddleElement);
+
+ // then
+ expect(xml).to.eql(expectedXML);
+ });
});
});