-/* Copyright (C)2013 Pantheon Technologies, s.r.o. All rights reserved. */\r
-package org.opendaylight.openflowjava.protocol.impl.deserialization.factories;\r
-\r
-import io.netty.buffer.ByteBuf;\r
-\r
-import org.opendaylight.openflowjava.protocol.impl.deserialization.OFDeserializer;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.ErrorType;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ErrorMessage;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ErrorMessageBuilder;\r
-\r
-/**\r
- * Translates Error messages (OpenFlow v1.0)\r
- * @author michal.polkorab\r
- */\r
-public class OF10ErrorMessageFactory implements OFDeserializer<ErrorMessage> {\r
-\r
-private static OF10ErrorMessageFactory instance;\r
- \r
- private OF10ErrorMessageFactory() {\r
- // do nothing, just singleton\r
- }\r
- \r
- /**\r
- * @return singleton factory\r
- */\r
- public static synchronized OF10ErrorMessageFactory getInstance() {\r
- if (instance == null) {\r
- instance = new OF10ErrorMessageFactory();\r
- }\r
- return instance;\r
- }\r
- \r
- @Override\r
- public ErrorMessage bufferToMessage(ByteBuf rawMessage, short version) {\r
- ErrorMessageBuilder builder = new ErrorMessageBuilder();\r
- builder.setVersion(version);\r
- builder.setXid(rawMessage.readUnsignedInt());\r
- builder.setType(ErrorType.forValue(rawMessage.readUnsignedShort()));\r
- builder.setCode(rawMessage.readUnsignedShort());\r
- if (rawMessage.readableBytes() > 0) {\r
- builder.setData(rawMessage.readBytes(rawMessage.readableBytes()).array());\r
- }\r
- return builder.build();\r
- }\r
-\r
-}\r
+/*
+ * Copyright (c) 2013 Pantheon Technologies s.r.o. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.openflowjava.protocol.impl.deserialization.factories;
+
+import io.netty.buffer.ByteBuf;
+
+import org.opendaylight.openflowjava.protocol.api.extensibility.OFDeserializer;
+import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.BadActionCodeV10;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.BadRequestCodeV10;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.ErrorTypeV10;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.FlowModFailedCodeV10;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.HelloFailedCodeV10;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortModFailedCodeV10;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.QueueOpFailedCodeV10;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ErrorMessage;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ErrorMessageBuilder;
+
+/**
+ * Translates Error messages (OpenFlow v1.0)
+ * @author michal.polkorab
+ */
+public class OF10ErrorMessageFactory implements OFDeserializer<ErrorMessage> {
+
+ private static final String UNKNOWN_TYPE = "UNKNOWN_TYPE";
+ private static final String UNKNOWN_CODE = "UNKNOWN_CODE";
+
+ @Override
+ public ErrorMessage deserialize(ByteBuf rawMessage) {
+ ErrorMessageBuilder builder = new ErrorMessageBuilder();
+ builder.setVersion((short) EncodeConstants.OF10_VERSION_ID);
+ builder.setXid(rawMessage.readUnsignedInt());
+ int type = rawMessage.readUnsignedShort();
+ ErrorTypeV10 errorType = ErrorTypeV10.forValue(type);
+ decodeType(builder, errorType, type);
+ decodeCode(rawMessage, builder, errorType);
+ int remainingBytes = rawMessage.readableBytes();
+ if (remainingBytes > 0) {
+ byte[] data = new byte[remainingBytes];
+ rawMessage.readBytes(data);
+ builder.setData(data);
+ }
+ return builder.build();
+ }
+
+ private static void decodeType(ErrorMessageBuilder builder, ErrorTypeV10 type, int readValue) {
+ if (type != null) {
+ builder.setType(type.getIntValue());
+ builder.setTypeString(type.name());
+ } else {
+ builder.setType(readValue);
+ builder.setTypeString(UNKNOWN_TYPE);
+ }
+ }
+
+ private static void decodeCode(ByteBuf rawMessage, ErrorMessageBuilder builder,
+ ErrorTypeV10 type) {
+ int code = rawMessage.readUnsignedShort();
+ if (type != null) {
+ switch (type) {
+ case HELLOFAILED:
+ {
+ HelloFailedCodeV10 errorCode = HelloFailedCodeV10.forValue(code);
+ if (errorCode != null) {
+ setCode(builder, errorCode.getIntValue(), errorCode.name());
+ } else {
+ setUnknownCode(builder, code);
+ }
+ break;
+ }
+ case BADREQUEST:
+ {
+ BadRequestCodeV10 errorCode = BadRequestCodeV10.forValue(code);
+ if (errorCode != null) {
+ setCode(builder, errorCode.getIntValue(), errorCode.name());
+ } else {
+ setUnknownCode(builder, code);
+ }
+ break;
+ }
+ case BADACTION:
+ {
+ BadActionCodeV10 errorCode = BadActionCodeV10.forValue(code);
+ if (errorCode != null) {
+ setCode(builder, errorCode.getIntValue(), errorCode.name());
+ } else {
+ setUnknownCode(builder, code);
+ }
+ break;
+ }
+ case FLOWMODFAILED:
+ {
+ FlowModFailedCodeV10 errorCode = FlowModFailedCodeV10.forValue(code);
+ if (errorCode != null) {
+ setCode(builder, errorCode.getIntValue(), errorCode.name());
+ } else {
+ setUnknownCode(builder, code);
+ }
+ break;
+ }
+ case PORTMODFAILED:
+ {
+ PortModFailedCodeV10 errorCode = PortModFailedCodeV10.forValue(code);
+ if (errorCode != null) {
+ setCode(builder, errorCode.getIntValue(), errorCode.name());
+ } else {
+ setUnknownCode(builder, code);
+ }
+ break;
+ }
+ case QUEUEOPFAILED:
+ {
+ QueueOpFailedCodeV10 errorCode = QueueOpFailedCodeV10.forValue(code);
+ if (errorCode != null) {
+ setCode(builder, errorCode.getIntValue(), errorCode.name());
+ } else {
+ setUnknownCode(builder, code);
+ }
+ break;
+ }
+ default:
+ setUnknownCode(builder, code);
+ break;
+ }
+ } else {
+ setUnknownCode(builder, code);
+ }
+ }
+
+ private static void setUnknownCode(ErrorMessageBuilder builder, int readValue) {
+ builder.setCode(readValue);
+ builder.setCodeString(UNKNOWN_CODE);
+ }
+
+ private static void setCode(ErrorMessageBuilder builder, int code, String codeString) {
+ builder.setCode(code);
+ builder.setCodeString(codeString);
+ }
+
+}