Parameter registry uses ByteBuf instead of byte[] 46/7946/5
authorMartin Bobak <mbobak@cisco.com>
Thu, 12 Jun 2014 13:30:30 +0000 (15:30 +0200)
committerMartin Bobak <mbobak@cisco.com>
Tue, 24 Jun 2014 15:25:53 +0000 (17:25 +0200)
- ParameterSerializer uses ByteBuf instead of byte[]
- ParameterUtil uses ByteBuf instead of byte[]

Change-Id: Ie8dfe69a7ba80249c5fe733103432ca5af63c9c1
Signed-off-by: Martin Bobak <mbobak@cisco.com>
bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/BGPOpenMessageParser.java
bgp/parser-impl/src/main/java/org/opendaylight/protocol/bgp/parser/impl/message/open/CapabilityParameterParser.java
bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/ParameterRegistry.java
bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/ParameterSerializer.java
bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/ParameterUtil.java
bgp/parser-spi/src/main/java/org/opendaylight/protocol/bgp/parser/spi/pojo/SimpleParameterRegistry.java
bgp/parser-spi/src/test/java/org/opendaylight/protocol/bgp/parser/spi/UtilsTest.java

index b25ec9e3e88d8ba0aec3c911b605d4180d3fc0c6..5805ef1b8ff45260cff6adf7a4cc89a82daad329 100644 (file)
@@ -9,15 +9,12 @@ package org.opendaylight.protocol.bgp.parser.impl.message;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
 import com.google.common.primitives.UnsignedBytes;
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.ByteBufUtil;
 import io.netty.buffer.Unpooled;
 import java.util.Arrays;
 import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
 import org.opendaylight.protocol.bgp.parser.BGPDocumentedException;
 import org.opendaylight.protocol.bgp.parser.BGPError;
 import org.opendaylight.protocol.bgp.parser.BGPParsingException;
@@ -41,7 +38,6 @@ import org.slf4j.LoggerFactory;
  * Parser for BGP Open message.
  */
 public final class BGPOpenMessageParser implements MessageParser, MessageSerializer {
-
     public static final int TYPE = 1;
 
     private static final Logger LOG = LoggerFactory.getLogger(BGPOpenMessageParser.class);
@@ -78,17 +74,10 @@ public final class BGPOpenMessageParser implements MessageParser, MessageSeriali
         LOG.trace("Started serializing open message: {}", msg);
         final Open open = (Open) msg;
 
-        final Map<byte[], Integer> optParams = Maps.newHashMap();
-
-        int optParamsLength = 0;
-
+        final ByteBuf paramsBuffer = Unpooled.buffer();
         if (open.getBgpParameters() != null) {
             for (final BgpParameters param : open.getBgpParameters()) {
-                final byte[] p = this.reg.serializeParameter(param);
-                if (p != null) {
-                    optParams.put(p, p.length);
-                    optParamsLength += p.length;
-                }
+                this.reg.serializeParameter(param, paramsBuffer);
             }
         }
         final ByteBuf msgBody = Unpooled.buffer();
@@ -104,14 +93,9 @@ public final class BGPOpenMessageParser implements MessageParser, MessageSeriali
         msgBody.writeShort(open.getHoldTimer());
         msgBody.writeBytes(Ipv4Util.bytesForAddress(open.getBgpIdentifier()));
 
-        msgBody.writeByte(optParamsLength);
+        msgBody.writeByte(paramsBuffer.writerIndex());
+        msgBody.writeBytes(paramsBuffer);
 
-        if (optParams != null) {
-            for (final Entry<byte[], Integer> entry : optParams.entrySet()) {
-                // FIXME: to be switched to ByteBuf later
-                msgBody.writeBytes(entry.getKey());
-            }
-        }
         MessageUtil.formatMessage(TYPE, msgBody, bytes);
         LOG.trace("Open message serialized to: {}", ByteBufUtil.hexDump(bytes));
     }
index 7cb2cb9299b3b0b7f015a63a09dcae678b7fbeec..6aafd6259ba07a50b55fdbceba954bcce2f07f06 100644 (file)
@@ -12,6 +12,8 @@ import com.google.common.primitives.UnsignedBytes;
 
 import io.netty.buffer.ByteBuf;
 
+import io.netty.buffer.ByteBufUtil;
+import io.netty.buffer.Unpooled;
 import java.util.Arrays;
 
 import org.opendaylight.protocol.bgp.parser.BGPDocumentedException;
@@ -56,18 +58,18 @@ public final class CapabilityParameterParser implements ParameterParser, Paramet
     }
 
     @Override
-    public byte[] serializeParameter(final BgpParameters parameter) {
+    public void serializeParameter(final BgpParameters parameter, ByteBuf byteAggregator) {
         final CParameters cap = parameter.getCParameters();
 
         LOG.trace("Started serializing BGP Capability: {}", cap);
 
-        byte[] bytes = this.reg.serializeCapability(cap);
+        ByteBuf bytes = Unpooled.wrappedBuffer(this.reg.serializeCapability(cap));
         if (bytes == null) {
             throw new IllegalArgumentException("Unhandled capability class" + cap.getImplementedInterface());
         }
 
-        LOG.trace("BGP capability serialized to: {}", Arrays.toString(bytes));
+        LOG.trace("BGP capability serialized to: {}", ByteBufUtil.hexDump(bytes));
 
-        return ParameterUtil.formatParameter(TYPE, bytes);
+        ParameterUtil.formatParameter(TYPE, bytes,byteAggregator);
     }
 }
