Add methods for modifying deserializer mapping 31/49231/3
authorTomas Slusny <tomas.slusny@pantheon.tech>
Mon, 12 Dec 2016 10:10:22 +0000 (11:10 +0100)
committerTomas Slusny <tomas.slusny@pantheon.tech>
Wed, 14 Dec 2016 13:12:55 +0000 (14:12 +0100)
Add new methods to SwitchConnectionProviderImpl that will allow
us to modify type to class mapping of deserializers for top level
messages (like FlowMod, PortMod) to be able to register deserializers
for custom top level types without needing changes in OpenflowJava.

Change-Id: I0f0d0f25a971660e6601069fc6f9f59e8206f2e7
Signed-off-by: Tomas Slusny <tomas.slusny@pantheon.tech>
openflow-protocol-api/src/main/java/org/opendaylight/openflowjava/protocol/api/extensibility/DeserializerExtensionProvider.java
openflow-protocol-api/src/main/java/org/opendaylight/openflowjava/protocol/api/keys/TypeToClassKey.java [moved from openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/util/TypeToClassKey.java with 95% similarity]
openflow-protocol-api/src/test/java/org/opendaylight/openflowjava/protocol/api/keys/TypeToClassKeyTest.java [moved from openflow-protocol-impl/src/test/java/org/opendaylight/openflowjava/protocol/impl/deserialization/TypeToClassKeyTest.java with 90% similarity]
openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/core/SwitchConnectionProviderImpl.java
openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/deserialization/DeserializationFactory.java
openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/deserialization/TypeToClassMapInitializer.java
openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/util/TypeToClassInitHelper.java
openflow-protocol-impl/src/test/java/org/opendaylight/openflowjava/protocol/impl/deserialization/TypeToClassMapInitializerTest.java

index 6de50c310c431f680570958f80d0cfe0bb7141cd..5a0658eb1b122c9b244c0e5de1c34a97c6463632 100644 (file)
@@ -14,6 +14,7 @@ import org.opendaylight.openflowjava.protocol.api.keys.ExperimenterIdDeserialize
 import org.opendaylight.openflowjava.protocol.api.keys.ExperimenterInstructionDeserializerKey;
 import org.opendaylight.openflowjava.protocol.api.keys.MatchEntryDeserializerKey;
 import org.opendaylight.openflowjava.protocol.api.keys.MessageCodeKey;
+import org.opendaylight.openflowjava.protocol.api.keys.TypeToClassKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.ErrorMessage;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.experimenter.core.ExperimenterDataOfChoice;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.meter.band.header.meter.band.MeterBandExperimenterCase;
@@ -127,4 +128,18 @@ public interface DeserializerExtensionProvider {
      */
     void registerQueuePropertyDeserializer(ExperimenterIdDeserializerKey key,
             OFDeserializer<QueueProperty> deserializer);
+
+    /**
+     * Registers type to class mapping used to assign return type when deserializing message
+     * @param key type to class key
+     * @param clazz return class
+     */
+    void registerDeserializerMapping(TypeToClassKey key, Class<?> clazz);
+
+    /**
+     * Unregisters 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
+     */
+    boolean unregisterDeserializerMapping(TypeToClassKey key);
 }
similarity index 95%
rename from openflow-protocol-impl/src/main/java/org/opendaylight/openflowjava/protocol/impl/util/TypeToClassKey.java
rename to openflow-protocol-api/src/main/java/org/opendaylight/openflowjava/protocol/api/keys/TypeToClassKey.java
index 0f6b9cafb5f3e0319649a1a4ba739209ba643266..71eed0948c76441939408f077f730568fe920ead 100644 (file)
@@ -5,7 +5,7 @@
  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
  * and is available at http://www.eclipse.org/legal/epl-v10.html
  */
-package org.opendaylight.openflowjava.protocol.impl.util;
+package org.opendaylight.openflowjava.protocol.api.keys;
 
 /**
  * @author michal.polkorab
@@ -6,12 +6,11 @@
  * and is available at http://www.eclipse.org/legal/epl-v10.html
  */
 
-package org.opendaylight.openflowjava.protocol.impl.deserialization;
+package org.opendaylight.openflowjava.protocol.api.keys;
 
 import org.junit.Assert;
 import org.junit.Test;
 import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
-import org.opendaylight.openflowjava.protocol.impl.util.TypeToClassKey;
 /**
  *
  * @author madamjak
index d65a623a63b12a30a082f230d7d8849b31f77ccb..afa476446f44395559d1a6b77461797f84821d82 100755 (executable)
@@ -38,6 +38,7 @@ import org.opendaylight.openflowjava.protocol.impl.deserialization.Deserializati
 import org.opendaylight.openflowjava.protocol.impl.deserialization.DeserializerRegistryImpl;
 import org.opendaylight.openflowjava.protocol.impl.serialization.SerializationFactory;
 import org.opendaylight.openflowjava.protocol.impl.serialization.SerializerRegistryImpl;
+import org.opendaylight.openflowjava.protocol.api.keys.TypeToClassKey;
 import org.opendaylight.openflowjava.protocol.spi.connection.SwitchConnectionProvider;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.config.rev140630.TransportProtocol;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.MatchField;
@@ -310,4 +311,14 @@ public class SwitchConnectionProviderImpl implements SwitchConnectionProvider, C
     public void registerDeserializer(MessageCodeKey key, OFGeneralDeserializer deserializer) {
        deserializerRegistry.registerDeserializer(key, deserializer);
     }
+
+    @Override
+    public void registerDeserializerMapping(final TypeToClassKey key, final Class<?> clazz) {
+        deserializationFactory.registerMapping(key, clazz);
+    }
+
+    @Override
+    public boolean unregisterDeserializerMapping(final TypeToClassKey key) {
+        return deserializationFactory.unregisterMapping(key);
+    }
 }
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
      */
index 61cce25dd0ca60485200606fc438245c91943312..61fe027f6263f72cf3bf33215ee3860fe0eda095 100644 (file)
@@ -10,7 +10,7 @@ package org.opendaylight.openflowjava.protocol.impl.deserialization;
 import java.util.Map;
 import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
 import org.opendaylight.openflowjava.protocol.impl.util.TypeToClassInitHelper;
-import org.opendaylight.openflowjava.protocol.impl.util.TypeToClassKey;
+import org.opendaylight.openflowjava.protocol.api.keys.TypeToClassKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.BarrierInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.BarrierOutput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoOutput;
index 339edd189ccd16fae7c28ba4c529ee9cf522d0ab..b360f89fd4cda606c17047a5521add6dd0895b24 100644 (file)
@@ -8,6 +8,7 @@
 package org.opendaylight.openflowjava.protocol.impl.util;
 
 import java.util.Map;
+import org.opendaylight.openflowjava.protocol.api.keys.TypeToClassKey;
 
 /**
  * @author michal.polkorab
index 9ff6e9e7d75d6a3021b19dfdc3e4418b57618db0..dfa01580279314737596de33bf122494a91e89bf 100644 (file)
@@ -14,7 +14,7 @@ import java.util.HashMap;
 import java.util.Map;
 import org.junit.Test;
 import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
-import org.opendaylight.openflowjava.protocol.impl.util.TypeToClassKey;
+import org.opendaylight.openflowjava.protocol.api.keys.TypeToClassKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.BarrierInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.BarrierOutput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.EchoOutput;