From 5a96be8c33b2df7b5c85599890d325ba48d9bb7c Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Wed, 29 Jan 2020 00:57:58 +0100 Subject: [PATCH] Improve KeyStatement implementations 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 (cherry picked from commit 8775f231aeb4d043d1de403b52edfafa81ccc7b1) (cherry picked from commit 68da3668580ffc48096854d361b628358e5b59b7) --- .../key/AbstractKeyEffectiveStatement.java | 12 ++------ .../stmt/key/AbstractKeyStatement.java | 29 +++++++++++++++++++ .../rfc7950/stmt/key/EmptyKeyStatement.java | 4 +-- .../rfc7950/stmt/key/KeyStatementSupport.java | 17 +++++++++++ .../rfc7950/stmt/key/RegularKeyStatement.java | 4 +-- 5 files changed, 50 insertions(+), 16 deletions(-) create mode 100644 yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/key/AbstractKeyStatement.java diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/key/AbstractKeyEffectiveStatement.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/key/AbstractKeyEffectiveStatement.java index 5b29258188..3fb8683537 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/key/AbstractKeyEffectiveStatement.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/key/AbstractKeyEffectiveStatement.java @@ -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 argument) { super(declared); - this.argument = argument.size() == 1 ? argument.iterator().next() : argument; + this.argument = KeyStatementSupport.maskCollection(argument); } @Override - @SuppressWarnings("unchecked") public final Collection argument() { - if (argument instanceof Collection) { - return (Collection) 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 index 0000000000..56731489c8 --- /dev/null +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/key/AbstractKeyStatement.java @@ -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> implements KeyStatement { + final @NonNull Object argument; + + AbstractKeyStatement(final StmtContext, ?, ?> context) { + super(context); + this.argument = KeyStatementSupport.maskCollection(context.coerceStatementArgument()); + } + + @Override + public final @NonNull Collection argument() { + return KeyStatementSupport.unmaskCollection(argument); + } +} diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/key/EmptyKeyStatement.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/key/EmptyKeyStatement.java index a6fb7ef94f..b8a0bcfcf3 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/key/EmptyKeyStatement.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/key/EmptyKeyStatement.java @@ -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> implements KeyStatement { +final class EmptyKeyStatement extends AbstractKeyStatement { EmptyKeyStatement(final StmtContext, ?, ?> context) { super(context); } diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/key/KeyStatementSupport.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/key/KeyStatementSupport.java index 0d86da1ce1..fbdd5784a2 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/key/KeyStatementSupport.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/key/KeyStatementSupport.java @@ -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 coll) { + return coll.size() == 1 ? verifyNotNull(coll.iterator().next()) : coll; + } + + @SuppressWarnings("unchecked") + static @NonNull Collection unmaskCollection(final @NonNull Object masked) { + if (masked instanceof Collection) { + return (Collection) masked; + } + verify(masked instanceof SchemaNodeIdentifier, "Unexpected argument %s", masked); + return ImmutableSet.of((SchemaNodeIdentifier) masked); + } } diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/key/RegularKeyStatement.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/key/RegularKeyStatement.java index 60ac9c2f56..0a11920750 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/key/RegularKeyStatement.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/key/RegularKeyStatement.java @@ -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> implements KeyStatement { +final class RegularKeyStatement extends AbstractKeyStatement { private final @NonNull Object substatements; RegularKeyStatement(final StmtContext, ?, ?> context, -- 2.36.6