Updated experimenter model
[openflowjava.git] / openflow-protocol-impl / src / main / java / org / opendaylight / openflowjava / protocol / impl / deserialization / factories / ErrorMessageFactory.java
index 5a049c51e06485cddabeac96d615da3d4c3d880d..4b18f2121c0da76ef306670aad05d10fb39b4a64 100644 (file)
@@ -10,10 +10,12 @@ 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.ExperimenterError;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev131002.ExperimenterErrorBuilder;
+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;
@@ -37,10 +39,12 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731
  * @author michal.polkorab
  * @author timotej.kubas
  */
-public class ErrorMessageFactory implements OFDeserializer<ErrorMessage> {
+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) {
@@ -49,10 +53,18 @@ public class ErrorMessageFactory implements OFDeserializer<ErrorMessage> {
         builder.setXid(rawMessage.readUnsignedInt());
         int type = rawMessage.readUnsignedShort();
         ErrorType errorType = ErrorType.forValue(type);
-        decodeType(builder, errorType, type);
-        decodeCode(rawMessage, builder, errorType);
-        if (rawMessage.readableBytes() > 0) {
-            builder.setData(rawMessage.readBytes(rawMessage.readableBytes()).array());
+        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();
     }
@@ -212,12 +224,6 @@ public class ErrorMessageFactory implements OFDeserializer<ErrorMessage> {
                 }
                 break;
             }
-            case EXPERIMENTER:
-                ExperimenterErrorBuilder expBuilder = new ExperimenterErrorBuilder();
-                expBuilder.setExpType(code);
-                expBuilder.setExperimenter(rawMessage.readUnsignedInt());
-                builder.addAugmentation(ExperimenterError.class, expBuilder.build());
-                break;
             default:
                 setUnknownCode(builder, code);
                 break;
@@ -237,4 +243,9 @@ public class ErrorMessageFactory implements OFDeserializer<ErrorMessage> {
         builder.setCodeString(codeString);
     }
 
+    @Override
+    public void injectDeserializerRegistry(DeserializerRegistry deserializerRegistry) {
+        this.registry = deserializerRegistry;
+    }
+
 }