Improve Descendant check 38/103738/1
authorRobert Varga <robert.varga@pantheon.tech>
Wed, 21 Dec 2022 23:00:56 +0000 (00:00 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Fri, 23 Dec 2022 19:22:54 +0000 (20:22 +0100)
Rather than asserting Absolute, use an explicit if with instanceof
expression to guard list additions. Also retain declaration order
by not going through an intermediate HashSet.

Change-Id: I0292aa8f927a101de83979da808cf84032bfb021
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
(cherry picked from commit e3d8fe2ba1ab33920596f1dd3140e7ac4bf6e75f)

data/yang-data-tree-ri/src/test/java/org/opendaylight/yangtools/yang/data/tree/impl/UniqueConstraintTest.java
parser/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/meta/UniqueStatementSupport.java

index cc1e5a078b3e5577121fb9ac2cf2e9b37eb30900..22f12ac0a7eec6fb7d0a1cd0415fe337061aed5e 100644 (file)
@@ -89,7 +89,7 @@ public class UniqueConstraintTest {
         verifyException(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 ",
+            "}] violates unique constraint on [l1, l2] of ",
             "(foo?revision=2016-05-17)my-leaf-1",
             "(foo?revision=2016-05-17)my-leaf-2]");
 
@@ -97,7 +97,7 @@ public class UniqueConstraintTest {
         verifyException(assertThrows(UniqueConstraintException.class,
             () -> writeMapEntry(inMemoryDataTree, "4", "l1", "l2", "l30")),
             "(foo?revision=2016-05-17)task[{(foo?revision=2016-05-17)task-id=",
-            "}] violates unique constraint on [l2, l1] of ",
+            "}] violates unique constraint on [l1, l2] of ",
             "(foo?revision=2016-05-17)my-leaf-1",
             "(foo?revision=2016-05-17)my-leaf-2");
     }
@@ -126,7 +126,7 @@ public class UniqueConstraintTest {
         verifyException(assertThrows(UniqueConstraintException.class,
             () -> writeMapEntry(inMemoryDataTree, "5", "l3", "l4", "l7")),
             "(foo?revision=2016-05-17)task[{(foo?revision=2016-05-17)task-id=",
-            "}] violates unique constraint on [l4, l3] of ",
+            "}] violates unique constraint on [l3, l4] of ",
             "(foo?revision=2016-05-17)my-leaf-1",
             "(foo?revision=2016-05-17)my-leaf-2");
         removeMapEntry(inMemoryDataTree, taskEntryKey("3"));
@@ -135,7 +135,7 @@ public class UniqueConstraintTest {
         verifyException(assertThrows(UniqueConstraintException.class,
             () -> writeMapEntry(inMemoryDataTree, "6", "l3", "l4", "l11")),
             "(foo?revision=2016-05-17)task[{(foo?revision=2016-05-17)task-id=",
-            "}] violates unique constraint on [l4, l3] of ",
+            "}] violates unique constraint on [l3, l4] of ",
             "(foo?revision=2016-05-17)my-leaf-1",
             "(foo?revision=2016-05-17)my-leaf-2");
 
index ad3900c2e23f6e7a16f9dfa5e3192796117a9975..505fc6f2729b1e76f0434a6d15b42184c0838cc4 100644 (file)
@@ -17,7 +17,6 @@ import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import java.util.Collection;
-import java.util.HashSet;
 import java.util.Map;
 import java.util.Objects;
 import java.util.Set;
@@ -31,7 +30,6 @@ import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.LeafEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.ListEffectiveStatement;
-import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Descendant;
 import org.opendaylight.yangtools.yang.model.api.stmt.UniqueEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.UniqueStatement;
@@ -144,17 +142,15 @@ public final class UniqueStatementSupport
     private static ImmutableSet<Descendant> parseUniqueConstraintArgument(final StmtContext<?, ?, ?> ctx,
             final String argumentValue) {
         // deal with 'line-break' rule, which is either "\n" or "\r\n", but not "\r"
-        final String nocrlf = CRLF_PATTERN.matcher(argumentValue).replaceAll("\n");
-
-        final var uniqueConstraintNodes = new HashSet<Descendant>();
-        for (var uniqueArgToken : SEP_SPLITTER.split(nocrlf)) {
-            final var nodeIdentifier = ArgumentUtils.nodeIdentifierFromPath(ctx, uniqueArgToken);
-            SourceException.throwIf(nodeIdentifier instanceof Absolute, ctx,
-                "Unique statement argument '%s' contains schema node identifier '%s' which is not in the descendant "
-                    + "node identifier form.", argumentValue, uniqueArgToken);
-            uniqueConstraintNodes.add((Descendant) nodeIdentifier);
-        }
-        return ImmutableSet.copyOf(uniqueConstraintNodes);
+        return SEP_SPLITTER.splitToStream(CRLF_PATTERN.matcher(argumentValue).replaceAll("\n"))
+            .map(uniqueArgToken -> {
+                if (!(ArgumentUtils.nodeIdentifierFromPath(ctx, uniqueArgToken) instanceof Descendant descendant)) {
+                    throw new SourceException(ctx, "Unique statement argument '%s' contains schema node identifier '%s'"
+                        + " which is not in the descendant node identifier form.", argumentValue, uniqueArgToken);
+                }
+                return descendant;
+            })
+            .collect(ImmutableSet.toImmutableSet());
     }
 
     /**