new serialization factories and tests
[openflowjava.git] / openflow-protocol-impl / src / main / java / org / opendaylight / openflowjava / protocol / impl / deserialization / factories / GetAsyncReplyMessageFactory.java
1 /* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */\r
2 package org.opendaylight.openflowjava.protocol.impl.deserialization.factories;\r
3 \r
4 import io.netty.buffer.ByteBuf;\r
5 \r
6 import java.util.ArrayList;\r
7 import java.util.List;\r
8 \r
9 import org.opendaylight.openflowjava.protocol.impl.deserialization.OFDeserializer;\r
10 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.FlowRemovedReason;\r
11 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PacketInReason;\r
12 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortReason;\r
13 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetAsyncOutput;\r
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GetAsyncOutputBuilder;\r
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.get.async.reply.FlowRemovedMask;\r
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.get.async.reply.FlowRemovedMaskBuilder;\r
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.get.async.reply.PacketInMask;\r
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.get.async.reply.PacketInMaskBuilder;\r
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.get.async.reply.PortStatusMask;\r
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.get.async.reply.PortStatusMaskBuilder;\r
21 \r
22 /**\r
23  * @author timotej.kubas\r
24  * @author michal.polkorab\r
25  */\r
26 public class GetAsyncReplyMessageFactory implements OFDeserializer<GetAsyncOutput> {\r
27     private static GetAsyncReplyMessageFactory instance;\r
28     \r
29     private GetAsyncReplyMessageFactory() {\r
30         // singleton\r
31     }\r
32 \r
33     /**\r
34      * @return singleton factory\r
35      */\r
36     public static GetAsyncReplyMessageFactory getInstance() {\r
37         if (instance == null) {\r
38             instance = new GetAsyncReplyMessageFactory();\r
39         }\r
40         return instance;\r
41     }\r
42     \r
43     @Override\r
44     public GetAsyncOutput bufferToMessage(ByteBuf rawMessage, short version) {\r
45         GetAsyncOutputBuilder builder = new GetAsyncOutputBuilder();\r
46         builder.setVersion(version);\r
47         builder.setXid(rawMessage.readUnsignedInt());\r
48         builder.setPacketInMask(decodePacketInMask(rawMessage));\r
49         builder.setPortStatusMask(decodePortStatusMask(rawMessage));\r
50         builder.setFlowRemovedMask(decodeFlowRemovedMask(rawMessage));\r
51         return builder.build();\r
52     }\r
53     \r
54     private static List<PacketInMask> decodePacketInMask(ByteBuf outputBuf) {\r
55         List<PacketInReason> readPIRList = new ArrayList<PacketInReason>();\r
56         List<PacketInMask> inMasks = new ArrayList<PacketInMask>();\r
57         PacketInMaskBuilder maskBuilder = new PacketInMaskBuilder();\r
58         \r
59         readPIRList.add(decodedPacketInReason((int) outputBuf.readUnsignedInt()));\r
60         readPIRList.add(decodedPacketInReason((int) outputBuf.readUnsignedInt()));\r
61         inMasks.add(maskBuilder.setMask(readPIRList).build()); \r
62         return inMasks;\r
63     }\r
64     \r
65     private static List<PortStatusMask> decodePortStatusMask(ByteBuf outputBuf) {\r
66         List<PortReason> readPortReasonList = new ArrayList<PortReason>();\r
67         List<PortStatusMask> inMasks = new ArrayList<PortStatusMask>();\r
68         PortStatusMaskBuilder maskBuilder = new PortStatusMaskBuilder();\r
69         \r
70         readPortReasonList.add(decodePortReason((int) outputBuf.readUnsignedInt()));\r
71         readPortReasonList.add(decodePortReason((int) outputBuf.readUnsignedInt()));\r
72         inMasks.add(maskBuilder.setMask(readPortReasonList).build()); \r
73         return inMasks;\r
74     }\r
75     \r
76     private static List<FlowRemovedMask> decodeFlowRemovedMask(ByteBuf outputBuf) {\r
77         List<FlowRemovedReason> readFlowRemovedReasonList = new ArrayList<FlowRemovedReason>();\r
78         List<FlowRemovedMask> inMasks = new ArrayList<FlowRemovedMask>();\r
79         FlowRemovedMaskBuilder maskBuilder = new FlowRemovedMaskBuilder();\r
80         \r
81         readFlowRemovedReasonList.add(decodeFlowRemovedReason((int) outputBuf.readUnsignedInt()));\r
82         readFlowRemovedReasonList.add(decodeFlowRemovedReason((int) outputBuf.readUnsignedInt()));\r
83         inMasks.add(maskBuilder.setMask(readFlowRemovedReasonList).build()); \r
84         return inMasks;\r
85     }\r
86     \r
87     private static PacketInReason decodedPacketInReason(int input) {\r
88         PacketInReason reason = null;\r
89         Boolean OFPRNOMATCH = (input & (1 << 0)) > 0;\r
90         Boolean OFPRACTION = (input & (1 << 1)) > 0;\r
91         Boolean OFPRINVALIDTTL = (input & (1 << 2)) > 0;\r
92         \r
93         if (OFPRNOMATCH) {\r
94             return PacketInReason.forValue(0);\r
95             }\r
96         if (OFPRACTION) {\r
97             return PacketInReason.forValue(1);\r
98             }\r
99         if (OFPRINVALIDTTL) {\r
100             return PacketInReason.forValue(2);\r
101             }\r
102         \r
103         return reason;\r
104     }\r
105     \r
106     private static PortReason decodePortReason(int input) {\r
107         PortReason reason = null;\r
108         Boolean OFPPRADD = (input & (1 << 0)) > 0;\r
109         Boolean OFPPRDELETE = (input & (1 << 1)) > 0;\r
110         Boolean OFPPRMODIFY = (input & (1 << 2)) > 0;\r
111         \r
112         if (OFPPRADD) {\r
113             return PortReason.forValue(0);\r
114             }\r
115         if (OFPPRDELETE) {\r
116             return PortReason.forValue(1);\r
117             }\r
118         if (OFPPRMODIFY) {\r
119             return PortReason.forValue(2);\r
120             }\r
121         \r
122         return reason;\r
123     }\r
124     \r
125     private static FlowRemovedReason decodeFlowRemovedReason(int input) {\r
126         FlowRemovedReason reason = null;\r
127         Boolean OFPRRIDLETIMEOUT = (input & (1 << 0)) > 0;\r
128         Boolean OFPRRHARDTIMEOUT = (input & (1 << 1)) > 0;\r
129         Boolean OFPRRDELETE = (input & (1 << 2)) > 0;\r
130         Boolean OFPRRGROUPDELETE = (input & (1 << 3)) > 0;\r
131         \r
132         if (OFPRRIDLETIMEOUT) {\r
133             return FlowRemovedReason.forValue(0);\r
134             }\r
135         if (OFPRRHARDTIMEOUT) {\r
136             return FlowRemovedReason.forValue(1);\r
137             }\r
138         if (OFPRRDELETE) {\r
139             return FlowRemovedReason.forValue(2);\r
140             }\r
141         if (OFPRRGROUPDELETE) {\r
142             return FlowRemovedReason.forValue(3);\r
143             }\r
144         \r
145         return reason;\r
146     }\r
147 }\r