Added synchronized to singletons
[openflowjava.git] / openflow-protocol-impl / src / main / java / org / opendaylight / openflowjava / protocol / impl / deserialization / factories / PortStatusMessageFactory.java
1 package org.opendaylight.openflowjava.protocol.impl.deserialization.factories;\r
2 \r
3 import io.netty.buffer.ByteBuf;\r
4 \r
5 import org.opendaylight.openflowjava.protocol.impl.deserialization.OFDeserializer;\r
6 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;\r
7 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortConfig;\r
8 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortFeatures;\r
9 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortReason;\r
10 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortState;\r
11 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortStatusMessage;\r
12 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.PortStatusMessageBuilder;\r
13 \r
14 /**\r
15  * @author michal.polkorab\r
16  * @author timotej.kubas\r
17  */\r
18 public class PortStatusMessageFactory implements OFDeserializer<PortStatusMessage> {\r
19 \r
20     private static PortStatusMessageFactory instance;\r
21     private static final byte PADDING_IN_PORT_STATUS_HEADER = 7;\r
22     private static final byte PADDING_IN_OFP_PORT_HEADER_1 = 4;\r
23     private static final byte PADDING_IN_OFP_PORT_HEADER_2 = 2;\r
24     private static final int macAddressLength = 6;\r
25     \r
26     private PortStatusMessageFactory() {\r
27         // Singleton\r
28     }\r
29     \r
30     /**\r
31      * @return singleton factory\r
32      */\r
33     public static synchronized PortStatusMessageFactory getInstance(){\r
34         if(instance == null){\r
35             instance = new PortStatusMessageFactory();\r
36         }\r
37         return instance;\r
38     }\r
39     \r
40     @Override\r
41     public PortStatusMessage bufferToMessage(ByteBuf rawMessage, short version) {\r
42         PortStatusMessageBuilder builder = new PortStatusMessageBuilder(); \r
43         builder.setVersion(version);\r
44         builder.setXid(rawMessage.readUnsignedInt());\r
45         builder.setReason(PortReason.forValue(rawMessage.readUnsignedByte()));\r
46         rawMessage.skipBytes(PADDING_IN_PORT_STATUS_HEADER);\r
47         builder.setPortNo(rawMessage.readUnsignedInt());\r
48         rawMessage.skipBytes(PADDING_IN_OFP_PORT_HEADER_1);\r
49         StringBuffer macToString = new StringBuffer();\r
50         for(int i=0; i<macAddressLength; i++){\r
51             short mac = 0;\r
52             mac = rawMessage.readUnsignedByte();\r
53             macToString.append(String.format("%02X", mac));\r
54         }\r
55         builder.setHwAddr(new MacAddress(macToString.toString()));\r
56         rawMessage.skipBytes(PADDING_IN_OFP_PORT_HEADER_2);\r
57         builder.setConfig(createPortConfig(rawMessage.readUnsignedInt()));\r
58         builder.setState(createPortState(rawMessage.readUnsignedInt()));\r
59         builder.setCurrentFeatures(createPortFeatures(rawMessage.readUnsignedInt()));\r
60         builder.setAdvertisedFeatures(createPortFeatures(rawMessage.readUnsignedInt()));\r
61         builder.setSupportedFeatures(createPortFeatures(rawMessage.readUnsignedInt()));\r
62         builder.setPeerFeatures(createPortFeatures(rawMessage.readUnsignedInt()));\r
63         builder.setCurrSpeed(rawMessage.readUnsignedInt());\r
64         builder.setMaxSpeed(rawMessage.readUnsignedInt());\r
65         return builder.build();\r
66     }\r
67 \r
68     private static PortFeatures createPortFeatures(long input){\r
69         final Boolean _10mbHd = ((input) & (1<<0)) != 0;\r
70         final Boolean _10mbFd = ((input) & (1<<1)) != 0;\r
71         final Boolean _100mbHd = ((input) & (1<<2)) != 0;\r
72         final Boolean _100mbFd = ((input) & (1<<3)) != 0;\r
73         final Boolean _1gbHd = ((input) & (1<<4)) != 0;\r
74         final Boolean _1gbFd = ((input) & (1<<5)) != 0;\r
75         final Boolean _10gbFd = ((input) & (1<<6)) != 0;\r
76         final Boolean _40gbFd = ((input) & (1<<7)) != 0;\r
77         final Boolean _100gbFd = ((input) & (1<<8)) != 0;\r
78         final Boolean _1tbFd = ((input) & (1<<9)) != 0;\r
79         final Boolean _other = ((input) & (1<<10)) != 0;\r
80         final Boolean _copper = ((input) & (1<<11)) != 0;\r
81         final Boolean _fiber = ((input) & (1<<12)) != 0;\r
82         final Boolean _autoneg = ((input) & (1<<13)) != 0;\r
83         final Boolean _pause = ((input) & (1<<14)) != 0;\r
84         final Boolean _pauseAsym = ((input) & (1<<15)) != 0;\r
85         return new PortFeatures(_10mbHd, _10mbFd, _100mbHd, _100mbFd, _1gbHd, _1gbFd, _10gbFd,\r
86                 _40gbFd, _100gbFd, _1tbFd, _other, _copper, _fiber, _autoneg, _pause, _pauseAsym);\r
87     }\r
88     \r
89     private static PortState createPortState(long input){\r
90         final Boolean _linkDown = ((input) & (1<<0)) != 0;\r
91         final Boolean _blocked  = ((input) & (1<<1)) != 0;\r
92         final Boolean _live     = ((input) & (1<<2)) != 0;\r
93         return new PortState(_linkDown, _blocked,_live);\r
94     }\r
95     \r
96     private static PortConfig createPortConfig(long input){\r
97         final Boolean _portDown   = ((input) & (1<<0)) != 0;\r
98         final Boolean _noRecv    = ((input) & (1<<2)) != 0;\r
99         final Boolean _noFwd       = ((input) & (1<<5)) != 0;\r
100         final Boolean _noPacketIn = ((input) & (1<<6)) != 0;\r
101         return new PortConfig(_noFwd, _noPacketIn, _noRecv, _portDown);\r
102     }\r
103     \r
104 }\r