BUG-612 : switched PCEP RRO subobject serializers to ByteBuf
[bgpcep.git] / pcep / spi / src / main / java / org / opendaylight / protocol / pcep / spi / ObjectUtil.java
index 3f954c714da450d012c867822c1461c3b6a8183a..7545a126b9e59bde076294c3c060993fc1c8688d 100644 (file)
@@ -7,7 +7,9 @@
  */
 package org.opendaylight.protocol.pcep.spi;
 
-import com.google.common.primitives.UnsignedBytes;
+import io.netty.buffer.ByteBuf;
+
+import java.util.BitSet;
 
 import org.opendaylight.protocol.util.ByteArray;
 
@@ -15,17 +17,9 @@ public final class ObjectUtil {
 
     private static final int HEADER_SIZE = 4;
 
-    private static final int OC_F_LENGTH = 1;
-    private static final int OT_FLAGS_MF_LENGTH = 1;
-    private static final int OBJ_LENGTH_F_LENGTH = 2;
-
-    private static final int OC_F_OFFSET = 0;
-    private static final int OT_FLAGS_MF_OFFSET = OC_F_OFFSET + OC_F_LENGTH;
-    private static final int OBJ_LENGTH_F_OFFSET = OT_FLAGS_MF_OFFSET + OT_FLAGS_MF_LENGTH;
-
     private static final int OT_SF_LENGTH = 4;
     /*
-     * flags offsets inside multi-filed
+     * flags offsets inside multi-field
      */
     private static final int P_FLAG_OFFSET = 6;
     private static final int I_FLAG_OFFSET = 7;
@@ -33,27 +27,20 @@ public final class ObjectUtil {
     private ObjectUtil() {
     }
 
-    public static byte[] formatSubobject(final int objectType, final int objectClass, final Boolean processingRule, final Boolean ignore,
-            final byte[] valueBytes) {
-
-        final byte[] bytes = new byte[HEADER_SIZE + valueBytes.length];
-
-        // objClass
-        bytes[0] = UnsignedBytes.checkedCast(objectClass);
-
-        // objType_flags multi-field
-        bytes[OT_FLAGS_MF_OFFSET] = UnsignedBytes.checkedCast(objectType << (Byte.SIZE - OT_SF_LENGTH));
-        if (processingRule != null && processingRule) {
-            bytes[OT_FLAGS_MF_OFFSET] |= 1 << Byte.SIZE - (P_FLAG_OFFSET) - 1;
-        }
+    public static void formatSubobject(final int objectType, final int objectClass, final Boolean processingRule, final Boolean ignore,
+            final ByteBuf body, final ByteBuf out) {
+        out.writeByte(objectClass);
+        BitSet flags = new BitSet(Byte.SIZE);
         if (ignore != null && ignore) {
-            bytes[OT_FLAGS_MF_OFFSET] |= 1 << Byte.SIZE - (I_FLAG_OFFSET) - 1;
+            flags.set(I_FLAG_OFFSET);
         }
-
-        // objLength
-        System.arraycopy(ByteArray.intToBytes(valueBytes.length + HEADER_SIZE, OBJ_LENGTH_F_LENGTH), 0, bytes, OBJ_LENGTH_F_OFFSET,
-                OBJ_LENGTH_F_LENGTH);
-        System.arraycopy(valueBytes, 0, bytes, HEADER_SIZE, valueBytes.length);
-        return bytes;
+        if (processingRule != null && processingRule) {
+            flags.set(P_FLAG_OFFSET);
+        }
+        byte[] flagB = ByteArray.bitSetToBytes(flags, 1);
+        int typeByte = objectType << OT_SF_LENGTH | flagB[0];
+        out.writeByte(typeByte);
+        out.writeShort(body.writerIndex() + HEADER_SIZE);
+        out.writeBytes(body);
     }
 }