From ba3080a178abe5f76b45fa88f442990c62ca5d43 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Fri, 20 Nov 2020 21:05:16 +0100 Subject: [PATCH] Report a dedicated exception on unique failure Rather than using plain IllegalArgumentException, report a dedicated exception derived from SchemaValidationFailedException. Also refactor UniqueValidation a bit. Change-Id: If24d97aebab516a461f673c169fa41f9447e0413 Signed-off-by: Robert Varga --- .../tree/SchemaValidationFailedException.java | 3 --- .../impl/schema/tree/UniqueValidation.java | 20 ++++++++++++------ .../tree/UniqueValidationFailedException.java | 21 +++++++++++++++++++ .../schema/tree/UniqueConstraintTest.java | 3 ++- 4 files changed, 37 insertions(+), 10 deletions(-) create mode 100644 yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/UniqueValidationFailedException.java diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/SchemaValidationFailedException.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/SchemaValidationFailedException.java index a1804d07f1..b1356bf29c 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/SchemaValidationFailedException.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/SchemaValidationFailedException.java @@ -5,7 +5,6 @@ * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ - package org.opendaylight.yangtools.yang.data.impl.schema.tree; /** @@ -13,7 +12,6 @@ package org.opendaylight.yangtools.yang.data.impl.schema.tree; * does not match the schema context. */ public class SchemaValidationFailedException extends IllegalArgumentException { - private static final long serialVersionUID = 1L; public SchemaValidationFailedException(final String message) { @@ -23,5 +21,4 @@ public class SchemaValidationFailedException extends IllegalArgumentException { public SchemaValidationFailedException(final String message, final Throwable cause) { super(message, cause); } - } diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/UniqueValidation.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/UniqueValidation.java index b308a194b5..6aab3ab4d8 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/UniqueValidation.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/UniqueValidation.java @@ -9,6 +9,7 @@ package org.opendaylight.yangtools.yang.data.impl.schema.tree; import static com.google.common.base.Preconditions.checkState; import static com.google.common.base.Verify.verify; +import static java.util.Objects.requireNonNull; import com.google.common.base.MoreObjects.ToStringHelper; import com.google.common.base.Stopwatch; @@ -47,33 +48,40 @@ final class UniqueValidation extends AbstractValidation { private final @NonNull ImmutableList> validators; - private UniqueValidation(final ModificationApplyOperation delegate, final List> validators) { + private UniqueValidation(final ModificationApplyOperation delegate, + final ImmutableList> validators) { super(delegate); - this.validators = ImmutableList.copyOf(validators); + this.validators = requireNonNull(validators); } static ModificationApplyOperation of(final ListSchemaNode schema, final DataTreeConfiguration treeConfig, final ModificationApplyOperation delegate) { + final ImmutableList> validators = validatorsOf(schema, treeConfig); + return validators.isEmpty() ? delegate : new UniqueValidation(delegate, validators); + } + + static ImmutableList> validatorsOf(final ListSchemaNode schema, + final DataTreeConfiguration treeConfig) { final Collection uniques = schema.getUniqueConstraints(); if (!treeConfig.isUniqueIndexEnabled() || uniques.isEmpty()) { - return delegate; + return ImmutableList.of(); } final Stopwatch sw = Stopwatch.createStarted(); final Map> paths = new HashMap<>(); - final List> validators = uniques.stream() + final ImmutableList> validators = uniques.stream() .map(unique -> UniqueValidator.of(unique.argument().stream() .map(descendant -> paths.computeIfAbsent(descendant, key -> toDescendantPath(schema, key))) .collect(ImmutableList.toImmutableList()))) .collect(ImmutableList.toImmutableList()); LOG.debug("Constructed {} validators in {}", validators.size(), sw); - return validators.isEmpty() ? delegate : new UniqueValidation(delegate, validators); + return validators; } @Override void enforceOnData(final NormalizedNode data) { - enforceOnData(data, (message, values) -> new IllegalArgumentException(message)); + enforceOnData(data, (message, values) -> new UniqueValidationFailedException(message)); } @Override diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/UniqueValidationFailedException.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/UniqueValidationFailedException.java new file mode 100644 index 0000000000..79e41a9265 --- /dev/null +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/UniqueValidationFailedException.java @@ -0,0 +1,21 @@ +/* + * Copyright (c) 2020 PANTHEON.tech, s.r.o. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.yangtools.yang.data.impl.schema.tree; + +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 { + private static final long serialVersionUID = 1L; + + UniqueValidationFailedException(final String message) { + super(message); + } +} diff --git a/yang/yang-data-impl/src/test/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/UniqueConstraintTest.java b/yang/yang-data-impl/src/test/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/UniqueConstraintTest.java index 4db997ad8b..dbccc7be8c 100644 --- a/yang/yang-data-impl/src/test/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/UniqueConstraintTest.java +++ b/yang/yang-data-impl/src/test/java/org/opendaylight/yangtools/yang/data/impl/schema/tree/UniqueConstraintTest.java @@ -78,7 +78,8 @@ public class UniqueConstraintTest { final InMemoryDataTree inMemoryDataTree = emptyDataTree(TEST_MODEL, true); - verifyExceptionMessage(assertThrows(IllegalArgumentException.class, () -> writeMap(inMemoryDataTree, true)), + verifyExceptionMessage(assertThrows(UniqueValidationFailedException.class, + () -> writeMap(inMemoryDataTree, true)), "(foo?revision=2016-05-17)task[{(foo?revision=2016-05-17)task-id=", "}] violates unique constraint on [l2, l1] of ", "(foo?revision=2016-05-17)my-leaf-1", -- 2.36.6