Add DataNodeDoesNotExist Exception

Issue-ID: CPS-182
Signed-off-by: niamhcore <niamh.core@est.tech>
Change-Id: I05fdd0fbc207e4806c187b96d35d7b6c54b795ea
diff --git a/cps-ri/src/main/java/org/onap/cps/spi/repository/FragmentRepository.java b/cps-ri/src/main/java/org/onap/cps/spi/repository/FragmentRepository.java
index 6fc956c..bf55172 100755
--- a/cps-ri/src/main/java/org/onap/cps/spi/repository/FragmentRepository.java
+++ b/cps-ri/src/main/java/org/onap/cps/spi/repository/FragmentRepository.java
@@ -28,7 +28,7 @@
 import org.onap.cps.spi.entities.AnchorEntity;

 import org.onap.cps.spi.entities.DataspaceEntity;

 import org.onap.cps.spi.entities.FragmentEntity;

-import org.onap.cps.spi.exceptions.NotFoundInDataspaceException;

+import org.onap.cps.spi.exceptions.DataNodeNotFoundException;

 import org.springframework.data.jpa.repository.JpaRepository;

 import org.springframework.data.jpa.repository.Modifying;

 import org.springframework.data.jpa.repository.Query;

@@ -44,7 +44,7 @@
     default FragmentEntity getByDataspaceAndAnchorAndXpath(@NonNull DataspaceEntity dataspaceEntity,

         @NonNull AnchorEntity anchorEntity, @NonNull String xpath) {

         return findByDataspaceAndAnchorAndXpath(dataspaceEntity, anchorEntity, xpath)

-            .orElseThrow(() -> new NotFoundInDataspaceException(dataspaceEntity.getName(), xpath));

+            .orElseThrow(() -> new DataNodeNotFoundException(dataspaceEntity.getName(), anchorEntity.getName(), xpath));

     }

 

     @Modifying

diff --git a/cps-ri/src/test/java/org/onap/cps/spi/impl/CpsDataPersistenceServiceTest.java b/cps-ri/src/test/java/org/onap/cps/spi/impl/CpsDataPersistenceServiceTest.java
index de0942c..4501e5f 100644
--- a/cps-ri/src/test/java/org/onap/cps/spi/impl/CpsDataPersistenceServiceTest.java
+++ b/cps-ri/src/test/java/org/onap/cps/spi/impl/CpsDataPersistenceServiceTest.java
@@ -32,8 +32,8 @@
 import org.onap.cps.spi.CpsDataPersistenceService;
 import org.onap.cps.spi.entities.FragmentEntity;
 import org.onap.cps.spi.exceptions.AnchorNotFoundException;
+import org.onap.cps.spi.exceptions.DataNodeNotFoundException;
 import org.onap.cps.spi.exceptions.DataspaceNotFoundException;
-import org.onap.cps.spi.exceptions.NotFoundInDataspaceException;
 import org.onap.cps.spi.model.DataNode;
 import org.onap.cps.spi.repository.FragmentRepository;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -159,7 +159,7 @@
             .addChildDataNode(DATASPACE_NAME, ANCHOR_NAME1, PARENT_XPATH1, createDataNodeTree(CHILD_XPATH1));
     }
 
