Add new tests for DAO
New test to validate some methods of the DAO and attempt to disable
Camunda in IT when it was not required to have it
Change-Id: I231230a7a4818f4bfd7887319a321625f66ffcae
Issue-ID: CLAMP-54
Signed-off-by: Determe, Sebastien (sd378r) <sd378r@intl.att.com>
diff --git a/src/main/java/org/onap/clamp/clds/service/CldsTemplateService.java b/src/main/java/org/onap/clamp/clds/service/CldsTemplateService.java
index 87f9c0c..e6e7325 100644
--- a/src/main/java/org/onap/clamp/clds/service/CldsTemplateService.java
+++ b/src/main/java/org/onap/clamp/clds/service/CldsTemplateService.java
@@ -49,7 +49,6 @@
import javax.ws.rs.core.MediaType;
import javax.xml.transform.TransformerException;
-import org.camunda.bpm.engine.RuntimeService;
import org.onap.clamp.clds.dao.CldsDao;
import org.onap.clamp.clds.model.CldsTemplate;
import org.onap.clamp.clds.model.ValueItem;
@@ -90,8 +89,7 @@
@Autowired
private CldsDao cldsDao;
- @Autowired
- private RuntimeService runtimeService;
+
@Autowired
private XslTransformer cldsBpmnTransformer;
diff --git a/src/test/java/org/onap/clamp/clds/it/CldsDaoIT.java b/src/test/java/org/onap/clamp/clds/it/CldsDaoIT.java
new file mode 100644
index 0000000..bd41964
--- /dev/null
+++ b/src/test/java/org/onap/clamp/clds/it/CldsDaoIT.java
@@ -0,0 +1,149 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP CLAMP
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights
+ * reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END============================================
+ * ===================================================================
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ */
+
+package org.onap.clamp.clds.it;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.IOException;
+
+import javax.ws.rs.NotFoundException;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.onap.clamp.clds.AbstractIT;
+import org.onap.clamp.clds.dao.CldsDao;
+import org.onap.clamp.clds.model.CldsEvent;
+import org.onap.clamp.clds.model.CldsModel;
+import org.onap.clamp.clds.model.CldsTemplate;
+import org.onap.clamp.clds.util.ResourceFileUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.TestPropertySource;
+import org.springframework.test.context.junit4.SpringRunner;
+
+/**
+ * Test CldsDAO calls through CldsModel and CldsEvent. This really test the DB
+ * and stored procedures.
+ */
+@RunWith(SpringRunner.class)
+@SpringBootTest
+@TestPropertySource(locations = "classpath:application-no-camunda.properties")
+public class CldsDaoIT extends AbstractIT {
+
+ @Autowired
+ public CldsDao cldsDao;
+
+ private String bpmnText;
+ private String imageText;
+ private String bpmnPropText;
+
+ @Before
+ public void setupBefore() throws IOException {
+ bpmnText = ResourceFileUtil.getResourceAsString("example/dao/bpmn-template.xml");
+ imageText = ResourceFileUtil.getResourceAsString("example/dao/image-template.xml");
+ bpmnPropText = ResourceFileUtil.getResourceAsString("example/dao/bpmn-prop.json");
+ }
+
+ @Test
+ public void testModelSave() throws IOException {
+ // Add the template first
+ CldsTemplate newTemplate = new CldsTemplate();
+ newTemplate.setName("test-template");
+
+ newTemplate.setBpmnText(bpmnText);
+ newTemplate.setImageText(imageText);
+
+ // Save the template in DB
+ cldsDao.setTemplate(newTemplate, "user");
+ // Test if it's well there
+ CldsTemplate newTemplateRead = cldsDao.getTemplate("test-template");
+ assertEquals(bpmnText, newTemplateRead.getBpmnText());
+ assertEquals(imageText, newTemplateRead.getImageText());
+
+ // Save the model
+ CldsModel newModel = new CldsModel();
+ newModel.setName("test-model");
+
+ newModel.setBpmnText(bpmnText);
+ newModel.setImageText(imageText);
+ newModel.setPropText(bpmnPropText);
+ newModel.setControlNamePrefix("ClosedLoop-");
+ newModel.setTemplateName("test-template");
+ newModel.setTemplateId(newTemplate.getId());
+ newModel.setDocText(newTemplate.getPropText());
+ newModel.setDocId(newTemplate.getPropId());
+ // Save the model in DB
+ cldsDao.setModel(newModel, "user");
+ // Test if the model can be retrieved
+ CldsModel newCldsModel = cldsDao.getModelTemplate("test-model");
+ assertEquals(bpmnText, newCldsModel.getBpmnText());
+ assertEquals(imageText, newCldsModel.getImageText());
+ assertEquals(bpmnPropText, newCldsModel.getPropText());
+
+ }
+
+ @Test(expected = NotFoundException.class)
+ public void testGetModelNotFound() {
+ CldsModel.retrieve(cldsDao, "test-model-not-found", false);
+ }
+
+ @Test(expected = NotFoundException.class)
+ public void testGetTemplateNotFound() {
+ CldsTemplate.retrieve(cldsDao, "test-template-not-found", false);
+ }
+
+ @Test
+ public void testInsEvent() {
+ // Add the template first
+ CldsTemplate newTemplate = new CldsTemplate();
+ newTemplate.setName("test-template-for-event");
+
+ newTemplate.setBpmnText(bpmnText);
+ newTemplate.setImageText(imageText);
+
+ newTemplate.save(cldsDao, "user");
+
+ // Test if it's well there
+ CldsTemplate newTemplateRead = CldsTemplate.retrieve(cldsDao, "test-template-for-event", false);
+ assertEquals(bpmnText, newTemplateRead.getBpmnText());
+ assertEquals(imageText, newTemplateRead.getImageText());
+
+ // Save the model
+ CldsModel newModel = new CldsModel();
+ newModel.setName("test-model-for-event");
+
+ newModel.setBpmnText(bpmnText);
+ newModel.setImageText(imageText);
+ newModel.setPropText(bpmnPropText);
+ newModel.setControlNamePrefix("ClosedLoop-");
+ newModel.setTemplateName("test-template-for-event");
+ newModel.setTemplateId(newTemplate.getId());
+ newModel.setDocText(newTemplate.getPropText());
+ newModel.setDocId(newTemplate.getPropId());
+
+ CldsEvent.insEvent(cldsDao, newModel, "user", CldsEvent.ACTION_RESTART, CldsEvent.ACTION_STATE_COMPLETED,
+ "process-instance-id");
+ }
+}
diff --git a/src/test/java/org/onap/clamp/clds/it/DcaeIT.java b/src/test/java/org/onap/clamp/clds/it/DcaeIT.java
index fc13270..4f0ebb4 100644
--- a/src/test/java/org/onap/clamp/clds/it/DcaeIT.java
+++ b/src/test/java/org/onap/clamp/clds/it/DcaeIT.java
@@ -25,7 +25,6 @@
import org.junit.Test;
import org.junit.runner.RunWith;
-
import org.onap.clamp.clds.AbstractIT;
import org.onap.clamp.clds.client.req.DcaeReq;
import org.onap.clamp.clds.model.CldsEvent;
@@ -33,13 +32,16 @@
import org.onap.clamp.clds.util.ResourceFileUtil;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
+import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit4.SpringRunner;
/**
- * Test DCAE API in org.onap.clamp.ClampDesigner.client package - replicate DCAE Delegates in test.
+ * Test DCAE API in org.onap.clamp.ClampDesigner.client package - replicate DCAE
+ * Delegates in test.
*/
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
+@TestPropertySource(locations = "classpath:application-no-camunda.properties")
public class DcaeIT extends AbstractIT {
@Test
@@ -49,8 +51,8 @@
String modelName = "example-model";
String controlName = "ClosedLoop-FRWL-SIG-1582f840-2881-11e6-b4ec-005056a9d756";
- ModelProperties prop = new ModelProperties(modelName, controlName, CldsEvent.ACTION_SUBMIT,
- true, modelBpmnProp, modelProp);
+ ModelProperties prop = new ModelProperties(modelName, controlName, CldsEvent.ACTION_SUBMIT, true, modelBpmnProp,
+ modelProp);
String dcaeReq = DcaeReq.format(refProp, prop);
System.out.println("dcaeReq=" + dcaeReq);
diff --git a/src/test/java/org/onap/clamp/clds/it/HttpsIT.java b/src/test/java/org/onap/clamp/clds/it/HttpsIT.java
index ff63033..98319b4 100644
--- a/src/test/java/org/onap/clamp/clds/it/HttpsIT.java
+++ b/src/test/java/org/onap/clamp/clds/it/HttpsIT.java
@@ -50,8 +50,7 @@
import org.springframework.web.client.RestTemplate;
/**
- * Test DCAE API in org.onap.clamp.ClampDesigner.client package - replicate DCAE
- * Delegates in test.
+ * Test HTTP and HTTPS settings + redirection of HTTP to HTTPS.
*/
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.DEFINED_PORT)
diff --git a/src/test/java/org/onap/clamp/clds/it/PolicyClientIT.java b/src/test/java/org/onap/clamp/clds/it/PolicyClientIT.java
index 69df972..09f1efe 100644
--- a/src/test/java/org/onap/clamp/clds/it/PolicyClientIT.java
+++ b/src/test/java/org/onap/clamp/clds/it/PolicyClientIT.java
@@ -48,6 +48,7 @@
import org.skyscreamer.jsonassert.JSONAssert;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
+import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit4.SpringRunner;
/**
@@ -56,6 +57,7 @@
*/
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
+@TestPropertySource(locations = "classpath:application-no-camunda.properties")
public class PolicyClientIT extends AbstractIT {
String modelProp;
String modelBpmnProp;
diff --git a/src/test/java/org/onap/clamp/clds/it/PropJsonBuilderIT.java b/src/test/java/org/onap/clamp/clds/it/PropJsonBuilderIT.java
index c3b35ee..525f9cb 100644
--- a/src/test/java/org/onap/clamp/clds/it/PropJsonBuilderIT.java
+++ b/src/test/java/org/onap/clamp/clds/it/PropJsonBuilderIT.java
@@ -39,6 +39,7 @@
import org.onap.clamp.clds.model.CldsSdcServiceDetail;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
+import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit4.SpringRunner;
/**
@@ -49,9 +50,10 @@
*/
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
+@TestPropertySource(locations = "classpath:application-no-camunda.properties")
public class PropJsonBuilderIT extends AbstractIT {
- private String globalPropsPartial;
+ private String globalPropsPartial;
private ObjectMapper mapper;
/**
@@ -86,8 +88,8 @@
private void sampleJsonObject() throws JsonProcessingException {
/**
- * Create three JSON Objects objectNode1, objectNode2, objectNode3.
- * Add all these three objects in the array
+ * Create three JSON Objects objectNode1, objectNode2, objectNode3. Add
+ * all these three objects in the array
*/
ObjectNode objectNode1 = mapper.createObjectNode();
objectNode1.put("bookName", "Java");
@@ -124,9 +126,8 @@
private String createEmptySharedObject() throws JsonProcessingException {
/**
- * Empty Object initialization.
- * "": { "vf": { "": "" }, "location": { "": "" }, "alarmCondition": {
- * "": "" } }
+ * Empty Object initialization. "": { "vf": { "": "" }, "location": {
+ * "": "" }, "alarmCondition": { "": "" } }
*/
ObjectNode emptyObjectNode = mapper.createObjectNode();
emptyObjectNode.put("", "");
@@ -144,8 +145,8 @@
emptyServiceObjectNode.putPOJO("", samArrayNode);
/**
- * Object initialization.
- * "vf": { " ": " ", "DCAE_CLAMP_DEMO3 1": "DCAE_CLAMP_DEMO3" }
+ * Object initialization. "vf": { " ": " ", "DCAE_CLAMP_DEMO3 1":
+ * "DCAE_CLAMP_DEMO3" }
*
*/
ObjectNode dcaeClampDemo3Node = mapper.createObjectNode();
@@ -157,9 +158,8 @@
vfObjectNode2.putPOJO("vf", vfArrayNode);
/**
- * Object initialization.
- * "location": { "SNDGCA64": "San Diego SAN3", "ALPRGAED":
- * "Alpharetta PDK1", "LSLEILAA": "Lisle DPA3" },
+ * Object initialization. "location": { "SNDGCA64": "San Diego SAN3",
+ * "ALPRGAED": "Alpharetta PDK1", "LSLEILAA": "Lisle DPA3" },
*/
ObjectNode sandiegoLocationNode = mapper.createObjectNode();
sandiegoLocationNode.put("SNDGCA64", "San Diego SAN3");
@@ -173,10 +173,10 @@
locationObjectNode2.putPOJO("location", locationArrayNode);
/**
- * Object initialization.
- * "alarmCondition": { "A+Fallback+Operation+will+soon+be+started":
- * "A Fallback Operation will soon be started",
- * "BRM%2C+Auto+Export+Backup+Failed": "BRM, Auto Export Backup Failed",
+ * Object initialization. "alarmCondition": {
+ * "A+Fallback+Operation+will+soon+be+started": "A Fallback Operation
+ * will soon be started", "BRM%2C+Auto+Export+Backup+Failed": "BRM, Auto
+ * Export Backup Failed",
*/
ObjectNode alamrCondition1 = mapper.createObjectNode();
alamrCondition1.put("A+Fallback+Operation+will+soon+be+started", "A Fallback Operation will soon be started");
@@ -206,8 +206,7 @@
byServiceBasicObjetNode.putPOJO("byService", byServiceBasicArrayNode);
/**
- * Object initialization.
- * "byVf": { "": { "vfc": { "": "" },
+ * Object initialization. "byVf": { "": { "vfc": { "": "" },
* "03596c12-c7e3-44b7-8994-5cdfeda8afdd": { "vfc": { " ": " " } } } }
*/
ObjectNode vfCObjectNode = mapper.createObjectNode();
@@ -240,9 +239,8 @@
private String createTestEmptySharedObject() throws IOException {
/**
- * Object initialization.
- * "": { "vf": { "": "" }, "location": { "": "" }, "alarmCondition": {
- * "": "" } }
+ * Object initialization. "": { "vf": { "": "" }, "location": { "": ""
+ * }, "alarmCondition": { "": "" } }
*/
ObjectNode emptyObjectNode = mapper.createObjectNode();
emptyObjectNode.put("", "");
@@ -254,8 +252,8 @@
emptyServiceObjectNode.putPOJO("", vfObjectNode);
/**
- * Object initialization.
- * "vf": { " ": " ", "DCAE_CLAMP_DEMO3 1": "DCAE_CLAMP_DEMO3" }
+ * Object initialization. "vf": { " ": " ", "DCAE_CLAMP_DEMO3 1":
+ * "DCAE_CLAMP_DEMO3" }
*
*/
ObjectNode vfObjectNode2 = mapper.createObjectNode();
@@ -265,9 +263,8 @@
vfObjectNode2.putPOJO("vf", dcaeClampDemo3Node);
/**
- * Object initialization.
- * "location": { "SNDGCA64": "San Diego SAN3", "ALPRGAED":
- * "Alpharetta PDK1", "LSLEILAA": "Lisle DPA3" },
+ * Object initialization. "location": { "SNDGCA64": "San Diego SAN3",
+ * "ALPRGAED": "Alpharetta PDK1", "LSLEILAA": "Lisle DPA3" },
*/
// ObjectNode sandiegoLocationNode = mapper.createObjectNode();
// sandiegoLocationNode.put("SNDGCA64","San Diego SAN3");
@@ -277,10 +274,10 @@
vfObjectNode2.putPOJO("location", locationJsonNode);
/**
- * Object initialization.
- * "alarmCondition": { "A+Fallback+Operation+will+soon+be+started":
- * "A Fallback Operation will soon be started",
- * "BRM%2C+Auto+Export+Backup+Failed": "BRM, Auto Export Backup Failed",
+ * Object initialization. "alarmCondition": {
+ * "A+Fallback+Operation+will+soon+be+started": "A Fallback Operation
+ * will soon be started", "BRM%2C+Auto+Export+Backup+Failed": "BRM, Auto
+ * Export Backup Failed",
*/
// ObjectNode alamrCondition1 = mapper.createObjectNode();
// alamrCondition1.put("A+Fallback+Operation+will+soon+be+started","A
@@ -295,8 +292,7 @@
byServiceBasicObjetNode.putPOJO("byService", emptyServiceObjectNode);
/**
- * Object initialization.
- * "byVf": { "": { "vfc": { "": "" },
+ * Object initialization. "byVf": { "": { "vfc": { "": "" },
* "03596c12-c7e3-44b7-8994-5cdfeda8afdd": { "vfc": { " ": " " } } } }
*/
ObjectNode vfCObjectNode = mapper.createObjectNode();
@@ -316,9 +312,8 @@
private String createCldsSharedObject(CldsSdcServiceDetail CldsSdcServiceDetail) throws IOException {
/**
- * Object initialization.
- * "": { "vf": { "": "" }, "location": { "": "" }, "alarmCondition": {
- * "": "" } }
+ * Object initialization. "": { "vf": { "": "" }, "location": { "": ""
+ * }, "alarmCondition": { "": "" } }
*/
ObjectNode emptyObjectNode = mapper.createObjectNode();
emptyObjectNode.put("", "");
@@ -330,8 +325,8 @@
emptyServiceObjectNode.putPOJO("", vfObjectNode);
/**
- * Object initialization.
- * "vf": { " ": " ", "DCAE_CLAMP_DEMO3 1": "DCAE_CLAMP_DEMO3" }
+ * Object initialization. "vf": { " ": " ", "DCAE_CLAMP_DEMO3 1":
+ * "DCAE_CLAMP_DEMO3" }
*
*/
ObjectNode vfObjectNode2 = mapper.createObjectNode();
@@ -341,9 +336,8 @@
vfObjectNode2.putPOJO("vf", dcaeClampDemo3Node);
/**
- * Object initialization.
- * "location": { "SNDGCA64": "San Diego SAN3", "ALPRGAED":
- * "Alpharetta PDK1", "LSLEILAA": "Lisle DPA3" },
+ * Object initialization. "location": { "SNDGCA64": "San Diego SAN3",
+ * "ALPRGAED": "Alpharetta PDK1", "LSLEILAA": "Lisle DPA3" },
*/
ObjectNode sandiegoLocationNode = mapper.createObjectNode();
sandiegoLocationNode.put("SNDGCA64", "San Diego SAN3");
@@ -351,10 +345,10 @@
vfObjectNode2.putPOJO("location", sandiegoLocationNode);
/**
- * Object initialization.
- * "alarmCondition": { "A+Fallback+Operation+will+soon+be+started":
- * "A Fallback Operation will soon be started",
- * "BRM%2C+Auto+Export+Backup+Failed": "BRM, Auto Export Backup Failed",
+ * Object initialization. "alarmCondition": {
+ * "A+Fallback+Operation+will+soon+be+started": "A Fallback Operation
+ * will soon be started", "BRM%2C+Auto+Export+Backup+Failed": "BRM, Auto
+ * Export Backup Failed",
*/
ObjectNode alamrCondition1 = mapper.createObjectNode();
alamrCondition1.put("A+Fallback+Operation+will+soon+be+started", "A Fallback Operation will soon be started");
@@ -365,8 +359,7 @@
byServiceBasicObjetNode.putPOJO("byService", emptyServiceObjectNode);
/**
- * Object initialization.
- * "byVf": { "": { "vfc": { "": "" },
+ * Object initialization. "byVf": { "": { "vfc": { "": "" },
* "03596c12-c7e3-44b7-8994-5cdfeda8afdd": { "vfc": { " ": " " } } } }
*/
diff --git a/src/test/java/org/onap/clamp/clds/it/RefPropIT.java b/src/test/java/org/onap/clamp/clds/it/RefPropIT.java
index c6a5de2..473ce4a 100644
--- a/src/test/java/org/onap/clamp/clds/it/RefPropIT.java
+++ b/src/test/java/org/onap/clamp/clds/it/RefPropIT.java
@@ -32,6 +32,7 @@
import org.junit.runner.RunWith;
import org.onap.clamp.clds.AbstractIT;
import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit4.SpringRunner;
/**
@@ -39,12 +40,14 @@
*/
@RunWith(SpringRunner.class)
@SpringBootTest
+@TestPropertySource(locations = "classpath:application-no-camunda.properties")
public class RefPropIT extends AbstractIT {
/**
* Test getting prop value as a JSON Node / template.
*
- * @throws IOException when JSON parsing fails
+ * @throws IOException
+ * when JSON parsing fails
*/
@Test
public void testJsonTemplate() throws IOException {
diff --git a/src/test/java/org/onap/clamp/clds/it/SdcCatalogServicesIT.java b/src/test/java/org/onap/clamp/clds/it/SdcCatalogServicesIT.java
index 2995b6c..dce6c90 100644
--- a/src/test/java/org/onap/clamp/clds/it/SdcCatalogServicesIT.java
+++ b/src/test/java/org/onap/clamp/clds/it/SdcCatalogServicesIT.java
@@ -41,14 +41,15 @@
import org.onap.clamp.clds.model.CldsServiceData;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit4.SpringRunner;
/**
- * Test DCAE API in org.onap.clamp.ClampDesigner.client package - replicate DCAE
- * Delegates in test.
+ * Test SDC Catalog Service class by mocking the SDC answers.
*/
@RunWith(SpringRunner.class)
@SpringBootTest
+@TestPropertySource(locations = "classpath:application-no-camunda.properties")
public class SdcCatalogServicesIT extends AbstractIT {
@Autowired
private SdcCatalogServices sdcCatalogWired = new SdcCatalogServices();
diff --git a/src/test/java/org/onap/clamp/clds/it/SdcIT.java b/src/test/java/org/onap/clamp/clds/it/SdcIT.java
index da9e5af..025420f 100644
--- a/src/test/java/org/onap/clamp/clds/it/SdcIT.java
+++ b/src/test/java/org/onap/clamp/clds/it/SdcIT.java
@@ -26,7 +26,6 @@
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
-
import org.onap.clamp.clds.AbstractIT;
import org.onap.clamp.clds.client.SdcCatalogServices;
import org.onap.clamp.clds.client.req.SdcReq;
@@ -36,16 +35,18 @@
import org.onap.clamp.clds.util.ResourceFileUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit4.SpringRunner;
/**
- * Test DCAE API in org.onap.clamp.ClampDesigner.client package - replicate DCAE Delegates in test.
+ * Test SDC Blueprint formater.
*/
@RunWith(SpringRunner.class)
@SpringBootTest
+@TestPropertySource(locations = "classpath:application-no-camunda.properties")
public class SdcIT extends AbstractIT {
@Autowired
- private RefProp refProp;
+ private RefProp refProp;
@Autowired
private SdcCatalogServices sdcCatalogServices;
@@ -62,14 +63,13 @@
String modelName = "example-model06";
String controlName = "ClosedLoop-FRWL-SIG04-1582f840-test-test-1234-005056a9d756";
String docText = ResourceFileUtil.getResourceAsString("example/templateProp.json");
- ModelProperties prop = new ModelProperties(modelName, controlName, CldsEvent.ACTION_SUBMIT,
- true, modelBpmnProp, modelProp);
+ ModelProperties prop = new ModelProperties(modelName, controlName, CldsEvent.ACTION_SUBMIT, true, modelBpmnProp,
+ modelProp);
String blueprint = SdcReq.formatBlueprint(refProp, prop, docText);
System.out.println("blueprint=" + blueprint);
- //assertEquals(blueprint, "");
+ // assertEquals(blueprint, "");
}
-
@Test
public void testTcaBlueprint() throws Exception {
String modelProp = ResourceFileUtil.getResourceAsString("example/modelPropForPolicy.json");
@@ -77,10 +77,10 @@
String modelName = "example-model06";
String controlName = "ClosedLoop-FRWL-SIG04-1582f840-test-test-1234-005056a9d756";
String docText = ResourceFileUtil.getResourceAsString("example/templatePropForTca.json");
- ModelProperties prop = new ModelProperties(modelName, controlName, CldsEvent.ACTION_SUBMIT,
- true, modelBpmnProp, modelProp);
+ ModelProperties prop = new ModelProperties(modelName, controlName, CldsEvent.ACTION_SUBMIT, true, modelBpmnProp,
+ modelProp);
String blueprint = SdcReq.formatBlueprint(refProp, prop, docText);
System.out.println("blueprint=" + blueprint);
- //assertEquals(blueprint, "");
+ // assertEquals(blueprint, "");
}
}
diff --git a/src/test/resources/application-no-camunda.properties b/src/test/resources/application-no-camunda.properties
new file mode 100644
index 0000000..dbf0e5b
--- /dev/null
+++ b/src/test/resources/application-no-camunda.properties
@@ -0,0 +1,158 @@
+###
+# ============LICENSE_START=======================================================
+# ONAP CLAMP
+# ================================================================================
+# Copyright (C) 2017 AT&T Intellectual Property. All rights
+# reserved.
+# ================================================================================
+# 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.
+# ============LICENSE_END============================================
+# ===================================================================
+# ECOMP is a trademark and service mark of AT&T Intellectual Property.
+###
+
+info.build.artifact=@project.artifactId@
+info.build.name=@project.name@
+info.build.description=@project.description@
+info.build.version=@project.version@
+
+### Set the port for HTTP or HTTPS protocol (Controlled by Spring framework, only one at a time).
+### (See below for the parameter 'server.http.port' if you want to have both enabled)
+### To have only HTTP, keep the lines server.ssl.* commented
+### To have only HTTPS enabled, uncomment the server.ssl.* lines and specify a right keystore location
+server.port=10443
+### Settings for HTTPS (this automatically enables the HTTPS on the port 'server.port')
+server.ssl.key-store=classpath:https/keystore-test.jks
+server.ssl.key-store-password=testpass
+server.ssl.key-password=testpass
+
+### In order to be user friendly when HTTPS is enabled,
+### you can add another HTTP port that will be automatically redirected to HTTPS
+### by enabling this parameter (server.http.port) and set it to another port (80 or 8080, 8090, etc ...)
+#server.http-to-https-redirection.port=10080
+
+### HTTP Example:
+###--------------
+### server.port=8080
+
+### HTTPS Example:
+### --------------
+### server.port=8443
+### server.ssl.key-store=file:/tmp/mykey.jks
+### server.ssl.key-store-password=mypass
+### server.ssl.key-password=mypass
+
+### HTTP (Redirected to HTTPS) and HTTPS Example:
+### --------------------------------------------
+### server.port=8443 <-- The HTTPS port
+### server.ssl.key-store=file:/tmp/mykey.jks
+### server.ssl.key-store-password=mypass
+### server.ssl.key-password=mypass
+### server.http-to-https-redirection.port=8090 <-- The HTTP port
+
+server.contextPath=/
+#Modified engine-rest applicationpath
+spring.jersey.application-path=/engine-rest
+spring.profiles.active=clamp-default,clamp-spring-authentication
+spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration
+
+#The max number of active threads in this pool
+server.tomcat.max-threads=200
+#The minimum number of threads always kept alive
+server.tomcat.min-Spare-Threads=25
+#The number of milliseconds before an idle thread shutsdown, unless the number of active threads are less or equal to minSpareThreads
+server.tomcat.max-idle-time=60000
+
+
+#Add this properties only if you want to change the URL, AJSC Framework interceptors will intercept
+#com.att.ajsc.common.interceptors.PreInterceptor.url=/**
+#com.att.ajsc.common.interceptors.PostInterceptor.url=/**
+
+#Servlet context parameters
+server.context_parameters.p-name=value #context parameter with p-name as key and value as value.
+
+camel.springboot.consumer-template-cache-size=1000
+camel.springboot.producer-template-cache-size=1000
+camel.springboot.jmx-enabled=true
+camel.defaultthreadpool.poolsize=10
+camel.defaultthreadpool.maxpoolsize=20
+camel.defaultthreadpool.maxqueuesize=1000
+camel.defaultthreadpool.keepaliveTime=60
+camel.defaultthreadpool.rejectpolicy=CallerRuns
+
+kubernetes.namespace=com-att-ajsc
+
+#server.port=0
+
+#Camunda Process Engine DataSource connection Details
+spring.datasource.camunda.url=jdbc:mariadb://localhost:${docker.mariadb.port.host}/camundabpm?verifyServerCertificate=false&useSSL=false&requireSSL=false&autoReconnect=true&maxReconnects=100
+spring.datasource.camunda.username=camunda
+spring.datasource.camunda.password=ndMSpw4CAM
+spring.datasource.camunda.driverClassName=org.mariadb.jdbc.Driver
+spring.datasource.camunda.validationQuery=SELECT 1
+spring.datasource.camunda.validationQueryTimeout=20000
+spring.datasource.camunda.validationInterval=60000
+spring.datasource.camunda.testWhileIdle = true
+# Automatically test whether a connection provided is good or not
+spring.datasource.camunda.testOnBorrow=true
+
+#Camunda application properties
+#Camunda history level
+camunda.bpm.history-level=auto
+camunda.bpm.enabled=false
+camunda.bpm.auto-deployment-enabled=false
+camunda.bpm.job-execution.active=false
+camunda.bpm.job-execution.enabled=false
+camunda.bpm.management.health.camunda.enabled=false
+camunda.bpm.metrics.enabled=false
+
+#clds datasource connection details
+spring.datasource.cldsdb.driver-class-name=org.mariadb.jdbc.Driver
+spring.datasource.cldsdb.url=jdbc:mariadb://localhost:${docker.mariadb.port.host}/cldsdb4?verifyServerCertificate=false&useSSL=false&requireSSL=false&autoReconnect=true&maxReconnects=100
+spring.datasource.cldsdb.username=clds
+spring.datasource.cldsdb.password=sidnnd83K
+spring.datasource.cldsdb.driverClassName=com.mysql.jdbc.Driver
+spring.datasource.cldsdb.validationQuery=SELECT 1
+spring.datasource.cldsdb.validationQueryTimeout=20000
+spring.datasource.cldsdb.validationInterval=60000
+spring.datasource.cldsdb.testWhileIdle = true
+# Automatically test whether a connection provided is good or not
+spring.datasource.cldsdb.testOnBorrow=true
+
+#Async Executor default Parameters
+async.core.pool.size=10
+async.max.pool.size=20
+async.queue.capacity=500
+
+org.onap.clamp.config.dcae.url=http://localhost:9000/closedloop-dcae-services
+
+#GRM Edge endpoint details
+service.name=ajsc6camundademo
+service.version=1.0.0.0
+routeoffer=TEST
+#Update with your application name
+application.name=AJSC6CAMUNDA
+
+org.onap.clamp.config.files.cldsReference=classpath:/clds/clds-reference.properties
+org.onap.clamp.config.files.cldsPolicyConfig=classpath:/clds/clds-policy-config.properties
+org.onap.clamp.config.files.cldsUsers=classpath:/clds/clds-users.json
+org.onap.clamp.config.files.globalClds=classpath:/clds/globalClds.properties
+
+#Define user permission related parameters, the permission type can be changed but MUST be redefined in clds-users.properties in that case !
+CLDS_PERMISSION_TYPE_CL=permission-type-cl
+CLDS_PERMISSION_TYPE_CL_MANAGE=permission-type-cl-manage
+CLDS_PERMISSION_TYPE_CL_EVENT=permission-type-cl-event
+CLDS_PERMISSION_TYPE_FILTER_VF=permission-type-filter-vf
+CLDS_PERMISSION_TYPE_TEMPLATE=permission-type-template
+#This one indicates the type of instances (dev|prod|perf...), this must be set accordingly in clds-users.properties
+CLDS_PERMISSION_INSTANCE=dev
\ No newline at end of file
diff --git a/src/test/resources/example/dao/bpmn-prop.json b/src/test/resources/example/dao/bpmn-prop.json
new file mode 100644
index 0000000..f2bfc7d
--- /dev/null
+++ b/src/test/resources/example/dao/bpmn-prop.json
@@ -0,0 +1,54 @@
+{
+ "Holmes_1m8n1s9": [
+ {
+ "name": "correlationalLogic",
+ "value": "uktukk"
+ }
+ ],
+ "Policy_19c1hms": {
+ "policy1": [
+ {
+ "name": "pname",
+ "value": "policy1"
+ },
+ {
+ "name": "pid",
+ "value": "0"
+ },
+ {
+ "name": "timeout",
+ "value": "345"
+ },
+ {
+ "policyConfigurations": [
+ [
+ {
+ "name": "maxRetries",
+ "value": [
+ "3"
+ ]
+ },
+ {
+ "name": "retryTimeLimit",
+ "value": [
+ "180"
+ ]
+ },
+ {
+ "name": "_id",
+ "value": [
+ "JmAZRQx"
+ ]
+ },
+ {
+ "name": "parentPolicy",
+ "value": [
+ ""
+ ]
+ }
+ ]
+ ]
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/src/test/resources/example/dao/bpmn-template.xml b/src/test/resources/example/dao/bpmn-template.xml
new file mode 100644
index 0000000..5aa133a
--- /dev/null
+++ b/src/test/resources/example/dao/bpmn-template.xml
@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="Definitions_1" targetNamespace="http://bpmn.io/schema/bpmn">
+ <bpmn:process id="Process_1" isExecutable="false">
+ <bpmn:startEvent id="StartEvent_1">
+ <bpmn:outgoing>SequenceFlow_0mshiwd</bpmn:outgoing>
+ </bpmn:startEvent>
+ <bpmn:collector id="Collector_1i63yo1">
+ <bpmn:incoming>SequenceFlow_0mshiwd</bpmn:incoming>
+ <bpmn:outgoing>SequenceFlow_0z37chw</bpmn:outgoing>
+ </bpmn:collector>
+ <bpmn:stringMatch id="StringMatch_1g5af0z">
+ <bpmn:incoming>SequenceFlow_0z37chw</bpmn:incoming>
+ <bpmn:outgoing>SequenceFlow_1io8zzg</bpmn:outgoing>
+ </bpmn:stringMatch>
+ <bpmn:vesCollector id="VesCollector_1s3sgbh">
+ <bpmn:incoming>SequenceFlow_1io8zzg</bpmn:incoming>
+ <bpmn:outgoing>SequenceFlow_0yenh9m</bpmn:outgoing>
+ </bpmn:vesCollector>
+ <bpmn:holmes id="Holmes_1m8n1s9">
+ <bpmn:incoming>SequenceFlow_0yenh9m</bpmn:incoming>
+ <bpmn:outgoing>SequenceFlow_1gq21be</bpmn:outgoing>
+ </bpmn:holmes>
+ <bpmn:tCA id="TCA_11n5nl9">
+ <bpmn:incoming>SequenceFlow_1gq21be</bpmn:incoming>
+ <bpmn:outgoing>SequenceFlow_14phr7v</bpmn:outgoing>
+ </bpmn:tCA>
+ <bpmn:policy id="Policy_19c1hms">
+ <bpmn:incoming>SequenceFlow_14phr7v</bpmn:incoming>
+ <bpmn:outgoing>SequenceFlow_1q2yngv</bpmn:outgoing>
+ </bpmn:policy>
+ <bpmn:endEvent id="EndEvent_0z8t6ek">
+ <bpmn:incoming>SequenceFlow_1q2yngv</bpmn:incoming>
+ </bpmn:endEvent>
+ <bpmn:sequenceFlow id="SequenceFlow_0mshiwd" sourceRef="StartEvent_1" targetRef="Collector_1i63yo1" />
+ <bpmn:sequenceFlow id="SequenceFlow_0z37chw" sourceRef="Collector_1i63yo1" targetRef="StringMatch_1g5af0z" />
+ <bpmn:sequenceFlow id="SequenceFlow_1io8zzg" sourceRef="StringMatch_1g5af0z" targetRef="VesCollector_1s3sgbh" />
+ <bpmn:sequenceFlow id="SequenceFlow_0yenh9m" sourceRef="VesCollector_1s3sgbh" targetRef="Holmes_1m8n1s9" />
+ <bpmn:sequenceFlow id="SequenceFlow_1gq21be" sourceRef="Holmes_1m8n1s9" targetRef="TCA_11n5nl9" />
+ <bpmn:sequenceFlow id="SequenceFlow_14phr7v" sourceRef="TCA_11n5nl9" targetRef="Policy_19c1hms" />
+ <bpmn:sequenceFlow id="SequenceFlow_1q2yngv" sourceRef="Policy_19c1hms" targetRef="EndEvent_0z8t6ek" />
+ </bpmn:process>
+ <bpmndi:BPMNDiagram id="BPMNDiagram_1">
+ <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Process_1">
+ <bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="StartEvent_1">
+ <dc:Bounds x="50" y="162" width="36" height="36" />
+ </bpmndi:BPMNShape>
+ <bpmndi:BPMNShape id="Collector_1i63yo1_di" bpmnElement="Collector_1i63yo1">
+ <dc:Bounds x="216" y="152" width="120" height="80" />
+ </bpmndi:BPMNShape>
+ <bpmndi:BPMNShape id="StringMatch_1g5af0z_di" bpmnElement="StringMatch_1g5af0z">
+ <dc:Bounds x="378" y="140" width="120" height="80" />
+ </bpmndi:BPMNShape>
+ <bpmndi:BPMNShape id="VesCollector_1s3sgbh_di" bpmnElement="VesCollector_1s3sgbh">
+ <dc:Bounds x="552" y="140" width="120" height="80" />
+ </bpmndi:BPMNShape>
+ <bpmndi:BPMNShape id="Holmes_1m8n1s9_di" bpmnElement="Holmes_1m8n1s9">
+ <dc:Bounds x="702" y="140" width="120" height="80" />
+ </bpmndi:BPMNShape>
+ <bpmndi:BPMNShape id="TCA_11n5nl9_di" bpmnElement="TCA_11n5nl9">
+ <dc:Bounds x="878" y="140" width="120" height="80" />
+ </bpmndi:BPMNShape>
+ <bpmndi:BPMNShape id="Policy_19c1hms_di" bpmnElement="Policy_19c1hms">
+ <dc:Bounds x="1031" y="140" width="120" height="80" />
+ </bpmndi:BPMNShape>
+ <bpmndi:BPMNShape id="EndEvent_0z8t6ek_di" bpmnElement="EndEvent_0z8t6ek">
+ <dc:Bounds x="1231" y="162" width="36" height="36" />
+ <bpmndi:BPMNLabel>
+ <dc:Bounds x="1204" y="198" width="90" height="20" />
+ </bpmndi:BPMNLabel>
+ </bpmndi:BPMNShape>
+ <bpmndi:BPMNEdge id="SequenceFlow_0mshiwd_di" bpmnElement="SequenceFlow_0mshiwd">
+ <di:waypoint xsi:type="dc:Point" x="86" y="180" />
+ <di:waypoint xsi:type="dc:Point" x="151" y="180" />
+ <di:waypoint xsi:type="dc:Point" x="151" y="192" />
+ <di:waypoint xsi:type="dc:Point" x="216" y="192" />
+ <bpmndi:BPMNLabel>
+ <dc:Bounds x="106" y="176" width="90" height="20" />
+ </bpmndi:BPMNLabel>
+ </bpmndi:BPMNEdge>
+ <bpmndi:BPMNEdge id="SequenceFlow_0z37chw_di" bpmnElement="SequenceFlow_0z37chw">
+ <di:waypoint xsi:type="dc:Point" x="336" y="192" />
+ <di:waypoint xsi:type="dc:Point" x="357" y="192" />
+ <di:waypoint xsi:type="dc:Point" x="357" y="180" />
+ <di:waypoint xsi:type="dc:Point" x="378" y="180" />
+ <bpmndi:BPMNLabel>
+ <dc:Bounds x="312" y="176" width="90" height="20" />
+ </bpmndi:BPMNLabel>
+ </bpmndi:BPMNEdge>
+ <bpmndi:BPMNEdge id="SequenceFlow_1io8zzg_di" bpmnElement="SequenceFlow_1io8zzg">
+ <di:waypoint xsi:type="dc:Point" x="498" y="180" />
+ <di:waypoint xsi:type="dc:Point" x="552" y="180" />
+ <bpmndi:BPMNLabel>
+ <dc:Bounds x="480" y="170" width="90" height="20" />
+ </bpmndi:BPMNLabel>
+ </bpmndi:BPMNEdge>
+ <bpmndi:BPMNEdge id="SequenceFlow_0yenh9m_di" bpmnElement="SequenceFlow_0yenh9m">
+ <di:waypoint xsi:type="dc:Point" x="672" y="180" />
+ <di:waypoint xsi:type="dc:Point" x="702" y="180" />
+ <bpmndi:BPMNLabel>
+ <dc:Bounds x="642" y="170" width="90" height="20" />
+ </bpmndi:BPMNLabel>
+ </bpmndi:BPMNEdge>
+ <bpmndi:BPMNEdge id="SequenceFlow_1gq21be_di" bpmnElement="SequenceFlow_1gq21be">
+ <di:waypoint xsi:type="dc:Point" x="822" y="180" />
+ <di:waypoint xsi:type="dc:Point" x="878" y="180" />
+ <bpmndi:BPMNLabel>
+ <dc:Bounds x="805" y="170" width="90" height="20" />
+ </bpmndi:BPMNLabel>
+ </bpmndi:BPMNEdge>
+ <bpmndi:BPMNEdge id="SequenceFlow_14phr7v_di" bpmnElement="SequenceFlow_14phr7v">
+ <di:waypoint xsi:type="dc:Point" x="998" y="180" />
+ <di:waypoint xsi:type="dc:Point" x="1031" y="180" />
+ <bpmndi:BPMNLabel>
+ <dc:Bounds x="969.5" y="170" width="90" height="20" />
+ </bpmndi:BPMNLabel>
+ </bpmndi:BPMNEdge>
+ <bpmndi:BPMNEdge id="SequenceFlow_1q2yngv_di" bpmnElement="SequenceFlow_1q2yngv">
+ <di:waypoint xsi:type="dc:Point" x="1151" y="180" />
+ <di:waypoint xsi:type="dc:Point" x="1231" y="180" />
+ <bpmndi:BPMNLabel>
+ <dc:Bounds x="1146" y="170" width="90" height="20" />
+ </bpmndi:BPMNLabel>
+ </bpmndi:BPMNEdge>
+ </bpmndi:BPMNPlane>
+ </bpmndi:BPMNDiagram>
+</bpmn:definitions>
diff --git a/src/test/resources/example/dao/image-template.xml b/src/test/resources/example/dao/image-template.xml
new file mode 100644
index 0000000..d7af2aa
--- /dev/null
+++ b/src/test/resources/example/dao/image-template.xml
@@ -0,0 +1,448 @@
+<?xml version="1.0" encoding="utf-8"?><!-- created with bpmn-js / http://bpmn.io --><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
+ width="1229" height="104" viewBox="44 134 1229 104" version="1.1">
+ <defs>
+ <marker viewBox="0 0 20 20" markerWidth="10" markerHeight="10"
+ orient="auto" refX="11" refY="10" id="markerSj7j5bqgxx">
+ <path d="M 1 5 L 11 10 L 1 15 Z"
+ style="stroke-width: 1; stroke-linecap: round; stroke-dasharray: 10000, 1;"
+ fill="#000000" />
+ </marker>
+ <marker viewBox="0 0 20 20" markerWidth="20" markerHeight="20"
+ orient="auto" refX="6" refY="6" id="markerSj7j5bqgxz">
+ <circle cx="6" cy="6" r="3.5"
+ style="stroke-width: 1; stroke-linecap: round; stroke-dasharray: 10000, 1;"
+ fill="#ffffff" stroke="#000000" />
+ </marker>
+ <marker viewBox="0 0 20 20" markerWidth="20" markerHeight="20"
+ orient="auto" refX="8.5" refY="5" id="markerSj7j5bqgx11">
+ <path d="m 1 5 l 0 -3 l 7 3 l -7 3 z"
+ style="stroke-width: 1; stroke-linecap: butt; stroke-dasharray: 10000, 1;"
+ fill="#ffffff" stroke="#000000" />
+ </marker>
+ <marker viewBox="0 0 20 20" markerWidth="10" markerHeight="10"
+ orient="auto" refX="11" refY="10" id="markerSj7j5bqgx13">
+ <path d="M 1 5 L 11 10 L 1 15"
+ style="stroke-width: 1; stroke-linecap: round; stroke-dasharray: 10000, 1;"
+ fill="#ffffff" stroke="#000000" />
+ </marker>
+ <marker viewBox="0 0 20 20" markerWidth="10" markerHeight="10"
+ orient="auto" refX="-1" refY="10" id="markerSj7j5bqgx15">
+ <path d="M 0 10 L 8 6 L 16 10 L 8 14 Z"
+ style="stroke-width: 1; stroke-linecap: round; stroke-dasharray: 10000, 1;"
+ fill="#ffffff" stroke="#000000" />
+ </marker>
+ <marker viewBox="0 0 20 20" markerWidth="10" markerHeight="10"
+ orient="auto" refX="-5" refY="10" id="markerSj7j5bqgx17">
+ <path d="M 1 4 L 5 16"
+ style="stroke-width: 1; stroke-linecap: round; stroke-dasharray: 10000, 1;"
+ fill="#000000" stroke="#000000" />
+ </marker>
+ </defs>
+ <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+ <g class="djs-element djs-shape" data-element-id="StartEvent_1"
+ transform="matrix(1,0,0,1,50,162)" style="display: block;">
+ <rect fill="none" class="djs-outline" x="-6" y="-6" width="48"
+ height="48"></rect>
+ <g class="djs-visual">
+ <circle cx="18" cy="18" r="18" style="stroke-width: 2;"
+ stroke="#000000" fill="#ffffff"></circle>
+ </g>
+ <rect x="0" y="0" width="36" height="36"
+ style="stroke-opacity: 0; stroke-width: 15;" fill="none" stroke="#ffffff"
+ class="djs-hit"></rect>
+ </g>
+ </g>
+ <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+ <g class="djs-element djs-shape" data-element-id="StartEvent_1_label"
+ transform="matrix(1,0,0,1,23,198)" style="display: none;">
+ <rect fill="none" class="djs-outline" x="-6" y="-6" width="102"
+ height="32"></rect>
+ <g class="djs-visual">
+ <text style="font-family: Arial,sans-serif; font-size: 11px;"
+ class=" djs-label">
+ <tspan x="45" y="0"></tspan>
+ </text>
+ </g>
+ <rect x="0" y="0" width="90" height="20"
+ style="stroke-opacity: 0; stroke-width: 15;" fill="none" stroke="#ffffff"
+ class="djs-hit"></rect>
+ </g>
+ </g>
+ <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+ <g class="djs-element djs-shape" data-element-id="Collector_1i63yo1"
+ transform="matrix(1,0,0,1,216,152)" style="display: block;">
+ <rect fill="none" class="djs-outline" x="-6" y="-6" width="132"
+ height="92"></rect>
+ <g class="djs-visual">
+ <rect x="0" y="0" width="120" height="80" rx="0" ry="0"
+ style="stroke-width: 2;" stroke="#000000" fill="#ffffff"></rect>
+ <polyline points="120,80 120,20 " style="stroke-width: 2;"
+ fill="none" stroke="#000000"></polyline>
+ <polyline points="20,0 20,80 " style="stroke-width: 2;"
+ fill="none" stroke="#000000"></polyline>
+ <text style="font-family: Arial,sans-serif; font-size: 12px;"
+ class=" djs-label">
+ <tspan x="35.5" y="43.5">Collector</tspan>
+ </text>
+ </g>
+ <rect x="0" y="0" width="120" height="80"
+ style="stroke-opacity: 0; stroke-width: 15;" fill="none" stroke="#ffffff"
+ class="djs-hit"></rect>
+ </g>
+ </g>
+ <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+ <g class="djs-element djs-shape" data-element-id="StringMatch_1g5af0z"
+ transform="matrix(1,0,0,1,378,140)" style="display: block;">
+ <rect fill="none" class="djs-outline" x="-6" y="-6" width="132"
+ height="92"></rect>
+ <g class="djs-visual">
+ <rect x="0" y="0" width="120" height="80" rx="0" ry="0"
+ style="stroke-width: 2;" stroke="#000000" fill="#ffffff"></rect>
+ <polyline points="0,20 120,20 " style="stroke-width: 2;"
+ fill="none" stroke="#000000"></polyline>
+ <text style="font-family: Arial,sans-serif; font-size: 12px;"
+ class=" djs-label">
+ <tspan x="27.5" y="43.5">StringMatch</tspan>
+ </text>
+ </g>
+ <rect x="0" y="0" width="120" height="80"
+ style="stroke-opacity: 0; stroke-width: 15;" fill="none" stroke="#ffffff"
+ class="djs-hit"></rect>
+ </g>
+ </g>
+ <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+ <g class="djs-element djs-shape" data-element-id="VesCollector_1s3sgbh"
+ transform="matrix(1,0,0,1,552,140)" style="display: block;">
+ <rect fill="none" class="djs-outline" x="-6" y="-6" width="132"
+ height="92"></rect>
+ <g class="djs-visual">
+ <rect x="0" y="0" width="120" height="80" rx="0" ry="0"
+ style="stroke-width: 2;" stroke="#000000" fill="#ffffff"></rect>
+ <polyline points="120,80 120,20 " style="stroke-width: 2;"
+ fill="none" stroke="#000000"></polyline>
+ <polyline points="20,0 20,80 " style="stroke-width: 2;"
+ fill="none" stroke="#000000"></polyline>
+ <text style="font-family: Arial,sans-serif; font-size: 12px;">
+ <tspan x="5" y="14">V</tspan>
+ </text>
+ <text style="font-family: Arial,sans-serif; font-size: 12px;">
+ <tspan x="5" y="26">E</tspan>
+ </text>
+ <text style="font-family: Arial,sans-serif; font-size: 12px;">
+ <tspan x="5" y="38">S</tspan>
+ </text>
+ <text style="font-family: Arial,sans-serif; font-size: 12px;"
+ class=" djs-label">
+ <tspan x="25.5" y="43.5">VesCollector</tspan>
+ </text>
+ </g>
+ <rect x="0" y="0" width="120" height="80"
+ style="stroke-opacity: 0; stroke-width: 15;" fill="none" stroke="#ffffff"
+ class="djs-hit"></rect>
+ </g>
+ </g>
+ <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+ <g class="djs-element djs-shape" data-element-id="Holmes_1m8n1s9"
+ transform="matrix(1,0,0,1,702,140)" style="display: block;">
+ <rect fill="none" class="djs-outline" x="-6" y="-6" width="132"
+ height="92"></rect>
+ <g class="djs-visual">
+ <rect x="0" y="0" width="120" height="80" rx="0" ry="0"
+ style="stroke-width: 2;" stroke="#000000" fill="#ffffff"></rect>
+ <circle cx="15" cy="15" r="10" style="stroke-width: 1;"
+ stroke="#000000" fill="#ffffff"></circle>
+ <text style="font-family: Arial,sans-serif; font-size: 12px;">
+ <tspan x="11" y="20">H</tspan>
+ </text>
+ <text style="font-family: Arial,sans-serif; font-size: 12px;"
+ class=" djs-label">
+ <tspan x="39" y="43.5">Holmes</tspan>
+ </text>
+ </g>
+ <rect x="0" y="0" width="120" height="80"
+ style="stroke-opacity: 0; stroke-width: 15;" fill="none" stroke="#ffffff"
+ class="djs-hit"></rect>
+ </g>
+ </g>
+ <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+ <g class="djs-element djs-shape" data-element-id="TCA_11n5nl9"
+ transform="matrix(1,0,0,1,878,140)" style="display: block;">
+ <rect fill="none" class="djs-outline" x="-6" y="-6" width="132"
+ height="92"></rect>
+ <g class="djs-visual">
+ <rect x="0" y="0" width="120" height="80" rx="0" ry="0"
+ style="stroke-width: 2;" stroke="#000000" fill="#ffffff"></rect>
+ <polyline points="0,60 120,60 " style="stroke-width: 2;"
+ fill="none" stroke="#000000"></polyline>
+ <text style="font-family: Arial,sans-serif; font-size: 12px;"
+ class=" djs-label">
+ <tspan x="48" y="43.5">TCA</tspan>
+ </text>
+ </g>
+ <rect x="0" y="0" width="120" height="80"
+ style="stroke-opacity: 0; stroke-width: 15;" fill="none" stroke="#ffffff"
+ class="djs-hit"></rect>
+ </g>
+ </g>
+ <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+ <g class="djs-element djs-shape" data-element-id="Policy_19c1hms"
+ transform="matrix(1,0,0,1,1031,140)" style="display: block;">
+ <rect fill="none" class="djs-outline" x="-6" y="-6" width="132"
+ height="92"></rect>
+ <g class="djs-visual">
+ <rect x="0" y="0" width="120" height="80" rx="0" ry="0"
+ style="stroke-width: 2;" stroke="#000000" fill="#ffffff"></rect>
+ <polyline points="0,40 60,0 " style="stroke-width: 2;"
+ fill="none" stroke="#000000"></polyline>
+ <text style="font-family: Arial,sans-serif; font-size: 12px;"
+ class=" djs-label">
+ <tspan x="43.5" y="43.5">Policy</tspan>
+ </text>
+ </g>
+ <rect x="0" y="0" width="120" height="80"
+ style="stroke-opacity: 0; stroke-width: 15;" fill="none" stroke="#ffffff"
+ class="djs-hit"></rect>
+ </g>
+ </g>
+ <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+ <g class="djs-element djs-shape" data-element-id="EndEvent_0z8t6ek"
+ transform="matrix(1,0,0,1,1231,162)" style="display: block;">
+ <rect fill="none" class="djs-outline" x="-6" y="-6" width="48"
+ height="48"></rect>
+ <g class="djs-visual">
+ <circle cx="18" cy="18" r="18" style="stroke-width: 4;"
+ stroke="#000000" fill="#ffffff"></circle>
+ </g>
+ <rect x="0" y="0" width="36" height="36"
+ style="stroke-opacity: 0; stroke-width: 15;" fill="none" stroke="#ffffff"
+ class="djs-hit"></rect>
+ </g>
+ </g>
+ <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+ <g class="djs-element djs-shape" data-element-id="EndEvent_0z8t6ek_label"
+ transform="matrix(1,0,0,1,1204,198)" style="display: none;">
+ <rect fill="none" class="djs-outline" x="-6" y="-6" width="102"
+ height="32"></rect>
+ <g class="djs-visual">
+ <text style="font-family: Arial,sans-serif; font-size: 11px;"
+ class=" djs-label">
+ <tspan x="45" y="0"></tspan>
+ </text>
+ </g>
+ <rect x="0" y="0" width="90" height="20"
+ style="stroke-opacity: 0; stroke-width: 15;" fill="none" stroke="#ffffff"
+ class="djs-hit"></rect>
+ </g>
+ </g>
+ <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+ <g class="djs-element djs-connection" data-element-id="SequenceFlow_0mshiwd"
+ style="display: block;">
+ <rect fill="none" class="djs-outline" x="80" y="174" width="142"
+ height="24"></rect>
+ <g class="djs-visual">
+ <path d="m 86,180L151,180 L151,192 L216,192 "
+ style="stroke-width: 2; stroke-linejoin: round; marker-end: url("#markerSj7j5bqgxx");"
+ fill="none" stroke="#000000"></path>
+ </g>
+ <polyline points="86,180 151,180 151,192 216,192 " style="stroke-opacity: 0; stroke-width: 15;"
+ fill="none" stroke="#ffffff" class="djs-hit"></polyline>
+ </g>
+ </g>
+ <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+ <g class="djs-element djs-shape" data-element-id="SequenceFlow_0mshiwd_label"
+ transform="matrix(1,0,0,1,106,176)" style="display: none;">
+ <rect fill="none" class="djs-outline" x="-6" y="-6" width="102"
+ height="32"></rect>
+ <g class="djs-visual">
+ <text style="font-family: Arial,sans-serif; font-size: 11px;"
+ class=" djs-label">
+ <tspan x="45" y="0"></tspan>
+ </text>
+ </g>
+ <rect x="0" y="0" width="90" height="20"
+ style="stroke-opacity: 0; stroke-width: 15;" fill="none" stroke="#ffffff"
+ class="djs-hit"></rect>
+ </g>
+ </g>
+ <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+ <g class="djs-element djs-connection" data-element-id="SequenceFlow_0z37chw"
+ style="display: block;">
+ <rect fill="none" class="djs-outline" x="330" y="174" width="54"
+ height="24"></rect>
+ <g class="djs-visual">
+ <path d="m 336,192L357,192 L357,180 L378,180 "
+ style="stroke-width: 2; stroke-linejoin: round; marker-end: url("#markerSj7j5bqgxx");"
+ fill="none" stroke="#000000"></path>
+ </g>
+ <polyline points="336,192 357,192 357,180 378,180 " style="stroke-opacity: 0; stroke-width: 15;"
+ fill="none" stroke="#ffffff" class="djs-hit"></polyline>
+ </g>
+ </g>
+ <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+ <g class="djs-element djs-shape" data-element-id="SequenceFlow_0z37chw_label"
+ transform="matrix(1,0,0,1,312,176)" style="display: none;">
+ <rect fill="none" class="djs-outline" x="-6" y="-6" width="102"
+ height="32"></rect>
+ <g class="djs-visual">
+ <text style="font-family: Arial,sans-serif; font-size: 11px;"
+ class=" djs-label">
+ <tspan x="45" y="0"></tspan>
+ </text>
+ </g>
+ <rect x="0" y="0" width="90" height="20"
+ style="stroke-opacity: 0; stroke-width: 15;" fill="none" stroke="#ffffff"
+ class="djs-hit"></rect>
+ </g>
+ </g>
+ <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+ <g class="djs-element djs-connection" data-element-id="SequenceFlow_1io8zzg"
+ style="display: block;">
+ <rect fill="none" class="djs-outline" x="492" y="174" width="66"
+ height="12"></rect>
+ <g class="djs-visual">
+ <path d="m 498,180L552,180 "
+ style="stroke-width: 2; stroke-linejoin: round; marker-end: url("#markerSj7j5bqgxx");"
+ fill="none" stroke="#000000"></path>
+ </g>
+ <polyline points="498,180 552,180 " style="stroke-opacity: 0; stroke-width: 15;"
+ fill="none" stroke="#ffffff" class="djs-hit"></polyline>
+ </g>
+ </g>
+ <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+ <g class="djs-element djs-shape" data-element-id="SequenceFlow_1io8zzg_label"
+ transform="matrix(1,0,0,1,480,170)" style="display: none;">
+ <rect fill="none" class="djs-outline" x="-6" y="-6" width="102"
+ height="32"></rect>
+ <g class="djs-visual">
+ <text style="font-family: Arial,sans-serif; font-size: 11px;"
+ class=" djs-label">
+ <tspan x="45" y="0"></tspan>
+ </text>
+ </g>
+ <rect x="0" y="0" width="90" height="20"
+ style="stroke-opacity: 0; stroke-width: 15;" fill="none" stroke="#ffffff"
+ class="djs-hit"></rect>
+ </g>
+ </g>
+ <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+ <g class="djs-element djs-connection" data-element-id="SequenceFlow_0yenh9m"
+ style="display: block;">
+ <rect fill="none" class="djs-outline" x="666" y="174" width="42"
+ height="12"></rect>
+ <g class="djs-visual">
+ <path d="m 672,180L702,180 "
+ style="stroke-width: 2; stroke-linejoin: round; marker-end: url("#markerSj7j5bqgxx");"
+ fill="none" stroke="#000000"></path>
+ </g>
+ <polyline points="672,180 702,180 " style="stroke-opacity: 0; stroke-width: 15;"
+ fill="none" stroke="#ffffff" class="djs-hit"></polyline>
+ </g>
+ </g>
+ <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+ <g class="djs-element djs-shape" data-element-id="SequenceFlow_0yenh9m_label"
+ transform="matrix(1,0,0,1,642,170)" style="display: none;">
+ <rect fill="none" class="djs-outline" x="-6" y="-6" width="102"
+ height="32"></rect>
+ <g class="djs-visual">
+ <text style="font-family: Arial,sans-serif; font-size: 11px;"
+ class=" djs-label">
+ <tspan x="45" y="0"></tspan>
+ </text>
+ </g>
+ <rect x="0" y="0" width="90" height="20"
+ style="stroke-opacity: 0; stroke-width: 15;" fill="none" stroke="#ffffff"
+ class="djs-hit"></rect>
+ </g>
+ </g>
+ <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+ <g class="djs-element djs-connection" data-element-id="SequenceFlow_1gq21be"
+ style="display: block;">
+ <rect fill="none" class="djs-outline" x="816" y="174" width="68"
+ height="12"></rect>
+ <g class="djs-visual">
+ <path d="m 822,180L878,180 "
+ style="stroke-width: 2; stroke-linejoin: round; marker-end: url("#markerSj7j5bqgxx");"
+ fill="none" stroke="#000000"></path>
+ </g>
+ <polyline points="822,180 878,180 " style="stroke-opacity: 0; stroke-width: 15;"
+ fill="none" stroke="#ffffff" class="djs-hit"></polyline>
+ </g>
+ </g>
+ <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+ <g class="djs-element djs-shape" data-element-id="SequenceFlow_1gq21be_label"
+ transform="matrix(1,0,0,1,805,170)" style="display: none;">
+ <rect fill="none" class="djs-outline" x="-6" y="-6" width="102"
+ height="32"></rect>
+ <g class="djs-visual">
+ <text style="font-family: Arial,sans-serif; font-size: 11px;"
+ class=" djs-label">
+ <tspan x="45" y="0"></tspan>
+ </text>
+ </g>
+ <rect x="0" y="0" width="90" height="20"
+ style="stroke-opacity: 0; stroke-width: 15;" fill="none" stroke="#ffffff"
+ class="djs-hit"></rect>
+ </g>
+ </g>
+ <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+ <g class="djs-element djs-connection" data-element-id="SequenceFlow_14phr7v"
+ style="display: block;">
+ <rect fill="none" class="djs-outline" x="992" y="174" width="45"
+ height="12"></rect>
+ <g class="djs-visual">
+ <path d="m 998,180L1031,180 "
+ style="stroke-width: 2; stroke-linejoin: round; marker-end: url("#markerSj7j5bqgxx");"
+ fill="none" stroke="#000000"></path>
+ </g>
+ <polyline points="998,180 1031,180 " style="stroke-opacity: 0; stroke-width: 15;"
+ fill="none" stroke="#ffffff" class="djs-hit"></polyline>
+ </g>
+ </g>
+ <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+ <g class="djs-element djs-shape" data-element-id="SequenceFlow_14phr7v_label"
+ transform="matrix(1,0,0,1,969.5,170)" style="display: none;">
+ <rect fill="none" class="djs-outline" x="-6" y="-6" width="102"
+ height="32"></rect>
+ <g class="djs-visual">
+ <text style="font-family: Arial,sans-serif; font-size: 11px;"
+ class=" djs-label">
+ <tspan x="45" y="0"></tspan>
+ </text>
+ </g>
+ <rect x="0" y="0" width="90" height="20"
+ style="stroke-opacity: 0; stroke-width: 15;" fill="none" stroke="#ffffff"
+ class="djs-hit"></rect>
+ </g>
+ </g>
+ <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+ <g class="djs-element djs-connection" data-element-id="SequenceFlow_1q2yngv"
+ style="display: block;">
+ <rect fill="none" class="djs-outline" x="1145" y="174" width="92"
+ height="12"></rect>
+ <g class="djs-visual">
+ <path d="m 1151,180L1231,180 "
+ style="stroke-width: 2; stroke-linejoin: round; marker-end: url("#markerSj7j5bqgxx");"
+ fill="none" stroke="#000000"></path>
+ </g>
+ <polyline points="1151,180 1231,180 " style="stroke-opacity: 0; stroke-width: 15;"
+ fill="none" stroke="#ffffff" class="djs-hit"></polyline>
+ </g>
+ </g>
+ <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+ <g class="djs-element djs-shape" data-element-id="SequenceFlow_1q2yngv_label"
+ transform="matrix(1,0,0,1,1146,170)" style="display: none;">
+ <rect fill="none" class="djs-outline" x="-6" y="-6" width="102"
+ height="32"></rect>
+ <g class="djs-visual">
+ <text style="font-family: Arial,sans-serif; font-size: 11px;"
+ class=" djs-label">
+ <tspan x="45" y="0"></tspan>
+ </text>
+ </g>
+ <rect x="0" y="0" width="90" height="20"
+ style="stroke-opacity: 0; stroke-width: 15;" fill="none" stroke="#ffffff"
+ class="djs-hit"></rect>
+ </g>
+ </g>
+</svg>
\ No newline at end of file