Add method to register listener for unknown msg
[openflowjava.git] / openflow-protocol-impl / src / main / java / org / opendaylight / openflowjava / protocol / impl / deserialization / factories / OF10ErrorMessageFactory.java
index 5d3f874f1c5614c37589c584a5c648148dee5e33..aa8b9c8d535b0f9838b53663c562e5317fa37f85 100644 (file)
@@ -10,7 +10,8 @@ package org.opendaylight.openflowjava.protocol.impl.deserialization.factories;
 
 import io.netty.buffer.ByteBuf;
 
-import org.opendaylight.openflowjava.protocol.impl.deserialization.OFDeserializer;
+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;
@@ -27,40 +28,27 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731
  */
 public class OF10ErrorMessageFactory implements OFDeserializer<ErrorMessage> {
 
-       private static final String UNKNOWN_TYPE = "UNKNOWN_TYPE";
+    private static final String UNKNOWN_TYPE = "UNKNOWN_TYPE";
     private static final String UNKNOWN_CODE = "UNKNOWN_CODE";
-    
-    private static OF10ErrorMessageFactory instance;
-    
-    private OF10ErrorMessageFactory() {
-        // do nothing, just singleton
-    }
-    
-    /**
-     * @return singleton factory
-     */
-    public static synchronized OF10ErrorMessageFactory getInstance() {
-        if (instance == null) {
-            instance = new OF10ErrorMessageFactory();
-        }
-        return instance;
-    }
-    
+
     @Override
-    public ErrorMessage bufferToMessage(ByteBuf rawMessage, short version) {
+    public ErrorMessage deserialize(ByteBuf rawMessage) {
         ErrorMessageBuilder builder = new ErrorMessageBuilder();
-        builder.setVersion(version);
+        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);
-        if (rawMessage.readableBytes() > 0) {
-            builder.setData(rawMessage.readBytes(rawMessage.readableBytes()).array());
+        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());
@@ -74,85 +62,85 @@ public class OF10ErrorMessageFactory implements OFDeserializer<ErrorMessage> {
     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);
-       }
+        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);
+        builder.setCode(readValue);
+        builder.setCodeString(UNKNOWN_CODE);
     }
-    
+
     private static void setCode(ErrorMessageBuilder builder, int code, String codeString) {
-       builder.setCode(code);
-               builder.setCodeString(codeString);
+        builder.setCode(code);
+        builder.setCodeString(codeString);
     }
 
 }