X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=yang%2Fyang-parser-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fyangtools%2Fyang%2Fparser%2Fstmt%2Frfc6020%2FKeyStatementImpl.java;h=128e3b6c76c9bd986846bbc21ccfdf21242742c4;hb=f3612c50f17cad8764938433e3c70a525dc6d636;hp=d0ec799c514233305b5cc72386eee444bcb9a693;hpb=be1171fbcc4469bd090366052f96a2ae08ffac25;p=yangtools.git diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/KeyStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/KeyStatementImpl.java index d0ec799c51..128e3b6c76 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/KeyStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/KeyStatementImpl.java @@ -7,12 +7,10 @@ */ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; -import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.KeyEffectiveStatementImpl; - +import com.google.common.base.Preconditions; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.ImmutableSet.Builder; import java.util.Collection; -import java.util.HashSet; -import java.util.List; -import java.util.Set; import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.KeyStatement; @@ -20,13 +18,13 @@ import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; -import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; -import com.google.common.base.Splitter; +import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils; +import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.KeyEffectiveStatementImpl; public class KeyStatementImpl extends AbstractDeclaredStatement> implements KeyStatement { - protected KeyStatementImpl(StmtContext, KeyStatement, ?> context) { + protected KeyStatementImpl(final StmtContext, KeyStatement, ?> context) { super(context); } @@ -34,44 +32,34 @@ public class KeyStatementImpl extends AbstractDeclaredStatement, KeyStatement, EffectiveStatement, KeyStatement>> { - public static final char SEPARATOR = ' '; - public Definition() { super(Rfc6020Mapping.KEY); } @Override - public Collection parseArgumentValue(StmtContext ctx, String value) - throws SourceException { - - Splitter keySplitter = Splitter.on(SEPARATOR).omitEmptyStrings().trimResults(); - List keyTokens = keySplitter.splitToList(value); - - // to detect if key contains duplicates - if ((new HashSet<>(keyTokens)).size() < keyTokens.size()) { - throw new IllegalArgumentException(); + public Collection parseArgumentValue(final StmtContext ctx, final String value) { + final Builder builder = ImmutableSet.builder(); + int tokens = 0; + for (String keyToken : StmtContextUtils.LIST_KEY_SPLITTER.split(value)) { + builder.add(SchemaNodeIdentifier.create(false, Utils.qNameFromArgument(ctx, keyToken))); + tokens++; } - Set keyNodes = new HashSet<>(); - - for (String keyToken : keyTokens) { - - SchemaNodeIdentifier keyNode = SchemaNodeIdentifier - .create(true, Utils.qNameFromArgument(ctx, keyToken)); - keyNodes.add(keyNode); - } + // Throws NPE on nulls, retains first inserted value, cannot be modified + final Collection ret = builder.build(); - return keyNodes; + Preconditions.checkArgument(ret.size() == tokens, "Key argument '%s' contains duplicates", value); + return ret; } @Override - public KeyStatement createDeclared(StmtContext, KeyStatement, ?> ctx) { + public KeyStatement createDeclared(final StmtContext, KeyStatement, ?> ctx) { return new KeyStatementImpl(ctx); } @Override public EffectiveStatement, KeyStatement> createEffective( - StmtContext, KeyStatement, EffectiveStatement, KeyStatement>> ctx) { + final StmtContext, KeyStatement, EffectiveStatement, KeyStatement>> ctx) { return new KeyEffectiveStatementImpl(ctx); } }