Remove trailing whitespace
[openflowjava.git] / openflow-protocol-impl / src / main / java / org / opendaylight / openflowjava / protocol / impl / deserialization / factories / ErrorMessageFactory.java
index 09ec1088d69bcdb8a1e8ad5428b4bd9e3950fdf6..daae36346d58ea860967695a699cba89ede61775 100644 (file)
@@ -10,9 +10,11 @@ package org.opendaylight.openflowjava.protocol.impl.deserialization.factories;
 
 import io.netty.buffer.ByteBuf;
 
-import org.opendaylight.openflowjava.protocol.impl.deserialization.OFDeserializer;
-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.openflowjava.protocol.api.extensibility.DeserializerRegistry;
+import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistryInjector;
+import org.opendaylight.openflowjava.protocol.api.extensibility.OFDeserializer;
+import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
+import org.opendaylight.openflowjava.util.ExperimenterDeserializerKeyFactory;
 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;
@@ -36,34 +38,29 @@ 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 static ErrorMessageFactory instance;
-    
-    private ErrorMessageFactory() {
-        // do nothing, just singleton
-    }
-    
-    /**
-     * @return singleton factory
-     */
-    public static synchronized ErrorMessageFactory getInstance() {
-        if (instance == null) {
-            instance = new ErrorMessageFactory();
-        }
-        return instance;
-    }
-    
+    private DeserializerRegistry registry;
+
     @Override
-    public ErrorMessage bufferToMessage(ByteBuf rawMessage, short version) {
+    public ErrorMessage deserialize(ByteBuf rawMessage) {
+        int startIndex = rawMessage.readerIndex();
         ErrorMessageBuilder builder = new ErrorMessageBuilder();
-        builder.setVersion(version);
+        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)) {
+            OFDeserializer<ErrorMessage> deserializer = registry.getDeserializer(
+                    ExperimenterDeserializerKeyFactory.createExperimenterErrorDeserializerKey(
+                            EncodeConstants.OF13_VERSION_ID, rawMessage.getUnsignedInt(
+                                    rawMessage.readerIndex() + EncodeConstants.SIZE_OF_SHORT_IN_BYTES)));
+            rawMessage.readerIndex(startIndex);
+            return deserializer.deserialize(rawMessage);
+        }
         decodeType(builder, errorType, type);
         decodeCode(rawMessage, builder, errorType);
         if (rawMessage.readableBytes() > 0) {
@@ -71,7 +68,7 @@ public class ErrorMessageFactory implements OFDeserializer<ErrorMessage> {
         }
         return builder.build();
     }
-    
+
     private static void decodeType(ErrorMessageBuilder builder, ErrorType type, int readValue) {
         if (type != null) {
             builder.setType(type.getIntValue());
@@ -227,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;
@@ -241,15 +232,20 @@ public class ErrorMessageFactory implements OFDeserializer<ErrorMessage> {
             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;
+    }
+
 }