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