Add tests 89/68189/1
authorsebdet <sd378r@intl.att.com>
Thu, 20 Sep 2018 16:27:17 +0000 (18:27 +0200)
committersebdet <sd378r@intl.att.com>
Thu, 20 Sep 2018 16:27:17 +0000 (18:27 +0200)
Add some tests and fix event for Submit action

Issue-ID: CLAMP-217
Change-Id: I1882a35da110130529085fad5524e82a509cd7e1
Signed-off-by: sebdet <sd378r@intl.att.com>
src/main/java/org/onap/clamp/clds/model/CldsModel.java
src/main/java/org/onap/clamp/clds/service/CldsService.java
src/test/java/org/onap/clamp/clds/it/CldsServiceItCase.java
src/test/resources/example/model-properties/tca_new/doc-text.yaml [new file with mode: 0644]
src/test/resources/example/model-properties/tca_new/model-properties.json [new file with mode: 0644]
src/test/resources/example/model-properties/tca_new/tca-img.xml [new file with mode: 0644]
src/test/resources/example/model-properties/tca_new/tca-template.xml [new file with mode: 0644]

index 55f4dfd..d7228cf 100644 (file)
@@ -18,7 +18,7 @@
  * limitations under the License.
  * ============LICENSE_END============================================
  * ===================================================================
- * 
+ *
  */
 
 package org.onap.clamp.clds.model;