-    @Test(expected = NotFoundInDataspaceException.class)
+    @Test(expected = DataNodeNotFoundException.class)
     @Sql({CLEAR_DATA, SET_DATA})
     public void testAddAChildWithToAParentThatDoesNotExist() {
         cpsDataPersistenceService
diff --git a/cps-service/src/main/java/org/onap/cps/spi/exceptions/DataNodeNotFoundException.java b/cps-service/src/main/java/org/onap/cps/spi/exceptions/DataNodeNotFoundException.java
new file mode 100644
index 0000000..125b93d
--- /dev/null
+++ b/cps-service/src/main/java/org/onap/cps/spi/exceptions/DataNodeNotFoundException.java
@@ -0,0 +1,42 @@
+/*
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 Nordix Foundation
+ *  ================================================================================
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ *  SPDX-License-Identifier: Apache-2.0
+ *  ============LICENSE_END=========================================================
+ */
+
+package org.onap.cps.spi.exceptions;
+
+/**
+ * DataNode Not Found Exception. Indicates the requested data being absent.
+ */
+@SuppressWarnings("squid:S110")  // Team agreed to accept 6 levels of inheritance for CPS Exceptions
+public class DataNodeNotFoundException extends DataValidationException {
+
+    private static final long serialVersionUID = 7786740001662205407L;
+
+    /**
+     * Constructor.
+     *
+     * @param dataspaceName the name of the dataspace
+     * @param anchorName    the anchor name
+     * @param xpath         datanode xpath
+     */
+    public DataNodeNotFoundException(final String dataspaceName, final String anchorName, final String xpath) {
+        super("DataNode not found", String
+            .format("DataNode with xpath %s was not found for anchor %s and dataspace %s.", xpath,
+                anchorName, dataspaceName));
+    }
+}
diff --git a/cps-service/src/main/java/org/onap/cps/spi/exceptions/DataValidationException.java b/cps-service/src/main/java/org/onap/cps/spi/exceptions/DataValidationException.java
index e6af607..57fc045 100644
--- a/cps-service/src/main/java/org/onap/cps/spi/exceptions/DataValidationException.java
+++ b/cps-service/src/main/java/org/onap/cps/spi/exceptions/DataValidationException.java
@@ -29,6 +29,16 @@
      *
      * @param message the error message
      * @param details the error details
+     */
+    public DataValidationException(final String message, final String details) {
+        super(message, details);
+    }
+
+    /**
+     * Constructor.
+     *
+     * @param message the error message
+     * @param details the error details
      * @param cause   the error cause
      */
     public DataValidationException(final String message, final String details, final Throwable cause) {
diff --git a/cps-service/src/test/groovy/org/onap/cps/spi/exceptions/CpsExceptionsSpec.groovy b/cps-service/src/test/groovy/org/onap/cps/spi/exceptions/CpsExceptionsSpec.groovy
index 914a395..500b801 100755
--- a/cps-service/src/test/groovy/org/onap/cps/spi/exceptions/CpsExceptionsSpec.groovy
+++ b/cps-service/src/test/groovy/org/onap/cps/spi/exceptions/CpsExceptionsSpec.groovy
@@ -27,6 +27,7 @@
     def rootCause = new Throwable()
     def providedMessage = 'some message'
     def providedDetails = 'some details'
+    def xpath = 'some xpath'
 
     def 'Creating an exception that the Anchor already exist.'() {
         given: 'an exception dat the Anchor already exist is created'
@@ -52,7 +53,7 @@
                     == "Dataspace with name ${dataspaceName} does not exist."
     }
 
-    def 'Creating a data validation exception.'() {
+    def 'Creating a data validation exception with root cause.'() {
         given: 'a data validation exception is created'
             def exception = new DataValidationException(providedMessage, providedDetails, rootCause)
         expect: 'the exception has the provided message'
@@ -63,6 +64,15 @@
             exception.cause == rootCause
     }
 
+    def 'Creating a data validation exception.'() {
+        given: 'a data validation exception is created'
+            def exception = new DataValidationException(providedMessage, providedDetails)
+        expect: 'the exception has the provided message'
+            exception.message == providedMessage
+        and: 'the exception has the provided details'
+            exception.details == providedDetails
+    }
+
     def 'Creating a model validation exception.'() {
         given: 'a data validation exception is created'
             def exception = new ModelValidationException(providedMessage, providedDetails)
@@ -117,4 +127,10 @@
                     == ("Schema Set with name ${schemaSetName} in dataspace ${dataspaceName} is having "
                     + "Anchor records associated.")
     }
+
+    def 'Creating a exception that a datanode does not exist.'() {
+        expect: 'the exception details contains the correct message with dataspace name and xpath.'
+            (new DataNodeNotFoundException(dataspaceName, anchorName, xpath)).details
+                    == "DataNode with xpath ${xpath} was not found for anchor ${anchorName} and dataspace ${dataspaceName}."
+    }
 }
\ No newline at end of file