-/* 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.augments.rev131002.ExperimenterError;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterErrorBuilder;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.BadActionCode;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.BadInstructionCode;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.BadMatchCode;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.BadRequestCode;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.ErrorType;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.FlowModFailedCode;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupModFailedCode;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.HelloFailedCode;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterModFailedCode;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortModFailedCode;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.QueueOpFailedCode;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.RoleRequestFailedCode;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.SwitchConfigFailedCode;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.TableFeaturesFailedCode;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.TableModFailedCode;\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\r
- * @author michal.polkorab\r
- * @author timotej.kubas\r
- */\r
-public class ErrorMessageFactory implements OFDeserializer<ErrorMessage> {\r
-\r
- private static final String UNKNOWN_CODE = "UNKNOWN_CODE";\r
- private static final String UNKNOWN_TYPE = "UNKNOWN_TYPE";\r
- \r
- private static ErrorMessageFactory instance;\r
- \r
- private ErrorMessageFactory() {\r
- // do nothing, just singleton\r
- }\r
- \r
- /**\r
- * @return singleton factory\r
- */\r
- public static synchronized ErrorMessageFactory getInstance() {\r
- if (instance == null) {\r
- instance = new ErrorMessageFactory();\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
- int type = rawMessage.readUnsignedShort();\r
- ErrorType errorType = ErrorType.forValue(type);\r
- decodeType(builder, errorType, type);\r
- decodeCode(rawMessage, builder, errorType);\r
- if (rawMessage.readableBytes() > 0) {\r
- builder.setData(rawMessage.readBytes(rawMessage.readableBytes()).array());\r
- }\r
- return builder.build();\r
- }\r
- \r
- private static void decodeType(ErrorMessageBuilder builder, ErrorType type, int readValue) {\r
- if (type != null) {\r
- builder.setType(type.getIntValue());\r
- builder.setTypeString(type.name());\r
- } else {\r
- builder.setType(readValue);\r
- builder.setTypeString(UNKNOWN_TYPE);\r
- }\r
- }\r
-\r
- private static void decodeCode(ByteBuf rawMessage, ErrorMessageBuilder builder,\r
- ErrorType type) {\r
- int code = rawMessage.readUnsignedShort();\r
- if (type != null) {\r
- switch (type) {\r
- case HELLOFAILED:\r
- {\r
- HelloFailedCode errorCode = HelloFailedCode.forValue(code);\r
- if (errorCode != null) {\r
- setCode(builder, errorCode.getIntValue(), errorCode.name());\r
- } else {\r
- setUnknownCode(builder, code);\r
- }\r
- break;\r
- }\r
- case BADREQUEST:\r
- {\r
- BadRequestCode errorCode = BadRequestCode.forValue(code);\r
- if (errorCode != null) {\r
- setCode(builder, errorCode.getIntValue(), errorCode.name());\r
- } else {\r
- setUnknownCode(builder, code);\r
- }\r
- break;\r
- }\r
- case BADACTION:\r
- {\r
- BadActionCode errorCode = BadActionCode.forValue(code);\r
- if (errorCode != null) {\r
- setCode(builder, errorCode.getIntValue(), errorCode.name());\r
- } else {\r
- setUnknownCode(builder, code);\r
- }\r
- break;\r
- }\r
- case BADINSTRUCTION:\r
- {\r
- BadInstructionCode errorCode = BadInstructionCode.forValue(code);\r
- if (errorCode != null) {\r
- setCode(builder, errorCode.getIntValue(), errorCode.name());\r
- } else {\r
- setUnknownCode(builder, code);\r
- }\r
- break;\r
- }\r
- case BADMATCH:\r
- {\r
- BadMatchCode errorCode = BadMatchCode.forValue(code);\r
- if (errorCode != null) {\r
- setCode(builder, errorCode.getIntValue(), errorCode.name());\r
- } else {\r
- setUnknownCode(builder, code);\r
- }\r
- break;\r
- }\r
- case FLOWMODFAILED:\r
- {\r
- FlowModFailedCode errorCode = FlowModFailedCode.forValue(code);\r
- if (errorCode != null) {\r
- setCode(builder, errorCode.getIntValue(), errorCode.name());\r
- } else {\r
- setUnknownCode(builder, code);\r
- }\r
- break;\r
- }\r
- case GROUPMODFAILED:\r
- {\r
- GroupModFailedCode errorCode = GroupModFailedCode.forValue(code);\r
- if (errorCode != null) {\r
- setCode(builder, errorCode.getIntValue(), errorCode.name());\r
- } else {\r
- setUnknownCode(builder, code);\r
- }\r
- break;\r
- }\r
- case PORTMODFAILED:\r
- {\r
- PortModFailedCode errorCode = PortModFailedCode.forValue(code);\r
- if (errorCode != null) {\r
- setCode(builder, errorCode.getIntValue(), errorCode.name());\r
- } else {\r
- setUnknownCode(builder, code);\r
- }\r
- break;\r
- }\r
- case TABLEMODFAILED:\r
- {\r
- TableModFailedCode errorCode = TableModFailedCode.forValue(code);\r
- if (errorCode != null) {\r
- setCode(builder, errorCode.getIntValue(), errorCode.name());\r
- } else {\r
- setUnknownCode(builder, code);\r
- }\r
- break;\r
- }\r
- case QUEUEOPFAILED:\r
- {\r
- QueueOpFailedCode errorCode = QueueOpFailedCode.forValue(code);\r
- if (errorCode != null) {\r
- setCode(builder, errorCode.getIntValue(), errorCode.name());\r
- } else {\r
- setUnknownCode(builder, code);\r
- }\r
- break;\r
- }\r
- case SWITCHCONFIGFAILED:\r
- {\r
- SwitchConfigFailedCode errorCode = SwitchConfigFailedCode.forValue(code);\r
- if (errorCode != null) {\r
- setCode(builder, errorCode.getIntValue(), errorCode.name());\r
- } else {\r
- setUnknownCode(builder, code);\r
- }\r
- break;\r
- }\r
- case ROLEREQUESTFAILED:\r
- {\r
- RoleRequestFailedCode errorCode = RoleRequestFailedCode.forValue(code);\r
- if (errorCode != null) {\r
- setCode(builder, errorCode.getIntValue(), errorCode.name());\r
- } else {\r
- setUnknownCode(builder, code);\r
- }\r
- break;\r
- }\r
- case METERMODFAILED:\r
- {\r
- MeterModFailedCode errorCode = MeterModFailedCode.forValue(code);\r
- if (errorCode != null) {\r
- setCode(builder, errorCode.getIntValue(), errorCode.name());\r
- } else {\r
- setUnknownCode(builder, code);\r
- }\r
- break;\r
- }\r
- case TABLEFEATURESFAILED:\r
- {\r
- TableFeaturesFailedCode errorCode = TableFeaturesFailedCode.forValue(code);\r
- if (errorCode != null) {\r
- setCode(builder, errorCode.getIntValue(), errorCode.name());\r
- } else {\r
- setUnknownCode(builder, code);\r
- }\r
- break;\r
- }\r
- case EXPERIMENTER:\r
- ExperimenterErrorBuilder expBuilder = new ExperimenterErrorBuilder();\r
- expBuilder.setExpType(code);\r
- expBuilder.setExperimenter(rawMessage.readUnsignedInt());\r
- builder.addAugmentation(ExperimenterError.class, expBuilder.build());\r
- break;\r
- default:\r
- setUnknownCode(builder, code);\r
- break;\r
- }\r
- } else {\r
- setUnknownCode(builder, code);\r
- }\r
- }\r
- \r
- private static void setUnknownCode(ErrorMessageBuilder builder, int readValue) {\r
- builder.setCode(readValue);\r
- builder.setCodeString(UNKNOWN_CODE);\r
- }\r
- \r
- private static void setCode(ErrorMessageBuilder builder, int code, String codeString) {\r
- builder.setCode(code);\r
- builder.setCodeString(codeString);\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.DeserializerRegistry;
+import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistryInjector;
+import org.opendaylight.openflowjava.protocol.api.extensibility.MessageCodeKey;
+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.augments.rev131002.ExperimenterIdError;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.BadActionCode;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.BadInstructionCode;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.BadMatchCode;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.BadRequestCode;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.ErrorType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.FlowModFailedCode;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupModFailedCode;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.HelloFailedCode;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MeterModFailedCode;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.PortModFailedCode;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.QueueOpFailedCode;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.RoleRequestFailedCode;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.SwitchConfigFailedCode;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.TableFeaturesFailedCode;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.TableModFailedCode;
+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
+ * @author michal.polkorab
+ * @author timotej.kubas
+ */
+public class ErrorMessageFactory implements OFDeserializer<ErrorMessage>,
+ DeserializerRegistryInjector {
+
+ private static final String UNKNOWN_CODE = "UNKNOWN_CODE";
+ private static final String UNKNOWN_TYPE = "UNKNOWN_TYPE";
+ private DeserializerRegistry registry;
+
+ @Override
+ public ErrorMessage deserialize(ByteBuf rawMessage) {
+ ErrorMessageBuilder builder = new ErrorMessageBuilder();
+ builder.setVersion((short) EncodeConstants.OF13_VERSION_ID);
+ builder.setXid(rawMessage.readUnsignedInt());
+ int type = rawMessage.readUnsignedShort();
+ ErrorType errorType = ErrorType.forValue(type);
+ if (ErrorType.EXPERIMENTER.equals(errorType)) {
+ builder.setType(errorType.getIntValue());
+ OFDeserializer<ExperimenterIdError> deserializer = registry.getDeserializer(new MessageCodeKey(
+ EncodeConstants.OF13_VERSION_ID, EncodeConstants.EXPERIMENTER_VALUE, ErrorMessage.class));
+ ExperimenterIdError error = deserializer.deserialize(rawMessage);
+ builder.addAugmentation(ExperimenterIdError.class, error);
+ } else {
+ decodeType(builder, errorType, type);
+ decodeCode(rawMessage, builder, errorType);
+ if (rawMessage.readableBytes() > 0) {
+ builder.setData(rawMessage.readBytes(rawMessage.readableBytes()).array());
+ }
+ }
+ return builder.build();
+ }
+
+ private static void decodeType(ErrorMessageBuilder builder, ErrorType 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,
+ ErrorType type) {
+ int code = rawMessage.readUnsignedShort();
+ if (type != null) {
+ switch (type) {
+ case HELLOFAILED:
+ {
+ HelloFailedCode errorCode = HelloFailedCode.forValue(code);
+ if (errorCode != null) {
+ setCode(builder, errorCode.getIntValue(), errorCode.name());
+ } else {
+ setUnknownCode(builder, code);
+ }
+ break;
+ }
+ case BADREQUEST:
+ {
+ BadRequestCode errorCode = BadRequestCode.forValue(code);
+ if (errorCode != null) {
+ setCode(builder, errorCode.getIntValue(), errorCode.name());
+ } else {
+ setUnknownCode(builder, code);
+ }
+ break;
+ }
+ case BADACTION:
+ {
+ BadActionCode errorCode = BadActionCode.forValue(code);
+ if (errorCode != null) {
+ setCode(builder, errorCode.getIntValue(), errorCode.name());
+ } else {
+ setUnknownCode(builder, code);
+ }
+ break;
+ }
+ case BADINSTRUCTION:
+ {
+ BadInstructionCode errorCode = BadInstructionCode.forValue(code);
+ if (errorCode != null) {
+ setCode(builder, errorCode.getIntValue(), errorCode.name());
+ } else {
+ setUnknownCode(builder, code);
+ }
+ break;
+ }
+ case BADMATCH:
+ {
+ BadMatchCode errorCode = BadMatchCode.forValue(code);
+ if (errorCode != null) {
+ setCode(builder, errorCode.getIntValue(), errorCode.name());
+ } else {
+ setUnknownCode(builder, code);
+ }
+ break;
+ }
+ case FLOWMODFAILED:
+ {
+ FlowModFailedCode errorCode = FlowModFailedCode.forValue(code);
+ if (errorCode != null) {
+ setCode(builder, errorCode.getIntValue(), errorCode.name());
+ } else {
+ setUnknownCode(builder, code);
+ }
+ break;
+ }
+ case GROUPMODFAILED:
+ {
+ GroupModFailedCode errorCode = GroupModFailedCode.forValue(code);
+ if (errorCode != null) {
+ setCode(builder, errorCode.getIntValue(), errorCode.name());
+ } else {
+ setUnknownCode(builder, code);
+ }
+ break;
+ }
+ case PORTMODFAILED:
+ {
+ PortModFailedCode errorCode = PortModFailedCode.forValue(code);
+ if (errorCode != null) {
+ setCode(builder, errorCode.getIntValue(), errorCode.name());
+ } else {
+ setUnknownCode(builder, code);
+ }
+ break;
+ }
+ case TABLEMODFAILED:
+ {
+ TableModFailedCode errorCode = TableModFailedCode.forValue(code);
+ if (errorCode != null) {
+ setCode(builder, errorCode.getIntValue(), errorCode.name());
+ } else {
+ setUnknownCode(builder, code);
+ }
+ break;
+ }
+ case QUEUEOPFAILED:
+ {
+ QueueOpFailedCode errorCode = QueueOpFailedCode.forValue(code);
+ if (errorCode != null) {
+ setCode(builder, errorCode.getIntValue(), errorCode.name());
+ } else {
+ setUnknownCode(builder, code);
+ }
+ break;
+ }
+ case SWITCHCONFIGFAILED:
+ {
+ SwitchConfigFailedCode errorCode = SwitchConfigFailedCode.forValue(code);
+ if (errorCode != null) {
+ setCode(builder, errorCode.getIntValue(), errorCode.name());
+ } else {
+ setUnknownCode(builder, code);
+ }
+ break;
+ }
+ case ROLEREQUESTFAILED:
+ {
+ RoleRequestFailedCode errorCode = RoleRequestFailedCode.forValue(code);
+ if (errorCode != null) {
+ setCode(builder, errorCode.getIntValue(), errorCode.name());
+ } else {
+ setUnknownCode(builder, code);
+ }
+ break;
+ }
+ case METERMODFAILED:
+ {
+ MeterModFailedCode errorCode = MeterModFailedCode.forValue(code);
+ if (errorCode != null) {
+ setCode(builder, errorCode.getIntValue(), errorCode.name());
+ } else {
+ setUnknownCode(builder, code);
+ }
+ break;
+ }
+ case TABLEFEATURESFAILED:
+ {
+ TableFeaturesFailedCode errorCode = TableFeaturesFailedCode.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);
+ }
+
+ @Override
+ public void injectDeserializerRegistry(DeserializerRegistry deserializerRegistry) {
+ this.registry = deserializerRegistry;
+ }
+
+}