3463855bafd1ef70f7a88f83b23054210d72df45
[openflowjava.git] / openflow-protocol-impl / src / main / java / org / opendaylight / openflowjava / protocol / impl / deserialization / factories / ErrorMessageFactory.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.augments.rev131002.ExperimenterError;\r
8 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterErrorBuilder;\r
9 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.BadActionCode;\r
10 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.BadInstructionCode;\r
11 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.BadMatchCode;\r
12 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.BadRequestCode;\r
13 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.ErrorType;\r
14 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.FlowModFailedCode;\r
15 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupModFailedCode;\r
16 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.HelloFailedCode;\r
17 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterModFailedCode;\r
18 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortModFailedCode;\r
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.QueueOpFailedCode;\r
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.RoleRequestFailedCode;\r
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.SwitchConfigFailedCode;\r
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.TableFeaturesFailedCode;\r
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.TableModFailedCode;\r
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ErrorMessage;\r
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ErrorMessageBuilder;\r
26 \r
27 /**\r
28  * Translates Error messages\r
29  * @author michal.polkorab\r
30  * @author timotej.kubas\r
31  */\r
32 public class ErrorMessageFactory implements OFDeserializer<ErrorMessage> {\r
33 \r
34     private static final String UNKNOWN_CODE = "UNKNOWN_CODE";\r
35     private static final String UNKNOWN_TYPE = "UNKNOWN_TYPE";\r
36     \r
37     private static ErrorMessageFactory instance;\r
38     \r
39     private ErrorMessageFactory() {\r
40         // do nothing, just singleton\r
41     }\r
42     \r
43     /**\r
44      * @return singleton factory\r
45      */\r
46     public static synchronized ErrorMessageFactory getInstance() {\r
47         if (instance == null) {\r
48             instance = new ErrorMessageFactory();\r
49         }\r
50         return instance;\r
51     }\r
52     \r
53     @Override\r
54     public ErrorMessage bufferToMessage(ByteBuf rawMessage, short version) {\r
55         ErrorMessageBuilder builder = new ErrorMessageBuilder();\r
56         builder.setVersion(version);\r
57         builder.setXid(rawMessage.readUnsignedInt());\r
58         int type = rawMessage.readUnsignedShort();\r
59         ErrorType errorType = ErrorType.forValue(type);\r
60         decodeType(builder, errorType, type);\r
61         decodeCode(rawMessage, builder, errorType);\r
62         if (rawMessage.readableBytes() > 0) {\r
63             builder.setData(rawMessage.readBytes(rawMessage.readableBytes()).array());\r
64         }\r
65         return builder.build();\r
66     }\r
67     \r
68     private static void decodeType(ErrorMessageBuilder builder, ErrorType type, int readValue) {\r
69         if (type != null) {\r
70             builder.setType(type.getIntValue());\r
71             builder.setTypeString(type.name());\r
72         } else {\r
73             builder.setType(readValue);\r
74             builder.setTypeString(UNKNOWN_TYPE);\r
75         }\r
76     }\r
77 \r
78     private static void decodeCode(ByteBuf rawMessage, ErrorMessageBuilder builder,\r
79             ErrorType type) {\r
80         int code = rawMessage.readUnsignedShort();\r
81         if (type != null) {\r
82             switch (type) {\r
83             case HELLOFAILED:\r
84             {\r
85                 HelloFailedCode errorCode = HelloFailedCode.forValue(code);\r
86                 if (errorCode != null) {\r
87                     setCode(builder, errorCode.getIntValue(), errorCode.name());\r
88                 } else {\r
89                     setUnknownCode(builder, code);\r
90                 }\r
91                 break;\r
92             }\r
93             case BADREQUEST:\r
94             {\r
95                 BadRequestCode errorCode = BadRequestCode.forValue(code);\r
96                 if (errorCode != null) {\r
97                     setCode(builder, errorCode.getIntValue(), errorCode.name());\r
98                 } else {\r
99                     setUnknownCode(builder, code);\r
100                 }\r
101                 break;\r
102             }\r
103             case BADACTION:\r
104             {\r
105                 BadActionCode errorCode = BadActionCode.forValue(code);\r
106                 if (errorCode != null) {\r
107                     setCode(builder, errorCode.getIntValue(), errorCode.name());\r
108                 } else {\r
109                     setUnknownCode(builder, code);\r
110                 }\r
111                 break;\r
112             }\r
113             case BADINSTRUCTION:\r
114             {\r
115                 BadInstructionCode errorCode = BadInstructionCode.forValue(code);\r
116                 if (errorCode != null) {\r
117                     setCode(builder, errorCode.getIntValue(), errorCode.name());\r
118                 } else {\r
119                     setUnknownCode(builder, code);\r
120                 }\r
121                 break;\r
122             }\r
123             case BADMATCH:\r
124             {\r
125                 BadMatchCode errorCode = BadMatchCode.forValue(code);\r
126                 if (errorCode != null) {\r
127                     setCode(builder, errorCode.getIntValue(), errorCode.name());\r
128                 } else {\r
129                     setUnknownCode(builder, code);\r
130                 }\r
131                 break;\r
132             }\r
133             case FLOWMODFAILED:\r
134             {\r
135                 FlowModFailedCode errorCode = FlowModFailedCode.forValue(code);\r
136                 if (errorCode != null) {\r
137                     setCode(builder, errorCode.getIntValue(), errorCode.name());\r
138                 } else {\r
139                     setUnknownCode(builder, code);\r
140                 }\r
141                 break;\r
142             }\r
143             case GROUPMODFAILED:\r
144             {\r
145                 GroupModFailedCode errorCode = GroupModFailedCode.forValue(code);\r
146                 if (errorCode != null) {\r
147                     setCode(builder, errorCode.getIntValue(), errorCode.name());\r
148                 } else {\r
149                     setUnknownCode(builder, code);\r
150                 }\r
151                 break;\r
152             }\r
153             case PORTMODFAILED:\r
154             {\r
155                 PortModFailedCode errorCode = PortModFailedCode.forValue(code);\r
156                 if (errorCode != null) {\r
157                     setCode(builder, errorCode.getIntValue(), errorCode.name());\r
158                 } else {\r
159                     setUnknownCode(builder, code);\r
160                 }\r
161                 break;\r
162             }\r
163             case TABLEMODFAILED:\r
164             {\r
165                 TableModFailedCode errorCode = TableModFailedCode.forValue(code);\r
166                 if (errorCode != null) {\r
167                     setCode(builder, errorCode.getIntValue(), errorCode.name());\r
168                 } else {\r
169                     setUnknownCode(builder, code);\r
170                 }\r
171                 break;\r
172             }\r
173             case QUEUEOPFAILED:\r
174             {\r
175                 QueueOpFailedCode errorCode = QueueOpFailedCode.forValue(code);\r
176                 if (errorCode != null) {\r
177                     setCode(builder, errorCode.getIntValue(), errorCode.name());\r
178                 } else {\r
179                     setUnknownCode(builder, code);\r
180                 }\r
181                 break;\r
182             }\r
183             case SWITCHCONFIGFAILED:\r
184             {\r
185                 SwitchConfigFailedCode errorCode = SwitchConfigFailedCode.forValue(code);\r
186                 if (errorCode != null) {\r
187                     setCode(builder, errorCode.getIntValue(), errorCode.name());\r
188                 } else {\r
189                     setUnknownCode(builder, code);\r
190                 }\r
191                 break;\r
192             }\r
193             case ROLEREQUESTFAILED:\r
194             {\r
195                 RoleRequestFailedCode errorCode = RoleRequestFailedCode.forValue(code);\r
196                 if (errorCode != null) {\r
197                     setCode(builder, errorCode.getIntValue(), errorCode.name());\r
198                 } else {\r
199                     setUnknownCode(builder, code);\r
200                 }\r
201                 break;\r
202             }\r
203             case METERMODFAILED:\r
204             {\r
205                 MeterModFailedCode errorCode = MeterModFailedCode.forValue(code);\r
206                 if (errorCode != null) {\r
207                     setCode(builder, errorCode.getIntValue(), errorCode.name());\r
208                 } else {\r
209                     setUnknownCode(builder, code);\r
210                 }\r
211                 break;\r
212             }\r
213             case TABLEFEATURESFAILED:\r
214             {\r
215                 TableFeaturesFailedCode errorCode = TableFeaturesFailedCode.forValue(code);\r
216                 if (errorCode != null) {\r
217                     setCode(builder, errorCode.getIntValue(), errorCode.name());\r
218                 } else {\r
219                     setUnknownCode(builder, code);\r
220                 }\r
221                 break;\r
222             }\r
223             case EXPERIMENTER:\r
224                 ExperimenterErrorBuilder expBuilder = new ExperimenterErrorBuilder();\r
225                 expBuilder.setExpType(code);\r
226                 expBuilder.setExperimenter(rawMessage.readUnsignedInt());\r
227                 builder.addAugmentation(ExperimenterError.class, expBuilder.build());\r
228                 break;\r
229             default:\r
230                 setUnknownCode(builder, code);\r
231                 break;\r
232             }\r
233         } else {\r
234             setUnknownCode(builder, code);\r
235         }\r
236     }\r
237     \r
238     private static void setUnknownCode(ErrorMessageBuilder builder, int readValue) {\r
239         builder.setCode(readValue);\r
240         builder.setCodeString(UNKNOWN_CODE);\r
241     }\r
242     \r
243     private static void setCode(ErrorMessageBuilder builder, int code, String codeString) {\r
244         builder.setCode(code);\r
245         builder.setCodeString(codeString);\r
246     }\r
247 \r
248 }\r