Extensibility support (deserialization part)
[openflowjava.git] / openflow-protocol-impl / src / main / java / org / opendaylight / openflowjava / protocol / impl / deserialization / DeserializationFactory.java
index 4daadffc7a42af656bc20af8fa14428487df81ef..1d827c0f88186c5f292a48d4a562cf3d48feb311 100644 (file)
@@ -10,38 +10,59 @@ package org.opendaylight.openflowjava.protocol.impl.deserialization;
 
 import io.netty.buffer.ByteBuf;
 
+import java.util.HashMap;
+import java.util.Map;
+
+import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistry;
+import org.opendaylight.openflowjava.protocol.api.extensibility.MessageCodeKey;
+import org.opendaylight.openflowjava.protocol.api.extensibility.OFDeserializer;
 import org.opendaylight.openflowjava.protocol.impl.util.EncodeConstants;
 import org.opendaylight.yangtools.yang.binding.DataObject;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 /**
  * @author michal.polkorab
  * @author timotej.kubas
  */
-public abstract class DeserializationFactory {
-    
-    private static final Logger LOGGER = LoggerFactory
-            .getLogger(DeserializationFactory.class);
+public class DeserializationFactory {
+
+    private DeserializerRegistry registry;
+    private Map<TypeToClassKey, Class<?>> messageClassMap;
+
+    /**
+     * Constructor
+     */
+    public DeserializationFactory() {
+        messageClassMap = new HashMap<>();
+        initTypeToClassMapping();
+    }
 
     /**
      * Transforms ByteBuf into correct POJO message
-     * @param rawMessage 
+     * @param rawMessage
      * @param version version decoded from OpenFlow protocol message
      * @return correct POJO as DataObject
      */
-    public static DataObject bufferToMessage(ByteBuf rawMessage, short version) {
+    public DataObject deserialize(ByteBuf rawMessage, short version) {
         DataObject dataObject = null;
-        short type = rawMessage.readUnsignedByte();
+        int type = rawMessage.readUnsignedByte();
+        Class<?> clazz = messageClassMap.get(new TypeToClassKey(version, type));
         rawMessage.skipBytes(EncodeConstants.SIZE_OF_SHORT_IN_BYTES);
-
-        MessageTypeCodeKey msgTypeCodeKey = new MessageTypeCodeKey(version, type);
-        OFDeserializer<?> decoder = DecoderTable.getInstance().getDecoder(msgTypeCodeKey);
-        if (decoder != null) {
-            dataObject = decoder.bufferToMessage(rawMessage, version);
-        } else {
-            LOGGER.warn("No correct decoder found in DecoderTable for arguments: " + msgTypeCodeKey.toString());
+        OFDeserializer<DataObject> deserializer = registry.getDeserializer(
+                new MessageCodeKey(version, type, clazz));
+        if (deserializer != null) {
+            dataObject = deserializer.deserialize(rawMessage);
         }
         return dataObject;
     }
+
+    /**
+     * @param registry
+     */
+    public void setRegistry(DeserializerRegistry registry) {
+        this.registry = registry;
+    }
+
+    private void initTypeToClassMapping() {
+        TypeToClassMapInitializer.initializeTypeToClassMap(messageClassMap);
+    }
 }