Updated experimenter model
[openflowjava.git] / openflow-protocol-impl / src / main / java / org / opendaylight / openflowjava / protocol / impl / deserialization / factories / ErrorMessageFactory.java
index 3463855bafd1ef70f7a88f83b23054210d72df45..4b18f2121c0da76ef306670aad05d10fb39b4a64 100644 (file)
-/* 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;
+    }
+
+}