Match and actions (de)serialization + fix
[openflowjava.git] / openflow-protocol-impl / src / main / java / org / opendaylight / openflowjava / protocol / impl / serialization / factories / GroupModInputMessageFactory.java
index 0a914269d2bbbc4c22bb26bc7a9c66ac5a2df177..6fa791d3f53574761161eb509e6e04c9066c1555 100644 (file)
@@ -3,13 +3,13 @@ package org.opendaylight.openflowjava.protocol.impl.serialization.factories;
 \r
 import io.netty.buffer.ByteBuf;\r
 \r
-import java.util.Iterator;\r
 import java.util.List;\r
 \r
 import org.opendaylight.openflowjava.protocol.impl.serialization.OFSerializer;\r
+import org.opendaylight.openflowjava.protocol.impl.util.ActionsSerializer;\r
 import org.opendaylight.openflowjava.protocol.impl.util.ByteBufUtils;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GroupModInput;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.group.mod.BucketsList;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.buckets.BucketsList;\r
 \r
 /**\r
  * @author timotej.kubas\r
@@ -18,9 +18,10 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731
 public class GroupModInputMessageFactory implements OFSerializer<GroupModInput> {\r
     private static final byte MESSAGE_TYPE = 15;\r
     private static final byte PADDING_IN_GROUP_MOD_MESSAGE = 1;\r
-    private static final int MESSAGE_LENGTH = 16; \r
+    private static final int MESSAGE_LENGTH = 16;\r
+    private static final byte LENGTH_OF_BUCKET_STRUCTURE = 16;\r
     private static GroupModInputMessageFactory instance;\r
-    \r
+\r
     private GroupModInputMessageFactory() {\r
         // singleton\r
     }\r
@@ -48,7 +49,7 @@ public class GroupModInputMessageFactory implements OFSerializer<GroupModInput>
 \r
     @Override\r
     public int computeLength(GroupModInput message) {\r
-        return MESSAGE_LENGTH;\r
+        return MESSAGE_LENGTH + computeLengthOfBuckets(message.getBucketsList());\r
     }\r
 \r
     @Override\r
@@ -58,16 +59,35 @@ public class GroupModInputMessageFactory implements OFSerializer<GroupModInput>
     \r
     private static void encodeBuckets(List<BucketsList> buckets, ByteBuf outBuffer) {\r
         final byte PADDING_IN_BUCKET = 4;\r
-        \r
-        for (Iterator<BucketsList> iterator = buckets.iterator(); iterator.hasNext();) {\r
-            BucketsList currentBucket = iterator.next();\r
-            // TODO get method for field length missing\r
-            outBuffer.writeShort(currentBucket.getWeight().intValue());\r
-            outBuffer.writeInt(currentBucket.getWatchPort().getValue().intValue());\r
-            outBuffer.writeInt(currentBucket.getWatchGroup().intValue());\r
-            ByteBufUtils.padBuffer(PADDING_IN_BUCKET, outBuffer);\r
-            // TODO actions structure missing\r
+        if (buckets != null) {\r
+            for (BucketsList currentBucket : buckets) {\r
+                outBuffer.writeShort(computeLengthOfBucket(currentBucket));\r
+                outBuffer.writeShort(currentBucket.getWeight().shortValue());\r
+                outBuffer.writeInt(currentBucket.getWatchPort().getValue().intValue());\r
+                outBuffer.writeInt(currentBucket.getWatchGroup().intValue());\r
+                ByteBufUtils.padBuffer(PADDING_IN_BUCKET, outBuffer);\r
+                ActionsSerializer.encodeActions(currentBucket.getActionsList(), outBuffer);\r
+            }\r
+        }\r
+    }\r
+    \r
+    private static int computeLengthOfBucket(BucketsList bucket) {\r
+        int lengthOfBuckets = 0;\r
+        if (bucket != null) {\r
+            lengthOfBuckets = LENGTH_OF_BUCKET_STRUCTURE + ActionsSerializer.computeLengthOfActions(bucket.getActionsList());\r
         }\r
+        return lengthOfBuckets;\r
+    }\r
+    \r
+    private static int computeLengthOfBuckets(List<BucketsList> buckets) {\r
+        int lengthOfBuckets = 0;\r
+        if (buckets != null) {\r
+            for (BucketsList currentBucket : buckets) {\r
+                lengthOfBuckets += LENGTH_OF_BUCKET_STRUCTURE + ActionsSerializer.computeLengthOfActions(currentBucket.getActionsList());\r
+            }\r
+        }\r
+        return lengthOfBuckets;\r
     }\r
 \r
+    \r
 }\r