ErrorMessage - int values for type and code provided
[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     private static final int NO_CORRECT_ENUM_FOUND_VALUE = -1;\r
37     \r
38     private static ErrorMessageFactory instance;\r
39     \r
40     private ErrorMessageFactory() {\r
41         // do nothing, just singleton\r
42     }\r
43     \r
44     /**\r
45      * @return singleton factory\r
46      */\r
47     public static synchronized ErrorMessageFactory getInstance() {\r
48         if (instance == null) {\r
49             instance = new ErrorMessageFactory();\r
50         }\r
51         return instance;\r
52     }\r
53     \r
54     @Override\r
55     public ErrorMessage bufferToMessage(ByteBuf rawMessage, short version) {\r
56         ErrorMessageBuilder builder = new ErrorMessageBuilder();\r
57         builder.setVersion(version);\r
58         builder.setXid(rawMessage.readUnsignedInt());\r
59         ErrorType type = ErrorType.forValue(rawMessage.readUnsignedShort());\r
60         decodeType(builder, type);\r
61         decodeCode(rawMessage, builder, type);\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 decodeCode(ByteBuf rawMessage, ErrorMessageBuilder builder,\r
69             ErrorType type) {\r
70         \r
71         switch (type) {\r
72         case HELLOFAILED:\r
73         {\r
74             HelloFailedCode code = HelloFailedCode.forValue(rawMessage.readUnsignedShort());\r
75             if (code != null) {\r
76                 builder.setCode(code.getIntValue());\r
77                 builder.setCodeString(code.name());\r
78             }\r
79             break;\r
80         }\r
81         case BADREQUEST:\r
82         {\r
83             BadRequestCode code = BadRequestCode.forValue(rawMessage.readUnsignedShort());\r
84             if (code != null) {\r
85                 builder.setCode(code.getIntValue());\r
86                 builder.setCodeString(code.name());\r
87             }\r
88             break;\r
89         }\r
90         case BADACTION:\r
91         {\r
92             BadActionCode code = BadActionCode.forValue(rawMessage.readUnsignedShort());\r
93             if (code != null) {\r
94                 builder.setCode(code.getIntValue());\r
95                 builder.setCodeString(code.name());\r
96             }\r
97             break;\r
98         }\r
99         case BADINSTRUCTION:\r
100         {\r
101             BadInstructionCode code = BadInstructionCode.forValue(rawMessage.readUnsignedShort());\r
102             if (code != null) {\r
103                 builder.setCode(code.getIntValue());\r
104                 builder.setCodeString(code.name());\r
105             }\r
106             break;\r
107         }\r
108         case BADMATCH:\r
109         {\r
110             BadMatchCode code = BadMatchCode.forValue(rawMessage.readUnsignedShort());\r
111             if (code != null) {\r
112                 builder.setCode(code.getIntValue());\r
113                 builder.setCodeString(code.name());\r
114             }\r
115             break;\r
116         }\r
117         case FLOWMODFAILED:\r
118         {\r
119             FlowModFailedCode code = FlowModFailedCode.forValue(rawMessage.readUnsignedShort());\r
120             if (code != null) {\r
121                 builder.setCode(code.getIntValue());\r
122                 builder.setCodeString(code.name());\r
123             }\r
124             break;\r
125         }\r
126         case GROUPMODFAILED:\r
127         {\r
128             GroupModFailedCode code = GroupModFailedCode.forValue(rawMessage.readUnsignedShort());\r
129             if (code != null) {\r
130                 builder.setCode(code.getIntValue());\r
131                 builder.setCodeString(code.name());\r
132             }\r
133             break;\r
134         }\r
135         case PORTMODFAILED:\r
136         {\r
137             PortModFailedCode code = PortModFailedCode.forValue(rawMessage.readUnsignedShort());\r
138             if (code != null) {\r
139                 builder.setCode(code.getIntValue());\r
140                 builder.setCodeString(code.name());\r
141             }\r
142             break;\r
143         }\r
144         case TABLEMODFAILED:\r
145         {\r
146             TableModFailedCode code = TableModFailedCode.forValue(rawMessage.readUnsignedShort());\r
147             if (code != null) {\r
148                 builder.setCode(code.getIntValue());\r
149                 builder.setCodeString(code.name());\r
150             }\r
151             break;\r
152         }\r
153         case QUEUEOPFAILED:\r
154         {\r
155             QueueOpFailedCode code = QueueOpFailedCode.forValue(rawMessage.readUnsignedShort());\r
156             if (code != null) {\r
157                 builder.setCode(code.getIntValue());\r
158                 builder.setCodeString(code.name());\r
159             }\r
160             break;\r
161         }\r
162         case SWITCHCONFIGFAILED:\r
163         {\r
164             SwitchConfigFailedCode code = SwitchConfigFailedCode.forValue(rawMessage.readUnsignedShort());\r
165             if (code != null) {\r
166                 builder.setCode(code.getIntValue());\r
167                 builder.setCodeString(code.name());\r
168             }\r
169             break;\r
170         }\r
171         case ROLEREQUESTFAILED:\r
172         {\r
173             RoleRequestFailedCode code = RoleRequestFailedCode.forValue(rawMessage.readUnsignedShort());\r
174             if (code != null) {\r
175                 builder.setCode(code.getIntValue());\r
176                 builder.setCodeString(code.name());\r
177             }\r
178             break;\r
179         }\r
180         case METERMODFAILED:\r
181         {\r
182             MeterModFailedCode code = MeterModFailedCode.forValue(rawMessage.readUnsignedShort());\r
183             if (code != null) {\r
184                 builder.setCode(code.getIntValue());\r
185                 builder.setCodeString(code.name());\r
186             }\r
187             break;\r
188         }\r
189         case TABLEFEATURESFAILED:\r
190         {\r
191             TableFeaturesFailedCode code = TableFeaturesFailedCode.forValue(rawMessage.readUnsignedShort());\r
192             if (code != null) {\r
193                 builder.setCode(code.getIntValue());\r
194                 builder.setCodeString(code.name());\r
195             }\r
196             break;\r
197         }\r
198         case EXPERIMENTER:\r
199             ExperimenterErrorBuilder expBuilder = new ExperimenterErrorBuilder();\r
200             expBuilder.setExpType(rawMessage.readUnsignedShort());\r
201             expBuilder.setExperimenter(rawMessage.readUnsignedInt());\r
202             builder.addAugmentation(ExperimenterError.class, expBuilder.build());\r
203             break;\r
204         default:\r
205             builder.setCode(NO_CORRECT_ENUM_FOUND_VALUE);\r
206             builder.setCodeString(UNKNOWN_CODE);\r
207             break;\r
208         }\r
209     }\r
210 \r
211     private static void decodeType(ErrorMessageBuilder builder, ErrorType type) {\r
212         if (type != null) {\r
213             builder.setType(type.getIntValue());\r
214             builder.setTypeString(type.name());\r
215         } else {\r
216             builder.setType(NO_CORRECT_ENUM_FOUND_VALUE);\r
217             builder.setTypeString(UNKNOWN_TYPE);\r
218         }\r
219     }\r
220 \r
221 }\r