Extensibility support (deserialization part)
[openflowjava.git] / openflow-protocol-impl / src / main / java / org / opendaylight / openflowjava / protocol / impl / util / OF10ActionsDeserializer.java
index 64372b1eb1f579a87d8c49a4f7506356c4b7510e..75be481a9226f273bacb5bf124555bb84beaba6b 100644 (file)
@@ -13,12 +13,15 @@ import io.netty.buffer.ByteBuf;
 import java.util.ArrayList;
 import java.util.List;
 
+import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistry;
+import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistryInjector;
+import org.opendaylight.openflowjava.protocol.api.extensibility.MessageCodeKey;
+import org.opendaylight.openflowjava.protocol.api.extensibility.OFDeserializer;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev100924.Ipv4Address;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.DlAddressAction;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.DlAddressActionBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterAction;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterActionBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.IpAddressAction;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.IpAddressActionBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.MaxLengthAction;
@@ -34,7 +37,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanVidAction;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.VlanVidActionBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Enqueue;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Experimenter;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.Output;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetDlDst;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.SetDlSrc;
@@ -57,7 +59,8 @@ import com.google.common.base.Joiner;
  * Deserializes ofp_action (OpenFlow v1.0) structures
  * @author michal.polkorab
  */
-public abstract class OF10ActionsDeserializer {
+public class OF10ActionsDeserializer implements OFDeserializer<Action>,
+        DeserializerRegistryInjector {
     
     private static final byte PADDING_IN_SET_VLAN_VID_ACTION = 2;
     private static final byte PADDING_IN_SET_VLAN_PCP_ACTION = 3;
@@ -66,41 +69,12 @@ public abstract class OF10ActionsDeserializer {
     private static final byte PADDING_IN_NW_TOS_ACTION = 3;
     private static final byte PADDING_IN_TP_ACTION = 2;
     private static final byte PADDING_IN_ENQUEUE_ACTION = 6;
+    private DeserializerRegistry registry;
 
-    /**
-     * Creates list of actions (OpenFlow v1.0) from ofp_action structures
-     * @param input input ByteBuf
-     * @return ActionsList list of actions
-     */
-    public static List<Action> createActionsList(ByteBuf input) {
-        List<Action> actions = new ArrayList<>();
-        while (input.readableBytes() > 0) {
-            int type = input.readUnsignedShort();
-            input.skipBytes(EncodeConstants.SIZE_OF_SHORT_IN_BYTES);
-            actions.add(decodeAction(input, type));
-        } 
-        return actions;
-    }
-
-    /**
-     * Creates list of actions (OpenFlow v1.0) from ofp_action structures, which are not the last structure
-     * in message
-     * @param input input ByteBuf
-     * @param actionsLength length of actions
-     * @return ActionsList list of actions
-     */
-    public static List<Action> createActionsList(ByteBuf input, int actionsLength) {
-        List<Action> actions = new ArrayList<>();
-        int currentLength = 0;
-        while (currentLength < actionsLength) {
-            int type = input.readUnsignedShort();
-            currentLength += input.readUnsignedShort();
-            actions.add(decodeAction(input, type));
-        } 
-        return actions;
-    }
-
-    private static Action decodeAction(ByteBuf input, int type) {
+    @Override
+    public Action deserialize(ByteBuf input) {
+        int type = input.readUnsignedShort();
+        input.skipBytes(EncodeConstants.SIZE_OF_SHORT_IN_BYTES);
         ActionBuilder actionsBuilder = new ActionBuilder();
         Action actionsList = null;
         switch(type) {
@@ -141,7 +115,9 @@ public abstract class OF10ActionsDeserializer {
             actionsList = createEnqueueAction(input, actionsBuilder);
             break;
         case 0xFFFF:
-            actionsList = createExperimenterAction(input, actionsBuilder);
+            OFDeserializer<ExperimenterAction> expDeserializer = registry.getDeserializer(
+                    new MessageCodeKey(EncodeConstants.OF10_VERSION_ID, 0xFFFF, ExperimenterAction.class));
+            expDeserializer.deserialize(input);
             break;
         default:
             break;
@@ -270,12 +246,8 @@ public abstract class OF10ActionsDeserializer {
         return builder.build();
     }
 
-    private static Action createExperimenterAction(ByteBuf input, ActionBuilder builder) {
-        builder.setType(Experimenter.class);
-        ExperimenterActionBuilder expBuilder = new ExperimenterActionBuilder();
-        expBuilder.setExperimenter(input.readUnsignedInt());
-        builder.addAugmentation(ExperimenterAction.class, expBuilder.build());
-        return builder.build();
+    @Override
+    public void injectDeserializerRegistry(DeserializerRegistry deserializerRegistry) {
+        registry = deserializerRegistry;
     }
-
 }