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.
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());
}
/**
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);
}
/**
* @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) {
@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();
}
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;
}
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<Integer, SubIdStatement> {
+public interface SubIdEffectiveStatement extends EffectiveStatement<Uint32, SubIdStatement> {
@Override
default StatementDefinition statementDefinition() {
return IetfYangSmiv2ExtensionsMapping.SUB_ID;
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();
}
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<Integer> {
+public interface SubIdStatement extends UnknownStatement<Uint32> {
@Override
default StatementDefinition statementDefinition() {
return IetfYangSmiv2ExtensionsMapping.SUB_ID;
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
@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
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<Integer, SubIdStatement>
+final class SubIdEffectiveStatementImpl extends UnknownEffectiveStatementBase<Uint32, SubIdStatement>
implements SubIdEffectiveStatement, SubIdSchemaNode {
private final SchemaPath path;
- SubIdEffectiveStatementImpl(final StmtContext<Integer, SubIdStatement, ?> ctx,
+ SubIdEffectiveStatementImpl(final StmtContext<Uint32, SubIdStatement, ?> ctx,
final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
super(ctx, substatements);
path = ctx.getParentContext().getSchemaPath().get().createChild(getNodeType());
}
@Override
- public int getArgument() {
- return argument().intValue();
+ public Uint32 getArgument() {
+ return argument();
}
@Override
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<Integer> implements SubIdStatement {
- SubIdStatementImpl(final Integer argument, final ImmutableList<? extends DeclaredStatement<?>> substatements) {
+final class SubIdStatementImpl extends WithSubstatements<Uint32> implements SubIdStatement {
+ SubIdStatementImpl(final Uint32 argument, final ImmutableList<? extends DeclaredStatement<?>> substatements) {
super(argument, substatements);
}
}
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;
@Beta
public final class SubIdStatementSupport
- extends BaseStatementSupport<Integer, SubIdStatement, SubIdEffectiveStatement> {
+ extends BaseStatementSupport<Uint32, SubIdStatement, SubIdEffectiveStatement> {
private static final SubstatementValidator SUBSTATEMENT_VALIDATOR =
SubstatementValidator.builder(IetfYangSmiv2ExtensionsMapping.SUB_ID).build();
private static final SubIdStatementSupport INSTANCE = new 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
}
@Override
- protected SubIdStatement createDeclared(final StmtContext<Integer, SubIdStatement, ?> ctx,
+ protected SubIdStatement createDeclared(final StmtContext<Uint32, SubIdStatement, ?> ctx,
final ImmutableList<? extends DeclaredStatement<?>> substatements) {
return new SubIdStatementImpl(ctx.coerceStatementArgument(), substatements);
}
@Override
- protected SubIdStatement createEmptyDeclared(final StmtContext<Integer, SubIdStatement, ?> ctx) {
+ protected SubIdStatement createEmptyDeclared(final StmtContext<Uint32, SubIdStatement, ?> ctx) {
return createDeclared(ctx, ImmutableList.of());
}
@Override
protected SubIdEffectiveStatement createEffective(
- final StmtContext<Integer, SubIdStatement, SubIdEffectiveStatement> ctx,
+ final StmtContext<Uint32, SubIdStatement, SubIdEffectiveStatement> ctx,
final SubIdStatement declared, final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
return new SubIdEffectiveStatementImpl(ctx, substatements);
}
@Override
protected SubIdEffectiveStatement createEmptyEffective(
- final StmtContext<Integer, SubIdStatement, SubIdEffectiveStatement> ctx, final SubIdStatement declared) {
+ final StmtContext<Uint32, SubIdStatement, SubIdEffectiveStatement> ctx, final SubIdStatement declared) {
return createEffective(ctx, declared, ImmutableList.of());
}
}
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;
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());
}
});
}