4f8113ee9d6e3c55e958579c2bcc7779c734bfb1
[openflowjava.git] / openflow-protocol-impl / src / main / java / org / opendaylight / openflowjava / protocol / impl / deserialization / factories / HelloMessageFactory.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 java.util.ArrayList;\r
5 import java.util.List;\r
6 \r
7 import io.netty.buffer.ByteBuf;\r
8 \r
9 import org.opendaylight.openflowjava.protocol.impl.deserialization.OFDeserializer;\r
10 import org.opendaylight.openflowjava.protocol.impl.serialization.factories.EncodeConstants;\r
11 import org.opendaylight.openflowjava.protocol.impl.serialization.factories.HelloInputMessageFactory;\r
12 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.HelloElementType;\r
13 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.HelloMessage;\r
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.HelloMessageBuilder;\r
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.hello.Elements;\r
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.hello.ElementsBuilder;\r
17 \r
18 /**\r
19  * @author michal.polkorab\r
20  *\r
21  */\r
22 public class HelloMessageFactory implements OFDeserializer<HelloMessage> {\r
23 \r
24     private static HelloMessageFactory instance;\r
25     \r
26     private HelloMessageFactory() {\r
27         // do nothing, just singleton\r
28     }\r
29     \r
30     /**\r
31      * @return singleton factory\r
32      */\r
33     public static synchronized HelloMessageFactory getInstance() {\r
34         if (instance == null) {\r
35             instance = new HelloMessageFactory();\r
36         }\r
37         return instance;\r
38     }\r
39     \r
40     @Override\r
41     public HelloMessage bufferToMessage(ByteBuf rawMessage, short version) {\r
42         HelloMessageBuilder builder = new HelloMessageBuilder();\r
43         builder.setVersion(version);\r
44         builder.setXid(rawMessage.readUnsignedInt());\r
45         if (rawMessage.readableBytes() > 0) {\r
46             builder.setElements(readElement(rawMessage));\r
47         }\r
48         return builder.build();\r
49     }\r
50     \r
51     private static List<Elements> readElement(ByteBuf input) {\r
52         List<Elements> elementsList = new ArrayList<>();\r
53         while (input.readableBytes() > 0) {\r
54             ElementsBuilder elementsBuilder = new ElementsBuilder();\r
55             int type = input.readUnsignedShort();\r
56             int elementLength = input.readUnsignedShort();\r
57             if (type == HelloElementType.VERSIONBITMAP.getIntValue()) {\r
58                 elementsBuilder.setType(HelloElementType.forValue(type));\r
59                 int[] versionBitmap = new int[(elementLength - HelloInputMessageFactory.HELLO_ELEMENT_HEADER_SIZE) / 4];\r
60                 for (int i = 0; i < versionBitmap.length; i++) {\r
61                     versionBitmap[i] = (int) input.readUnsignedInt();\r
62                 }\r
63                 elementsBuilder.setVersionBitmap(readVersionBitmap(versionBitmap));\r
64                 int paddingRemainder = elementLength % EncodeConstants.PADDING;\r
65                 if (paddingRemainder != 0) {\r
66                     input.readBytes(EncodeConstants.PADDING - paddingRemainder);\r
67                 }\r
68             }\r
69             elementsList.add(elementsBuilder.build());\r
70         }\r
71         return elementsList;\r
72     }\r
73     \r
74     private static List<Boolean> readVersionBitmap(int[] input){\r
75         List<Boolean> versionBitmapList = new ArrayList<>();\r
76         for (int i = 0; i < input.length; i++) {\r
77             int mask = input[i];\r
78             for (int j = 0; j < Integer.SIZE; j++) {\r
79                     versionBitmapList.add((mask & (1<<j)) != 0);\r
80             }\r
81         }\r
82         return versionBitmapList;\r
83     }\r
84 }\r