Updating exception and explanation for update node leaves 37/122037/2
authorniamhcore <niamh.core@est.tech>
Thu, 17 Jun 2021 14:27:55 +0000 (15:27 +0100)
committerniamhcore <niamh.core@est.tech>
Fri, 18 Jun 2021 14:14:12 +0000 (15:14 +0100)
Issue-ID: CPS-464 & CPS-465
Signed-off-by: niamhcore <niamh.core@est.tech>
Change-Id: I1880ceee66d89c49d039011163fa74bb7da19f25

cps-service/src/main/java/org/onap/cps/spi/model/DataNodeBuilder.java
cps-service/src/main/java/org/onap/cps/utils/YangUtils.java
cps-service/src/test/groovy/org/onap/cps/api/impl/CpsDataServiceImplSpec.groovy

index 762e61a..4a9957d 100644 (file)
@@ -29,6 +29,7 @@ import java.util.Map;
 import java.util.Set;
 import java.util.stream.Collectors;
 import lombok.extern.slf4j.Slf4j;
+import org.onap.cps.spi.exceptions.DataValidationException;
 import org.onap.cps.utils.YangUtils;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild;
@@ -142,6 +143,10 @@ public class DataNodeBuilder {
 
     private DataNode buildFromNormalizedNodeTree() {
         final Collection<DataNode> dataNodeCollection = buildCollectionFromNormalizedNodeTree();
+        if (!dataNodeCollection.iterator().hasNext()) {
+            throw new DataValidationException(
+                "Unsupported xpath: ", "Unsupported xpath as it is referring to one element");
+        }
         return dataNodeCollection.iterator().next();
     }
 
index 0b66d37..b5c14a0 100644 (file)
@@ -94,9 +94,13 @@ public class YangUtils {
             final var jsonReader = new JsonReader(new StringReader(jsonData));
             jsonParserStream.parse(jsonReader);
 
-        } catch (final IOException | IllegalStateException | JsonSyntaxException exception) {
+        } catch (final IOException | JsonSyntaxException exception) {
             throw new DataValidationException(
-                    "Failed to parse json data: " + jsonData,  exception.getMessage(), exception);
+                "Failed to parse json data: " + jsonData, exception.getMessage(), exception);
+        } catch (final IllegalStateException illegalStateException) {
+            throw new DataValidationException(
+                "Failed to parse json data. Unsupported xpath or json data:" + jsonData, illegalStateException
+                .getMessage(), illegalStateException);
         }
         return normalizedNodeResult.getResult();
     }
index 27a5a4e..8001d6a 100644 (file)
@@ -125,6 +125,19 @@ class CpsDataServiceImplSpec extends Specification {
             'level 2 node'   | '/test-tree'    | '{"branch": [{"name":"Name"}]}' || '/test-tree/branch[@name=\'Name\']' | ['name': 'Name']
     }
 
+    def 'Update list-element data node with : #scenario.'() {
+        given: 'schema set for given anchor and dataspace references bookstore model'
+            setupSchemaSetMocks('bookstore.yang')
+        when: 'update data method is invoked with json data #jsonData and parent node xpath'
+            objectUnderTest.updateNodeLeaves(dataspaceName, anchorName, '/bookstore/categories[@code=2]', jsonData)
+        then: 'the persistence service method is invoked with correct parameters'
+            thrown(DataValidationException)
+        where: 'following parameters were used'
+            scenario          | jsonData
+            'multiple leaves' | '{"code": "01","name": "some-name"}'
+            'one leaf'        | '{"name": "some-name"}'
+    }
+
     def 'Replace data node: #scenario.'() {
         given: 'schema set for given anchor and dataspace references test-tree model'
             setupSchemaSetMocks('test-tree.yang')