Add methods for modifying deserializer mapping
[openflowjava.git] / openflow-protocol-impl / src / main / java / org / opendaylight / openflowjava / protocol / impl / deserialization / DeserializationFactory.java
index bf535b2d2aaf8acbdeefc23f66181edf31149dfc..de631b11fa0ec52f09f367af04335b27bb26c897 100644 (file)
@@ -8,15 +8,14 @@
 
 package org.opendaylight.openflowjava.protocol.impl.deserialization;
 
-import com.google.common.collect.ImmutableMap;
 import io.netty.buffer.ByteBuf;
-import java.util.HashMap;
 import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
 import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistry;
 import org.opendaylight.openflowjava.protocol.api.extensibility.OFDeserializer;
 import org.opendaylight.openflowjava.protocol.api.keys.MessageCodeKey;
+import org.opendaylight.openflowjava.protocol.api.keys.TypeToClassKey;
 import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
-import org.opendaylight.openflowjava.protocol.impl.util.TypeToClassKey;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 
 /**
@@ -26,20 +25,17 @@ import org.opendaylight.yangtools.yang.binding.DataObject;
  */
 public class DeserializationFactory {
 
-    private final Map<TypeToClassKey, Class<?>> messageClassMap;
+    private final Map<TypeToClassKey, Class<?>> messageClassMap = new ConcurrentHashMap<>();
     private DeserializerRegistry registry;
 
     /**
      * Constructor
      */
     public DeserializationFactory() {
-        final Map<TypeToClassKey, Class<?>> temp = new HashMap<>();
-        TypeToClassMapInitializer.initializeTypeToClassMap(temp);
+        TypeToClassMapInitializer.initializeTypeToClassMap(messageClassMap);
 
         // Register type to class map for additional deserializers
-        TypeToClassMapInitializer.initializeAdditionalTypeToClassMap(temp);
-
-        messageClassMap = ImmutableMap.copyOf(temp);
+        TypeToClassMapInitializer.initializeAdditionalTypeToClassMap(messageClassMap);
     }
 
     /**
@@ -60,6 +56,28 @@ public class DeserializationFactory {
         return dataObject;
     }
 
+    /**
+     * Register new type to class mapping used to assign return type when deserializing message
+     * @param key type to class key
+     * @param clazz return class
+     */
+    public void registerMapping(final TypeToClassKey key, final Class<?> clazz) {
+        messageClassMap.put(key, clazz);
+    }
+
+    /**
+     * Unregister type to class mapping used to assign return type when deserializing message
+     * @param key type to class key
+     * @return true if mapping was successfully removed
+     */
+    public boolean unregisterMapping(final TypeToClassKey key) {
+        if (key == null) {
+            throw new IllegalArgumentException("TypeToClassKey is null");
+        }
+
+        return messageClassMap.remove(key) != null;
+    }
+
     /**
      * @param registry
      */