new serialization factories and tests
[openflowjava.git] / openflow-protocol-impl / src / main / java / org / opendaylight / openflowjava / protocol / impl / deserialization / factories / GetAsyncReplyMessageFactory.java
diff --git a/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/deserialization/factories/GetAsyncReplyMessageFactory.java b/openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/deserialization/factories/GetAsyncReplyMessageFactory.java
new file mode 100644 (file)
index 0000000..56f682d
--- /dev/null
@@ -0,0 +1,147 @@
+/* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */\r
+package org.opendaylight.openflowjava.protocol.impl.deserialization.factories;\r
+\r
+import io.netty.buffer.ByteBuf;\r
+\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+\r
+import org.opendaylight.openflowjava.protocol.impl.deserialization.OFDeserializer;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.FlowRemovedReason;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PacketInReason;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortReason;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetAsyncOutput;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetAsyncOutputBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.get.async.reply.FlowRemovedMask;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.get.async.reply.FlowRemovedMaskBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.get.async.reply.PacketInMask;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.get.async.reply.PacketInMaskBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.get.async.reply.PortStatusMask;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.get.async.reply.PortStatusMaskBuilder;\r
+\r
+/**\r
+ * @author timotej.kubas\r
+ * @author michal.polkorab\r
+ */\r
+public class GetAsyncReplyMessageFactory implements OFDeserializer<GetAsyncOutput> {\r
+    private static GetAsyncReplyMessageFactory instance;\r
+    \r
+    private GetAsyncReplyMessageFactory() {\r
+        // singleton\r
+    }\r
+\r
+    /**\r
+     * @return singleton factory\r
+     */\r
+    public static GetAsyncReplyMessageFactory getInstance() {\r
+        if (instance == null) {\r
+            instance = new GetAsyncReplyMessageFactory();\r
+        }\r
+        return instance;\r
+    }\r
+    \r
+    @Override\r
+    public GetAsyncOutput bufferToMessage(ByteBuf rawMessage, short version) {\r
+        GetAsyncOutputBuilder builder = new GetAsyncOutputBuilder();\r
+        builder.setVersion(version);\r
+        builder.setXid(rawMessage.readUnsignedInt());\r
+        builder.setPacketInMask(decodePacketInMask(rawMessage));\r
+        builder.setPortStatusMask(decodePortStatusMask(rawMessage));\r
+        builder.setFlowRemovedMask(decodeFlowRemovedMask(rawMessage));\r
+        return builder.build();\r
+    }\r
+    \r
+    private static List<PacketInMask> decodePacketInMask(ByteBuf outputBuf) {\r
+        List<PacketInReason> readPIRList = new ArrayList<PacketInReason>();\r
+        List<PacketInMask> inMasks = new ArrayList<PacketInMask>();\r
+        PacketInMaskBuilder maskBuilder = new PacketInMaskBuilder();\r
+        \r
+        readPIRList.add(decodedPacketInReason((int) outputBuf.readUnsignedInt()));\r
+        readPIRList.add(decodedPacketInReason((int) outputBuf.readUnsignedInt()));\r
+        inMasks.add(maskBuilder.setMask(readPIRList).build()); \r
+        return inMasks;\r
+    }\r
+    \r
+    private static List<PortStatusMask> decodePortStatusMask(ByteBuf outputBuf) {\r
+        List<PortReason> readPortReasonList = new ArrayList<PortReason>();\r
+        List<PortStatusMask> inMasks = new ArrayList<PortStatusMask>();\r
+        PortStatusMaskBuilder maskBuilder = new PortStatusMaskBuilder();\r
+        \r
+        readPortReasonList.add(decodePortReason((int) outputBuf.readUnsignedInt()));\r
+        readPortReasonList.add(decodePortReason((int) outputBuf.readUnsignedInt()));\r
+        inMasks.add(maskBuilder.setMask(readPortReasonList).build()); \r
+        return inMasks;\r
+    }\r
+    \r
+    private static List<FlowRemovedMask> decodeFlowRemovedMask(ByteBuf outputBuf) {\r
+        List<FlowRemovedReason> readFlowRemovedReasonList = new ArrayList<FlowRemovedReason>();\r
+        List<FlowRemovedMask> inMasks = new ArrayList<FlowRemovedMask>();\r
+        FlowRemovedMaskBuilder maskBuilder = new FlowRemovedMaskBuilder();\r
+        \r
+        readFlowRemovedReasonList.add(decodeFlowRemovedReason((int) outputBuf.readUnsignedInt()));\r
+        readFlowRemovedReasonList.add(decodeFlowRemovedReason((int) outputBuf.readUnsignedInt()));\r
+        inMasks.add(maskBuilder.setMask(readFlowRemovedReasonList).build()); \r
+        return inMasks;\r
+    }\r
+    \r
+    private static PacketInReason decodedPacketInReason(int input) {\r
+        PacketInReason reason = null;\r
+        Boolean OFPRNOMATCH = (input & (1 << 0)) > 0;\r
+        Boolean OFPRACTION = (input & (1 << 1)) > 0;\r
+        Boolean OFPRINVALIDTTL = (input & (1 << 2)) > 0;\r
+        \r
+        if (OFPRNOMATCH) {\r
+            return PacketInReason.forValue(0);\r
+            }\r
+        if (OFPRACTION) {\r
+            return PacketInReason.forValue(1);\r
+            }\r
+        if (OFPRINVALIDTTL) {\r
+            return PacketInReason.forValue(2);\r
+            }\r
+        \r
+        return reason;\r
+    }\r
+    \r
+    private static PortReason decodePortReason(int input) {\r
+        PortReason reason = null;\r
+        Boolean OFPPRADD = (input & (1 << 0)) > 0;\r
+        Boolean OFPPRDELETE = (input & (1 << 1)) > 0;\r
+        Boolean OFPPRMODIFY = (input & (1 << 2)) > 0;\r
+        \r
+        if (OFPPRADD) {\r
+            return PortReason.forValue(0);\r
+            }\r
+        if (OFPPRDELETE) {\r
+            return PortReason.forValue(1);\r
+            }\r
+        if (OFPPRMODIFY) {\r
+            return PortReason.forValue(2);\r
+            }\r
+        \r
+        return reason;\r
+    }\r
+    \r
+    private static FlowRemovedReason decodeFlowRemovedReason(int input) {\r
+        FlowRemovedReason reason = null;\r
+        Boolean OFPRRIDLETIMEOUT = (input & (1 << 0)) > 0;\r
+        Boolean OFPRRHARDTIMEOUT = (input & (1 << 1)) > 0;\r
+        Boolean OFPRRDELETE = (input & (1 << 2)) > 0;\r
+        Boolean OFPRRGROUPDELETE = (input & (1 << 3)) > 0;\r
+        \r
+        if (OFPRRIDLETIMEOUT) {\r
+            return FlowRemovedReason.forValue(0);\r
+            }\r
+        if (OFPRRHARDTIMEOUT) {\r
+            return FlowRemovedReason.forValue(1);\r
+            }\r
+        if (OFPRRDELETE) {\r
+            return FlowRemovedReason.forValue(2);\r
+            }\r
+        if (OFPRRGROUPDELETE) {\r
+            return FlowRemovedReason.forValue(3);\r
+            }\r
+        \r
+        return reason;\r
+    }\r
+}\r