Modernize UniqueValidation a bit
[yangtools.git] / data / yang-data-tree-ri / src / main / java / org / opendaylight / yangtools / yang / data / tree / impl / UniqueValidation.java
index 74788bc36ca8ad43f46bc707b239c2eb537d6ce3..08399c5012825012384822c9d8b8ea4ef05914d9 100644 (file)
@@ -8,22 +8,19 @@
 package org.opendaylight.yangtools.yang.data.tree.impl;
 
 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;
+import com.google.common.base.VerifyException;
 import com.google.common.collect.HashMultimap;
 import com.google.common.collect.ImmutableList;
-import java.util.Collection;
 import java.util.HashMap;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
 import org.opendaylight.yangtools.yang.data.api.schema.DataContainerNode;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
@@ -31,11 +28,9 @@ import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNodeContainer;
 import org.opendaylight.yangtools.yang.data.tree.api.DataTreeConfiguration;
 import org.opendaylight.yangtools.yang.data.tree.api.UniqueConstraintException;
 import org.opendaylight.yangtools.yang.model.api.DataNodeContainer;
-import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.ListSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.TypedDataSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Descendant;
-import org.opendaylight.yangtools.yang.model.api.stmt.UniqueEffectiveStatement;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -62,20 +57,19 @@ final class UniqueValidation extends AbstractValidation {
 
     static ImmutableList<UniqueValidator<?>> validatorsOf(final ListSchemaNode schema,
             final DataTreeConfiguration treeConfig) {
-        final Collection<? extends @NonNull UniqueEffectiveStatement> uniques = schema.getUniqueConstraints();
+        final var uniques = schema.getUniqueConstraints();
         if (!treeConfig.isUniqueIndexEnabled() || uniques.isEmpty()) {
             return ImmutableList.of();
         }
 
-        final Stopwatch sw = Stopwatch.createStarted();
-        final Map<Descendant, List<NodeIdentifier>> paths = new HashMap<>();
-        final ImmutableList<UniqueValidator<?>> validators = uniques.stream()
+        final var sw = Stopwatch.createStarted();
+        final var paths = new HashMap<Descendant, List<NodeIdentifier>>();
+        final var 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());
+            .collect(ImmutableList.<UniqueValidator<?>>toImmutableList());
         LOG.debug("Constructed {} validators in {}", validators.size(), sw);
-
         return validators;
     }
 
@@ -92,20 +86,24 @@ final class UniqueValidation extends AbstractValidation {
 
     private <T extends @NonNull Exception> void enforceOnData(final NormalizedNode data,
             final ExceptionSupplier<T> exceptionSupplier) throws T {
-        final Stopwatch sw = Stopwatch.createStarted();
-        verify(data instanceof NormalizedNodeContainer, "Unexpected data %s", data);
-        final var children = ((NormalizedNodeContainer<?>) data).body();
+        final var sw = Stopwatch.createStarted();
+        if (!(data instanceof NormalizedNodeContainer<?> dataContainer)) {
+            throw new VerifyException("Unexpected data " + data.prettyTree());
+        }
+
+        final var children = dataContainer.body();
         final var collected = HashMultimap.<UniqueValidator<?>, Object>create(validators.size(), children.size());
-        for (NormalizedNode child : children) {
-            verify(child instanceof DataContainerNode, "Unexpected child %s", child);
-            final DataContainerNode cont = (DataContainerNode) child;
+        for (var child : children) {
+            if (!(child instanceof DataContainerNode cont)) {
+                throw new VerifyException("Unexpected child " + child);
+            }
 
-            final Map<List<NodeIdentifier>, Object> valueCache = new HashMap<>();
-            for (UniqueValidator<?> validator : validators) {
+            final var valueCache = new HashMap<List<NodeIdentifier>, Object>();
+            for (var validator : validators) {
                 final Object values = validator.extractValues(valueCache, cont);
                 final Object masked = BinaryValue.wrap(values);
                 if (!collected.put(validator, masked)) {
-                    final Map<Descendant, @Nullable Object> index = validator.indexValues(values);
+                    final var index = validator.indexValues(values);
                     throw exceptionSupplier.get(cont.name()
                         + " violates unique constraint on " + masked + " of " + index.keySet(), index);
                 }
@@ -122,18 +120,18 @@ final class UniqueValidation extends AbstractValidation {
 
     private static ImmutableList<NodeIdentifier> toDescendantPath(final ListSchemaNode parent,
             final Descendant descendant) {
-        final List<QName> qnames = descendant.getNodeIdentifiers();
-        final ImmutableList.Builder<NodeIdentifier> builder = ImmutableList.builderWithExpectedSize(qnames.size());
-        final Iterator<QName> it = descendant.getNodeIdentifiers().iterator();
+        final var qnames = descendant.getNodeIdentifiers();
+        final var builder = ImmutableList.<NodeIdentifier>builderWithExpectedSize(qnames.size());
+        final var it = descendant.getNodeIdentifiers().iterator();
         DataNodeContainer current = parent;
         while (true) {
-            final QName qname = it.next();
-            final DataSchemaNode next = current.findDataChildByName(qname)
+            final var qname = it.next();
+            final var next = current.findDataChildByName(qname)
                 .orElseThrow(() -> new IllegalStateException("Cannot find component " + qname + " of " + descendant));
             builder.add(NodeIdentifier.create(qname));
             if (!it.hasNext()) {
                 checkState(next instanceof TypedDataSchemaNode, "Unexpected schema %s for %s", next, descendant);
-                final ImmutableList<NodeIdentifier> ret = builder.build();
+                final var ret = builder.build();
                 LOG.trace("Resolved {} to {}", descendant, ret);
                 return ret;
             }