From 07d406116969ac1d96476f5d57c713d4c02a1c31 Mon Sep 17 00:00:00 2001 From: Dana Kutenicsova Date: Sun, 1 Jun 2014 11:04:52 +0200 Subject: [PATCH] BUG-612 : switch PCEP objects to ByteBuf. Change-Id: I14a6f1877e0feeb08499807b51632630a79104e3 Signed-off-by: Dana Kutenicsova --- .../stateful02/Stateful02LspObjectParser.java | 23 +- .../pcep/ietf/PCEPObjectParserTest.java | 20 +- .../CInitiated00LspObjectParser.java | 23 +- .../CInitiated00SrpObjectParser.java | 24 +- .../stateful07/Stateful07LspObjectParser.java | 21 +- .../stateful07/Stateful07SrpObjectParser.java | 23 +- .../pcep/ietf/PCEPObjectParserTest.java | 26 ++- .../impl/object/AbstractBandwidthParser.java | 17 +- .../object/PCEPClassTypeObjectParser.java | 22 +- .../impl/object/PCEPCloseObjectParser.java | 14 +- .../object/PCEPEndPointsIpv4ObjectParser.java | 28 +-- .../object/PCEPEndPointsIpv6ObjectParser.java | 31 ++- .../impl/object/PCEPErrorObjectParser.java | 17 +- .../object/PCEPExcludeRouteObjectParser.java | 16 +- .../object/PCEPExplicitRouteObjectParser.java | 14 +- .../PCEPGlobalConstraintsObjectParser.java | 17 +- .../object/PCEPIncludeRouteObjectParser.java | 19 +- .../object/PCEPLoadBalancingObjectParser.java | 18 +- .../impl/object/PCEPLspaObjectParser.java | 31 +-- .../impl/object/PCEPMetricObjectParser.java | 20 +- .../impl/object/PCEPNoPathObjectParser.java | 18 +- .../object/PCEPNotificationObjectParser.java | 16 +- .../PCEPObjectiveFunctionObjectParser.java | 12 +- .../impl/object/PCEPOpenObjectParser.java | 19 +- .../impl/object/PCEPPathKeyObjectParser.java | 13 +- .../object/PCEPReportedRouteObjectParser.java | 15 +- .../PCEPRequestParameterObjectParser.java | 20 +- .../impl/object/PCEPSvecObjectParser.java | 21 +- .../pcep/impl/PCEPObjectParserTest.java | 214 +++++++++--------- .../pcep/spi/AbstractMessageParser.java | 3 +- .../spi/AbstractObjectWithTlvsParser.java | 42 ++-- .../protocol/pcep/spi/ObjectParser.java | 4 +- .../protocol/pcep/spi/ObjectRegistry.java | 8 +- .../pcep/spi/pojo/SimpleObjectRegistry.java | 19 +- 34 files changed, 451 insertions(+), 397 deletions(-) diff --git a/pcep/ietf-stateful02/src/main/java/org/opendaylight/protocol/pcep/ietf/stateful02/Stateful02LspObjectParser.java b/pcep/ietf-stateful02/src/main/java/org/opendaylight/protocol/pcep/ietf/stateful02/Stateful02LspObjectParser.java index 2085c18340..b67f8225a3 100644 --- a/pcep/ietf-stateful02/src/main/java/org/opendaylight/protocol/pcep/ietf/stateful02/Stateful02LspObjectParser.java +++ b/pcep/ietf-stateful02/src/main/java/org/opendaylight/protocol/pcep/ietf/stateful02/Stateful02LspObjectParser.java @@ -7,6 +7,8 @@ */ package org.opendaylight.protocol.pcep.ietf.stateful02; +import io.netty.buffer.ByteBuf; + import java.util.BitSet; import org.opendaylight.protocol.pcep.spi.AbstractObjectWithTlvsParser; @@ -26,6 +28,8 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.typ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.ObjectHeader; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.Tlv; +import com.google.common.base.Preconditions; + /** * Parser for {@link Lsp} */ @@ -54,23 +58,24 @@ public class Stateful02LspObjectParser extends AbstractObjectWithTlvsParser> 4)); + int[] plspIdRaw = new int[] { + bytes.readUnsignedByte(), + bytes.readUnsignedByte(), + bytes.getUnsignedByte(2), + }; + builder.setPlspId(new PlspId((long) ((plspIdRaw[0] << 12) | (plspIdRaw[1] << 4) | (plspIdRaw[2] >> 4)))); + final BitSet flags = ByteArray.bytesToBitSet(ByteArray.readBytes(bytes, 2)); builder.setDelegate(flags.get(DELEGATE_FLAG_OFFSET)); builder.setSync(flags.get(SYNC_FLAG_OFFSET)); builder.setRemove(flags.get(REMOVE_FLAG_OFFSET)); builder.setOperational(flags.get(OPERATIONAL_FLAG_OFFSET)); final TlvsBuilder b = new TlvsBuilder(); - parseTlvs(b, ByteArray.cutBytes(bytes, TLVS_OFFSET)); + parseTlvs(b, bytes.slice()); builder.setTlvs(b.build()); return builder.build(); } diff --git a/pcep/ietf-stateful02/src/test/java/org/opendaylight/protocol/pcep/ietf/PCEPObjectParserTest.java b/pcep/ietf-stateful02/src/test/java/org/opendaylight/protocol/pcep/ietf/PCEPObjectParserTest.java index 9ee0c69a73..94a26dd48f 100644 --- a/pcep/ietf-stateful02/src/test/java/org/opendaylight/protocol/pcep/ietf/PCEPObjectParserTest.java +++ b/pcep/ietf-stateful02/src/test/java/org/opendaylight/protocol/pcep/ietf/PCEPObjectParserTest.java @@ -9,6 +9,8 @@ package org.opendaylight.protocol.pcep.ietf; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; import java.io.IOException; @@ -53,7 +55,7 @@ public class PCEPObjectParserTest { @Test public void testOpenObjectWithTLV() throws PCEPDeserializerException, IOException { final PCEPOpenObjectParser parser = new PCEPOpenObjectParser(this.tlvRegistry); - final byte[] result = ByteArray.fileToBytes("src/test/resources/PCEPOpenObject1.bin"); + final ByteBuf result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/PCEPOpenObject1.bin")); final OpenBuilder builder = new OpenBuilder(); builder.setProcessingRule(false); @@ -75,14 +77,14 @@ public class PCEPObjectParserTest { builder.setTlvs(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.open.TlvsBuilder().addAugmentation( Tlvs2.class, statBuilder.build()).addAugmentation(Tlvs1.class, cleanupBuilder.build()).build()); - assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(false, false), ByteArray.cutBytes(result, 4))); - assertArrayEquals(result, parser.serializeObject(builder.build())); + assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(false, false), result.slice(4, result.readableBytes() -4))); + assertArrayEquals(result.array(), parser.serializeObject(builder.build())); } @Test public void testLspaObjectWithTlv() throws IOException, PCEPDeserializerException { final Stateful02LspaObjectParser parser = new Stateful02LspaObjectParser(this.tlvRegistry); - final byte[] result = ByteArray.fileToBytes("src/test/resources/PCEPLspaObject1LowerBounds.bin"); + final ByteBuf result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/PCEPLspaObject1LowerBounds.bin")); final LspaBuilder builder = new LspaBuilder(); builder.setIgnore(false); @@ -105,20 +107,20 @@ public class PCEPObjectParserTest { new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated._00.rev140113.Tlvs2Builder().setSymbolicPathName( tlv).build()).build()); // Tlvs container does not contain toString - final Object o = parser.parseObject(new ObjectHeaderImpl(true, true), ByteArray.cutBytes(result, 4)); + final Object o = parser.parseObject(new ObjectHeaderImpl(true, true), result.slice(4, result.readableBytes() -4)); assertEquals( tlv, ((Lspa) o).getTlvs().getAugmentation( org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated._00.rev140113.Tlvs2.class).getSymbolicPathName()); // assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(true, true), ByteArray.cutBytes(result, // 4))); - assertArrayEquals(result, parser.serializeObject(builder.build())); + assertArrayEquals(result.array(), parser.serializeObject(builder.build())); } @Test public void testLspObjectWithTLV() throws IOException, PCEPDeserializerException { final Stateful02LspObjectParser parser = new Stateful02LspObjectParser(this.tlvRegistry); - final byte[] result = ByteArray.fileToBytes("src/test/resources/PCEPLspObject1WithTLV.bin"); + final ByteBuf result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/PCEPLspObject1WithTLV.bin")); final LspBuilder builder = new LspBuilder(); builder.setProcessingRule(true); @@ -132,7 +134,7 @@ public class PCEPObjectParserTest { final SymbolicPathName tlv2 = new SymbolicPathNameBuilder().setPathName( new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.stateful._02.rev140110.SymbolicPathName("Med".getBytes())).build(); builder.setTlvs(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.stateful._02.rev140110.lsp.object.lsp.TlvsBuilder().setSymbolicPathName(tlv2).build()); - assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(true, true), ByteArray.cutBytes(result, 4))); - assertArrayEquals(result, parser.serializeObject(builder.build())); + assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(true, true), result.slice(4, result.readableBytes() -4))); + assertArrayEquals(result.array(), parser.serializeObject(builder.build())); } } diff --git a/pcep/ietf-stateful07/src/main/java/org/opendaylight/protocol/pcep/ietf/initiated00/CInitiated00LspObjectParser.java b/pcep/ietf-stateful07/src/main/java/org/opendaylight/protocol/pcep/ietf/initiated00/CInitiated00LspObjectParser.java index 84bdad1762..a84dca3d89 100644 --- a/pcep/ietf-stateful07/src/main/java/org/opendaylight/protocol/pcep/ietf/initiated00/CInitiated00LspObjectParser.java +++ b/pcep/ietf-stateful07/src/main/java/org/opendaylight/protocol/pcep/ietf/initiated00/CInitiated00LspObjectParser.java @@ -7,6 +7,8 @@ */ package org.opendaylight.protocol.pcep.ietf.initiated00; +import io.netty.buffer.ByteBuf; + import java.util.BitSet; import org.opendaylight.protocol.pcep.ietf.stateful07.Stateful07LspObjectParser; @@ -24,6 +26,8 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.iet import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.Object; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.ObjectHeader; +import com.google.common.base.Preconditions; + /** * Parser for {@link Lsp} */ @@ -36,17 +40,18 @@ public final class CInitiated00LspObjectParser extends Stateful07LspObjectParser } @Override - public Lsp parseObject(final ObjectHeader header, final byte[] bytes) throws PCEPDeserializerException { - if (bytes == null || bytes.length == 0) { - throw new IllegalArgumentException("Array of bytes is mandatory. Can't be null or empty."); - } - final BitSet flags = ByteArray.bytesToBitSet(ByteArray.subByte(bytes, 2, 2)); - + public Lsp parseObject(final ObjectHeader header, final ByteBuf bytes) throws PCEPDeserializerException { + Preconditions.checkArgument(bytes != null && bytes.isReadable(), "Array of bytes is mandatory. Can't be null or empty."); final LspBuilder builder = new LspBuilder(); builder.setIgnore(header.isIgnore()); builder.setProcessingRule(header.isProcessingRule()); - - builder.setPlspId(new PlspId((ByteArray.bytesToLong(ByteArray.subByte(bytes, 0, 2)) & 0xFFFF) << 4 | (bytes[2] & 0xFF) >> 4)); + int[] plspIdRaw = new int[] { + bytes.readUnsignedByte(), + bytes.readUnsignedByte(), + bytes.getUnsignedByte(2), + }; + builder.setPlspId(new PlspId((long) ((plspIdRaw[0] << 12) | (plspIdRaw[1] << 4) | (plspIdRaw[2] >> 4)))); + final BitSet flags = ByteArray.bytesToBitSet(ByteArray.readBytes(bytes, 2)); builder.setDelegate(flags.get(DELEGATE_FLAG_OFFSET)); builder.setSync(flags.get(SYNC_FLAG_OFFSET)); builder.setRemove(flags.get(REMOVE_FLAG_OFFSET)); @@ -58,7 +63,7 @@ public final class CInitiated00LspObjectParser extends Stateful07LspObjectParser s |= (flags.get(OPERATIONAL_OFFSET) ? 1 : 0) << 2; builder.setOperational(OperationalStatus.forValue(s)); final TlvsBuilder b = new TlvsBuilder(); - parseTlvs(b, ByteArray.cutBytes(bytes, TLVS_OFFSET)); + parseTlvs(b, bytes.slice()); builder.setTlvs(b.build()); return builder.build(); } diff --git a/pcep/ietf-stateful07/src/main/java/org/opendaylight/protocol/pcep/ietf/initiated00/CInitiated00SrpObjectParser.java b/pcep/ietf-stateful07/src/main/java/org/opendaylight/protocol/pcep/ietf/initiated00/CInitiated00SrpObjectParser.java index a3de16c113..7c8537b61a 100644 --- a/pcep/ietf-stateful07/src/main/java/org/opendaylight/protocol/pcep/ietf/initiated00/CInitiated00SrpObjectParser.java +++ b/pcep/ietf-stateful07/src/main/java/org/opendaylight/protocol/pcep/ietf/initiated00/CInitiated00SrpObjectParser.java @@ -7,6 +7,8 @@ */ package org.opendaylight.protocol.pcep.ietf.initiated00; +import io.netty.buffer.ByteBuf; + import java.util.Arrays; import java.util.BitSet; @@ -23,6 +25,8 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.iet import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.Object; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.ObjectHeader; +import com.google.common.base.Preconditions; + /** * Parser for {@link Srp} */ @@ -35,12 +39,10 @@ public final class CInitiated00SrpObjectParser extends Stateful07SrpObjectParser } @Override - public Srp parseObject(final ObjectHeader header, final byte[] bytes) throws PCEPDeserializerException { - if (bytes == null || bytes.length == 0) { - throw new IllegalArgumentException("Array of bytes is mandatory. Can't be null or empty."); - } - if (bytes.length < MIN_SIZE) { - throw new PCEPDeserializerException("Wrong length of array of bytes. Passed: " + bytes.length + "; Expected: >=" + MIN_SIZE + public Srp parseObject(final ObjectHeader header, final ByteBuf bytes) throws PCEPDeserializerException { + Preconditions.checkArgument(bytes != null && bytes.isReadable(), "Array of bytes is mandatory. Can't be null or empty."); + if (bytes.readableBytes() < MIN_SIZE) { + throw new PCEPDeserializerException("Wrong length of array of bytes. Passed: " + bytes.readableBytes() + "; Expected: >=" + MIN_SIZE + "."); } if (header.isProcessingRule()) { @@ -49,13 +51,13 @@ public final class CInitiated00SrpObjectParser extends Stateful07SrpObjectParser final SrpBuilder builder = new SrpBuilder(); builder.setIgnore(header.isIgnore()); builder.setProcessingRule(header.isProcessingRule()); - final BitSet flags = ByteArray.bytesToBitSet(ByteArray.subByte(bytes, 0, FLAGS_SIZE)); + final BitSet flags = ByteArray.bytesToBitSet(ByteArray.readBytes(bytes, FLAGS_SIZE)); builder.addAugmentation(Srp1.class, new Srp1Builder().setRemove(flags.get(REMOVE_FLAG)).build()); - final byte[] srpId = ByteArray.subByte(bytes, FLAGS_SIZE, SRP_ID_SIZE); - if (Arrays.equals(srpId, new byte[] { 0, 0, 0, 0 }) || Arrays.equals(srpId, new byte[] { 0xFFFFFFFF })) { - throw new PCEPDeserializerException("Min/Max values for SRP ID are reserved."); + final byte[] srpId = ByteArray.getBytes(bytes, SRP_ID_SIZE); + if (Arrays.equals(srpId, new byte[] { 0xFFFFFFFF })) { + throw new PCEPDeserializerException("Max values for SRP ID are reserved."); } - builder.setOperationId(new SrpIdNumber(ByteArray.bytesToLong(srpId))); + builder.setOperationId(new SrpIdNumber(bytes.readUnsignedInt())); return builder.build(); } diff --git a/pcep/ietf-stateful07/src/main/java/org/opendaylight/protocol/pcep/ietf/stateful07/Stateful07LspObjectParser.java b/pcep/ietf-stateful07/src/main/java/org/opendaylight/protocol/pcep/ietf/stateful07/Stateful07LspObjectParser.java index 148eac48b0..bd8f75ff81 100644 --- a/pcep/ietf-stateful07/src/main/java/org/opendaylight/protocol/pcep/ietf/stateful07/Stateful07LspObjectParser.java +++ b/pcep/ietf-stateful07/src/main/java/org/opendaylight/protocol/pcep/ietf/stateful07/Stateful07LspObjectParser.java @@ -7,6 +7,8 @@ */ package org.opendaylight.protocol.pcep.ietf.stateful07; +import io.netty.buffer.ByteBuf; + import java.util.BitSet; import org.opendaylight.protocol.pcep.spi.AbstractObjectWithTlvsParser; @@ -59,17 +61,18 @@ public class Stateful07LspObjectParser extends AbstractObjectWithTlvsParser> 4)); + int[] plspIdRaw = new int[] { + bytes.readUnsignedByte(), + bytes.readUnsignedByte(), + bytes.getUnsignedByte(2), + }; + builder.setPlspId(new PlspId((long) ((plspIdRaw[0] << 12) | (plspIdRaw[1] << 4) | (plspIdRaw[2] >> 4)))); + final BitSet flags = ByteArray.bytesToBitSet(ByteArray.readBytes(bytes, 2)); builder.setDelegate(flags.get(DELEGATE_FLAG_OFFSET)); builder.setSync(flags.get(SYNC_FLAG_OFFSET)); builder.setRemove(flags.get(REMOVE_FLAG_OFFSET)); @@ -80,7 +83,7 @@ public class Stateful07LspObjectParser extends AbstractObjectWithTlvsParser=" + MIN_SIZE + public Srp parseObject(final ObjectHeader header, final ByteBuf bytes) throws PCEPDeserializerException { + Preconditions.checkArgument(bytes != null && bytes.isReadable(), "Array of bytes is mandatory. Can't be null or empty."); + if (bytes.readableBytes() < MIN_SIZE) { + throw new PCEPDeserializerException("Wrong length of array of bytes. Passed: " + bytes.readableBytes() + "; Expected: >=" + MIN_SIZE + "."); } if (header.isProcessingRule()) { @@ -60,11 +62,12 @@ public class Stateful07SrpObjectParser extends AbstractObjectWithTlvsParser { private static final int BANDWIDTH_F_LENGTH = 4; @@ -23,18 +28,16 @@ abstract class AbstractBandwidthParser extends AbstractObjectWithTlvsParser subs = Lists.newArrayList(); - for (final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.explicit.route.object.ero.Subobject s : parseSubobjects(bytes)) { + final List subs = new ArrayList<>(); + //FIXME: switch to ByteBuf + for (final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.explicit.route.object.ero.Subobject s : parseSubobjects(ByteArray.readAllBytes(bytes))) { subs.add(new SubobjectBuilder().setSubobjectType(s.getSubobjectType()).build()); } builder.setSubobject(subs); diff --git a/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/object/PCEPLoadBalancingObjectParser.java b/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/object/PCEPLoadBalancingObjectParser.java index bdec9e875a..82d7404e71 100644 --- a/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/object/PCEPLoadBalancingObjectParser.java +++ b/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/object/PCEPLoadBalancingObjectParser.java @@ -7,6 +7,8 @@ */ package org.opendaylight.protocol.pcep.impl.object; +import io.netty.buffer.ByteBuf; + import org.opendaylight.protocol.pcep.spi.AbstractObjectWithTlvsParser; import org.opendaylight.protocol.pcep.spi.ObjectUtil; import org.opendaylight.protocol.pcep.spi.PCEPDeserializerException; @@ -18,6 +20,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.typ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.load.balancing.object.LoadBalancing; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.load.balancing.object.LoadBalancingBuilder; +import com.google.common.base.Preconditions; import com.google.common.primitives.UnsignedBytes; /** @@ -44,18 +47,17 @@ public class PCEPLoadBalancingObjectParser extends AbstractObjectWithTlvsParser< } @Override - public LoadBalancing parseObject(final ObjectHeader header, final byte[] bytes) throws PCEPDeserializerException { - if (bytes == null || bytes.length == 0) { - throw new IllegalArgumentException("Byte array is mandatory. Can't be null or empty."); - } - if (bytes.length != SIZE) { - throw new PCEPDeserializerException("Wrong length of array of bytes. Passed: " + bytes.length + "; Expected: " + SIZE + "."); + public LoadBalancing parseObject(final ObjectHeader header, final ByteBuf bytes) throws PCEPDeserializerException { + Preconditions.checkArgument(bytes != null && bytes.isReadable(), "Array of bytes is mandatory. Can't be null or empty."); + if (bytes.readableBytes() != SIZE) { + throw new PCEPDeserializerException("Wrong length of array of bytes. Passed: " + bytes.readableBytes()+ "; Expected: " + SIZE + "."); } final LoadBalancingBuilder builder = new LoadBalancingBuilder(); builder.setIgnore(header.isIgnore()); builder.setProcessingRule(header.isProcessingRule()); - builder.setMaxLsp((short) UnsignedBytes.toInt(bytes[MAX_LSP_F_OFFSET])); - builder.setMinBandwidth(new Bandwidth(ByteArray.subByte(bytes, MIN_BAND_F_OFFSET, MIN_BAND_F_LENGTH))); + bytes.readerIndex(bytes.readerIndex() + MAX_LSP_F_OFFSET); + builder.setMaxLsp((short) UnsignedBytes.toInt(bytes.readByte())); + builder.setMinBandwidth(new Bandwidth(ByteArray.readBytes(bytes, MIN_BAND_F_LENGTH))); return builder.build(); } diff --git a/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/object/PCEPLspaObjectParser.java b/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/object/PCEPLspaObjectParser.java index 76e0f267f8..ce7988ca9a 100644 --- a/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/object/PCEPLspaObjectParser.java +++ b/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/object/PCEPLspaObjectParser.java @@ -7,6 +7,8 @@ */ package org.opendaylight.protocol.pcep.impl.object; +import io.netty.buffer.ByteBuf; + import java.util.BitSet; import org.opendaylight.protocol.pcep.spi.AbstractObjectWithTlvsParser; @@ -22,6 +24,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.typ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.lspa.object.lspa.TlvsBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev130820.AttributeFilter; +import com.google.common.base.Preconditions; import com.google.common.primitives.UnsignedBytes; /** @@ -64,26 +67,24 @@ public class PCEPLspaObjectParser extends AbstractObjectWithTlvsParser pk = Lists.newArrayList(); - final List subs = parseSubobjects(bytes); + final List pk = new ArrayList<>(); + //FIXME: switch to ByteBuf + final List subs = parseSubobjects(ByteArray.readAllBytes(bytes)); for (final Subobject s : subs) { final org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.explicit.route.object.ero.subobject.subobject.type.PathKeyCase k = (org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.explicit.route.object.ero.subobject.subobject.type.PathKeyCase) s.getSubobjectType(); pk.add(new PathKeysBuilder().setLoose(s.isLoose()).setPceId(k.getPathKey().getPceId()).setPathKey(k.getPathKey().getPathKey()).build()); diff --git a/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/object/PCEPReportedRouteObjectParser.java b/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/object/PCEPReportedRouteObjectParser.java index d8dc5a66eb..ec29b4a6d7 100644 --- a/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/object/PCEPReportedRouteObjectParser.java +++ b/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/object/PCEPReportedRouteObjectParser.java @@ -7,14 +7,19 @@ */ package org.opendaylight.protocol.pcep.impl.object; +import io.netty.buffer.ByteBuf; + import org.opendaylight.protocol.pcep.spi.ObjectUtil; import org.opendaylight.protocol.pcep.spi.PCEPDeserializerException; import org.opendaylight.protocol.pcep.spi.RROSubobjectRegistry; +import org.opendaylight.protocol.util.ByteArray; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.Object; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.ObjectHeader; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.reported.route.object.Rro; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.reported.route.object.RroBuilder; +import com.google.common.base.Preconditions; + /** * Parser for {@link Rro} */ @@ -29,15 +34,13 @@ public class PCEPReportedRouteObjectParser extends AbstractRROWithSubobjectsPars } @Override - public Rro parseObject(final ObjectHeader header, final byte[] bytes) throws PCEPDeserializerException { - if (bytes == null || bytes.length == 0) { - throw new IllegalArgumentException("Byte array is mandatory. Can't be null or empty."); - } + public Rro parseObject(final ObjectHeader header, final ByteBuf bytes) throws PCEPDeserializerException { + Preconditions.checkArgument(bytes != null && bytes.isReadable(), "Array of bytes is mandatory. Can't be null or empty."); final RroBuilder builder = new RroBuilder(); - builder.setIgnore(header.isIgnore()); builder.setProcessingRule(header.isProcessingRule()); - builder.setSubobject(parseSubobjects(bytes)); + //FIXME: switch to ByteBuf + builder.setSubobject(parseSubobjects(ByteArray.readAllBytes(bytes))); return builder.build(); } diff --git a/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/object/PCEPRequestParameterObjectParser.java b/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/object/PCEPRequestParameterObjectParser.java index 3b9e7631ba..400d78f57a 100644 --- a/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/object/PCEPRequestParameterObjectParser.java +++ b/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/object/PCEPRequestParameterObjectParser.java @@ -8,7 +8,8 @@ package org.opendaylight.protocol.pcep.impl.object; -import java.util.Arrays; +import io.netty.buffer.ByteBuf; + import java.util.BitSet; import org.opendaylight.protocol.pcep.spi.AbstractObjectWithTlvsParser; @@ -26,6 +27,8 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.typ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.rp.object.rp.Tlvs; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.rp.object.rp.TlvsBuilder; +import com.google.common.base.Preconditions; + /** * Parser for {@link Rp} */ @@ -97,13 +100,9 @@ public class PCEPRequestParameterObjectParser extends AbstractObjectWithTlvsPars } @Override - public Object parseObject(final ObjectHeader header, final byte[] bytes) throws PCEPDeserializerException { - if (bytes == null || bytes.length == 0) { - throw new IllegalArgumentException("Array of bytes is mandatory. Can't be null or empty."); - } - - final BitSet flags = ByteArray.bytesToBitSet(Arrays.copyOfRange(bytes, FLAGS_PRI_MF_OFFSET, FLAGS_PRI_MF_OFFSET - + FLAGS_PRI_MF_LENGTH)); + public Object parseObject(final ObjectHeader header, final ByteBuf bytes) throws PCEPDeserializerException { + Preconditions.checkArgument(bytes != null && bytes.isReadable(), "Array of bytes is mandatory. Can't be null or empty."); + final BitSet flags = ByteArray.bytesToBitSet(ByteArray.readBytes(bytes, FLAGS_PRI_MF_LENGTH)); short priority = 0; priority |= flags.get(PRI_SF_OFFSET + 2) ? 1 : 0; priority |= (flags.get(PRI_SF_OFFSET + 1) ? 1 : 0) << 1; @@ -125,9 +124,8 @@ public class PCEPRequestParameterObjectParser extends AbstractObjectWithTlvsPars builder.setBiDirectional(flags.get(B_FLAG_OFFSET)); builder.setReoptimization(flags.get(R_FLAG_OFFSET)); - builder.setRequestId(new RequestId(ByteArray.bytesToLong(Arrays.copyOfRange(bytes, RID_F_OFFSET, RID_F_OFFSET + RID_F_LENGTH)))); - parseTlvs(builder, ByteArray.cutBytes(bytes, TLVS_OFFSET)); - + builder.setRequestId(new RequestId(bytes.readUnsignedInt())); + parseTlvs(builder, bytes.slice()); return builder.build(); } diff --git a/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/object/PCEPSvecObjectParser.java b/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/object/PCEPSvecObjectParser.java index c58aac13ba..fd6c4e194e 100644 --- a/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/object/PCEPSvecObjectParser.java +++ b/pcep/impl/src/main/java/org/opendaylight/protocol/pcep/impl/object/PCEPSvecObjectParser.java @@ -7,6 +7,8 @@ */ package org.opendaylight.protocol.pcep.impl.object; +import io.netty.buffer.ByteBuf; + import java.util.BitSet; import java.util.List; @@ -21,6 +23,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.typ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.svec.object.Svec; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.svec.object.SvecBuilder; +import com.google.common.base.Preconditions; import com.google.common.collect.Lists; /** @@ -61,19 +64,17 @@ public class PCEPSvecObjectParser extends AbstractObjectWithTlvsParser=" + MIN_SIZE - + "."); + public Svec parseObject(final ObjectHeader header, final ByteBuf bytes) throws PCEPDeserializerException { + Preconditions.checkArgument(bytes != null && bytes.isReadable(), "Array of bytes is mandatory. Can't be null or empty."); + if (bytes.readableBytes() < MIN_SIZE) { + throw new PCEPDeserializerException("Wrong length of array of bytes. Passed: " + bytes.readableBytes() + "; Expected: >=" + MIN_SIZE + "."); } - final BitSet flags = ByteArray.bytesToBitSet(ByteArray.subByte(bytes, FLAGS_F_OFFSET, FLAGS_F_LENGTH)); + bytes.readerIndex(bytes.readerIndex() + FLAGS_F_OFFSET); + final BitSet flags = ByteArray.bytesToBitSet(ByteArray.readBytes(bytes, FLAGS_F_LENGTH)); final List requestIDs = Lists.newArrayList(); - for (int i = REQ_ID_LIST_OFFSET; i < bytes.length; i += REQ_LIST_ITEM_LENGTH) { - requestIDs.add(new RequestId(ByteArray.bytesToLong(ByteArray.subByte(bytes, i, REQ_LIST_ITEM_LENGTH)))); + while (bytes.isReadable()) { + requestIDs.add(new RequestId(bytes.readUnsignedInt())); } if (requestIDs.isEmpty()) { throw new PCEPDeserializerException("Empty Svec Object - no request ids."); diff --git a/pcep/impl/src/test/java/org/opendaylight/protocol/pcep/impl/PCEPObjectParserTest.java b/pcep/impl/src/test/java/org/opendaylight/protocol/pcep/impl/PCEPObjectParserTest.java index 9cfd4da7c1..48cfa69ad6 100644 --- a/pcep/impl/src/test/java/org/opendaylight/protocol/pcep/impl/PCEPObjectParserTest.java +++ b/pcep/impl/src/test/java/org/opendaylight/protocol/pcep/impl/PCEPObjectParserTest.java @@ -12,6 +12,8 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; import java.io.IOException; import java.util.List; @@ -123,7 +125,7 @@ public class PCEPObjectParserTest { @Test public void testOpenObjectWOTLV() throws PCEPDeserializerException, IOException { final PCEPOpenObjectParser parser = new PCEPOpenObjectParser(this.tlvRegistry); - final byte[] result = ByteArray.fileToBytes("src/test/resources/PCEPOpenObject1.bin"); + final ByteBuf result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/PCEPOpenObject1.bin")); final OpenBuilder builder = new OpenBuilder(); builder.setProcessingRule(false); @@ -135,28 +137,28 @@ public class PCEPObjectParserTest { builder.setTlvs(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.open.TlvsBuilder().build()); - assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(false, false), ByteArray.cutBytes(result, 4))); - assertArrayEquals(result, parser.serializeObject(builder.build())); + assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(false, false), result.slice(4, result.readableBytes() -4))); + assertArrayEquals(result.array(), parser.serializeObject(builder.build())); } @Test public void testCloseObject() throws IOException, PCEPDeserializerException { final PCEPCloseObjectParser parser = new PCEPCloseObjectParser(this.tlvRegistry); - final byte[] result = ByteArray.fileToBytes("src/test/resources/PCEPCloseObject1.bin"); + final ByteBuf result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/PCEPCloseObject1.bin")); final CCloseBuilder builder = new CCloseBuilder(); builder.setProcessingRule(false); builder.setIgnore(false); builder.setReason((short) 5); - assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(false, false), ByteArray.cutBytes(result, 4))); - assertArrayEquals(result, parser.serializeObject(builder.build())); + assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(false, false), result.slice(4, result.readableBytes() -4))); + assertArrayEquals(result.array(), parser.serializeObject(builder.build())); } @Test public void testLoadBalancingObject() throws IOException, PCEPDeserializerException { final PCEPLoadBalancingObjectParser parser = new PCEPLoadBalancingObjectParser(this.tlvRegistry); - final byte[] result = ByteArray.fileToBytes("src/test/resources/PCEPLoadBalancingObject1.bin"); + final ByteBuf result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/PCEPLoadBalancingObject1.bin")); final LoadBalancingBuilder builder = new LoadBalancingBuilder(); builder.setProcessingRule(true); @@ -164,14 +166,14 @@ public class PCEPObjectParserTest { builder.setMaxLsp((short) UnsignedBytes.toInt((byte) 0xf1)); builder.setMinBandwidth(new Bandwidth(new byte[] { (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF })); - assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(true, false), ByteArray.cutBytes(result, 4))); - assertArrayEquals(result, parser.serializeObject(builder.build())); + assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(true, false), result.slice(4, result.readableBytes() -4))); + assertArrayEquals(result.array(), parser.serializeObject(builder.build())); } @Test public void testERObject() throws Exception { final PCEPExplicitRouteObjectParser parser = new PCEPExplicitRouteObjectParser(this.ctx.getEROSubobjectHandlerRegistry()); - final byte[] result = ByteArray.fileToBytes("src/test/resources/PCEPExplicitRouteObject1PackOfSubobjects.bin"); + final ByteBuf result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/PCEPExplicitRouteObject1PackOfSubobjects.bin")); final EroBuilder builder = new EroBuilder(); builder.setProcessingRule(false); @@ -179,25 +181,25 @@ public class PCEPObjectParserTest { final List subs = Lists.newArrayList(); subs.add(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.explicit.route.object.ero.SubobjectBuilder().setLoose( true).setSubobjectType( - new AsNumberCaseBuilder().setAsNumber(new AsNumberBuilder().setAsNumber(new AsNumber(0xffffL)).build()).build()).build()); + new AsNumberCaseBuilder().setAsNumber(new AsNumberBuilder().setAsNumber(new AsNumber(0xffffL)).build()).build()).build()); subs.add(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.explicit.route.object.ero.SubobjectBuilder().setLoose( true).setSubobjectType( - new IpPrefixCaseBuilder().setIpPrefix( - new IpPrefixBuilder().setIpPrefix(new IpPrefix(new Ipv4Prefix("255.255.255.255/32"))).build()).build()).build()); + new IpPrefixCaseBuilder().setIpPrefix( + new IpPrefixBuilder().setIpPrefix(new IpPrefix(new Ipv4Prefix("255.255.255.255/32"))).build()).build()).build()); subs.add(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.explicit.route.object.ero.SubobjectBuilder().setLoose( true).setSubobjectType( - new UnnumberedCaseBuilder().setUnnumbered( - new UnnumberedBuilder().setRouterId(0xffffffffL).setInterfaceId(0xffffffffL).build()).build()).build()); + new UnnumberedCaseBuilder().setUnnumbered( + new UnnumberedBuilder().setRouterId(0xffffffffL).setInterfaceId(0xffffffffL).build()).build()).build()); builder.setSubobject(subs); - assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(false, false), ByteArray.cutBytes(result, 4))); - assertArrayEquals(result, parser.serializeObject(builder.build())); + assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(false, false), result.slice(4, result.readableBytes() -4))); + assertArrayEquals(result.array(), parser.serializeObject(builder.build())); } @Test public void testIRObject() throws Exception { final PCEPIncludeRouteObjectParser parser = new PCEPIncludeRouteObjectParser(this.ctx.getEROSubobjectHandlerRegistry()); - final byte[] result = ByteArray.fileToBytes("src/test/resources/PCEPIncludeRouteObject1PackOfSubobjects.bin"); + final ByteBuf result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/PCEPIncludeRouteObject1PackOfSubobjects.bin")); final byte[] ip6PrefixBytes = { (byte) 0x12, (byte) 0x34, (byte) 0x54, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00 }; @@ -218,14 +220,14 @@ public class PCEPObjectParserTest { new UnnumberedBuilder().setRouterId(0x1245678L).setInterfaceId(0x9abcdef0L).build()).build()).build()); builder.setSubobject(subs); - assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(false, false), ByteArray.cutBytes(result, 4))); - assertArrayEquals(result, parser.serializeObject(builder.build())); + assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(false, false), result.slice(4, result.readableBytes() -4))); + assertArrayEquals(result.array(), parser.serializeObject(builder.build())); } @Test public void testRRObject() throws Exception { final PCEPReportedRouteObjectParser parser = new PCEPReportedRouteObjectParser(this.ctx.getRROSubobjectHandlerRegistry()); - final byte[] result = ByteArray.fileToBytes("src/test/resources/PCEPReportedRouteObject1PackOfSubobjects.bin"); + final ByteBuf result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/PCEPReportedRouteObject1PackOfSubobjects.bin")); final byte[] ip6PrefixBytes = { (byte) 0x12, (byte) 0x34, (byte) 0x54, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00 }; @@ -237,49 +239,49 @@ public class PCEPObjectParserTest { new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev130820.record.route.subobjects.subobject.type.IpPrefixCaseBuilder().setIpPrefix( new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev130820.record.route.subobjects.subobject.type.ip.prefix._case.IpPrefixBuilder().setIpPrefix( new IpPrefix(new Ipv4Prefix("255.255.255.255/32"))).build()).build()).setProtectionAvailable(false).setProtectionInUse( - false).build()); + false).build()); subs.add(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.reported.route.object.rro.SubobjectBuilder().setSubobjectType( new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev130820.record.route.subobjects.subobject.type.IpPrefixCaseBuilder().setIpPrefix( new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev130820.record.route.subobjects.subobject.type.ip.prefix._case.IpPrefixBuilder().setIpPrefix( new IpPrefix(Ipv6Util.prefixForBytes(ip6PrefixBytes, 22))).build()).build()).setProtectionAvailable(false).setProtectionInUse( - false).build()); + false).build()); subs.add(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.reported.route.object.rro.SubobjectBuilder().setSubobjectType( new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev130820.record.route.subobjects.subobject.type.UnnumberedCaseBuilder().setUnnumbered( new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.rsvp.rev130820.record.route.subobjects.subobject.type.unnumbered._case.UnnumberedBuilder().setRouterId( 0x1245678L).setInterfaceId(0x9abcdef0L).build()).build()).setProtectionAvailable(false).setProtectionInUse( - false).build()); + false).build()); builder.setSubobject(subs); - assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(false, false), ByteArray.cutBytes(result, 4))); - assertArrayEquals(result, parser.serializeObject(builder.build())); + assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(false, false), result.slice(4, result.readableBytes() -4))); + assertArrayEquals(result.array(), parser.serializeObject(builder.build())); } @Test public void testBandwidthObject() throws IOException, PCEPDeserializerException { final PCEPBandwidthObjectParser parser = new PCEPBandwidthObjectParser(this.tlvRegistry); - final byte[] result = ByteArray.fileToBytes("src/test/resources/PCEPBandwidthObject1LowerBounds.bin"); + final ByteBuf result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/PCEPBandwidthObject1LowerBounds.bin")); final BandwidthBuilder builder = new BandwidthBuilder(); builder.setProcessingRule(true); builder.setIgnore(true); builder.setBandwidth(new Bandwidth(new byte[] { (byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00 })); - assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(true, true), ByteArray.cutBytes(result, 4))); - assertArrayEquals(result, parser.serializeObject(builder.build())); + assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(true, true), result.slice(4, result.readableBytes() -4))); + assertArrayEquals(result.array(), parser.serializeObject(builder.build())); } @Test public void testExistingBandwidthObject() throws IOException, PCEPDeserializerException { final PCEPExistingBandwidthObjectParser parser = new PCEPExistingBandwidthObjectParser(this.tlvRegistry); - final byte[] result = ByteArray.fileToBytes("src/test/resources/PCEPBandwidthObject2UpperBounds.bin"); + final ByteBuf result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/PCEPBandwidthObject2UpperBounds.bin")); final BandwidthBuilder builder = new BandwidthBuilder(); builder.setProcessingRule(true); builder.setIgnore(true); builder.setBandwidth(new Bandwidth(new byte[] { (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF })); - assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(true, true), ByteArray.cutBytes(result, 4))); - assertArrayEquals(result, parser.serializeObject(builder.build())); + assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(true, true), result.slice(4, result.readableBytes() -4))); + assertArrayEquals(result.array(), parser.serializeObject(builder.build())); } @Test @@ -288,7 +290,7 @@ public class PCEPObjectParserTest { final byte[] destIPBytes = { (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF }; final PCEPEndPointsIpv4ObjectParser parser = new PCEPEndPointsIpv4ObjectParser(this.tlvRegistry); - final byte[] result = ByteArray.fileToBytes("src/test/resources/PCEPEndPointsObject1IPv4.bin"); + final ByteBuf result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/PCEPEndPointsObject1IPv4.bin")); final EndpointsObjBuilder builder = new EndpointsObjBuilder(); builder.setProcessingRule(true); @@ -297,8 +299,8 @@ public class PCEPObjectParserTest { new Ipv4Builder().setSourceIpv4Address(Ipv4Util.addressForBytes(srcIPBytes)).setDestinationIpv4Address( Ipv4Util.addressForBytes(destIPBytes)).build()).build()); - assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(true, false), ByteArray.cutBytes(result, 4))); - assertArrayEquals(result, parser.serializeObject(builder.build())); + assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(true, false), result.slice(4, result.readableBytes() -4))); + assertArrayEquals(result.array(), parser.serializeObject(builder.build())); } @Test @@ -309,7 +311,7 @@ public class PCEPObjectParserTest { (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF }; final PCEPEndPointsIpv6ObjectParser parser = new PCEPEndPointsIpv6ObjectParser(this.tlvRegistry); - final byte[] result = ByteArray.fileToBytes("src/test/resources/PCEPEndPointsObject2IPv6.bin"); + final ByteBuf result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/PCEPEndPointsObject2IPv6.bin")); final EndpointsObjBuilder builder = new EndpointsObjBuilder(); builder.setProcessingRule(true); @@ -318,14 +320,14 @@ public class PCEPObjectParserTest { new Ipv6Builder().setSourceIpv6Address(Ipv6Util.addressForBytes(srcIPBytes)).setDestinationIpv6Address( Ipv6Util.addressForBytes(destIPBytes)).build()).build()); - assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(true, false), ByteArray.cutBytes(result, 4))); - assertArrayEquals(result, parser.serializeObject(builder.build())); + assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(true, false), result.slice(4, result.readableBytes() -4))); + assertArrayEquals(result.array(), parser.serializeObject(builder.build())); } @Test public void testErrorObjectWithTlv() throws PCEPDeserializerException, IOException { final PCEPErrorObjectParser parser = new PCEPErrorObjectParser(this.tlvRegistry); - byte[] result = ByteArray.fileToBytes("src/test/resources/PCEPErrorObject1.bin"); + ByteBuf result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/PCEPErrorObject1.bin")); final ErrorObjectBuilder builder = new ErrorObjectBuilder(); builder.setProcessingRule(true); @@ -333,23 +335,23 @@ public class PCEPObjectParserTest { builder.setType((short) 1); builder.setValue((short) 1); - assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(true, true), ByteArray.cutBytes(result, 4))); - assertArrayEquals(result, parser.serializeObject(builder.build())); + assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(true, true), result.slice(4, result.readableBytes() -4))); + assertArrayEquals(result.array(), parser.serializeObject(builder.build())); - result = ByteArray.fileToBytes("src/test/resources/PCEPErrorObject3.bin"); + result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/PCEPErrorObject3.bin")); builder.setType((short) 7); builder.setValue((short) 0); builder.setTlvs(new TlvsBuilder().setReqMissing(new ReqMissingBuilder().setRequestId(new RequestId(0x00001155L)).build()).build()); - assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(true, true), ByteArray.cutBytes(result, 4))); - assertArrayEquals(result, parser.serializeObject(builder.build())); + assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(true, true), result.slice(4, result.readableBytes() -4))); + assertArrayEquals(result.array(), parser.serializeObject(builder.build())); } @Test public void testLspaObject() throws IOException, PCEPDeserializerException { final PCEPLspaObjectParser parser = new PCEPLspaObjectParser(this.tlvRegistry); - byte[] result = ByteArray.fileToBytes("src/test/resources/PCEPLspaObject1LowerBounds.bin"); + ByteBuf result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/PCEPLspaObject1LowerBounds.bin")); final LspaBuilder builder = new LspaBuilder(); builder.setProcessingRule(true); @@ -362,10 +364,10 @@ public class PCEPObjectParserTest { builder.setLocalProtectionDesired(false); builder.setTlvs(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.lspa.object.lspa.TlvsBuilder().build()); - assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(true, true), ByteArray.cutBytes(result, 4))); - assertArrayEquals(result, parser.serializeObject(builder.build())); + assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(true, true), result.slice(4, result.readableBytes() -4))); + assertArrayEquals(result.array(), parser.serializeObject(builder.build())); - result = ByteArray.fileToBytes("src/test/resources/PCEPLspaObject2UpperBounds.bin"); + result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/PCEPLspaObject2UpperBounds.bin")); builder.setExcludeAny(new AttributeFilter(0xFFFFFFFFL)); builder.setIncludeAny(new AttributeFilter(0xFFFFFFFFL)); @@ -374,14 +376,14 @@ public class PCEPObjectParserTest { builder.setSetupPriority((short) 0xFF); builder.setLocalProtectionDesired(true); - assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(true, true), ByteArray.cutBytes(result, 4))); - assertArrayEquals(result, parser.serializeObject(builder.build())); + assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(true, true), result.slice(4, result.readableBytes() -4))); + assertArrayEquals(result.array(), parser.serializeObject(builder.build())); } @Test public void testMetricObject() throws IOException, PCEPDeserializerException { final PCEPMetricObjectParser parser = new PCEPMetricObjectParser(this.tlvRegistry); - byte[] result = ByteArray.fileToBytes("src/test/resources/PCEPMetricObject1LowerBounds.bin"); + ByteBuf result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/PCEPMetricObject1LowerBounds.bin")); final MetricBuilder builder = new MetricBuilder(); builder.setProcessingRule(true); @@ -391,24 +393,24 @@ public class PCEPObjectParserTest { builder.setMetricType((short) 1); builder.setValue(new Float32(new byte[] { 0, 0, 0, 0 })); - assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(true, true), ByteArray.cutBytes(result, 4))); - assertArrayEquals(result, parser.serializeObject(builder.build())); + assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(true, true), result.slice(4, result.readableBytes() -4))); + assertArrayEquals(result.array(), parser.serializeObject(builder.build())); - result = ByteArray.fileToBytes("src/test/resources/PCEPMetricObject2UpperBounds.bin"); + result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/PCEPMetricObject2UpperBounds.bin")); builder.setComputed(true); builder.setBound(false); builder.setMetricType((short) 2); builder.setValue(new Float32(new byte[] { (byte) 0x4f, (byte) 0x70, (byte) 0x00, (byte) 0x00 })); - assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(true, true), ByteArray.cutBytes(result, 4))); - assertArrayEquals(result, parser.serializeObject(builder.build())); + assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(true, true), result.slice(4, result.readableBytes() -4))); + assertArrayEquals(result.array(), parser.serializeObject(builder.build())); } @Test public void testNoPathObjectWithTlv() throws PCEPDeserializerException, IOException { final PCEPNoPathObjectParser parser = new PCEPNoPathObjectParser(this.tlvRegistry); - byte[] result = ByteArray.fileToBytes("src/test/resources/PCEPNoPathObject1WithoutTLV.bin"); + ByteBuf result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/PCEPNoPathObject1WithoutTLV.bin")); final NoPathBuilder builder = new NoPathBuilder(); builder.setProcessingRule(true); @@ -416,10 +418,10 @@ public class PCEPObjectParserTest { builder.setNatureOfIssue((short) 1); builder.setUnsatisfiedConstraints(true); - assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(true, true), ByteArray.cutBytes(result, 4))); - assertArrayEquals(result, parser.serializeObject(builder.build())); + assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(true, true), result.slice(4, result.readableBytes() -4))); + assertArrayEquals(result.array(), parser.serializeObject(builder.build())); - result = ByteArray.fileToBytes("src/test/resources/PCEPNoPathObject2WithTLV.bin"); + result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/PCEPNoPathObject2WithTLV.bin")); builder.setNatureOfIssue((short) 0); builder.setUnsatisfiedConstraints(false); @@ -429,14 +431,14 @@ public class PCEPObjectParserTest { builder.setTlvs(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.pcrep.message.pcrep.message.replies.result.failure._case.no.path.TlvsBuilder().setNoPathVector( b.build()).build()); - assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(true, true), ByteArray.cutBytes(result, 4))); - assertArrayEquals(result, parser.serializeObject(builder.build())); + assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(true, true), result.slice(4, result.readableBytes() -4))); + assertArrayEquals(result.array(), parser.serializeObject(builder.build())); } @Test public void testNotifyObjectWithTlv() throws PCEPDeserializerException, IOException { final PCEPNotificationObjectParser parser = new PCEPNotificationObjectParser(this.tlvRegistry); - byte[] result = ByteArray.fileToBytes("src/test/resources/PCEPNotificationObject2WithoutTlv.bin"); + ByteBuf result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/PCEPNotificationObject2WithoutTlv.bin")); final CNotificationBuilder builder = new CNotificationBuilder(); builder.setProcessingRule(true); @@ -444,24 +446,24 @@ public class PCEPObjectParserTest { builder.setType((short) 0xff); builder.setValue((short) 0xff); - assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(true, true), ByteArray.cutBytes(result, 4))); - assertArrayEquals(result, parser.serializeObject(builder.build())); + assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(true, true), result.slice(4, result.readableBytes() -4))); + assertArrayEquals(result.array(), parser.serializeObject(builder.build())); - result = ByteArray.fileToBytes("src/test/resources/PCEPNotificationObject1WithTlv.bin"); + result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/PCEPNotificationObject1WithTlv.bin")); builder.setType((short) 2); builder.setValue((short) 1); builder.setTlvs(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.notification.object.c.notification.TlvsBuilder().setOverloadDuration( new OverloadDurationBuilder().setDuration(0xff0000a2L).build()).build()); - assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(true, true), ByteArray.cutBytes(result, 4))); - assertArrayEquals(result, parser.serializeObject(builder.build())); + assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(true, true), result.slice(4, result.readableBytes() -4))); + assertArrayEquals(result.array(), parser.serializeObject(builder.build())); } @Test public void testRPObjectWithTlv() throws PCEPDeserializerException, IOException { final PCEPRequestParameterObjectParser parser = new PCEPRequestParameterObjectParser(this.tlvRegistry); - byte[] result = ByteArray.fileToBytes("src/test/resources/PCEPRPObject1.bin"); + ByteBuf result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/PCEPRPObject1.bin")); final RpBuilder builder = new RpBuilder(); builder.setProcessingRule(true); @@ -479,10 +481,10 @@ public class PCEPObjectParserTest { builder.setPriority((short) 5); builder.setRequestId(new RequestId(0xdeadbeefL)); - assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(true, true), ByteArray.cutBytes(result, 4))); - assertArrayEquals(result, parser.serializeObject(builder.build())); + assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(true, true),result.slice(4, result.readableBytes() -4))); + assertArrayEquals(result.array(), parser.serializeObject(builder.build())); - result = ByteArray.fileToBytes("src/test/resources/PCEPRPObject2.bin"); + result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/PCEPRPObject2.bin")); builder.setReoptimization(false); builder.setFragmentation(true); @@ -495,14 +497,14 @@ public class PCEPObjectParserTest { builder.setTlvs(new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.rp.object.rp.TlvsBuilder().setOrder( b.build()).build()); - assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(true, true), ByteArray.cutBytes(result, 4))); - assertArrayEquals(result, parser.serializeObject(builder.build())); + assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(true, true), result.slice(4, result.readableBytes() -4))); + assertArrayEquals(result.array(), parser.serializeObject(builder.build())); } @Test public void testSvecObject() throws IOException, PCEPDeserializerException { final PCEPSvecObjectParser parser = new PCEPSvecObjectParser(this.tlvRegistry); - byte[] result = ByteArray.fileToBytes("src/test/resources/PCEPSvecObject2.bin"); + ByteBuf result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/PCEPSvecObject2.bin")); final SvecBuilder builder = new SvecBuilder(); builder.setProcessingRule(false); @@ -512,10 +514,10 @@ public class PCEPObjectParserTest { builder.setSrlgDiverse(false); builder.setRequestsIds(Lists.newArrayList(new RequestId(0xFFL))); - assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(false, false), ByteArray.cutBytes(result, 4))); - assertArrayEquals(result, parser.serializeObject(builder.build())); + assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(false, false), result.slice(4, result.readableBytes() -4))); + assertArrayEquals(result.array(), parser.serializeObject(builder.build())); - result = ByteArray.fileToBytes("src/test/resources/PCEPSvecObject1_10ReqIDs.bin"); + result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/PCEPSvecObject1_10ReqIDs.bin")); builder.setProcessingRule(true); builder.setLinkDiverse(true); @@ -535,28 +537,28 @@ public class PCEPObjectParserTest { builder.setRequestsIds(requestIDs); - assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(true, false), ByteArray.cutBytes(result, 4))); - assertArrayEquals(result, parser.serializeObject(builder.build())); + assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(true, false), result.slice(4, result.readableBytes() -4))); + assertArrayEquals(result.array(), parser.serializeObject(builder.build())); } @Test public void testClassTypeObject() throws PCEPDeserializerException { final PCEPClassTypeObjectParser parser = new PCEPClassTypeObjectParser(this.tlvRegistry); - final byte[] result = new byte[] { (byte) 0x16, (byte) 0x12, (byte) 0x00, (byte) 0x08, 0, 0, 0, (byte) 0x04 }; + final ByteBuf result = Unpooled.wrappedBuffer(new byte[] { (byte) 0x16, (byte) 0x12, (byte) 0x00, (byte) 0x08, 0, 0, 0, (byte) 0x04 }); final ClassTypeBuilder builder = new ClassTypeBuilder(); builder.setProcessingRule(true); builder.setIgnore(false); builder.setClassType(new ClassType((short) 4)); - assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(true, false), ByteArray.cutBytes(result, 4))); - assertArrayEquals(result, parser.serializeObject(builder.build())); + assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(true, false), result.slice(4, result.readableBytes() -4))); + assertArrayEquals(result.array(), parser.serializeObject(builder.build())); } @Test public void testExcludeRouteObject() throws Exception { final PCEPExcludeRouteObjectParser parser = new PCEPExcludeRouteObjectParser(this.ctx.getXROSubobjectHandlerRegistry()); - final byte[] result = ByteArray.fileToBytes("src/test/resources/PCEPExcludeRouteObject.1.bin"); + final ByteBuf result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/PCEPExcludeRouteObject.1.bin")); final XroBuilder builder = new XroBuilder(); builder.setProcessingRule(false); @@ -566,19 +568,19 @@ public class PCEPObjectParserTest { subs.add(new SubobjectBuilder().setMandatory(true).setSubobjectType( new IpPrefixCaseBuilder().setIpPrefix( new IpPrefixBuilder().setIpPrefix(new IpPrefix(new Ipv4Prefix("192.168.0.0/16"))).build()).build()).setAttribute( - Attribute.Node).build()); + Attribute.Node).build()); subs.add(new SubobjectBuilder().setMandatory(false).setSubobjectType( new AsNumberCaseBuilder().setAsNumber(new AsNumberBuilder().setAsNumber(new AsNumber(0x1234L)).build()).build()).build()); builder.setSubobject(subs); - assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(false, false), ByteArray.cutBytes(result, 4))); - assertArrayEquals(result, parser.serializeObject(builder.build())); + assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(false, false), result.slice(4, result.readableBytes() -4))); + assertArrayEquals(result.array(), parser.serializeObject(builder.build())); } @Test public void testPathKeyObject() throws Exception { final PCEPPathKeyObjectParser parser = new PCEPPathKeyObjectParser(this.ctx.getEROSubobjectHandlerRegistry()); - final byte[] result = ByteArray.fileToBytes("src/test/resources/PCEPPathKeyObject.bin"); + final ByteBuf result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/PCEPPathKeyObject.bin")); final PathKeyBuilder builder = new PathKeyBuilder(); builder.setProcessingRule(true); @@ -588,28 +590,28 @@ public class PCEPObjectParserTest { new PceId(new byte[] { (byte) 0x12, (byte) 0x34, (byte) 0x50, (byte) 0x00 })).build()); builder.setPathKeys(list); - assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(true, false), ByteArray.cutBytes(result, 4))); - assertArrayEquals(result, parser.serializeObject(builder.build())); + assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(true, false), result.slice(4, result.readableBytes() -4))); + assertArrayEquals(result.array(), parser.serializeObject(builder.build())); } @Test public void testObjectiveFunctionObject() throws IOException, PCEPDeserializerException { final PCEPObjectiveFunctionObjectParser parser = new PCEPObjectiveFunctionObjectParser(this.tlvRegistry); - final byte[] result = ByteArray.fileToBytes("src/test/resources/PCEPObjectiveFunctionObject.1.bin"); + final ByteBuf result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/PCEPObjectiveFunctionObject.1.bin")); final OfBuilder builder = new OfBuilder(); builder.setProcessingRule(true); builder.setIgnore(false); builder.setCode(new OfId(4)); - assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(true, false), ByteArray.cutBytes(result, 4))); - assertArrayEquals(result, parser.serializeObject(builder.build())); + assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(true, false), result.slice(4, result.readableBytes() -4))); + assertArrayEquals(result.array(), parser.serializeObject(builder.build())); } @Test public void testGlobalConstraintsObject() throws IOException, PCEPDeserializerException { final PCEPGlobalConstraintsObjectParser parser = new PCEPGlobalConstraintsObjectParser(this.tlvRegistry); - final byte[] result = ByteArray.fileToBytes("src/test/resources/PCEPGlobalConstraintsObject.1.bin"); + final ByteBuf result = Unpooled.wrappedBuffer(ByteArray.fileToBytes("src/test/resources/PCEPGlobalConstraintsObject.1.bin")); final GcBuilder builder = new GcBuilder(); builder.setProcessingRule(true); @@ -619,29 +621,29 @@ public class PCEPObjectParserTest { builder.setMinUtilization((short) 100); builder.setOverBookingFactor((short) 99); - assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(true, false), ByteArray.cutBytes(result, 4))); - assertArrayEquals(result, parser.serializeObject(builder.build())); + assertEquals(builder.build(), parser.parseObject(new ObjectHeaderImpl(true, false), result.slice(4, result.readableBytes() -4))); + assertArrayEquals(result.array(), parser.serializeObject(builder.build())); } @Test public void testIgnoreUknownObject() throws PCEPDeserializerException { - final Object object = ctx.getObjectHandlerRegistry().parseObject(35, 1, new ObjectHeaderImpl(false, false), null); - assertNull(object); + final Object object = this.ctx.getObjectHandlerRegistry().parseObject(35, 1, new ObjectHeaderImpl(false, false), null); + assertNull(object); } @Test public void testUnrecognizedObjectType() throws PCEPDeserializerException { - final Object object = ctx.getObjectHandlerRegistry().parseObject(2, 2, new ObjectHeaderImpl(true, true), null); - assertNotNull(object); - assertTrue(object instanceof UnknownObject); - assertEquals(PCEPErrors.UNRECOGNIZED_OBJ_TYPE, ((UnknownObject) object).getError()); + final Object object = this.ctx.getObjectHandlerRegistry().parseObject(2, 2, new ObjectHeaderImpl(true, true), null); + assertNotNull(object); + assertTrue(object instanceof UnknownObject); + assertEquals(PCEPErrors.UNRECOGNIZED_OBJ_TYPE, ((UnknownObject) object).getError()); } @Test public void testUnrecognizedObjectClass() throws PCEPDeserializerException { - final Object object = ctx.getObjectHandlerRegistry().parseObject(35, 1, new ObjectHeaderImpl(true, true), null); - assertNotNull(object); - assertTrue(object instanceof UnknownObject); - assertEquals(PCEPErrors.UNRECOGNIZED_OBJ_CLASS, ((UnknownObject) object).getError()); + final Object object = this.ctx.getObjectHandlerRegistry().parseObject(35, 1, new ObjectHeaderImpl(true, true), null); + assertNotNull(object); + assertTrue(object instanceof UnknownObject); + assertEquals(PCEPErrors.UNRECOGNIZED_OBJ_CLASS, ((UnknownObject) object).getError()); } } diff --git a/pcep/spi/src/main/java/org/opendaylight/protocol/pcep/spi/AbstractMessageParser.java b/pcep/spi/src/main/java/org/opendaylight/protocol/pcep/spi/AbstractMessageParser.java index f46c2ab3aa..3f8a0e00c4 100644 --- a/pcep/spi/src/main/java/org/opendaylight/protocol/pcep/spi/AbstractMessageParser.java +++ b/pcep/spi/src/main/java/org/opendaylight/protocol/pcep/spi/AbstractMessageParser.java @@ -87,8 +87,7 @@ public abstract class AbstractMessageParser implements MessageParser, MessageSer final ObjectHeader header = new ObjectHeaderImpl(flags.get(P_FLAG_OFFSET), flags.get(I_FLAG_OFFSET)); // parseObject is required to return null for P=0 errored objects - // FIXME: change this to ByteBuf - final Object o = this.registry.parseObject(objClass, objType, header, ByteArray.readAllBytes(bytesToPass)); + final Object o = this.registry.parseObject(objClass, objType, header, bytesToPass); if (o != null) { objs.add(o); } diff --git a/pcep/spi/src/main/java/org/opendaylight/protocol/pcep/spi/AbstractObjectWithTlvsParser.java b/pcep/spi/src/main/java/org/opendaylight/protocol/pcep/spi/AbstractObjectWithTlvsParser.java index 3949a1eb37..5a080c29a2 100644 --- a/pcep/spi/src/main/java/org/opendaylight/protocol/pcep/spi/AbstractObjectWithTlvsParser.java +++ b/pcep/spi/src/main/java/org/opendaylight/protocol/pcep/spi/AbstractObjectWithTlvsParser.java @@ -7,6 +7,9 @@ */ package org.opendaylight.protocol.pcep.spi; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufUtil; + import java.util.Arrays; import org.opendaylight.protocol.util.ByteArray; @@ -32,36 +35,25 @@ public abstract class AbstractObjectWithTlvsParser implements ObjectParser, O this.tlvReg = Preconditions.checkNotNull(tlvReg); } - protected final void parseTlvs(final T builder, final byte[] bytes) throws PCEPDeserializerException { - if (bytes == null) { - throw new IllegalArgumentException("Byte array is mandatory."); - } - if (bytes.length == 0) { + protected final void parseTlvs(final T builder, final ByteBuf bytes) throws PCEPDeserializerException { + Preconditions.checkArgument(bytes != null, "Array of bytes is mandatory. Can't be null."); + if (!bytes.isReadable()) { return; } - - int length; - int byteOffset = 0; - int type = 0; - - while (byteOffset < bytes.length) { - type = ByteArray.bytesToInt(ByteArray.subByte(bytes, byteOffset, TLV_TYPE_F_LENGTH)); - byteOffset += TLV_TYPE_F_LENGTH; - length = ByteArray.bytesToInt(ByteArray.subByte(bytes, byteOffset, TLV_LENGTH_F_LENGTH)); - byteOffset += TLV_LENGTH_F_LENGTH; - - if (TLV_HEADER_LENGTH + length > bytes.length) { - throw new PCEPDeserializerException("Wrong length specified. Passed: " + (TLV_HEADER_LENGTH + length) + "; Expected: <= " - + (bytes.length - byteOffset) + "."); + while (bytes.isReadable()) { + int type = bytes.readUnsignedShort(); + int length = bytes.readUnsignedShort(); + if (length > bytes.readableBytes()) { + throw new PCEPDeserializerException("Wrong length specified. Passed: " + length + "; Expected: <= " + + bytes.readableBytes() + "."); } - - final byte[] tlvBytes = ByteArray.subByte(bytes, byteOffset, length); - - LOG.trace("Attempt to parse tlv from bytes: {}", ByteArray.bytesToHexString(tlvBytes)); - final Tlv tlv = this.tlvReg.parseTlv(type, tlvBytes); + final ByteBuf tlvBytes = bytes.slice(bytes.readerIndex(), length); + LOG.trace("Attempt to parse tlv from bytes: {}", ByteBufUtil.hexDump(tlvBytes)); + //FIXME: switch to ByteBuf + final Tlv tlv = this.tlvReg.parseTlv(type, ByteArray.readAllBytes(tlvBytes)); LOG.trace("Tlv was parsed. {}", tlv); addTlv(builder, tlv); - byteOffset += length + getPadding(TLV_HEADER_LENGTH + length, PADDED_TO); + bytes.readerIndex(bytes.readerIndex() + length + getPadding(TLV_HEADER_LENGTH + length, PADDED_TO)); } } diff --git a/pcep/spi/src/main/java/org/opendaylight/protocol/pcep/spi/ObjectParser.java b/pcep/spi/src/main/java/org/opendaylight/protocol/pcep/spi/ObjectParser.java index 93507c4219..de04bffd32 100644 --- a/pcep/spi/src/main/java/org/opendaylight/protocol/pcep/spi/ObjectParser.java +++ b/pcep/spi/src/main/java/org/opendaylight/protocol/pcep/spi/ObjectParser.java @@ -7,9 +7,11 @@ */ package org.opendaylight.protocol.pcep.spi; +import io.netty.buffer.ByteBuf; + import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.Object; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.ObjectHeader; public interface ObjectParser { - Object parseObject(ObjectHeader header, byte[] buffer) throws PCEPDeserializerException; + Object parseObject(final ObjectHeader header, final ByteBuf buffer) throws PCEPDeserializerException; } diff --git a/pcep/spi/src/main/java/org/opendaylight/protocol/pcep/spi/ObjectRegistry.java b/pcep/spi/src/main/java/org/opendaylight/protocol/pcep/spi/ObjectRegistry.java index 248d93391b..9dbf59624e 100644 --- a/pcep/spi/src/main/java/org/opendaylight/protocol/pcep/spi/ObjectRegistry.java +++ b/pcep/spi/src/main/java/org/opendaylight/protocol/pcep/spi/ObjectRegistry.java @@ -7,6 +7,8 @@ */ package org.opendaylight.protocol.pcep.spi; +import io.netty.buffer.ByteBuf; + import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.Object; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.ObjectHeader; @@ -15,16 +17,16 @@ public interface ObjectRegistry { * Finds parser for given object type and class in the registry. Delegates parsing to found parser. * @param objectType object type * @param objectClass object class - * @param buffer object raw binary value to be parsed + * @param buffer object wrapped in ByteBuf * @return null if the parser for this object could not be found * @throws PCEPDeserializerException if the parsing did not succeed */ - Object parseObject(final int objectClass, final int objectType, final ObjectHeader header, final byte[] buffer) throws PCEPDeserializerException; + Object parseObject(final int objectClass, final int objectType, final ObjectHeader header, final ByteBuf buffer) throws PCEPDeserializerException; /** * Find serializer for given object. Delegates parsing to found serializer. * @param object to be parsed * @return null if the serializer for this object could not be found */ - byte[] serializeObject(Object object); + byte[] serializeObject(final Object object); } diff --git a/pcep/spi/src/main/java/org/opendaylight/protocol/pcep/spi/pojo/SimpleObjectRegistry.java b/pcep/spi/src/main/java/org/opendaylight/protocol/pcep/spi/pojo/SimpleObjectRegistry.java index b5950f0be6..4316b180ba 100644 --- a/pcep/spi/src/main/java/org/opendaylight/protocol/pcep/spi/pojo/SimpleObjectRegistry.java +++ b/pcep/spi/src/main/java/org/opendaylight/protocol/pcep/spi/pojo/SimpleObjectRegistry.java @@ -7,6 +7,8 @@ */ package org.opendaylight.protocol.pcep.spi.pojo; +import io.netty.buffer.ByteBuf; + import org.opendaylight.protocol.concepts.HandlerRegistry; import org.opendaylight.protocol.pcep.spi.ObjectParser; import org.opendaylight.protocol.pcep.spi.ObjectRegistry; @@ -44,20 +46,19 @@ public final class SimpleObjectRegistry implements ObjectRegistry { } @Override - public Object parseObject(int objectClass, int objectType, ObjectHeader header, byte[] buffer) throws PCEPDeserializerException { + public Object parseObject(final int objectClass, final int objectType, final ObjectHeader header, final ByteBuf buffer) throws PCEPDeserializerException { Preconditions.checkArgument(objectType >= 0 && objectType <= Values.UNSIGNED_SHORT_MAX_VALUE); final ObjectParser parser = this.handlers.getParser(createKey(objectClass, objectType)); if (parser == null) { - if(!header.isProcessingRule()) { - return null; - } - + if(!header.isProcessingRule()) { + return null; + } for (int type = 1; type <= 15; type++) { - final ObjectParser objParser = this.handlers.getParser(createKey(objectClass, type)); - if(objParser != null) { - return new UnknownObject(PCEPErrors.UNRECOGNIZED_OBJ_TYPE); - } + final ObjectParser objParser = this.handlers.getParser(createKey(objectClass, type)); + if(objParser != null) { + return new UnknownObject(PCEPErrors.UNRECOGNIZED_OBJ_TYPE); + } } return new UnknownObject(PCEPErrors.UNRECOGNIZED_OBJ_CLASS); } -- 2.36.6