Merge "Add json schema for events"
diff --git a/cps-dependencies/pom.xml b/cps-dependencies/pom.xml
index 16a6532..afe4de0 100755
--- a/cps-dependencies/pom.xml
+++ b/cps-dependencies/pom.xml
@@ -45,8 +45,8 @@
         <spock-core.version>2.0-M5-groovy-3.0</spock-core.version>
         <spock-spring.version>2.0-M5-groovy-3.0</spock-spring.version>
         <spotbugs.version>4.2.0</spotbugs.version>
-        <springboot.version>2.3.8.RELEASE</springboot.version>
-        <springboot.cloud.version>Hoxton.SR9</springboot.cloud.version>
+        <springboot.version>2.5.0</springboot.version>
+        <springboot.cloud.version>2020.0.2</springboot.cloud.version>
         <springfox.version>3.0.0</springfox.version>
         <swagger.version>2.1.4</swagger.version>
         <testcontainers.version>1.15.1</testcontainers.version>
diff --git a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServiceImpl.java b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServiceImpl.java
index bdb71bf..5aadb3f 100755
--- a/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServiceImpl.java
+++ b/cps-ncmp-service/src/main/java/org/onap/cps/ncmp/api/impl/NetworkCmProxyDataServiceImpl.java
@@ -60,7 +60,7 @@
 
     @Override
     public void createDataNode(final String cmHandle, final String parentNodeXpath, final String jsonData) {
-        if (StringUtils.isEmpty(parentNodeXpath) || "/".equals(parentNodeXpath)) {
+        if (!StringUtils.hasText(parentNodeXpath) || "/".equals(parentNodeXpath)) {
             cpsDataService.saveData(getDataspaceName(), cmHandle, jsonData);
         } else {
             cpsDataService.saveData(getDataspaceName(), cmHandle, parentNodeXpath, jsonData);
diff --git a/cps-parent/pom.xml b/cps-parent/pom.xml
index 18addd7..78a89f0 100755
--- a/cps-parent/pom.xml
+++ b/cps-parent/pom.xml
@@ -62,8 +62,12 @@
             ../cps-service/target/site/jacoco-aggregate/jacoco.xml,
             ../cps-rest/target/site/jacoco-ut/jacoco.xml,
             ../cps-rest/target/site/jacoco-aggregate/jacoco.xml,
+            ../cps-ncmp-service/target/site/jacoco-ut/jacoco.xml,
+            ../cps-ncmp-service/target/site/jacoco-aggregate/jacoco.xml,
             ../cps-ncmp-rest/target/site/jacoco-ut/jacoco.xml,
             ../cps-ncmp-rest/target/site/jacoco-aggregate/jacoco.xml,
+            ../cps-path-parser/target/site/jacoco-ut/jacoco.xml,
+            ../cps-path-parser/target/site/jacoco-aggregate/jacoco.xml,
             ../cps-application/target/site/jacoco-ut/jacoco.xml,
             ../cps-application/target/site/jacoco-aggregate/jacoco.xml
         </sonar.coverage.jacoco.xmlReportPaths>
diff --git a/cps-path-parser/src/main/antlr4/org/onap/cps/cpspath/parser/antlr4/CpsPath.g4 b/cps-path-parser/src/main/antlr4/org/onap/cps/cpspath/parser/antlr4/CpsPath.g4
index 8609545..a4fd58e 100644
--- a/cps-path-parser/src/main/antlr4/org/onap/cps/cpspath/parser/antlr4/CpsPath.g4
+++ b/cps-path-parser/src/main/antlr4/org/onap/cps/cpspath/parser/antlr4/CpsPath.g4
@@ -25,7 +25,7 @@
 
 ancestorPath: yangElement (SLASH yangElement)* ;
 
-cpsPathWithSingleLeafCondition: prefix singleValueCondition ;
+cpsPathWithSingleLeafCondition: prefix singleValueCondition postfix? ;
 
 /*
 No need to ditinguish between cpsPathWithDescendant | cpsPathWithDescendantAndLeafConditions really!
@@ -40,6 +40,8 @@
 
 prefix: (SLASH yangElement)* SLASH containerName ;
 
+postfix: (SLASH yangElement)+ ;
+
 yangElement: containerName listElementRef? ;
 
 containerName: QName ;
diff --git a/cps-path-parser/src/main/java/org/onap/cps/cpspath/parser/CpsPathBuilder.java b/cps-path-parser/src/main/java/org/onap/cps/cpspath/parser/CpsPathBuilder.java
index 83e076d..afe01f6 100644
--- a/cps-path-parser/src/main/java/org/onap/cps/cpspath/parser/CpsPathBuilder.java
+++ b/cps-path-parser/src/main/java/org/onap/cps/cpspath/parser/CpsPathBuilder.java
@@ -1,4 +1,3 @@
-package org.onap.cps.cpspath.parser;
 /*
  *  ============LICENSE_START=======================================================
  *  Copyright (C) 2021 Nordix Foundation
@@ -18,6 +17,8 @@
  *  ============LICENSE_END=========================================================
  */
 
+package org.onap.cps.cpspath.parser;
+
 import java.util.HashMap;
 import java.util.Map;
 import org.onap.cps.cpspath.parser.antlr4.CpsPathBaseListener;
@@ -27,6 +28,7 @@
 import org.onap.cps.cpspath.parser.antlr4.CpsPathParser.CpsPathWithSingleLeafConditionContext;
 import org.onap.cps.cpspath.parser.antlr4.CpsPathParser.LeafConditionContext;
 import org.onap.cps.cpspath.parser.antlr4.CpsPathParser.MultipleValueConditionsContext;
+import org.onap.cps.cpspath.parser.antlr4.CpsPathParser.PostfixContext;
 import org.onap.cps.cpspath.parser.antlr4.CpsPathParser.PrefixContext;
 import org.onap.cps.cpspath.parser.antlr4.CpsPathParser.SingleValueConditionContext;
 
@@ -42,6 +44,11 @@
     }
 
     @Override
+    public void exitPostfix(final PostfixContext ctx) {
+        throw new IllegalStateException(String.format("Unsupported postfix %s encountered in CpsPath.", ctx.getText()));
+    }
+
+    @Override
     public void exitLeafCondition(final LeafConditionContext ctx) {
         Object comparisonValue = null;
         if (ctx.IntegerLiteral() != null) {
diff --git a/cps-path-parser/src/main/java/org/onap/cps/cpspath/parser/CpsPathQuery.java b/cps-path-parser/src/main/java/org/onap/cps/cpspath/parser/CpsPathQuery.java
index 32fe0cb..1774e03 100644
--- a/cps-path-parser/src/main/java/org/onap/cps/cpspath/parser/CpsPathQuery.java
+++ b/cps-path-parser/src/main/java/org/onap/cps/cpspath/parser/CpsPathQuery.java
@@ -19,7 +19,6 @@
 
 package org.onap.cps.cpspath.parser;
 
-
 import java.util.Map;
 import lombok.AccessLevel;
 import lombok.Getter;
diff --git a/cps-path-parser/src/test/groovy/org/onap/cps/cpspath/parser/CpsPathQuerySpec.groovy b/cps-path-parser/src/test/groovy/org/onap/cps/cpspath/parser/CpsPathQuerySpec.groovy
index 0e7fc35..116c916 100644
--- a/cps-path-parser/src/test/groovy/org/onap/cps/cpspath/parser/CpsPathQuerySpec.groovy
+++ b/cps-path-parser/src/test/groovy/org/onap/cps/cpspath/parser/CpsPathQuerySpec.groovy
@@ -84,6 +84,7 @@
             'end with descendant and more than one attribute separated by "or"' | '//child[@int-leaf=5 or @leaf-name="leaf value"]'
             'missing attribute value'                                           | '//child[@int-leaf=5 and @name]'
             'incomplete ancestor value'                                         | '//books/ancestor::'
+            'unsupported postfix after single value condition (JIRA CPS-450)'   | '/parent/child[@id=1]/somePostFix'
     }
 
     def 'Parse cps path using ancestor by schema node identifier with a #scenario.'() {