OF-1.0 related 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     private static final int NO_CORRECT_ENUM_FOUND_VALUE = -1;\r
26     \r
27     private static OF10ErrorMessageFactory instance;\r
28     \r
29     private OF10ErrorMessageFactory() {\r
30         // do nothing, just singleton\r
31     }\r
32     \r
33     /**\r
34      * @return singleton factory\r
35      */\r
36     public static synchronized OF10ErrorMessageFactory getInstance() {\r
37         if (instance == null) {\r
38             instance = new OF10ErrorMessageFactory();\r
39         }\r
40         return instance;\r
41     }\r
42     \r
43     @Override\r
44     public ErrorMessage bufferToMessage(ByteBuf rawMessage, short version) {\r
45         ErrorMessageBuilder builder = new ErrorMessageBuilder();\r
46         builder.setVersion(version);\r
47         builder.setXid(rawMessage.readUnsignedInt());\r
48         ErrorTypeV10 type = ErrorTypeV10.forValue(rawMessage.readUnsignedShort());\r
49         decodeType(builder, type);\r
50         decodeCode(rawMessage, builder, type);\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 decodeCode(ByteBuf rawMessage, ErrorMessageBuilder builder,\r
58             ErrorTypeV10 type) {\r
59         switch (type) {\r
60         case HELLOFAILED:\r
61         {\r
62             HelloFailedCodeV10 code = HelloFailedCodeV10.forValue(rawMessage.readUnsignedShort());\r
63             if (code != null) {\r
64                 builder.setCode(code.getIntValue());\r
65                 builder.setCodeString(code.name());\r
66             }\r
67             break;\r
68         }\r
69         case BADREQUEST:\r
70         {\r
71             BadRequestCodeV10 code = BadRequestCodeV10.forValue(rawMessage.readUnsignedShort());\r
72             if (code != null) {\r
73                 builder.setCode(code.getIntValue());\r
74                 builder.setCodeString(code.name());\r
75             }\r
76             break;\r
77         }\r
78         case BADACTION:\r
79         {\r
80             BadActionCodeV10 code = BadActionCodeV10.forValue(rawMessage.readUnsignedShort());\r
81             if (code != null) {\r
82                 builder.setCode(code.getIntValue());\r
83                 builder.setCodeString(code.name());\r
84             }\r
85             break;\r
86         }\r
87         case FLOWMODFAILED:\r
88         {\r
89             FlowModFailedCodeV10 code = FlowModFailedCodeV10.forValue(rawMessage.readUnsignedShort());\r
90             if (code != null) {\r
91                 builder.setCode(code.getIntValue());\r
92                 builder.setCodeString(code.name());\r
93             }\r
94             break;\r
95         }\r
96         case PORTMODFAILED:\r
97         {\r
98             PortModFailedCodeV10 code = PortModFailedCodeV10.forValue(rawMessage.readUnsignedShort());\r
99             if (code != null) {\r
100                 builder.setCode(code.getIntValue());\r
101                 builder.setCodeString(code.name());\r
102             }\r
103             break;\r
104         }\r
105         case QUEUEOPFAILED:\r
106         {\r
107             QueueOpFailedCodeV10 code = QueueOpFailedCodeV10.forValue(rawMessage.readUnsignedShort());\r
108             if (code != null) {\r
109                 builder.setCode(code.getIntValue());\r
110                 builder.setCodeString(code.name());\r
111             }\r
112             break;\r
113         }\r
114         default:\r
115             builder.setCode(NO_CORRECT_ENUM_FOUND_VALUE);\r
116             builder.setCodeString(UNKNOWN_CODE);\r
117             break;\r
118         }\r
119     }\r
120 \r
121     private static void decodeType(ErrorMessageBuilder builder, ErrorTypeV10 type) {\r
122         if (type != null) {\r
123             builder.setType(type.getIntValue());\r
124             builder.setTypeString(type.name());\r
125         } else {\r
126             builder.setType(NO_CORRECT_ENUM_FOUND_VALUE);\r
127             builder.setTypeString(UNKNOWN_TYPE);\r
128         }\r
129     }\r
130 \r
131 }\r