final NodeIdentifier nodeId = decodeNodeIdentifier(nodeHeader, parent);
final int size;
- switch (nodeHeader & MagnesiumNode.PREDICATE_MASK) {
+ switch (mask(nodeHeader, MagnesiumNode.PREDICATE_MASK)) {
case MagnesiumNode.PREDICATE_ZERO:
size = 0;
break;
}
private AugmentationIdentifier readAugmentationIdentifier(final byte header) throws IOException {
- final int count = header & MagnesiumPathArgument.AID_COUNT_MASK;
+ final byte count = mask(header, MagnesiumPathArgument.AID_COUNT_MASK);
switch (count) {
case MagnesiumPathArgument.AID_COUNT_1B:
return readAugmentationIdentifier(input.readUnsignedByte());
case MagnesiumPathArgument.AID_COUNT_4B:
return readAugmentationIdentifier(input.readInt());
default:
- return readAugmentationIdentifier(count >>> MagnesiumPathArgument.AID_COUNT_SHIFT);
+ return readAugmentationIdentifier(rshift(count, MagnesiumPathArgument.AID_COUNT_SHIFT));
}
}
private NodeIdentifierWithPredicates readNodeIdentifierWithPredicates(final byte header) throws IOException {
final QName qname = readNodeIdentifier(header).getNodeType();
- switch (header & MagnesiumPathArgument.SIZE_MASK) {
+ switch (mask(header, MagnesiumPathArgument.SIZE_MASK)) {
case MagnesiumPathArgument.SIZE_1B:
return readNodeIdentifierWithPredicates(qname, input.readUnsignedByte());
case MagnesiumPathArgument.SIZE_2B:
case MagnesiumPathArgument.SIZE_4B:
return readNodeIdentifierWithPredicates(qname, input.readInt());
default:
- return readNodeIdentifierWithPredicates(qname, header >>> MagnesiumPathArgument.SIZE_SHIFT);
+ return readNodeIdentifierWithPredicates(qname, rshift(header, MagnesiumPathArgument.SIZE_SHIFT));
}
}
}
private static void verifyPathIdentifierOnly(final byte header) throws InvalidNormalizedNodeStreamException {
- if ((header & MagnesiumPathArgument.SIZE_MASK) != 0) {
+ if (mask(header, MagnesiumPathArgument.SIZE_MASK) != 0) {
throw new InvalidNormalizedNodeStreamException("Invalid path argument header " + header);
}
}
throw new InvalidNormalizedNodeStreamException("Invalid bits length " + size);
}
}
+
+ private static byte mask(final byte header, final byte mask) {
+ return (byte) (header & mask);
+ }
+
+ private static int rshift(final byte header, final byte shift) {
+ return (header & 0xFF) >>> shift;
+ }
}
import static org.junit.Assert.assertEquals;
+import com.google.common.collect.ImmutableSet;
import com.google.common.io.ByteStreams;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
+import java.util.ArrayList;
+import java.util.List;
import java.util.Optional;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import org.opendaylight.yangtools.yang.common.Empty;
import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.AugmentationIdentifier;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeWithValue;
assertEquals(expected, nnin.readNormalizedNode());
}
+ @Test
+ public void testAugmentationIdentifier() throws IOException {
+ final List<QName> qnames = new ArrayList<>();
+ for (int i = 0; i < 257; ++i) {
+ qnames.add(QName.create(TestModel.TEST_QNAME, "a" + i));
+ }
+
+ for (int i = 0; i < qnames.size(); ++i) {
+ final AugmentationIdentifier expected = AugmentationIdentifier.create(
+ ImmutableSet.copyOf(qnames.subList(0, i)));
+
+ ByteArrayOutputStream bos = new ByteArrayOutputStream();
+
+ try (NormalizedNodeDataOutput nnout =
+ NormalizedNodeInputOutput.newDataOutput(ByteStreams.newDataOutput(bos),
+ NormalizedNodeStreamVersion.SODIUM_SR1)) {
+ nnout.writePathArgument(expected);
+ }
+
+ final byte[] bytes = bos.toByteArray();
+
+ NormalizedNodeDataInput nnin = NormalizedNodeInputOutput.newDataInput(ByteStreams.newDataInput(bytes));
+ PathArgument arg = nnin.readPathArgument();
+ assertEquals(expected, arg);
+ }
+ }
+
private static String largeString(final int pow) {
StringBuilder sb = new StringBuilder("X");
for (int i = 0; i < pow; i++) {