Improve KeyStatement implementations 96/87296/1
authorRobert Varga <robert.varga@pantheon.tech>
Tue, 28 Jan 2020 23:57:58 +0000 (00:57 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Thu, 30 Jan 2020 10:44:09 +0000 (11:44 +0100)
KeyStatement is holding on to singleton collections, where it can
easily squash them, just as it does with substatements.

JIRA: YANGTOOLS-652
Change-Id: I9141da24244d91a8e785ee9cf1131fecbb07d329
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
(cherry picked from commit 8775f231aeb4d043d1de403b52edfafa81ccc7b1)
(cherry picked from commit 68da3668580ffc48096854d361b628358e5b59b7)

yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/key/AbstractKeyEffectiveStatement.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/key/AbstractKeyStatement.java [new file with mode: 0644]
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/key/EmptyKeyStatement.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/key/KeyStatementSupport.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/key/RegularKeyStatement.java

index 5b292581887c8c56cf41676373e1d7039d6a38a4..3fb868353740d149739b23ec8dd5bf498e986554 100644 (file)
@@ -7,9 +7,6 @@
  */
 package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.key;
 
-import static com.google.common.base.Verify.verify;
-
-import com.google.common.collect.ImmutableSet;
 import java.util.Collection;
 import org.opendaylight.yangtools.yang.model.api.stmt.KeyEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.KeyStatement;
@@ -25,17 +22,12 @@ abstract class AbstractKeyEffectiveStatement
 
         Foreign(final KeyStatement declared, final Collection<SchemaNodeIdentifier> argument) {
             super(declared);
-            this.argument = argument.size() == 1 ? argument.iterator().next() : argument;
+            this.argument = KeyStatementSupport.maskCollection(argument);
         }
 
         @Override
-        @SuppressWarnings("unchecked")
         public final Collection<SchemaNodeIdentifier> argument() {
-            if (argument instanceof Collection) {
-                return (Collection<SchemaNodeIdentifier>) argument;
-            }
-            verify(argument instanceof SchemaNodeIdentifier, "Unexpected argument %s", argument);
-            return ImmutableSet.of((SchemaNodeIdentifier) argument);
+            return KeyStatementSupport.unmaskCollection(argument);
         }
     }
 
diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/key/AbstractKeyStatement.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/key/AbstractKeyStatement.java
new file mode 100644 (file)
index 0000000..5673148
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+ * 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.parser.rfc7950.stmt.key;
+
+import java.util.Collection;
+import org.eclipse.jdt.annotation.NonNull;
+import org.opendaylight.yangtools.yang.model.api.stmt.KeyStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredStatement.WithRawArgument;
+import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
+
+abstract class AbstractKeyStatement extends WithRawArgument<Collection<SchemaNodeIdentifier>> implements KeyStatement {
+    final @NonNull Object argument;
+
+    AbstractKeyStatement(final StmtContext<Collection<SchemaNodeIdentifier>, ?, ?> context) {
+        super(context);
+        this.argument = KeyStatementSupport.maskCollection(context.coerceStatementArgument());
+    }
+
+    @Override
+    public final @NonNull Collection<SchemaNodeIdentifier> argument() {
+        return KeyStatementSupport.unmaskCollection(argument);
+    }
+}
index a6fb7ef94fa22b9ea978e04ebefc6923e3206f25..b8a0bcfcf37ecb8a7943cf3977ffd1c780c7ac6a 100644 (file)
@@ -8,12 +8,10 @@
 package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.key;
 
 import java.util.Collection;
-import org.opendaylight.yangtools.yang.model.api.stmt.KeyStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier;
-import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredStatement.WithArgument;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
 
-final class EmptyKeyStatement extends WithArgument<Collection<SchemaNodeIdentifier>> implements KeyStatement {
+final class EmptyKeyStatement extends AbstractKeyStatement {
     EmptyKeyStatement(final StmtContext<Collection<SchemaNodeIdentifier>, ?, ?> context) {
         super(context);
     }
index 0d86da1ce187c047611c5c0c9476d2ca7c9bf7f3..fbdd5784a2ef63709c9a25f078f1269c29872d59 100644 (file)
@@ -7,11 +7,15 @@
  */
 package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.key;
 
+import static com.google.common.base.Verify.verify;
+import static com.google.common.base.Verify.verifyNotNull;
+
 import com.google.common.base.Splitter;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.ImmutableSet.Builder;
 import java.util.Collection;
+import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.common.QNameModule;
 import org.opendaylight.yangtools.yang.model.api.YangStmtMapping;
@@ -114,4 +118,17 @@ public final class KeyStatementSupport
         return arg.equals(declared.argument()) ? new EmptyLocalKeyEffectiveStatement(declared)
                 : new EmptyForeignKeyEffectiveStatement(declared, arg);
     }
+
+    static @NonNull Object maskCollection(final @NonNull Collection<SchemaNodeIdentifier> coll) {
+        return coll.size() == 1 ? verifyNotNull(coll.iterator().next()) : coll;
+    }
+
+    @SuppressWarnings("unchecked")
+    static @NonNull Collection<SchemaNodeIdentifier> unmaskCollection(final @NonNull Object masked) {
+        if (masked instanceof Collection) {
+            return (Collection<SchemaNodeIdentifier>) masked;
+        }
+        verify(masked instanceof SchemaNodeIdentifier, "Unexpected argument %s", masked);
+        return ImmutableSet.of((SchemaNodeIdentifier) masked);
+    }
 }
index 60ac9c2f56c9bf30a40e30e03827e110983142ea..0a119207504d810a2d1b6b88075309edc1684ab8 100644 (file)
@@ -11,12 +11,10 @@ import com.google.common.collect.ImmutableList;
 import java.util.Collection;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
-import org.opendaylight.yangtools.yang.model.api.stmt.KeyStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier;
-import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredStatement.WithArgument;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
 
-final class RegularKeyStatement extends WithArgument<Collection<SchemaNodeIdentifier>> implements KeyStatement {
+final class RegularKeyStatement extends AbstractKeyStatement {
     private final @NonNull Object substatements;
 
     RegularKeyStatement(final StmtContext<Collection<SchemaNodeIdentifier>, ?, ?> context,