Error code support for ErrorMessage
[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 OF10ErrorMessageFactory instance;\r
24     \r
25     private OF10ErrorMessageFactory() {\r
26         // do nothing, just singleton\r
27     }\r
28     \r
29     /**\r
30      * @return singleton factory\r
31      */\r
32     public static synchronized OF10ErrorMessageFactory getInstance() {\r
33         if (instance == null) {\r
34             instance = new OF10ErrorMessageFactory();\r
35         }\r
36         return instance;\r
37     }\r
38     \r
39     @Override\r
40     public ErrorMessage bufferToMessage(ByteBuf rawMessage, short version) {\r
41         ErrorMessageBuilder builder = new ErrorMessageBuilder();\r
42         builder.setVersion(version);\r
43         builder.setXid(rawMessage.readUnsignedInt());\r
44         ErrorTypeV10 type = ErrorTypeV10.forValue(rawMessage.readUnsignedShort());\r
45         decodeType(builder, type);\r
46         decodeCode(rawMessage, builder, type);\r
47         if (rawMessage.readableBytes() > 0) {\r
48             builder.setData(rawMessage.readBytes(rawMessage.readableBytes()).array());\r
49         }\r
50         return builder.build();\r
51     }\r
52 \r
53     private static void decodeCode(ByteBuf rawMessage, ErrorMessageBuilder builder,\r
54             ErrorTypeV10 type) {\r
55         switch (type) {\r
56         case HELLOFAILED:\r
57         {\r
58             HelloFailedCodeV10 code = HelloFailedCodeV10.forValue(rawMessage.readUnsignedShort());\r
59             if (code != null) {\r
60                 builder.setCode(code.name());\r
61             }\r
62             break;\r
63         }\r
64         case BADREQUEST:\r
65         {\r
66             BadRequestCodeV10 code = BadRequestCodeV10.forValue(rawMessage.readUnsignedShort());\r
67             if (code != null) {\r
68                 builder.setCode(code.name());\r
69             }\r
70             break;\r
71         }\r
72         case BADACTION:\r
73         {\r
74             BadActionCodeV10 code = BadActionCodeV10.forValue(rawMessage.readUnsignedShort());\r
75             if (code != null) {\r
76                 builder.setCode(code.name());\r
77             }\r
78             break;\r
79         }\r
80         case FLOWMODFAILED:\r
81         {\r
82             FlowModFailedCodeV10 code = FlowModFailedCodeV10.forValue(rawMessage.readUnsignedShort());\r
83             if (code != null) {\r
84                 builder.setCode(code.name());\r
85             }\r
86             break;\r
87         }\r
88         case PORTMODFAILED:\r
89         {\r
90             PortModFailedCodeV10 code = PortModFailedCodeV10.forValue(rawMessage.readUnsignedShort());\r
91             if (code != null) {\r
92                 builder.setCode(code.name());\r
93             }\r
94             break;\r
95         }\r
96         case QUEUEOPFAILED:\r
97         {\r
98             QueueOpFailedCodeV10 code = QueueOpFailedCodeV10.forValue(rawMessage.readUnsignedShort());\r
99             if (code != null) {\r
100                 builder.setCode(code.name());\r
101             }\r
102             break;\r
103         }\r
104         default:\r
105             builder.setCode("UNKNOWN_CODE");\r
106             break;\r
107         }\r
108     }\r
109 \r
110     private static void decodeType(ErrorMessageBuilder builder, ErrorTypeV10 type) {\r
111         if (type != null) {\r
112             builder.setType(type.name());\r
113         } else {\r
114             builder.setType("UNKNOWN_TYPE");\r
115         }\r
116     }\r
117 \r
118 }\r