Retrofit YangNetconfError into Unique*Exception 88/96688/8
authorRobert Varga <robert.varga@pantheon.tech>
Sun, 27 Jun 2021 19:20:21 +0000 (21:20 +0200)
committerRobert Varga <robert.varga@pantheon.tech>
Wed, 18 Aug 2021 22:35:48 +0000 (00:35 +0200)
Add a basic bridge to YangNetconfError. This allows NETCONF WG
protocols, like NETCONF and RESTCONF, to report unified complete
information about failure causes.

JIRA: YANGTOOLS-1306
Change-Id: Id8134275fe1b304db88466ad2c6733a48871503e
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
data/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/tree/UniqueConstraintException.java
data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/UniqueValidationFailedException.java

index 48cbe7c058fe97bcd4d7c30e293b825a40a42f20..bd7d9f583bb1aaf02bdfd0f2ece1123ca11e9cad 100644 (file)
@@ -12,10 +12,16 @@ import static java.util.Objects.requireNonNull;
 import com.google.common.annotations.Beta;
 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import java.util.Collections;
+import java.util.List;
 import java.util.Map;
-import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.eclipse.jdt.annotation.Nullable;
+import org.opendaylight.yangtools.yang.common.ErrorSeverity;
+import org.opendaylight.yangtools.yang.common.ErrorTag;
+import org.opendaylight.yangtools.yang.common.ErrorType;
+import org.opendaylight.yangtools.yang.data.api.ImmutableYangNetconfError;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.YangNetconfError;
+import org.opendaylight.yangtools.yang.data.api.YangNetconfErrorAware;
 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Descendant;
 
 /**
@@ -24,21 +30,34 @@ import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Desce
  * @author Robert Varga
  */
 @Beta
-@NonNullByDefault
-public class UniqueConstraintException extends DataValidationFailedException {
+public class UniqueConstraintException extends DataValidationFailedException implements YangNetconfErrorAware {
     private static final long serialVersionUID = 1L;
 
     // Note: this cannot be an ImmutableMap because we must support null values
     @SuppressFBWarnings(value = "SE_BAD_FIELD", justification = "Best effort on serialization")
     private final Map<Descendant, @Nullable Object> values;
 
+    // FIXME: 8.0.0: this maps to a list of 'non-unique' YangInstanceIdentifiers, really. we should be getting
+    //               a list of YangErrorInfo containing them -- but what about Serializability then?
     public UniqueConstraintException(final YangInstanceIdentifier path, final Map<Descendant, @Nullable Object> values,
             final String message) {
         super(path, message);
         this.values = requireNonNull(values);
     }
 
+    // FIXME: 8.0.0: this should be completely nonnull, there is no point in reporting missing values
     public final Map<Descendant, @Nullable Object> values() {
         return Collections.unmodifiableMap(values);
     }
+
+    @Override
+    public List<YangNetconfError> getNetconfErrors() {
+        return List.of(ImmutableYangNetconfError.builder()
+            .severity(ErrorSeverity.ERROR)
+            .type(ErrorType.APPLICATION)
+            .tag(ErrorTag.OPERATION_FAILED)
+            .appTag("data-not-unique")
+            // FIXME: 8.0.0: and then we need to append YangErrorInfo here
+            .build());
+    }
 }
index 79e41a926579e42c3d80d9d0aa167101c55f21c6..3a034ff311c0cafd44766413fb61a88307c2e56d 100644 (file)
@@ -7,15 +7,34 @@
  */
 package org.opendaylight.yangtools.yang.data.impl.schema.tree;
 
+import java.util.List;
+import org.opendaylight.yangtools.yang.common.ErrorSeverity;
+import org.opendaylight.yangtools.yang.common.ErrorTag;
+import org.opendaylight.yangtools.yang.common.ErrorType;
+import org.opendaylight.yangtools.yang.data.api.ImmutableYangNetconfError;
+import org.opendaylight.yangtools.yang.data.api.YangNetconfError;
+import org.opendaylight.yangtools.yang.data.api.YangNetconfErrorAware;
 import org.opendaylight.yangtools.yang.data.api.schema.tree.UniqueConstraintException;
 
 /**
  * Exception thrown when unique constraints would be violated and we cannot throw a {@link UniqueConstraintException}.
  */
-final class UniqueValidationFailedException extends SchemaValidationFailedException {
+final class UniqueValidationFailedException extends SchemaValidationFailedException implements YangNetconfErrorAware {
     private static final long serialVersionUID = 1L;
 
     UniqueValidationFailedException(final String message) {
         super(message);
     }
+
+    @Override
+    public List<YangNetconfError> getNetconfErrors() {
+        return List.of(ImmutableYangNetconfError.builder()
+            .severity(ErrorSeverity.ERROR)
+            .type(ErrorType.APPLICATION)
+            .tag(ErrorTag.OPERATION_FAILED)
+            .appTag("data-not-unique")
+            // FIXME: 8.0.0: we are missing path information which should be filled in here. Constructor call site needs
+            //               to provide that.
+            .build());
+    }
 }