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