OF1.0 fixes
[openflowjava.git] / openflow-protocol-impl / src / main / java / org / opendaylight / openflowjava / protocol / impl / deserialization / factories / OF10ErrorMessageFactory.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 org.opendaylight.openflowjava.protocol.impl.deserialization.OFDeserializer;\r
7 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.BadActionCodeV10;\r
8 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.BadRequestCodeV10;\r
9 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.ErrorTypeV10;\r
10 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.FlowModFailedCodeV10;\r
11 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.HelloFailedCodeV10;\r
12 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortModFailedCodeV10;\r
13 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.QueueOpFailedCodeV10;\r
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ErrorMessage;\r
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ErrorMessageBuilder;\r
16 \r
17 /**\r
18  * Translates Error messages (OpenFlow v1.0)\r
19  * @author michal.polkorab\r
20  */\r
21 public class OF10ErrorMessageFactory implements OFDeserializer<ErrorMessage> {\r
22 \r
23         private static final String UNKNOWN_TYPE = "UNKNOWN_TYPE";\r
24     private static final String UNKNOWN_CODE = "UNKNOWN_CODE";\r
25     \r
26     private static OF10ErrorMessageFactory instance;\r
27     \r
28     private OF10ErrorMessageFactory() {\r
29         // do nothing, just singleton\r
30     }\r
31     \r
32     /**\r
33      * @return singleton factory\r
34      */\r
35     public static synchronized OF10ErrorMessageFactory getInstance() {\r
36         if (instance == null) {\r
37             instance = new OF10ErrorMessageFactory();\r
38         }\r
39         return instance;\r
40     }\r
41     \r
42     @Override\r
43     public ErrorMessage bufferToMessage(ByteBuf rawMessage, short version) {\r
44         ErrorMessageBuilder builder = new ErrorMessageBuilder();\r
45         builder.setVersion(version);\r
46         builder.setXid(rawMessage.readUnsignedInt());\r
47         int type = rawMessage.readUnsignedShort();\r
48         ErrorTypeV10 errorType = ErrorTypeV10.forValue(type);\r
49         decodeType(builder, errorType, type);\r
50         decodeCode(rawMessage, builder, errorType);\r
51         if (rawMessage.readableBytes() > 0) {\r
52             builder.setData(rawMessage.readBytes(rawMessage.readableBytes()).array());\r
53         }\r
54         return builder.build();\r
55     }\r
56     \r
57     private static void decodeType(ErrorMessageBuilder builder, ErrorTypeV10 type, int readValue) {\r
58         if (type != null) {\r
59             builder.setType(type.getIntValue());\r
60             builder.setTypeString(type.name());\r
61         } else {\r
62             builder.setType(readValue);\r
63             builder.setTypeString(UNKNOWN_TYPE);\r
64         }\r
65     }\r
66 \r
67     private static void decodeCode(ByteBuf rawMessage, ErrorMessageBuilder builder,\r
68             ErrorTypeV10 type) {\r
69         int code = rawMessage.readUnsignedShort();\r
70         if (type != null) {\r
71                 switch (type) {\r
72                 case HELLOFAILED:\r
73                 {\r
74                         HelloFailedCodeV10 errorCode = HelloFailedCodeV10.forValue(code);\r
75                         if (errorCode != null) {\r
76                                 setCode(builder, errorCode.getIntValue(), errorCode.name());\r
77                         } else {\r
78                                 setUnknownCode(builder, code);\r
79                         }\r
80                         break;\r
81                 }\r
82                 case BADREQUEST:\r
83                 {\r
84                         BadRequestCodeV10 errorCode = BadRequestCodeV10.forValue(code);\r
85                         if (errorCode != null) {\r
86                                 setCode(builder, errorCode.getIntValue(), errorCode.name());\r
87                         } else {\r
88                                 setUnknownCode(builder, code);\r
89                         }\r
90                         break;\r
91                 }\r
92                 case BADACTION:\r
93                 {\r
94                         BadActionCodeV10 errorCode = BadActionCodeV10.forValue(code);\r
95                         if (errorCode != null) {\r
96                                 setCode(builder, errorCode.getIntValue(), errorCode.name());\r
97                         } else {\r
98                                 setUnknownCode(builder, code);\r
99                         }\r
100                         break;\r
101                 }\r
102                 case FLOWMODFAILED:\r
103                 {\r
104                         FlowModFailedCodeV10 errorCode = FlowModFailedCodeV10.forValue(code);\r
105                         if (errorCode != null) {\r
106                                 setCode(builder, errorCode.getIntValue(), errorCode.name());\r
107                         } else {\r
108                                 setUnknownCode(builder, code);\r
109                         }\r
110                         break;\r
111                 }\r
112                 case PORTMODFAILED:\r
113                 {\r
114                         PortModFailedCodeV10 errorCode = PortModFailedCodeV10.forValue(code);\r
115                         if (errorCode != null) {\r
116                                 setCode(builder, errorCode.getIntValue(), errorCode.name());\r
117                         } else {\r
118                                 setUnknownCode(builder, code);\r
119                         }\r
120                         break;\r
121                 }\r
122                 case QUEUEOPFAILED:\r
123                 {\r
124                         QueueOpFailedCodeV10 errorCode = QueueOpFailedCodeV10.forValue(code);\r
125                         if (errorCode != null) {\r
126                                 setCode(builder, errorCode.getIntValue(), errorCode.name());\r
127                         } else {\r
128                                 setUnknownCode(builder, code);\r
129                         }\r
130                         break;\r
131                 }\r
132                 default:\r
133                         setUnknownCode(builder, code);\r
134                         break;\r
135                 }\r
136         } else {\r
137                 setUnknownCode(builder, code);\r
138         }\r
139     }\r
140     \r
141     private static void setUnknownCode(ErrorMessageBuilder builder, int readValue) {\r
142         builder.setCode(readValue);\r
143                 builder.setCodeString(UNKNOWN_CODE);\r
144     }\r
145     \r
146     private static void setCode(ErrorMessageBuilder builder, int code, String codeString) {\r
147         builder.setCode(code);\r
148                 builder.setCodeString(codeString);\r
149     }\r
150 \r
151 }\r