index cb46a51834d7775940b63fae5b1e3fe7abe2c78a..b332d11070d3ce8b59ce5ed794c64f5b9674b51c 100644 (file)
@@ -16,5 +16,5 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.mess
 public interface ParameterRegistry {
     BgpParameters parseParameter(int parameterType, ByteBuf bytes) throws BGPParsingException, BGPDocumentedException;
 
-    byte[] serializeParameter(BgpParameters parameter);
+    void serializeParameter(BgpParameters parameter, ByteBuf bytes);
 }
index c868d24c517993939af45c00603d4f8e24df2439..21726757facf61f6ff3cf2043e1fb11c3dd49897 100644 (file)
@@ -7,8 +7,9 @@
  */
 package org.opendaylight.protocol.bgp.parser.spi;
 
+import io.netty.buffer.ByteBuf;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.message.rev130919.open.BgpParameters;
 
 public interface ParameterSerializer {
-    byte[] serializeParameter(BgpParameters parameter);
+    void serializeParameter(BgpParameters parameter, ByteBuf byteAggregator);
 }
index 1b47136695421584a45d3b5b188df538901a08ae..1a9b25c69e685dfdacd45efdbeef93f7f3e304c6 100644 (file)
@@ -7,21 +7,17 @@
  */
 package org.opendaylight.protocol.bgp.parser.spi;
 
-import com.google.common.primitives.UnsignedBytes;
+import io.netty.buffer.ByteBuf;
 
 public final class ParameterUtil {
 
-    private static final int HEADER_SIZE = 2;
-
     private ParameterUtil() {
 
     }
 
-    public static byte[] formatParameter(final int type, final byte[] value) {
-        final byte[] bytes = new byte[HEADER_SIZE + value.length];
-        bytes[0] = UnsignedBytes.checkedCast(type);
-        bytes[1] = UnsignedBytes.checkedCast(value.length);
-        System.arraycopy(value, 0, bytes, HEADER_SIZE, value.length);
-        return bytes;
+    public static void formatParameter(final int type, final ByteBuf value, final ByteBuf byteAggregator) {
+        byteAggregator.writeByte(type);
+        byteAggregator.writeByte(value.writerIndex());
+        byteAggregator.writeBytes(value);
     }
 }
index 34ff8f5a570f484dd1a67f815f637e098b0bf2ca..6e11444127bc34de200c64ee77ac91db4aced447 100644 (file)
@@ -42,12 +42,11 @@ final class SimpleParameterRegistry implements ParameterRegistry {
         return parser.parseParameter(buffer);
     }
 
-    @Override
-    public byte[] serializeParameter(final BgpParameters parameter) {
+    public void serializeParameter(final BgpParameters parameter, ByteBuf bytes) {
         final ParameterSerializer serializer = this.handlers.getSerializer(parameter.getImplementedInterface());
         if (serializer == null) {
-            return null;
+            return;
         }
-        return serializer.serializeParameter(parameter);
+        serializer.serializeParameter(parameter,bytes);
     }
 }
index 4cc43ac2a4db664a1ea64391d84a32f474710256..ef6c17a49f0cb21dcd61b0982561f52918b594d7 100644 (file)
@@ -38,7 +38,7 @@ public class UtilsTest {
             UnsignedBytes.MAX_VALUE, UnsignedBytes.MAX_VALUE, UnsignedBytes.MAX_VALUE, UnsignedBytes.MAX_VALUE, UnsignedBytes.MAX_VALUE,
             UnsignedBytes.MAX_VALUE, UnsignedBytes.MAX_VALUE, UnsignedBytes.MAX_VALUE, 0, 23, 3, 32, 5, 14, 21 };
         ByteBuf formattedMessage = Unpooled.buffer();
-        MessageUtil.formatMessage(3, Unpooled.wrappedBuffer(new byte[]{32, 5, 14, 21}),formattedMessage);
+        MessageUtil.formatMessage(3, Unpooled.wrappedBuffer(new byte[] { 32, 5, 14, 21 }), formattedMessage);
         assertArrayEquals(result, ByteArray.getAllBytes(formattedMessage));
     }
 
@@ -87,6 +87,8 @@ public class UtilsTest {
     @Test
     public void testParameterUtil() {
         final byte[] result = new byte[] { 1, 2, 4, 8 };
-        assertArrayEquals(result, ParameterUtil.formatParameter(1, new byte[] { 4, 8 }));
+        ByteBuf aggregator = Unpooled.buffer();
+        ParameterUtil.formatParameter(1, Unpooled.wrappedBuffer(new byte[] { 4, 8 }), aggregator);
+        assertArrayEquals(result, ByteArray.getAllBytes(aggregator));
     }
 }