From: Robert Varga Date: Fri, 18 Sep 2020 22:12:07 +0000 (+0200) Subject: Fix SubIdStatement/ObjectIdentifier ranges X-Git-Tag: v6.0.0~56 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=f95dcc02afeddd89c820b0c8357c9747da91e051;p=yangtools.git Fix SubIdStatement/ObjectIdentifier ranges RFC2578 makes it clear that each sub-identifier is an uint32 as well as that there is at most 128 of them present in an ObjectIdentifier. JIRA: YANGTOOLS-1134 Change-Id: Ic19baf8158c3e291c505c943bf16eae7cfd4ad58 Signed-off-by: Robert Varga --- diff --git a/yang/rfc6643-model-api/src/main/java/org/opendaylight/yangtools/rfc6643/model/api/ObjectIdentifier.java b/yang/rfc6643-model-api/src/main/java/org/opendaylight/yangtools/rfc6643/model/api/ObjectIdentifier.java index c97a12379c..806b237a1b 100644 --- a/yang/rfc6643-model-api/src/main/java/org/opendaylight/yangtools/rfc6643/model/api/ObjectIdentifier.java +++ b/yang/rfc6643-model-api/src/main/java/org/opendaylight/yangtools/rfc6643/model/api/ObjectIdentifier.java @@ -19,6 +19,7 @@ import java.util.stream.IntStream; import org.checkerframework.checker.regex.qual.Regex; import org.opendaylight.yangtools.concepts.Identifier; import org.opendaylight.yangtools.concepts.WritableObject; +import org.opendaylight.yangtools.yang.common.Uint32; /** * An OID, or ObjectIdentifier, as defined by ITU and ISO/IEC. @@ -32,20 +33,21 @@ public final class ObjectIdentifier implements Identifier, WritableObject { private static final Pattern CHECK_OID_PATTERN = Pattern.compile(CHECK_OID_REGEX); private static final Pattern SPLIT_PATTERN = Pattern.compile(".", Pattern.LITERAL); - private final int[] components; + private final int[] subIdentifiers; - private ObjectIdentifier(final int[] components) { - this.components = components; + private ObjectIdentifier(final int[] subIdentifiers) { + this.subIdentifiers = subIdentifiers; } /** - * Create an {@link ObjectIdentifier} from its integer components. + * Create an {@link ObjectIdentifier} from its integer components. Each sub-identifier is interpreted as an unsigned + * integer. * - * @param components OID items + * @param subIdentifiers OID sub-identifiers * @return An ObjectIdentifier. */ - public static ObjectIdentifier forComponents(final int... components) { - return new ObjectIdentifier(components.clone()); + public static ObjectIdentifier of(final int... subIdentifiers) { + return new ObjectIdentifier(subIdentifiers.clone()); } /** @@ -58,13 +60,13 @@ public final class ObjectIdentifier implements Identifier, WritableObject { return new ObjectIdentifier(parseObjectId(str)); } - public int[] getComponents() { + public int[] getSubIdentifiers() { // Always make a defensive copy - return components.clone(); + return subIdentifiers.clone(); } - public IntStream streamComponents() { - return Arrays.stream(components); + public IntStream streamSubIdentifiers() { + return Arrays.stream(subIdentifiers); } /** @@ -76,8 +78,8 @@ public final class ObjectIdentifier implements Identifier, WritableObject { * @throws IOException If an I/O error is reported */ public static ObjectIdentifier readFrom(final DataInput in) throws IOException { - final int count = in.readInt(); - checkArgument(count >= 0, "Illegal item count"); + final int count = in.readUnsignedByte(); + checkArgument(count >= 0 && count <= 128, "Illegal item count %s", count); final int[] oid = new int[count]; for (int index = 0; index < count; ++index) { @@ -89,29 +91,29 @@ public final class ObjectIdentifier implements Identifier, WritableObject { @Override public void writeTo(final DataOutput out) throws IOException { - out.writeInt(components.length); - for (int i : components) { + out.writeByte(subIdentifiers.length); + for (int i : subIdentifiers) { out.writeInt(i); } } @Override public int hashCode() { - return Arrays.hashCode(components); + return Arrays.hashCode(subIdentifiers); } @Override public boolean equals(final Object obj) { return this == obj || obj instanceof ObjectIdentifier - && Arrays.equals(components, ((ObjectIdentifier) obj).components); + && Arrays.equals(subIdentifiers, ((ObjectIdentifier) obj).subIdentifiers); } @Override public String toString() { StringBuilder stringBuilder = new StringBuilder(); - stringBuilder.append(components[0]); - for (int index = 1; index < components.length; index++) { - stringBuilder.append('.').append(components[index]); + stringBuilder.append(subIdentifiers[0]); + for (int index = 1; index < subIdentifiers.length; index++) { + stringBuilder.append('.').append(subIdentifiers[index]); } return stringBuilder.toString(); } @@ -120,9 +122,11 @@ public final class ObjectIdentifier implements Identifier, WritableObject { checkArgument(CHECK_OID_PATTERN.matcher(objectId).matches(), "Wrong format for OID: '%s'", objectId); final String[] splitOid = SPLIT_PATTERN.split(objectId); + checkArgument(splitOid.length <= 128, "Object Identifier can have at most 128 sub-identifiers"); + final int[] oid = new int[splitOid.length]; for (int index = 0; index < splitOid.length; index ++) { - oid[index] = Integer.parseInt(splitOid[index]); + oid[index] = Uint32.valueOf(splitOid[index]).intValue(); } return oid; } diff --git a/yang/rfc6643-model-api/src/main/java/org/opendaylight/yangtools/rfc6643/model/api/SubIdEffectiveStatement.java b/yang/rfc6643-model-api/src/main/java/org/opendaylight/yangtools/rfc6643/model/api/SubIdEffectiveStatement.java index 0339d8b456..4f162b9f60 100644 --- a/yang/rfc6643-model-api/src/main/java/org/opendaylight/yangtools/rfc6643/model/api/SubIdEffectiveStatement.java +++ b/yang/rfc6643-model-api/src/main/java/org/opendaylight/yangtools/rfc6643/model/api/SubIdEffectiveStatement.java @@ -8,11 +8,12 @@ package org.opendaylight.yangtools.rfc6643.model.api; import com.google.common.annotations.Beta; +import org.opendaylight.yangtools.yang.common.Uint32; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition; @Beta -public interface SubIdEffectiveStatement extends EffectiveStatement { +public interface SubIdEffectiveStatement extends EffectiveStatement { @Override default StatementDefinition statementDefinition() { return IetfYangSmiv2ExtensionsMapping.SUB_ID; diff --git a/yang/rfc6643-model-api/src/main/java/org/opendaylight/yangtools/rfc6643/model/api/SubIdSchemaNode.java b/yang/rfc6643-model-api/src/main/java/org/opendaylight/yangtools/rfc6643/model/api/SubIdSchemaNode.java index c696abef60..3fdb5f648c 100644 --- a/yang/rfc6643-model-api/src/main/java/org/opendaylight/yangtools/rfc6643/model/api/SubIdSchemaNode.java +++ b/yang/rfc6643-model-api/src/main/java/org/opendaylight/yangtools/rfc6643/model/api/SubIdSchemaNode.java @@ -8,10 +8,12 @@ package org.opendaylight.yangtools.rfc6643.model.api; import com.google.common.annotations.Beta; +import org.eclipse.jdt.annotation.NonNull; +import org.opendaylight.yangtools.yang.common.Uint32; import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode; @Beta public interface SubIdSchemaNode extends UnknownSchemaNode { - int getArgument(); + @NonNull Uint32 getArgument(); } diff --git a/yang/rfc6643-model-api/src/main/java/org/opendaylight/yangtools/rfc6643/model/api/SubIdStatement.java b/yang/rfc6643-model-api/src/main/java/org/opendaylight/yangtools/rfc6643/model/api/SubIdStatement.java index ff0166e239..b422fb102d 100644 --- a/yang/rfc6643-model-api/src/main/java/org/opendaylight/yangtools/rfc6643/model/api/SubIdStatement.java +++ b/yang/rfc6643-model-api/src/main/java/org/opendaylight/yangtools/rfc6643/model/api/SubIdStatement.java @@ -8,11 +8,12 @@ package org.opendaylight.yangtools.rfc6643.model.api; import com.google.common.annotations.Beta; +import org.opendaylight.yangtools.yang.common.Uint32; import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition; import org.opendaylight.yangtools.yang.model.api.stmt.UnknownStatement; @Beta -public interface SubIdStatement extends UnknownStatement { +public interface SubIdStatement extends UnknownStatement { @Override default StatementDefinition statementDefinition() { return IetfYangSmiv2ExtensionsMapping.SUB_ID; diff --git a/yang/rfc6643-parser-support/src/main/java/org/opendaylight/yangtools/rfc6643/parser/OidStatementSupport.java b/yang/rfc6643-parser-support/src/main/java/org/opendaylight/yangtools/rfc6643/parser/OidStatementSupport.java index 1539109020..47bbb8021a 100644 --- a/yang/rfc6643-parser-support/src/main/java/org/opendaylight/yangtools/rfc6643/parser/OidStatementSupport.java +++ b/yang/rfc6643-parser-support/src/main/java/org/opendaylight/yangtools/rfc6643/parser/OidStatementSupport.java @@ -18,6 +18,7 @@ import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.BaseStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; import org.opendaylight.yangtools.yang.parser.spi.meta.SubstatementValidator; +import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; @Beta public final class OidStatementSupport @@ -36,7 +37,11 @@ public final class OidStatementSupport @Override public ObjectIdentifier parseArgumentValue(final StmtContext ctx, final String value) { - return ObjectIdentifier.forString(value); + try { + return ObjectIdentifier.forString(value); + } catch (IllegalArgumentException e) { + throw new SourceException(ctx.getStatementSourceReference(), e, "Invalid object identifier '%s'", value); + } } @Override diff --git a/yang/rfc6643-parser-support/src/main/java/org/opendaylight/yangtools/rfc6643/parser/SubIdEffectiveStatementImpl.java b/yang/rfc6643-parser-support/src/main/java/org/opendaylight/yangtools/rfc6643/parser/SubIdEffectiveStatementImpl.java index 427c365f30..650293f299 100644 --- a/yang/rfc6643-parser-support/src/main/java/org/opendaylight/yangtools/rfc6643/parser/SubIdEffectiveStatementImpl.java +++ b/yang/rfc6643-parser-support/src/main/java/org/opendaylight/yangtools/rfc6643/parser/SubIdEffectiveStatementImpl.java @@ -13,25 +13,26 @@ import org.opendaylight.yangtools.rfc6643.model.api.SubIdEffectiveStatement; import org.opendaylight.yangtools.rfc6643.model.api.SubIdSchemaNode; import org.opendaylight.yangtools.rfc6643.model.api.SubIdStatement; import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.common.Uint32; import org.opendaylight.yangtools.yang.model.api.SchemaPath; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.UnknownEffectiveStatementBase; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; -final class SubIdEffectiveStatementImpl extends UnknownEffectiveStatementBase +final class SubIdEffectiveStatementImpl extends UnknownEffectiveStatementBase implements SubIdEffectiveStatement, SubIdSchemaNode { private final SchemaPath path; - SubIdEffectiveStatementImpl(final StmtContext ctx, + SubIdEffectiveStatementImpl(final StmtContext ctx, final ImmutableList> substatements) { super(ctx, substatements); path = ctx.getParentContext().getSchemaPath().get().createChild(getNodeType()); } @Override - public int getArgument() { - return argument().intValue(); + public Uint32 getArgument() { + return argument(); } @Override diff --git a/yang/rfc6643-parser-support/src/main/java/org/opendaylight/yangtools/rfc6643/parser/SubIdStatementImpl.java b/yang/rfc6643-parser-support/src/main/java/org/opendaylight/yangtools/rfc6643/parser/SubIdStatementImpl.java index 1a288c6a8c..508bc41ed8 100644 --- a/yang/rfc6643-parser-support/src/main/java/org/opendaylight/yangtools/rfc6643/parser/SubIdStatementImpl.java +++ b/yang/rfc6643-parser-support/src/main/java/org/opendaylight/yangtools/rfc6643/parser/SubIdStatementImpl.java @@ -9,11 +9,12 @@ package org.opendaylight.yangtools.rfc6643.parser; import com.google.common.collect.ImmutableList; import org.opendaylight.yangtools.rfc6643.model.api.SubIdStatement; +import org.opendaylight.yangtools.yang.common.Uint32; import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement; import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredStatement.ArgumentToString.WithSubstatements; -final class SubIdStatementImpl extends WithSubstatements implements SubIdStatement { - SubIdStatementImpl(final Integer argument, final ImmutableList> substatements) { +final class SubIdStatementImpl extends WithSubstatements implements SubIdStatement { + SubIdStatementImpl(final Uint32 argument, final ImmutableList> substatements) { super(argument, substatements); } } diff --git a/yang/rfc6643-parser-support/src/main/java/org/opendaylight/yangtools/rfc6643/parser/SubIdStatementSupport.java b/yang/rfc6643-parser-support/src/main/java/org/opendaylight/yangtools/rfc6643/parser/SubIdStatementSupport.java index 0171f2981b..821f5beef2 100644 --- a/yang/rfc6643-parser-support/src/main/java/org/opendaylight/yangtools/rfc6643/parser/SubIdStatementSupport.java +++ b/yang/rfc6643-parser-support/src/main/java/org/opendaylight/yangtools/rfc6643/parser/SubIdStatementSupport.java @@ -12,6 +12,7 @@ import com.google.common.collect.ImmutableList; import org.opendaylight.yangtools.rfc6643.model.api.IetfYangSmiv2ExtensionsMapping; import org.opendaylight.yangtools.rfc6643.model.api.SubIdEffectiveStatement; import org.opendaylight.yangtools.rfc6643.model.api.SubIdStatement; +import org.opendaylight.yangtools.yang.common.Uint32; import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.BaseStatementSupport; @@ -20,7 +21,7 @@ import org.opendaylight.yangtools.yang.parser.spi.meta.SubstatementValidator; @Beta public final class SubIdStatementSupport - extends BaseStatementSupport { + extends BaseStatementSupport { private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(IetfYangSmiv2ExtensionsMapping.SUB_ID).build(); private static final SubIdStatementSupport INSTANCE = new SubIdStatementSupport(); @@ -34,8 +35,8 @@ public final class SubIdStatementSupport } @Override - public Integer parseArgumentValue(final StmtContext ctx, final String value) { - return Integer.parseUnsignedInt(value); + public Uint32 parseArgumentValue(final StmtContext ctx, final String value) { + return Uint32.valueOf(value); } @Override @@ -44,26 +45,26 @@ public final class SubIdStatementSupport } @Override - protected SubIdStatement createDeclared(final StmtContext ctx, + protected SubIdStatement createDeclared(final StmtContext ctx, final ImmutableList> substatements) { return new SubIdStatementImpl(ctx.coerceStatementArgument(), substatements); } @Override - protected SubIdStatement createEmptyDeclared(final StmtContext ctx) { + protected SubIdStatement createEmptyDeclared(final StmtContext ctx) { return createDeclared(ctx, ImmutableList.of()); } @Override protected SubIdEffectiveStatement createEffective( - final StmtContext ctx, + final StmtContext ctx, final SubIdStatement declared, final ImmutableList> substatements) { return new SubIdEffectiveStatementImpl(ctx, substatements); } @Override protected SubIdEffectiveStatement createEmptyEffective( - final StmtContext ctx, final SubIdStatement declared) { + final StmtContext ctx, final SubIdStatement declared) { return createEffective(ctx, declared, ImmutableList.of()); } } diff --git a/yang/rfc6643-parser-support/src/test/java/org/opendaylight/yangtools/rfc6643/parser/IetfYangSmiv2ExtensionPluginTest.java b/yang/rfc6643-parser-support/src/test/java/org/opendaylight/yangtools/rfc6643/parser/IetfYangSmiv2ExtensionPluginTest.java index 31e4456bc6..c0d599a308 100644 --- a/yang/rfc6643-parser-support/src/test/java/org/opendaylight/yangtools/rfc6643/parser/IetfYangSmiv2ExtensionPluginTest.java +++ b/yang/rfc6643-parser-support/src/test/java/org/opendaylight/yangtools/rfc6643/parser/IetfYangSmiv2ExtensionPluginTest.java @@ -22,6 +22,7 @@ import org.opendaylight.yangtools.rfc6643.model.api.ObjectIdentifier; import org.opendaylight.yangtools.rfc6643.model.api.OidSchemaNode; import org.opendaylight.yangtools.rfc6643.model.api.SubIdSchemaNode; import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.common.Uint32; import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode; import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode; @@ -103,9 +104,9 @@ public class IetfYangSmiv2ExtensionPluginTest { assertTrue(testNumberLeaf.getUnknownSchemaNodes().size() == 3); testNumberLeaf.getUnknownSchemaNodes().forEach(unknownSchemaNode -> { if (unknownSchemaNode instanceof SubIdSchemaNode) { - assertEquals(((SubIdSchemaNode) unknownSchemaNode).getArgument(), 2); + assertEquals(Uint32.TWO, ((SubIdSchemaNode) unknownSchemaNode).getArgument()); } else if (unknownSchemaNode instanceof DefValSchemaNode) { - assertEquals(((DefValSchemaNode) unknownSchemaNode).getArgument(), "0"); + assertEquals("0", ((DefValSchemaNode) unknownSchemaNode).getArgument()); } }); }