From d2f6cbc6a00034c4d08fdbb7dd73cc681d89d3ab Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Sun, 27 Jun 2021 21:20:21 +0200 Subject: [PATCH] Retrofit YangNetconfError into Unique*Exception 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 --- .../tree/UniqueConstraintException.java | 25 ++++++++++++++++--- .../tree/UniqueValidationFailedException.java | 21 +++++++++++++++- 2 files changed, 42 insertions(+), 4 deletions(-) diff --git a/data/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/tree/UniqueConstraintException.java b/data/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/tree/UniqueConstraintException.java index 48cbe7c058..bd7d9f583b 100644 --- a/data/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/tree/UniqueConstraintException.java +++ b/data/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/schema/tree/UniqueConstraintException.java @@ -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 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 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 values() { return Collections.unmodifiableMap(values); } + + @Override + public List 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()); + } } diff --git a/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/UniqueValidationFailedException.java b/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/UniqueValidationFailedException.java index 79e41a9265..3a034ff311 100644 --- a/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/UniqueValidationFailedException.java +++ b/data/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/UniqueValidationFailedException.java @@ -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 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()); + } } -- 2.36.6