"Added more deserialization factories & their unit tests"
[openflowjava.git] / openflow-protocol-impl / src / main / java / org / opendaylight / openflowjava / protocol / impl / deserialization / factories / PacketInMessageFactory.java
1 package org.opendaylight.openflowjava.protocol.impl.deserialization.factories;\r
2 \r
3 import io.netty.buffer.ByteBuf;\r
4 \r
5 import java.math.BigInteger;\r
6 \r
7 import org.opendaylight.openflowjava.protocol.impl.deserialization.OFDeserializer;\r
8 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.TableId;\r
9 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketInMessage;\r
10 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PacketInMessageBuilder;\r
11 \r
12 /**\r
13  * @author michal.polkorab\r
14  * @author timotej.kubas\r
15  */\r
16 public class PacketInMessageFactory implements OFDeserializer<PacketInMessage> {\r
17 \r
18     private static PacketInMessageFactory instance;\r
19     private static final byte PADDING_IN_PACKET_IN_HEADER = 2;\r
20     \r
21     private PacketInMessageFactory() {\r
22         // Singleton\r
23     }\r
24     \r
25     /**\r
26      * @return singleton factory\r
27      */\r
28     public static PacketInMessageFactory getInstance(){\r
29         if(instance == null){\r
30             instance = new PacketInMessageFactory();\r
31         }\r
32         return instance;\r
33     }\r
34 \r
35     @Override\r
36     public PacketInMessage bufferToMessage(ByteBuf rawMessage, short version) {\r
37         PacketInMessageBuilder builder = new PacketInMessageBuilder();\r
38         builder.setVersion(version);\r
39         builder.setXid(rawMessage.readUnsignedInt());\r
40         builder.setBufferId(rawMessage.readUnsignedInt());\r
41         builder.setTotalLen(rawMessage.readUnsignedShort());\r
42         builder.setReason(rawMessage.readUnsignedByte());\r
43         builder.setTableId(new TableId((long)rawMessage.readUnsignedByte()));\r
44         byte[] cookie = new byte[Long.SIZE/Byte.SIZE];\r
45         rawMessage.readBytes(cookie);\r
46         builder.setCookie(new BigInteger(cookie));\r
47         // TODO - implement match factories to finish this factory \r
48         rawMessage.skipBytes(PADDING_IN_PACKET_IN_HEADER);\r
49         builder.setData(rawMessage.readBytes(rawMessage.readableBytes()).array());\r
50         return builder.build();\r
51     }\r
52 }\r