@@ -45,13 +45,13 @@ public class CldsModel {
 
     private static final EELFLogger logger = EELFManager.getInstance().getLogger(CldsModel.class);
     private static final int UUID_LENGTH = 36;
-    private static final String STATUS_DESIGN = "DESIGN";
-    private static final String STATUS_DISTRIBUTED = "DISTRIBUTED";
-    private static final String STATUS_ACTIVE = "ACTIVE";
-    private static final String STATUS_STOPPED = "STOPPED";
-    private static final String STATUS_DELETING = "DELETING";
-    private static final String STATUS_ERROR = "ERROR";
-    private static final String STATUS_UNKNOWN = "UNKNOWN";
+    public static final String STATUS_DESIGN = "DESIGN";
+    public static final String STATUS_DISTRIBUTED = "DISTRIBUTED";
+    public static final String STATUS_ACTIVE = "ACTIVE";
+    public static final String STATUS_STOPPED = "STOPPED";
+    public static final String STATUS_DELETING = "DELETING";
+    public static final String STATUS_ERROR = "ERROR";
+    public static final String STATUS_UNKNOWN = "UNKNOWN";
     private String id;
     private String templateId;
     private String templateName;
@@ -99,7 +99,7 @@ public class CldsModel {
         boolean canCall = false;
         /* Below checks the clds event is submit/resubmit/distribute */
         if (event.isActionCd(CldsEvent.ACTION_SUBMIT) || event.isActionCd(CldsEvent.ACTION_RESUBMIT)
-                || event.isActionCd(CldsEvent.ACTION_DISTRIBUTE) || event.isActionCd(CldsEvent.ACTION_SUBMITDCAE)) {
+            || event.isActionCd(CldsEvent.ACTION_DISTRIBUTE) || event.isActionCd(CldsEvent.ACTION_SUBMITDCAE)) {
             canCall = true;
         }
         return canCall;
@@ -125,22 +125,22 @@ public class CldsModel {
         } else if (event.isActionStateCd(CldsEvent.ACTION_STATE_ERROR)) {
             status = STATUS_ERROR;
         } else if (event.isActionAndStateCd(CldsEvent.ACTION_CREATE, CldsEvent.ACTION_STATE_ANY)
-                || event.isActionAndStateCd(CldsEvent.ACTION_SUBMIT, CldsEvent.ACTION_STATE_ANY)
-                || event.isActionAndStateCd(CldsEvent.ACTION_RESUBMIT, CldsEvent.ACTION_STATE_ANY)
-                || event.isActionAndStateCd(CldsEvent.ACTION_SUBMITDCAE, CldsEvent.ACTION_STATE_ANY)
-                || event.isActionAndStateCd(CldsEvent.ACTION_DELETE, CldsEvent.ACTION_STATE_RECEIVED)
-                || event.isActionAndStateCd(CldsEvent.ACTION_MODIFY, CldsEvent.ACTION_STATE_ANY)) {
+            || event.isActionAndStateCd(CldsEvent.ACTION_SUBMIT, CldsEvent.ACTION_STATE_ANY)
+            || event.isActionAndStateCd(CldsEvent.ACTION_RESUBMIT, CldsEvent.ACTION_STATE_ANY)
+            || event.isActionAndStateCd(CldsEvent.ACTION_SUBMITDCAE, CldsEvent.ACTION_STATE_ANY)
+            || event.isActionAndStateCd(CldsEvent.ACTION_DELETE, CldsEvent.ACTION_STATE_RECEIVED)
+            || event.isActionAndStateCd(CldsEvent.ACTION_MODIFY, CldsEvent.ACTION_STATE_ANY)) {
             status = STATUS_DESIGN;
         } else if (event.isActionAndStateCd(CldsEvent.ACTION_DISTRIBUTE, CldsEvent.ACTION_STATE_RECEIVED)
-                || event.isActionAndStateCd(CldsEvent.ACTION_UNDEPLOY, CldsEvent.ACTION_STATE_RECEIVED)) {
+            || event.isActionAndStateCd(CldsEvent.ACTION_UNDEPLOY, CldsEvent.ACTION_STATE_RECEIVED)) {
             status = STATUS_DISTRIBUTED;
         } else if (event.isActionAndStateCd(CldsEvent.ACTION_DELETE, CldsEvent.ACTION_STATE_SENT)) {
             status = STATUS_DELETING;
         } else if (event.isActionAndStateCd(CldsEvent.ACTION_DEPLOY, CldsEvent.ACTION_STATE_RECEIVED)
-                || event.isActionAndStateCd(CldsEvent.ACTION_RESTART, CldsEvent.ACTION_STATE_ANY)
-                || event.isActionAndStateCd(CldsEvent.ACTION_UPDATE, CldsEvent.ACTION_STATE_ANY)
-                || event.isActionAndStateCd(CldsEvent.ACTION_DEPLOY, CldsEvent.ACTION_STATE_ANY)
-                || event.isActionAndStateCd(CldsEvent.ACTION_SUBMITPOLICY, CldsEvent.ACTION_STATE_ANY)) {
+            || event.isActionAndStateCd(CldsEvent.ACTION_RESTART, CldsEvent.ACTION_STATE_ANY)
+            || event.isActionAndStateCd(CldsEvent.ACTION_UPDATE, CldsEvent.ACTION_STATE_ANY)
+            || event.isActionAndStateCd(CldsEvent.ACTION_DEPLOY, CldsEvent.ACTION_STATE_ANY)
+            || event.isActionAndStateCd(CldsEvent.ACTION_SUBMITPOLICY, CldsEvent.ACTION_STATE_ANY)) {
             status = STATUS_ACTIVE;
         } else if (event.isActionAndStateCd(CldsEvent.ACTION_STOP, CldsEvent.ACTION_STATE_ANY)) {
             status = STATUS_STOPPED;
@@ -182,69 +182,69 @@ public class CldsModel {
     private void determinePermittedActionCd() {
         String actionCd = getCurrentActionCd();
         switch (actionCd) {
-            case CldsEvent.ACTION_CREATE:
-                permittedActionCd = Arrays.asList(CldsEvent.ACTION_SUBMIT, CldsEvent.ACTION_TEST,
-                        CldsEvent.ACTION_DELETE);
-                if (isSimplifiedModel()) {
-                    permittedActionCd = Arrays.asList(CldsEvent.ACTION_SUBMITDCAE, CldsEvent.ACTION_SUBMITPOLICY,
-                            CldsEvent.ACTION_TEST, CldsEvent.ACTION_DELETE);
-                }
-                break;
-            case CldsEvent.ACTION_MODIFY:
-                permittedActionCd = Arrays.asList(CldsEvent.ACTION_RESUBMIT, CldsEvent.ACTION_DELETE);
-                if (isSimplifiedModel()) {
-                    permittedActionCd = Arrays.asList(CldsEvent.ACTION_SUBMITDCAE, CldsEvent.ACTION_SUBMITPOLICY,
-                            CldsEvent.ACTION_DELETE);
-                }
-                break;
-            case CldsEvent.ACTION_SUBMIT:
-            case CldsEvent.ACTION_RESUBMIT:
-                permittedActionCd = Arrays.asList(CldsEvent.ACTION_RESUBMIT, CldsEvent.ACTION_DELETE);
-                break;
-            case CldsEvent.ACTION_SUBMITDCAE:
-                permittedActionCd = Arrays.asList(CldsEvent.ACTION_SUBMITDCAE, CldsEvent.ACTION_DELETE);
-                break;
-            case CldsEvent.ACTION_SUBMITPOLICY:
-                permittedActionCd = Arrays.asList(CldsEvent.ACTION_UPDATE, CldsEvent.ACTION_STOP);
-                break;
-            case CldsEvent.ACTION_DISTRIBUTE:
-                permittedActionCd = Arrays.asList(CldsEvent.ACTION_DEPLOY, CldsEvent.ACTION_RESUBMIT,
-                        CldsEvent.ACTION_DELETE);
-                if (isSimplifiedModel()) {
-                    permittedActionCd = Arrays.asList(CldsEvent.ACTION_DEPLOY, CldsEvent.ACTION_SUBMITDCAE,
-                            CldsEvent.ACTION_DELETE);
-                }
-                break;
-            case CldsEvent.ACTION_UNDEPLOY:
+        case CldsEvent.ACTION_CREATE:
+            permittedActionCd = Arrays.asList(CldsEvent.ACTION_SUBMIT, CldsEvent.ACTION_TEST,
+                CldsEvent.ACTION_DELETE);
+            if (isSimplifiedModel()) {
+                permittedActionCd = Arrays.asList(CldsEvent.ACTION_SUBMITDCAE, CldsEvent.ACTION_SUBMITPOLICY,
+                    CldsEvent.ACTION_TEST, CldsEvent.ACTION_DELETE);
+            }
+            break;
+        case CldsEvent.ACTION_MODIFY:
+            permittedActionCd = Arrays.asList(CldsEvent.ACTION_RESUBMIT, CldsEvent.ACTION_DELETE);
+            if (isSimplifiedModel()) {
+                permittedActionCd = Arrays.asList(CldsEvent.ACTION_SUBMITDCAE, CldsEvent.ACTION_SUBMITPOLICY,
+                    CldsEvent.ACTION_DELETE);
+            }
+            break;
+        case CldsEvent.ACTION_SUBMIT:
+        case CldsEvent.ACTION_RESUBMIT:
+            permittedActionCd = Arrays.asList(CldsEvent.ACTION_RESUBMIT, CldsEvent.ACTION_DELETE);
+            break;
+        case CldsEvent.ACTION_SUBMITDCAE:
+            permittedActionCd = Arrays.asList(CldsEvent.ACTION_SUBMITDCAE, CldsEvent.ACTION_DELETE);
+            break;
+        case CldsEvent.ACTION_SUBMITPOLICY:
+            permittedActionCd = Arrays.asList(CldsEvent.ACTION_UPDATE, CldsEvent.ACTION_STOP);
+            break;
+        case CldsEvent.ACTION_DISTRIBUTE:
+            permittedActionCd = Arrays.asList(CldsEvent.ACTION_DEPLOY, CldsEvent.ACTION_RESUBMIT,
+                CldsEvent.ACTION_DELETE);
+            if (isSimplifiedModel()) {
+                permittedActionCd = Arrays.asList(CldsEvent.ACTION_DEPLOY, CldsEvent.ACTION_SUBMITDCAE,
+                    CldsEvent.ACTION_DELETE);
+            }
+            break;
+        case CldsEvent.ACTION_UNDEPLOY:
+            permittedActionCd = Arrays.asList(CldsEvent.ACTION_UPDATE, CldsEvent.ACTION_DEPLOY,
+                CldsEvent.ACTION_RESUBMIT, CldsEvent.ACTION_DELETE);
+            if (isSimplifiedModel()) {
                 permittedActionCd = Arrays.asList(CldsEvent.ACTION_UPDATE, CldsEvent.ACTION_DEPLOY,
-                        CldsEvent.ACTION_RESUBMIT, CldsEvent.ACTION_DELETE);
-                if (isSimplifiedModel()) {
-                    permittedActionCd = Arrays.asList(CldsEvent.ACTION_UPDATE, CldsEvent.ACTION_DEPLOY,
-                            CldsEvent.ACTION_SUBMITDCAE, CldsEvent.ACTION_DELETE);
-                }
-                break;
-            case CldsEvent.ACTION_DEPLOY:
-                permittedActionCd = Arrays.asList(CldsEvent.ACTION_DEPLOY, CldsEvent.ACTION_UNDEPLOY,
-                        CldsEvent.ACTION_UPDATE, CldsEvent.ACTION_STOP);
-                break;
-            case CldsEvent.ACTION_RESTART:
-            case CldsEvent.ACTION_UPDATE:
-                permittedActionCd = Arrays.asList(CldsEvent.ACTION_DEPLOY, CldsEvent.ACTION_UPDATE,
-                        CldsEvent.ACTION_STOP, CldsEvent.ACTION_UNDEPLOY);
-                if (isPolicyOnly()) {
-                    permittedActionCd = Arrays.asList(CldsEvent.ACTION_UPDATE, CldsEvent.ACTION_STOP);
-                }
-                break;
-            case CldsEvent.ACTION_STOP:
+                    CldsEvent.ACTION_SUBMITDCAE, CldsEvent.ACTION_DELETE);
+            }
+            break;
+        case CldsEvent.ACTION_DEPLOY:
+            permittedActionCd = Arrays.asList(CldsEvent.ACTION_DEPLOY, CldsEvent.ACTION_UNDEPLOY,
+                CldsEvent.ACTION_UPDATE, CldsEvent.ACTION_STOP);
+            break;
+        case CldsEvent.ACTION_RESTART:
+        case CldsEvent.ACTION_UPDATE:
+            permittedActionCd = Arrays.asList(CldsEvent.ACTION_DEPLOY, CldsEvent.ACTION_UPDATE,
+                CldsEvent.ACTION_STOP, CldsEvent.ACTION_UNDEPLOY);
+            if (isPolicyOnly()) {
+                permittedActionCd = Arrays.asList(CldsEvent.ACTION_UPDATE, CldsEvent.ACTION_STOP);
+            }
+            break;
+        case CldsEvent.ACTION_STOP:
+            permittedActionCd = Arrays.asList(CldsEvent.ACTION_UPDATE, CldsEvent.ACTION_RESTART,
+                CldsEvent.ACTION_UNDEPLOY);
+            if (isPolicyOnly()) {
                 permittedActionCd = Arrays.asList(CldsEvent.ACTION_UPDATE, CldsEvent.ACTION_RESTART,
-                        CldsEvent.ACTION_UNDEPLOY);
-                if (isPolicyOnly()) {
-                    permittedActionCd = Arrays.asList(CldsEvent.ACTION_UPDATE, CldsEvent.ACTION_RESTART,
-                            CldsEvent.ACTION_DELETE);
-                }
-                break;
-            default:
-                logger.warn("Invalid current actionCd: " + actionCd);
+                    CldsEvent.ACTION_DELETE);
+            }
+            break;
+        default:
+            logger.warn("Invalid current actionCd: " + actionCd);
         }
     }
 
@@ -289,8 +289,8 @@ public class CldsModel {
         determinePermittedActionCd();
         if (!permittedActionCd.contains(requestedActionCd)) {
             throw new IllegalArgumentException(
-                    "Invalid requestedActionCd: " + requestedActionCd + ".  Given current actionCd: "
-                            + getCurrentActionCd() + ", the permittedActionCd: " + permittedActionCd);
+                "Invalid requestedActionCd: " + requestedActionCd + ".  Given current actionCd: "
+                    + getCurrentActionCd() + ", the permittedActionCd: " + permittedActionCd);
         }
     }
 
@@ -303,8 +303,8 @@ public class CldsModel {
     public static CldsModel createUsingControlName(String fullControlName) {
         if (fullControlName == null || fullControlName.length() < UUID_LENGTH) {
             throw new BadRequestException(
-                    "closed loop id / control name length, " + (fullControlName != null ? fullControlName.length() : 0)
-                            + ", less than the minimum of: " + UUID_LENGTH);
+                "closed loop id / control name length, " + (fullControlName != null ? fullControlName.length() : 0)
+                + ", less than the minimum of: " + UUID_LENGTH);
         }
         CldsModel model = new CldsModel();
         model.setControlNamePrefix(fullControlName.substring(0, fullControlName.length() - UUID_LENGTH));
@@ -328,10 +328,10 @@ public class CldsModel {
         cldsModel = cldsDao.getModelByUuid(cldsModel.getControlNameUuid());
         cldsModel.determineStatus();
         if (dcaeEvent.getCldsActionCd().equals(CldsEvent.ACTION_UNDEPLOY) || (dcaeEvent.getCldsActionCd()
-                .equals(CldsEvent.ACTION_DEPLOY)
-                && (cldsModel.getStatus().equals(STATUS_DISTRIBUTED) || cldsModel.getStatus().equals(STATUS_DESIGN)))) {
+            .equals(CldsEvent.ACTION_DEPLOY)
+            && (cldsModel.getStatus().equals(STATUS_DISTRIBUTED) || cldsModel.getStatus().equals(STATUS_DESIGN)))) {
             CldsEvent.insEvent(cldsDao, dcaeEvent.getControlName(), userid, dcaeEvent.getCldsActionCd(),
-                    CldsEvent.ACTION_STATE_RECEIVED, null);
+                CldsEvent.ACTION_STATE_RECEIVED, null);
         }
         cldsDao.insModelInstance(cldsModel, dcaeEvent.getInstances());
         return cldsModel;
index 243881f..5e35b89 100644 (file)
@@ -118,6 +118,7 @@ public class CldsService extends SecureServiceBase {
 
     @Autowired
     private HttpServletRequest request;
+
     @Autowired
     public CldsService(CldsDao cldsDao, XslTransformer cldsBpmnTransformer, ClampProperties refProp,
         SdcCatalogServices sdcCatalogServices, DcaeDispatcherServices dcaeDispatcherServices,
@@ -127,7 +128,7 @@ public class CldsService extends SecureServiceBase {
         @Value("${clamp.config.security.permission.type.cl.event:permission-type-cl-event}") String cldsPermissionTypeClEvent,
         @Value("${clamp.config.security.permission.type.filter.vf:permission-type-filter-vf}") String cldsPermissionTypeFilterVf,
         @Value("${clamp.config.security.permission.type.template:permission-type-template}") String cldsPermissionTypeTemplate,
-            @Value("${clamp.config.security.permission.type.tosca:permission-type-tosca}") String cldsPermissionTypeTosca,
+        @Value("${clamp.config.security.permission.type.tosca:permission-type-tosca}") String cldsPermissionTypeTosca,
         @Value("${clamp.config.security.permission.instance:dev}") String cldsPermissionInstance) {
         this.cldsDao = cldsDao;
         this.cldsBpmnTransformer = cldsBpmnTransformer;
@@ -149,7 +150,7 @@ public class CldsService extends SecureServiceBase {
             "update");
         permissionReadTosca = SecureServicePermission.create(cldsPermissionTypeTosca, cldsPermissionInstance, "read");
         permissionUpdateTosca = SecureServicePermission.create(cldsPermissionTypeTosca, cldsPermissionInstance,
-                "update");
+            "update");
     }
 
     /*
@@ -222,7 +223,7 @@ public class CldsService extends SecureServiceBase {
      * @return image xml text - content of image given name
      */
     public String getImageXml(String modelName) {
-       util.entering(request, "CldsService: GET model image");
+        util.entering(request, "CldsService: GET model image");
         Date startTime = new Date();
         isAuthorized(permissionReadCl);
         logger.info("GET imageText for modelName={}", modelName);
@@ -241,7 +242,7 @@ public class CldsService extends SecureServiceBase {
      * @return clds model - clds model for the given model name
      */
     public CldsModel getModel(String modelName) {
-       util.entering(request, "CldsService: GET model");
+        util.entering(request, "CldsService: GET model");
         Date startTime = new Date();
         isAuthorized(permissionReadCl);
         logger.debug("GET model for  modelName={}", modelName);
@@ -270,7 +271,7 @@ public class CldsService extends SecureServiceBase {
      * @param modelName
      */
     public CldsModel putModel(String modelName, CldsModel cldsModel) {
-       util.entering(request, "CldsService: PUT model");
+        util.entering(request, "CldsService: PUT model");
         Date startTime = new Date();
         isAuthorized(permissionUpdateCl);
         isAuthorizedForVf(cldsModel);
@@ -339,9 +340,8 @@ public class CldsService extends SecureServiceBase {
      * @throws DecoderException
      *         In case of issues with the Hex String decoding
      */
-    public ResponseEntity<?> putModelAndProcessAction(String action,
-        String modelName,String test, CldsModel model)
-            throws TransformerException, ParseException {
+    public ResponseEntity<?> putModelAndProcessAction(String action, String modelName, String test, CldsModel model)
+        throws TransformerException, ParseException {
         util.entering(request, "CldsService: Process model action");
         Date startTime = new Date();
         CldsModel retrievedModel = null;
@@ -364,7 +364,7 @@ public class CldsService extends SecureServiceBase {
             this.fillInCldsModel(model);
             // save model to db
             model.setName(modelName);
-            updateAndInsertNewEvent(modelName, model.getControlNamePrefix(), model.getEvent(), CldsEvent.ACTION_MODIFY);
+            updateAndInsertNewEvent(modelName, model.getControlNamePrefix(), model.getEvent(), CldsEvent.ACTION_SUBMIT);
             model.save(cldsDao, getUserId());
             // get vars and format if necessary
             String prop = model.getPropText();
@@ -376,10 +376,10 @@ public class CldsService extends SecureServiceBase {
             // Flag indicates whether it is triggered by Validation Test button
             // from
             // UI
-            boolean isTest = Boolean.valueOf(test);
+            boolean isTest = Boolean.parseBoolean(test);
             if (!isTest) {
                 String actionTestOverride = refProp.getStringValue("action.test.override");
-                if (Boolean.valueOf(actionTestOverride)) {
+                if (Boolean.parseBoolean(actionTestOverride)) {
                     logger.info("PUT actionTestOverride={}", actionTestOverride);
                     logger.info("PUT override test indicator and setting it to true");
                     isTest = true;
@@ -387,7 +387,7 @@ public class CldsService extends SecureServiceBase {
             }
             logger.info("PUT isTest={}", isTest);
             String insertTestEvent = refProp.getStringValue("action.insert.test.event");
-            boolean isInsertTestEvent = Boolean.valueOf(insertTestEvent);
+            boolean isInsertTestEvent = Boolean.parseBoolean(insertTestEvent);
 
             logger.info("PUT isInsertTestEvent={}", isInsertTestEvent);
             // determine if requested action is permitted
@@ -407,12 +407,14 @@ public class CldsService extends SecureServiceBase {
                 retrievedModel = CldsModel.retrieve(cldsDao, modelName, false);
             }
             if (retrievedModel != null) {
-                if (!isTest && !errorCase && (actionCd.equalsIgnoreCase(CldsEvent.ACTION_SUBMIT)
-                    || actionCd.equalsIgnoreCase(CldsEvent.ACTION_RESUBMIT)
-                    || actionCd.equalsIgnoreCase(CldsEvent.ACTION_SUBMITDCAE))) {
+                if (!isTest && !errorCase
+                    && (actionCd.equalsIgnoreCase(CldsEvent.ACTION_SUBMIT)
+                        || actionCd.equalsIgnoreCase(CldsEvent.ACTION_RESUBMIT)
+                        || actionCd.equalsIgnoreCase(CldsEvent.ACTION_SUBMITDCAE))) {
                     if (retrievedModel.getTemplateName().startsWith(CsarInstallerImpl.TEMPLATE_NAME_PREFIX)) {
                         // SDC artifact case
-                        logger.info("Skipping DCAE inventory call as closed loop has been created from SDC notification");
+                        logger
+                        .info("Skipping DCAE inventory call as closed loop has been created from SDC notification");
                         DcaeEvent dcaeEvent = new DcaeEvent();
                         dcaeEvent.setArtifactName(retrievedModel.getControlName() + ".yml");
                         dcaeEvent.setEvent(DcaeEvent.EVENT_DISTRIBUTION);
@@ -432,15 +434,19 @@ public class CldsService extends SecureServiceBase {
                 auditLogger.info("Process model action completed");
             } else {
                 logger.error("CldsModel not found in database with modelName: " + modelName);
-                util.exiting(HttpStatus.INTERNAL_SERVER_ERROR.toString(), "CldsModel not found in database with modelName " + "modelName", Level.INFO, ONAPLogConstants.ResponseStatus.ERROR);
-                return new ResponseEntity<String>("CldsModel not found in database with modelName: \" + modelName", HttpStatus.INTERNAL_SERVER_ERROR);
+                util.exiting(HttpStatus.INTERNAL_SERVER_ERROR.toString(),
+                    "CldsModel not found in database with modelName " + "modelName", Level.INFO,
+                    ONAPLogConstants.ResponseStatus.ERROR);
+                return new ResponseEntity<String>("CldsModel not found in database with modelName: \" + modelName",
+                    HttpStatus.INTERNAL_SERVER_ERROR);
             }
         } catch (Exception e) {
             errorCase = true;
             logger.error("Exception occured during putModelAndProcessAction", e);
         }
         if (errorCase) {
-            util.exiting(HttpStatus.INTERNAL_SERVER_ERROR.toString(), "putModelAndProcessAction failed", Level.INFO, ONAPLogConstants.ResponseStatus.ERROR);
+            util.exiting(HttpStatus.INTERNAL_SERVER_ERROR.toString(), "putModelAndProcessAction failed", Level.INFO,
+                ONAPLogConstants.ResponseStatus.ERROR);
             return new ResponseEntity<>(retrievedModel, HttpStatus.INTERNAL_SERVER_ERROR);
         }
         util.exiting(HttpStatus.OK.toString(), "Successful", Level.INFO, ONAPLogConstants.ResponseStatus.COMPLETED);
@@ -467,7 +473,7 @@ public class CldsService extends SecureServiceBase {
         }
         // Flag indicates whether it is triggered by Validation Test button from
         // UI
-        boolean isTest = Boolean.valueOf(test);
+        boolean isTest = Boolean.parseBoolean(test);
         int instanceCount = 0;
         if (dcaeEvent.getInstances() != null) {
             instanceCount = dcaeEvent.getInstances().size();
@@ -540,9 +546,8 @@ public class CldsService extends SecureServiceBase {
      * @throws IOException
      *         In case of issue to convert CldsServiceCache to InputStream
      */
-    public String getSdcPropertiesByServiceUUIDForRefresh(
-        String serviceInvariantUUID, Boolean refresh)
-            throws GeneralSecurityException, DecoderException, IOException {
+    public String getSdcPropertiesByServiceUUIDForRefresh(String serviceInvariantUUID, Boolean refresh)
+        throws GeneralSecurityException, DecoderException, IOException {
         util.entering(request, "CldsService: GET sdc properties by uuid");
         Date startTime = new Date();
         CldsServiceData cldsServiceData = new CldsServiceData();
@@ -561,7 +566,8 @@ public class CldsService extends SecureServiceBase {
         // audit log
         LoggingUtils.setTimeContext(startTime, new Date());
         auditLogger.info("GET sdc properties by uuid completed");
-        util.exiting("200", "Get sdc properties by uuid success", Level.INFO, ONAPLogConstants.ResponseStatus.COMPLETED);
+        util.exiting("200", "Get sdc properties by uuid success", Level.INFO,
+            ONAPLogConstants.ResponseStatus.COMPLETED);
         return sdcProperties;
     }
 
@@ -774,7 +780,8 @@ public class CldsService extends SecureServiceBase {
                 model.save(cldsDao, getUserId());
             } else {
                 logger.info("Deploy model (" + modelName + ") failed...Operation Status is - " + operationStatus);
-                util.exiting(HttpStatus.INTERNAL_SERVER_ERROR.toString(), "DeployModel failed", Level.INFO, ONAPLogConstants.ResponseStatus.ERROR);
+                util.exiting(HttpStatus.INTERNAL_SERVER_ERROR.toString(), "DeployModel failed", Level.INFO,
+                    ONAPLogConstants.ResponseStatus.ERROR);
                 throw new HttpClientErrorException(HttpStatus.INTERNAL_SERVER_ERROR,
                     "Deploy model (" + modelName + ") failed...Operation Status is - " + operationStatus);
             }
@@ -787,7 +794,8 @@ public class CldsService extends SecureServiceBase {
             logger.error("Exception occured during deployModel", e);
         }
         if (errorCase) {
-               util.exiting(HttpStatus.INTERNAL_SERVER_ERROR.toString(), "DeployModel failed", Level.INFO, ONAPLogConstants.ResponseStatus.ERROR);
+            util.exiting(HttpStatus.INTERNAL_SERVER_ERROR.toString(), "DeployModel failed", Level.INFO,
+                ONAPLogConstants.ResponseStatus.ERROR);
             return new ResponseEntity<>(model, HttpStatus.INTERNAL_SERVER_ERROR);
         }
         util.exiting(HttpStatus.OK.toString(), "Successful", Level.INFO, ONAPLogConstants.ResponseStatus.COMPLETED);
@@ -821,7 +829,8 @@ public class CldsService extends SecureServiceBase {
                 model.save(cldsDao, getUserId());
             } else {
                 logger.info("Undeploy model (" + modelName + ") failed...Operation Status is - " + operationStatus);
-                util.exiting(HttpStatus.INTERNAL_SERVER_ERROR.toString(), "UndeployModel failed", Level.INFO, ONAPLogConstants.ResponseStatus.ERROR);
+                util.exiting(HttpStatus.INTERNAL_SERVER_ERROR.toString(), "UndeployModel failed", Level.INFO,
+                    ONAPLogConstants.ResponseStatus.ERROR);
                 throw new HttpClientErrorException(HttpStatus.INTERNAL_SERVER_ERROR,
                     "Undeploy model (" + modelName + ") failed...Operation Status is - " + operationStatus);
             }
@@ -834,7 +843,8 @@ public class CldsService extends SecureServiceBase {
             logger.error("Exception occured during unDeployModel", e);
         }
         if (errorCase) {
-            util.exiting(HttpStatus.INTERNAL_SERVER_ERROR.toString(), "UndeployModel failed", Level.INFO, ONAPLogConstants.ResponseStatus.ERROR);
+            util.exiting(HttpStatus.INTERNAL_SERVER_ERROR.toString(), "UndeployModel failed", Level.INFO,
+                ONAPLogConstants.ResponseStatus.ERROR);
             return new ResponseEntity<>(model, HttpStatus.INTERNAL_SERVER_ERROR);
         }
         util.exiting(HttpStatus.OK.toString(), "Successful", Level.INFO, ONAPLogConstants.ResponseStatus.COMPLETED);
@@ -879,7 +889,7 @@ public class CldsService extends SecureServiceBase {
     }
 
     // Created for the integration test
-    public void setLoggingUtil (LoggingUtils utilP) {
-        util =  utilP;
+    public void setLoggingUtil(LoggingUtils utilP) {
+        util = utilP;
     }
 }
\ No newline at end of file
index 695aa2d..9cca936 100644 (file)
@@ -55,6 +55,7 @@ import org.onap.clamp.clds.model.CldsInfo;
 import org.onap.clamp.clds.model.CldsModel;
 import org.onap.clamp.clds.model.CldsServiceData;
 import org.onap.clamp.clds.model.CldsTemplate;
+import org.onap.clamp.clds.model.DcaeEvent;
 import org.onap.clamp.clds.service.CldsService;
 import org.onap.clamp.clds.util.LoggingUtils;
 import org.onap.clamp.clds.util.ResourceFileUtil;
@@ -85,22 +86,26 @@ public class CldsServiceItCase {
     private String bpmnText;
     private String imageText;
     private String bpmnPropText;
+    private String docText;
+
     @Autowired
     private CldsDao cldsDao;
     private Authentication authentication;
-    private List<GrantedAuthority> authList =  new LinkedList<GrantedAuthority>();
+    private List<GrantedAuthority> authList = new LinkedList<GrantedAuthority>();
     private LoggingUtils util;
+
     /**
      * Setup the variable before the tests execution.
      *
      * @throws IOException
-     *             In case of issues when opening the files
+     *         In case of issues when opening the files
      */
     @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");
+        bpmnText = ResourceFileUtil.getResourceAsString("example/model-properties/tca_new/tca-template.xml");
+        imageText = ResourceFileUtil.getResourceAsString("example/model-properties/tca_new/tca-img.xml");
+        bpmnPropText = ResourceFileUtil.getResourceAsString("example/model-properties/tca_new/model-properties.json");
+        docText = ResourceFileUtil.getResourceAsString("example/model-properties/tca_new/doc-text.yaml");
 
         authList.add(new SimpleGrantedAuthority("permission-type-cl-manage|dev|*"));
         authList.add(new SimpleGrantedAuthority("permission-type-cl|dev|read"));
@@ -108,7 +113,8 @@ public class CldsServiceItCase {
         authList.add(new SimpleGrantedAuthority("permission-type-template|dev|read"));
         authList.add(new SimpleGrantedAuthority("permission-type-template|dev|update"));
         authList.add(new SimpleGrantedAuthority("permission-type-filter-vf|dev|*"));
-        authentication =  new UsernamePasswordAuthenticationToken(new User("admin", "", authList), "", authList);
+        authList.add(new SimpleGrantedAuthority("permission-type-cl-event|dev|*"));
+        authentication = new UsernamePasswordAuthenticationToken(new User("admin", "", authList), "", authList);
 
         util = Mockito.mock(LoggingUtils.class);
         Mockito.doNothing().when(util).entering(Matchers.any(HttpServletRequest.class), Matchers.any(String.class));
@@ -179,52 +185,63 @@ public class CldsServiceItCase {
         newModel.setControlNamePrefix("ClosedLoop-");
         newModel.setTemplateName(randomNameTemplate);
         newModel.setTemplateId(newTemplate.getId());
-        newModel.setDocText(newTemplate.getPropText());
+        newModel.setDocText(docText);
         // Test the PutModel method
 
         cldsService.putModel(randomNameModel, newModel);
         // Verify whether it has been added properly or not
         assertNotNull(cldsDao.getModel(randomNameModel));
 
-        CldsModel model= cldsService.getModel(randomNameModel);
+        CldsModel model = cldsService.getModel(randomNameModel);
         // Verify with GetModel
-        assertEquals(model.getTemplateName(),randomNameTemplate);
-        assertEquals(model.getName(),randomNameModel);
+        assertEquals(model.getTemplateName(), randomNameTemplate);
+        assertEquals(model.getName(), randomNameModel);
 
         assertTrue(cldsService.getModelNames().size() >= 1);
 
         // Should fail
-        ResponseEntity<?> responseEntity = cldsService.putModelAndProcessAction(CldsEvent.ACTION_SUBMIT, randomNameModel, "true", model);
-        assertTrue(responseEntity.getStatusCode().equals(HttpStatus.INTERNAL_SERVER_ERROR));
-        model=(CldsModel)responseEntity.getBody();
-        assertNull(model);
+        ResponseEntity<?> responseEntity = cldsService.putModelAndProcessAction(CldsEvent.ACTION_SUBMIT,
+            randomNameModel, "false", cldsService.getModel(randomNameModel));
+        assertTrue(responseEntity.getStatusCode().equals(HttpStatus.OK));
+        assertNotNull(responseEntity.getBody());
+        assertTrue(CldsModel.STATUS_DISTRIBUTED.equals(((CldsModel) responseEntity.getBody()).getStatus()));
+        assertTrue(CldsModel.STATUS_DISTRIBUTED.equals(cldsService.getModel(randomNameModel).getStatus()));
 
-        responseEntity=cldsService.deployModel(randomNameModel, cldsService.getModel(randomNameModel));
+        responseEntity = cldsService.deployModel(randomNameModel, cldsService.getModel(randomNameModel));
         assertNotNull(responseEntity);
-        assertNotNull(responseEntity.getStatusCode());
-        model=(CldsModel)responseEntity.getBody();
-        assertNotNull(model);
+        assertTrue(responseEntity.getStatusCode().equals(HttpStatus.OK));
+        assertNotNull(responseEntity.getBody());
+        assertTrue(CldsModel.STATUS_ACTIVE.equals(((CldsModel) responseEntity.getBody()).getStatus()));
+        assertTrue(CldsModel.STATUS_ACTIVE.equals(cldsService.getModel(randomNameModel).getStatus()));
 
-        responseEntity=cldsService.unDeployModel(randomNameModel, cldsService.getModel(randomNameModel));
+        responseEntity = cldsService.unDeployModel(randomNameModel, cldsService.getModel(randomNameModel));
         assertNotNull(responseEntity);
-        assertNotNull(responseEntity.getStatusCode());
-        model=(CldsModel)responseEntity.getBody();
-        assertNotNull(model);
+        assertTrue(responseEntity.getStatusCode().equals(HttpStatus.OK));
+        assertNotNull(responseEntity.getBody());
+        assertTrue(CldsModel.STATUS_DISTRIBUTED.equals(((CldsModel) responseEntity.getBody()).getStatus()));
+        assertTrue(CldsModel.STATUS_DISTRIBUTED.equals(cldsService.getModel(randomNameModel).getStatus()));
+
+        DcaeEvent dcaeEvent = new DcaeEvent();
+        dcaeEvent.setArtifactName("ClosedLoop_with-enough-characters_TestArtifact.yml");
+        dcaeEvent.setEvent(DcaeEvent.EVENT_CREATED);
+        dcaeEvent.setResourceUUID("1");
+        dcaeEvent.setServiceUUID("2");
+        assertEquals(cldsService.postDcaeEvent("false", dcaeEvent),
+            "event=created serviceUUID=2 resourceUUID=1 artifactName=ClosedLoop_with-enough-characters_TestArtifact.yml instance count=0 isTest=false");
     }
 
     @Test
     public void testGetSdcProperties() throws IOException {
         JSONAssert.assertEquals(
-            ResourceFileUtil.getResourceAsString("example/sdc/expected-result/sdc-properties-global.json"), cldsService.getSdcProperties(),
-            true);
+            ResourceFileUtil.getResourceAsString("example/sdc/expected-result/sdc-properties-global.json"),
+            cldsService.getSdcProperties(), true);
     }
 
     @Test
     public void testGetSdcServices() throws GeneralSecurityException, DecoderException, JSONException, IOException {
         String result = cldsService.getSdcServices();
         JSONAssert.assertEquals(
-            ResourceFileUtil.getResourceAsString("example/sdc/expected-result/all-sdc-services.json"), result,
-            true);
+            ResourceFileUtil.getResourceAsString("example/sdc/expected-result/all-sdc-services.json"), result, true);
     }
 
     @Test
@@ -238,8 +255,8 @@ public class CldsServiceItCase {
         String result = cldsService.getSdcPropertiesByServiceUUIDForRefresh("4cc5b45a-1f63-4194-8100-cd8e14248c92",
             false);
         JSONAssert.assertEquals(
-            ResourceFileUtil.getResourceAsString("example/sdc/expected-result/sdc-properties-4cc5b45a.json"),
-            result, true);
+            ResourceFileUtil.getResourceAsString("example/sdc/expected-result/sdc-properties-4cc5b45a.json"), result,
+            true);
         // Now test the Cache effect
         CldsServiceData cldsServiceDataCache = cldsDao.getCldsServiceCache("c95b0e7c-c1f0-4287-9928-7964c5377a46");
         // Should not be there, so should be null
diff --git a/src/test/resources/example/model-properties/tca_new/doc-text.yaml b/src/test/resources/example/model-properties/tca_new/doc-text.yaml
new file mode 100644 (file)
index 0000000..947cfdb
--- /dev/null
@@ -0,0 +1,170 @@
+{"global":[{"name":"service","value":["tosca_definitions_version: cloudify_dsl_1_3
+imports:
+  - "http://www.getcloudify.org/spec/cloudify/3.4/types.yaml"
+  - https://nexus.onap.org/service/local/repositories/raw/content/org.onap.dcaegen2.platform.plugins/R2/dockerplugin/3.2.0/dockerplugin_types.yaml
+  - https://nexus.onap.org/service/local/repositories/raw/content/org.onap.dcaegen2.platform.plugins/R2/relationshipplugin/1.0.0/relationshipplugin_types.yaml
+  - https://nexus.onap.org/service/local/repositories/raw/content/org.onap.dcaegen2.platform.plugins/R2/dcaepolicyplugin/2.3.0/dcaepolicyplugin_types.yaml
+
+inputs:
+  dh_override:
+    type: string
+    default: "component_dockerhost"
+  dh_location_id:
+    type: string
+    default: "zone1"
+  aaiEnrichmentHost:
+    type: string
+    default: "none"
+  aaiEnrichmentPort:
+    type: string    
+    default: 8443
+  enableAAIEnrichment:
+    type: string
+    default: false
+  dmaap_host:
+    type: string
+    default: dmaap.onap-message-router   
+  dmaap_port:
+    type: string
+    default: 3904    
+  enableRedisCaching:
+    type: string
+    default: false    
+  redisHosts:
+    type: string      
+  tag_version:
+    type: string
+    default: "nexus3.onap.org:10001/onap//onap/org.onap.dcaegen2.deployments.tca-cdap-container:1.0.0"
+  consul_host:
+    type: string
+    default: consul-server.onap-consul
+  consul_port:
+    type: string
+    default: "8500"
+  cbs_host:
+    type: string
+    default: "config-binding-service.dcae"
+  cbs_port:
+    type: string
+    default: "10000"
+  policy_id:
+    type: string
+    default: "none"
+  external_port:
+    type: string
+    description: "Port for CDAPgui to be exposed"
+    default: "32010"
+
+node_templates:
+  docker_service_host:
+    properties:
+      docker_host_override:
+        get_input: dh_override
+      location_id:
+        get_input: dh_location_id
+    type: dcae.nodes.SelectedDockerHost
+  tca_docker:
+    relationships:
+       - type: dcae.relationships.component_contained_in
+         target: docker_service_host
+       - target: tca_policy
+         type: cloudify.relationships.depends_on        
+    type: dcae.nodes.DockerContainerForComponentsUsingDmaap
+    properties:
+        application_config:
+            app_config:
+                appDescription: DCAE Analytics Threshold Crossing Alert Application
+                appName: dcae-tca
+                tcaAlertsAbatementTableName: TCAAlertsAbatementTable
+                tcaAlertsAbatementTableTTLSeconds: '1728000'
+                tcaSubscriberOutputStreamName: TCASubscriberOutputStream
+                tcaVESAlertsTableName: TCAVESAlertsTable
+                tcaVESAlertsTableTTLSeconds: '1728000'
+                tcaVESMessageStatusTableName: TCAVESMessageStatusTable
+                tcaVESMessageStatusTableTTLSeconds: '86400'
+                thresholdCalculatorFlowletInstances: '2'
+            app_preferences:
+                aaiEnrichmentHost: 
+                    get_input: aaiEnrichmentHost
+                aaiEnrichmentIgnoreSSLCertificateErrors: 'true'
+                aaiEnrichmentPortNumber: '8443'
+                aaiEnrichmentProtocol: https
+                aaiEnrichmentUserName: DCAE
+                aaiEnrichmentUserPassword: DCAE
+                aaiVMEnrichmentAPIPath: /aai/v11/search/nodes-query
+                aaiVNFEnrichmentAPIPath: /aai/v11/network/generic-vnfs/generic-vnf
+                enableAAIEnrichment: 
+                    get_input: enableAAIEnrichment
+                enableRedisCaching: 
+                    get_input: enableRedisCaching
+                redisHosts: 
+                    get_input: redisHosts
+                enableAlertCEFFormat: 'false'
+                publisherContentType: application/json
+                publisherHostName: 
+                    get_input: dmaap_host
+                publisherHostPort: 
+                    get_input: dmaap_port                  
+                publisherMaxBatchSize: '1'
+                publisherMaxRecoveryQueueSize: '100000'
+                publisherPollingInterval: '20000'
+                publisherProtocol: http
+                publisherTopicName: unauthenticated.DCAE_CL_OUTPUT
+                subscriberConsumerGroup: OpenDCAE-c12
+                subscriberConsumerId: c12
+                subscriberContentType: application/json
+                subscriberHostName: 
+                    get_input: dmaap_host
+                subscriberHostPort:
+                    get_input: dmaap_port                                  
+                subscriberMessageLimit: '-1'
+                subscriberPollingInterval: '30000'
+                subscriberProtocol: http
+                subscriberTimeoutMS: '-1'
+                subscriberTopicName: unauthenticated.SEC_MEASUREMENT_OUTPUT
+                tca_policy_default: '{"domain":"measurementsForVfScaling","metricsPerEventName":[{"eventName":"vFirewallBroadcastPackets","controlLoopSchemaType":"VNF","policyScope":"DCAE","policyName":"DCAE.Config_tca-hi-lo","policyVersion":"v0.0.1","thresholds":[{"closedLoopControlName":"ControlLoop-vFirewall-d0a1dfc6-94f5-4fd4-a5b5-4630b438850a","version":"1.0.2","fieldPath":"$.event.measurementsForVfScalingFields.vNicUsageArray[*].receivedTotalPacketsDelta","thresholdValue":300,"direction":"LESS_OR_EQUAL","severity":"MAJOR","closedLoopEventStatus":"ONSET"},{"closedLoopControlName":"ControlLoop-vFirewall-d0a1dfc6-94f5-4fd4-a5b5-4630b438850a","version":"1.0.2","fieldPath":"$.event.measurementsForVfScalingFields.vNicUsageArray[*].receivedTotalPacketsDelta","thresholdValue":700,"direction":"GREATER_OR_EQUAL","severity":"CRITICAL","closedLoopEventStatus":"ONSET"}]},{"eventName":"vLoadBalancer","controlLoopSchemaType":"VM","policyScope":"DCAE","policyName":"DCAE.Config_tca-hi-lo","policyVersion":"v0.0.1","thresholds":[{"closedLoopControlName":"ControlLoop-vDNS-6f37f56d-a87d-4b85-b6a9-cc953cf779b3","version":"1.0.2","fieldPath":"$.event.measurementsForVfScalingFields.vNicUsageArray[*].receivedTotalPacketsDelta","thresholdValue":300,"direction":"GREATER_OR_EQUAL","severity":"CRITICAL","closedLoopEventStatus":"ONSET"}]},{"eventName":"Measurement_vGMUX","controlLoopSchemaType":"VNF","policyScope":"DCAE","policyName":"DCAE.Config_tca-hi-lo","policyVersion":"v0.0.1","thresholds":[{"closedLoopControlName":"ControlLoop-vCPE-48f0c2c3-a172-4192-9ae3-052274181b6e","version":"1.0.2","fieldPath":"$.event.measurementsForVfScalingFields.additionalMeasurements[*].arrayOfFields[0].value","thresholdValue":0,"direction":"EQUAL","severity":"MAJOR","closedLoopEventStatus":"ABATED"},{"closedLoopControlName":"ControlLoop-vCPE-48f0c2c3-a172-4192-9ae3-052274181b6e","version":"1.0.2","fieldPath":"$.event.measurementsForVfScalingFields.additionalMeasurements[*].arrayOfFields[0].value","thresholdValue":0,"direction":"GREATER","severity":"CRITICAL","closedLoopEventStatus":"ONSET"}]}]}'
+        service_component_type: dcaegen2-analytics_tca    
+        docker_config:
+            healthcheck:
+               endpoint: /healthcheck
+               interval: 15s
+               timeout: 1s
+               type: http
+        image:
+            get_input: tag_version        
+    interfaces:
+      cloudify.interfaces.lifecycle:
+        start:
+          inputs:
+            envs:
+                DMAAPHOST: 
+                    { get_input: dmaap_host }
+                DMAAPPORT:
+                    { get_input: dmaap_port }
+                DMAAPPUBTOPIC: "unauthenticated.DCAE_CL_OUTPUT"
+                DMAAPSUBTOPIC: "unauthenticated.SEC_MEASUREMENT_OUTPUT"
+                AAIHOST: 
+                    { get_input: aaiEnrichmentHost }
+                AAIPORT: 
+                    { get_input: aaiEnrichmentPort }
+                CONSUL_HOST: 
+                    { get_input: consul_host }
+                CONSUL_PORT: 
+                    { get_input: consul_port }
+                CBS_HOST: 
+                    { get_input: cbs_host }
+                CBS_PORT: 
+                    { get_input: cbs_port }
+                CONFIG_BINDING_SERVICE: "config_binding_service"                
+            ports:
+              - concat: ["11011:", { get_input: external_port }]        
+        stop:
+          inputs:
+            cleanup_image: true              
+  tca_policy:
+    type: dcae.nodes.policy
+    properties:
+      policy_id:
+           get_input: policy_id
+
+"]}]}
\ No newline at end of file
diff --git a/src/test/resources/example/model-properties/tca_new/model-properties.json b/src/test/resources/example/model-properties/tca_new/model-properties.json
new file mode 100644 (file)
index 0000000..c4299fa
--- /dev/null
@@ -0,0 +1,359 @@
+{
+       "global": [
+               {
+                       "name": "service",
+                       "value": [
+                               "4cc5b45a-1f63-4194-8100-cd8e14248c92"
+                       ]
+               },
+               {
+                       "name": "vf",
+                       "value": [
+                               "023a3f0d-1161-45ff-b4cf-8918a8ccf3ad"
+                       ]
+               },
+               {
+                       "name": "actionSet",
+                       "value": [
+                               "vnfRecipe"
+                       ]
+               },
+               {
+                       "name": "location",
+                       "value": [
+                               "DC1"
+                       ]
+               },
+               {
+                       "name": "deployParameters",
+                       "value": {
+                               "dh_override": "component_dockerhost",
+                               "dh_location_id": "zone1",
+                               "aaiEnrichmentHost": "none",
+                               "aaiEnrichmentPort": 8443,
+                               "enableAAIEnrichment": false,
+                               "dmaap_host": "dmaap.onap-message-router",
+                               "dmaap_port": 3904,
+                               "enableRedisCaching": false,
+                               "redisHosts": "",
+                               "tag_version": "nexus3.onap.org:10001/onap//onap/org.onap.dcaegen2.deployments.tca-cdap-container:1.0.0",
+                               "consul_host": "consul-server.onap-consul",
+                               "consul_port": "8500",
+                               "cbs_host": "config-binding-service.dcae",
+                               "cbs_port": "10000",
+                               "external_port": "32010",
+                               "policy_id": "AUTO_GENERATED_POLICY_ID_AT_SUBMIT"
+                       }
+               }
+       ],
+       "Policy_12lup3h": {
+               "policy1": [
+                       {
+                               "name": "pname",
+                               "value": "policy1"
+                       },
+                       {
+                               "name": "pid",
+                               "value": "0"
+                       },
+                       {
+                               "name": "timeout",
+                               "value": "345"
+                       },
+                       {
+                               "policyConfigurations": [
+                                       [
+                                               {
+                                                       "name": "recipe",
+                                                       "value": [
+                                                               "restart"
+                                                       ]
+                                               },
+                                               {
+                                                       "name": "maxRetries",
+                                                       "value": [
+                                                               "3"
+                                                       ]
+                                               },
+                                               {
+                                                       "name": "retryTimeLimit",
+                                                       "value": [
+                                                               "180"
+                                                       ]
+                                               },
+                                               {
+                                                       "name": "_id",
+                                                       "value": [
+                                                               "6TtHGPq"
+                                                       ]
+                                               },
+                                               {
+                                                       "name": "parentPolicy",
+                                                       "value": [
+                                                               ""
+                                                       ]
+                                               },
+                                               {
+                                                       "name": "actor",
+                                                       "value": [
+                                                               "APPC"
+                                                       ]
+                                               },
+                                               {
+                                                       "name": "recipeInput",
+                                                       "value": [
+                                                               ""
+                                                       ]
+                                               },
+                                               {
+                                                       "name": "recipeLevel",
+                                                       "value": [
+                                                               "VM"
+                                                       ]
+                                               },
+                                               {
+                                                       "name": "targetResourceId",
+                                                       "value": [
+                                                               "07e266fc-49ab-4cd7-8378-ca4676f1b9ec"
+                                                       ]
+                                               },
+                                               {
+                                                       "name": "targetResourceIdOther",
+                                                       "value": [
+                                                               ""
+                                                       ]
+                                               },
+                                               {
+                                                       "name": "enableGuardPolicy",
+                                                       "value": [
+                                                               "on"
+                                                       ]
+                                               },
+                                               {
+                                                       "name": "guardPolicyType",
+                                                       "value": [
+                                                               "FrequencyLimiter"
+                                                       ]
+                                               },
+                                               {
+                                                       "name": "guardTargets",
+                                                       "value": [
+                                                               ".*"
+                                                       ]
+                                               },
+                                               {
+                                                       "name": "minGuard",
+                                                       "value": [
+                                                               "1"
+                                                       ]
+                                               },
+                                               {
+                                                       "name": "maxGuard",
+                                                       "value": [
+                                                               "1"
+                                                       ]
+                                               },
+                                               {
+                                                       "name": "limitGuard",
+                                                       "value": [
+                                                               "1"
+                                                       ]
+                                               },
+                                               {
+                                                       "name": "timeUnitsGuard",
+                                                       "value": [
+                                                               "minute"
+                                                       ]
+                                               },
+                                               {
+                                                       "name": "timeWindowGuard",
+                                                       "value": [
+                                                               "10"
+                                                       ]
+                                               },
+                                               {
+                                                       "name": "guardActiveStart",
+                                                       "value": [
+                                                               "00:00:01-05:00"
+                                                       ]
+                                               },
+                                               {
+                                                       "name": "guardActiveEnd",
+                                                       "value": [
+                                                               "00:00:00-05:00"
+                                                       ]
+                                               }
+                                       ],
+                                       [
+                                               {
+                                                       "name": "recipe",
+                                                       "value": [
+                                                               "rebuild"
+                                                       ]
+                                               },
+                                               {
+                                                       "name": "maxRetries",
+                                                       "value": [
+                                                               "3"
+                                                       ]
+                                               },
+                                               {
+                                                       "name": "retryTimeLimit",
+                                                       "value": [
+                                                               "180"
+                                                       ]
+                                               },
+                                               {
+                                                       "name": "_id",
+                                                       "value": [
+                                                               "aulXWRT"
+                                                       ]
+                                               },
+                                               {
+                                                       "name": "parentPolicy",
+                                                       "value": [
+                                                               "6TtHGPq"
+                                                       ]
+                                               },
+                                               {
+                                                       "name": "parentPolicyConditions",
+                                                       "value": [
+                                                               "Failure"
+                                                       ]
+                                               },
+                                               {
+                                                       "name": "actor",
+                                                       "value": [
+                                                               "APPC"
+                                                       ]
+                                               },
+                                               {
+                                                       "name": "recipeInput",
+                                                       "value": [
+                                                               ""
+                                                       ]
+                                               },
+                                               {
+                                                       "name": "recipeLevel",
+                                                       "value": [
+                                                               "VM"
+                                                       ]
+                                               },
+                                               {
+                                                       "name": "targetResourceId",
+                                                       "value": [
+                                                               "07e266fc-49ab-4cd7-8378-ca4676f1b9ec"
+                                                       ]
+                                               },
+                                               {
+                                                       "name": "targetResourceIdOther",
+                                                       "value": [
+                                                               ""
+                                                       ]
+                                               },
+                                               {
+                                                       "name": "guardPolicyType",
+                                                       "value": [
+                                                               "MinMax"
+                                                       ]
+                                               },
+                                               {
+                                                       "name": "guardTargets",
+                                                       "value": [
+                                                               ".*"
+                                                       ]
+                                               },
+                                               {
+                                                       "name": "minGuard",
+                                                       "value": [
+                                                               "1"
+                                                       ]
+                                               },
+                                               {
+                                                       "name": "maxGuard",
+                                                       "value": [
+                                                               "1"
+                                                       ]
+                                               },
+                                               {
+                                                       "name": "limitGuard",
+                                                       "value": [
+                                                               "1"
+                                                       ]
+                                               },
+                                               {
+                                                       "name": "timeUnitsGuard",
+                                                       "value": [
+                                                               "minute"
+                                                       ]
+                                               },
+                                               {
+                                                       "name": "timeWindowGuard",
+                                                       "value": [
+                                                               "10"
+                                                       ]
+                                               },
+                                               {
+                                                       "name": "guardActiveStart",
+                                                       "value": [
+                                                               "00:00:01-05:00"
+                                                       ]
+                                               },
+                                               {
+                                                       "name": "guardActiveEnd",
+                                                       "value": [
+                                                               "00:00:00-05:00"
+                                                       ]
+                                               }
+                                       ]
+                               ]
+                       }
+               ]
+       },
+       "TCA_1d13unw": {
+               "tca1": [
+                       {
+                               "name": "tname",
+                               "value": "tca1"
+                       },
+                       {
+                               "name": "tuuid",
+                               "value": "7f14fe1f-68ac-t628-8fff-7f1de86f7038"
+                       },
+                       {
+                               "name": "tcaPol",
+                               "value": "policy1"
+                       },
+                       {
+                               "name": "eventName",
+                               "value": "vLoadBalancer"
+                       },
+                       {
+                               "name": "controlLoopSchemaType",
+                               "value": "VM"
+                       },
+                       {
+                               "name": "tcaPolId",
+                               "value": "0"
+                       },
+                       {
+                               "serviceConfigurations": [
+                                       [
+                                               "$.event.measurementsForVfScalingFields.additionalMeasurements[*].arrayOfFields[0].value",
+                                               "GREATER",
+                                               "10",
+                                               "ONSET",
+                                               "undefined"
+                                       ],
+                                       [
+                                               "$.event.measurementsForVfScalingFields.vNicUsageArray[*].receivedTotalPacketsDelta",
+                                               "GREATER_OR_EQUAL",
+                                               "20",
+                                               "ABATED",
+                                               "undefined"
+                                       ]
+                               ]
+                       }
+               ]
+       }
+}
\ No newline at end of file
diff --git a/src/test/resources/example/model-properties/tca_new/tca-img.xml b/src/test/resources/example/model-properties/tca_new/tca-img.xml
new file mode 100644 (file)
index 0000000..a2ec5af
--- /dev/null
@@ -0,0 +1,309 @@
+<?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="924" height="92" viewBox="44 134 924 92" version="1.1">
+               <defs>
+                               <marker viewBox="0 0 20 20" markerWidth="10" markerHeight="10"
+                                               orient="auto" refX="11" refY="10" id="markerSjdype4kmnw">
+                                               <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="markerSjdype4kmny">
+                                               <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="markerSjdype4kmo0">
+                                               <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="markerSjdype4kmo2">
+                                               <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="markerSjdype4kmo4">
+                                               <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="markerSjdype4kmo6">
+                                               <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="VesCollector_1g9cmz0"
+                                               transform="matrix(1,0,0,1,207,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="TCA_1d13unw"
+                                               transform="matrix(1,0,0,1,453,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_12lup3h"
+                                               transform="matrix(1,0,0,1,687,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 selected" data-element-id="EndEvent_16kg9fx"
+                                               transform="matrix(1,0,0,1,925,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 class=" djs-resizer djs-resizer-nw" transform="matrix(1,0,0,1,0,0)">
+                                                               <rect x="-7" y="-7" width="5" height="5" class=" djs-resizer-visual"></rect>
+                                                               <rect x="-7" y="-7" width="20" height="20" class=" djs-resizer-hit"></rect>
+                                               </g>
+                                               <g class=" djs-resizer djs-resizer-ne" transform="matrix(0,1,-1,0,36,0)">
+                                                               <rect x="-7" y="-7" width="5" height="5" class=" djs-resizer-visual"></rect>
+                                                               <rect x="-7" y="-7" width="20" height="20" class=" djs-resizer-hit"></rect>
+                                               </g>
+                                               <g class=" djs-resizer djs-resizer-se" transform="matrix(-1,0,0,-1,36,36)">
+                                                               <rect x="-7" y="-7" width="5" height="5" class=" djs-resizer-visual"></rect>
+                                                               <rect x="-7" y="-7" width="20" height="20" class=" djs-resizer-hit"></rect>
+                                               </g>
+                                               <g class=" djs-resizer djs-resizer-sw" transform="matrix(0,-1,1,0,0,36)">
+                                                               <rect x="-7" y="-7" width="5" height="5" class=" djs-resizer-visual"></rect>
+                                                               <rect x="-7" y="-7" width="20" height="20" class=" djs-resizer-hit"></rect>
+                                               </g>
+                               </g>
+               </g>
+               <g class="djs-group" xmlns="http://www.w3.org/2000/svg">
+                               <g class="djs-element djs-shape" data-element-id="EndEvent_16kg9fx_label"
+                                               transform="matrix(1,0,0,1,898,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_1ahk7jg"
+                                               style="display: block;">
+                                               <rect fill="none" class="djs-outline" x="80" y="174" width="133"
+                                                               height="12"></rect>
+                                               <g class="djs-visual">
+                                                               <path d="m  86,180L207,180 "
+                                                                               style="stroke-width: 2; stroke-linejoin: round; marker-end: url(&quot;#markerSjdype4kmnw&quot;);"
+                                                                               fill="none" stroke="#000000"></path>
+                                               </g>
+                                               <polyline points="86,180 207,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_1ahk7jg_label"
+                                               transform="matrix(1,0,0,1,101.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_18ahat1"
+                                               style="display: block;">
+                                               <rect fill="none" class="djs-outline" x="321" y="174" width="138"
+                                                               height="12"></rect>
+                                               <g class="djs-visual">
+                                                               <path d="m  327,180L453,180 "
+                                                                               style="stroke-width: 2; stroke-linejoin: round; marker-end: url(&quot;#markerSjdype4kmnw&quot;);"
+                                                                               fill="none" stroke="#000000"></path>
+                                               </g>
+                                               <polyline points="327,180 453,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_18ahat1_label"
+                                               transform="matrix(1,0,0,1,345,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_1mo9gxb"
+                                               style="display: block;">
+                                               <rect fill="none" class="djs-outline" x="567" y="174" width="126"
+                                                               height="12"></rect>
+                                               <g class="djs-visual">
+                                                               <path d="m  573,180L687,180 "
+                                                                               style="stroke-width: 2; stroke-linejoin: round; marker-end: url(&quot;#markerSjdype4kmnw&quot;);"
+                                                                               fill="none" stroke="#000000"></path>
+                                               </g>
+                                               <polyline points="573,180 687,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_1mo9gxb_label"
+                                               transform="matrix(1,0,0,1,585,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_1dgtrrq"
+                                               style="display: block;">
+                                               <rect fill="none" class="djs-outline" x="801" y="174" width="130"
+                                                               height="12"></rect>
+                                               <g class="djs-visual">
+                                                               <path d="m  807,180L925,180 "
+                                                                               style="stroke-width: 2; stroke-linejoin: round; marker-end: url(&quot;#markerSjdype4kmnw&quot;);"
+                                                                               fill="none" stroke="#000000"></path>
+                                               </g>
+                                               <polyline points="807,180 925,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_1dgtrrq_label"
+                                               transform="matrix(1,0,0,1,821,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
diff --git a/src/test/resources/example/model-properties/tca_new/tca-template.xml b/src/test/resources/example/model-properties/tca_new/tca-template.xml
new file mode 100644 (file)
index 0000000..cc942ef
--- /dev/null
@@ -0,0 +1,95 @@
+<?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_1ahk7jg</bpmn:outgoing>
+                               </bpmn:startEvent>
+                               <bpmn:vesCollector id="VesCollector_1g9cmz0">
+                                               <bpmn:incoming>SequenceFlow_1ahk7jg</bpmn:incoming>
+                                               <bpmn:outgoing>SequenceFlow_18ahat1</bpmn:outgoing>
+                               </bpmn:vesCollector>
+                               <bpmn:tCA id="TCA_1d13unw">
+                                               <bpmn:incoming>SequenceFlow_18ahat1</bpmn:incoming>
+                                               <bpmn:outgoing>SequenceFlow_1mo9gxb</bpmn:outgoing>
+                               </bpmn:tCA>
+                               <bpmn:policy id="Policy_12lup3h">
+                                               <bpmn:incoming>SequenceFlow_1mo9gxb</bpmn:incoming>
+                                               <bpmn:outgoing>SequenceFlow_1dgtrrq</bpmn:outgoing>
+                               </bpmn:policy>
+                               <bpmn:endEvent id="EndEvent_16kg9fx">
+                                               <bpmn:incoming>SequenceFlow_1dgtrrq</bpmn:incoming>
+                               </bpmn:endEvent>
+                               <bpmn:sequenceFlow id="SequenceFlow_1ahk7jg"
+                                               sourceRef="StartEvent_1" targetRef="VesCollector_1g9cmz0" />
+                               <bpmn:sequenceFlow id="SequenceFlow_18ahat1"
+                                               sourceRef="VesCollector_1g9cmz0" targetRef="TCA_1d13unw" />
+                               <bpmn:sequenceFlow id="SequenceFlow_1mo9gxb"
+                                               sourceRef="TCA_1d13unw" targetRef="Policy_12lup3h" />
+                               <bpmn:sequenceFlow id="SequenceFlow_1dgtrrq"
+                                               sourceRef="Policy_12lup3h" targetRef="EndEvent_16kg9fx" />
+               </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="VesCollector_1g9cmz0_di"
+                                                               bpmnElement="VesCollector_1g9cmz0">
+                                                               <dc:Bounds x="207" y="140" width="120" height="80" />
+                                               </bpmndi:BPMNShape>
+                                               <bpmndi:BPMNShape id="TCA_1d13unw_di"
+                                                               bpmnElement="TCA_1d13unw">
+                                                               <dc:Bounds x="453" y="140" width="120" height="80" />
+                                               </bpmndi:BPMNShape>
+                                               <bpmndi:BPMNShape id="Policy_12lup3h_di"
+                                                               bpmnElement="Policy_12lup3h">
+                                                               <dc:Bounds x="687" y="140" width="120" height="80" />
+                                               </bpmndi:BPMNShape>
+                                               <bpmndi:BPMNShape id="EndEvent_16kg9fx_di"
+                                                               bpmnElement="EndEvent_16kg9fx">
+                                                               <dc:Bounds x="925" y="162" width="36" height="36" />
+                                                               <bpmndi:BPMNLabel>
+                                                                               <dc:Bounds x="898" y="198" width="90" height="20" />
+                                                               </bpmndi:BPMNLabel>
+                                               </bpmndi:BPMNShape>
+                                               <bpmndi:BPMNEdge id="SequenceFlow_1ahk7jg_di"
+                                                               bpmnElement="SequenceFlow_1ahk7jg">
+                                                               <di:waypoint xsi:type="dc:Point" x="86" y="180" />
+                                                               <di:waypoint xsi:type="dc:Point" x="207" y="180" />
+                                                               <bpmndi:BPMNLabel>
+                                                                               <dc:Bounds x="101.5" y="170" width="90" height="20" />
+                                                               </bpmndi:BPMNLabel>
+                                               </bpmndi:BPMNEdge>
+                                               <bpmndi:BPMNEdge id="SequenceFlow_18ahat1_di"
+                                                               bpmnElement="SequenceFlow_18ahat1">
+                                                               <di:waypoint xsi:type="dc:Point" x="327" y="180" />
+                                                               <di:waypoint xsi:type="dc:Point" x="453" y="180" />
+                                                               <bpmndi:BPMNLabel>
+                                                                               <dc:Bounds x="345" y="170" width="90" height="20" />
+                                                               </bpmndi:BPMNLabel>
+                                               </bpmndi:BPMNEdge>
+                                               <bpmndi:BPMNEdge id="SequenceFlow_1mo9gxb_di"
+                                                               bpmnElement="SequenceFlow_1mo9gxb">
+                                                               <di:waypoint xsi:type="dc:Point" x="573" y="180" />
+                                                               <di:waypoint xsi:type="dc:Point" x="687" y="180" />
+                                                               <bpmndi:BPMNLabel>
+                                                                               <dc:Bounds x="585" y="170" width="90" height="20" />
+                                                               </bpmndi:BPMNLabel>
+                                               </bpmndi:BPMNEdge>
+                                               <bpmndi:BPMNEdge id="SequenceFlow_1dgtrrq_di"
+                                                               bpmnElement="SequenceFlow_1dgtrrq">
+                                                               <di:waypoint xsi:type="dc:Point" x="807" y="180" />
+                                                               <di:waypoint xsi:type="dc:Point" x="925" y="180" />
+                                                               <bpmndi:BPMNLabel>
+                                                                               <dc:Bounds x="821" y="170" width="90" height="20" />
+                                                               </bpmndi:BPMNLabel>
+                                               </bpmndi:BPMNEdge>
+                               </bpmndi:BPMNPlane>
+               </bpmndi:BPMNDiagram>
+
+</bpmn:definitions>
\ No newline at end of file