Add multipart reply deserializers
[openflowplugin.git] / openflowplugin-impl / src / main / java / org / opendaylight / openflowplugin / impl / protocol / deserialization / util / ActionUtil.java
index ae24d8ba938b7468763cf363590b9661e54532fd..57adfdb1910a6c0439662b6441c424a75046100e 100644 (file)
@@ -11,6 +11,7 @@ package org.opendaylight.openflowplugin.impl.protocol.deserialization.util;
 import java.util.Objects;
 
 import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistry;
+import org.opendaylight.openflowjava.protocol.api.extensibility.HeaderDeserializer;
 import org.opendaylight.openflowjava.protocol.api.extensibility.OFDeserializer;
 import org.opendaylight.openflowjava.protocol.api.keys.ActionDeserializerKey;
 import org.opendaylight.openflowjava.protocol.api.keys.ExperimenterActionDeserializerKey;
@@ -55,7 +56,7 @@ public class ActionUtil {
             final OFDeserializer<Action> deserializer = registry.getDeserializer(key);
 
             return deserializer.deserialize(message);
-        } catch (IllegalStateException e) {
+        } catch (ClassCastException | IllegalStateException e) {
             final MessageCodeKey key = Objects.nonNull(expId)
                 ? new ExperimenterActionDeserializerKey(version, expId)
                 : new ActionDeserializerKey(version, type, expId);
@@ -68,4 +69,43 @@ public class ActionUtil {
         }
     }
 
+    /**
+     * Deserialize OpenFlow action header, using extension converter if available
+     * TODO: Remove also extension converters
+     *
+     * @param version OpenFlow version
+     * @param message OpenFlow buffered message
+     * @param registry deserializer registry
+     * @param path Action path
+     */
+    public static Action readActionHeader(short version, ByteBuf message, DeserializerRegistry registry,
+            ActionPath path) {
+        int type = message.getUnsignedShort(message.readerIndex());
+        Long expId = null;
+
+        if (type == EncodeConstants.EXPERIMENTER_VALUE) {
+            expId = message.getUnsignedInt(message.readerIndex()
+                    + 2 * EncodeConstants.SIZE_OF_SHORT_IN_BYTES);
+        }
+
+        try {
+            final MessageCodeExperimenterKey key = new MessageCodeExperimenterKey(
+                version, type, Action.class, expId);
+
+            final HeaderDeserializer<Action> deserializer = registry.getDeserializer(key);
+
+            return deserializer.deserializeHeader(message);
+        } catch (ClassCastException | IllegalStateException e) {
+            final MessageCodeKey key = Objects.nonNull(expId)
+                ? new ExperimenterActionDeserializerKey(version, expId)
+                : new ActionDeserializerKey(version, type, expId);
+
+            final HeaderDeserializer<org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203
+                .actions.grouping.Action> deserializer = registry.getDeserializer(key);
+
+            return ActionExtensionHelper.processAlienAction(deserializer.deserializeHeader(message),
+                    OpenflowVersion.get(version), path);
+        }
+    }
+
 }