Extend openflow-protocol-impl serialization
[openflowjava.git] / openflow-protocol-impl / src / main / java / org / opendaylight / openflowjava / protocol / impl / deserialization / DeserializerRegistryImpl.java
index 8808569f50a14154dd14386deef24ff4bae4a8b7..6ee4818344ec655ab57480897d63a3ff1b5af383 100644 (file)
@@ -10,23 +10,26 @@ package org.opendaylight.openflowjava.protocol.impl.deserialization;
 
 import java.util.HashMap;
 import java.util.Map;
-
 import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistry;
 import org.opendaylight.openflowjava.protocol.api.extensibility.DeserializerRegistryInjector;
-import org.opendaylight.openflowjava.protocol.api.extensibility.MessageCodeKey;
 import org.opendaylight.openflowjava.protocol.api.extensibility.OFGeneralDeserializer;
-import org.opendaylight.openflowjava.protocol.impl.util.EncodeConstants;
+import org.opendaylight.openflowjava.protocol.api.keys.MessageCodeKey;
+import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
 import org.opendaylight.openflowjava.protocol.impl.util.MatchDeserializer;
 import org.opendaylight.openflowjava.protocol.impl.util.OF10MatchDeserializer;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.match.grouping.Match;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev130731.match.v10.grouping.MatchV10;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.grouping.Match;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.v10.grouping.MatchV10;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * Stores and registers deserializers
+ *
  * @author michal.polkorab
  */
 public class DeserializerRegistryImpl implements DeserializerRegistry {
-    
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(DeserializerRegistryImpl.class);
     private Map<MessageCodeKey, OFGeneralDeserializer> registry;
 
     /**
@@ -35,14 +38,20 @@ public class DeserializerRegistryImpl implements DeserializerRegistry {
     @Override
     public void init() {
         registry = new HashMap<>();
+
         // register message deserializers
-        MessageDerializerInitializer.registerMessageDeserializers(this);
+        MessageDeserializerInitializer.registerMessageDeserializers(this);
+
+        // register additional message deserializers
+        AdditionalMessageDeserializerInitializer.registerMessageDeserializers(this);
 
         // register common structure deserializers
-        registerDeserializer(new MessageCodeKey(EncodeConstants.OF10_VERSION_ID,
-                EncodeConstants.EMPTY_VALUE, MatchV10.class), new OF10MatchDeserializer());
-        registerDeserializer(new MessageCodeKey(EncodeConstants.OF13_VERSION_ID,
-                EncodeConstants.EMPTY_VALUE, Match.class), new MatchDeserializer());
+        registerDeserializer(
+                new MessageCodeKey(EncodeConstants.OF10_VERSION_ID, EncodeConstants.EMPTY_VALUE, MatchV10.class),
+                new OF10MatchDeserializer());
+        registerDeserializer(
+                new MessageCodeKey(EncodeConstants.OF13_VERSION_ID, EncodeConstants.EMPTY_VALUE, Match.class),
+                new MatchDeserializer());
 
         // register match entry deserializers
         MatchEntryDeserializerInitializer.registerMatchEntryDeserializers(this);
@@ -50,32 +59,44 @@ public class DeserializerRegistryImpl implements DeserializerRegistry {
         ActionDeserializerInitializer.registerDeserializers(this);
         // register instruction deserializers
         InstructionDeserializerInitializer.registerDeserializers(this);
-        // register default experimenter deserializers
-        DefaultExperimenterDeserializerInitializer.registerDeserializers(this);
     }
 
     @Override
     @SuppressWarnings("unchecked")
-    public <DESERIALIZER_TYPE extends OFGeneralDeserializer> DESERIALIZER_TYPE getDeserializer(
-            MessageCodeKey key) {
+    public <T extends OFGeneralDeserializer> T getDeserializer(MessageCodeKey key) {
         OFGeneralDeserializer deserializer = registry.get(key);
         if (deserializer == null) {
-            throw new NullPointerException("Deserializer for key: " + key.toString()
-                    + " was not found");
+            throw new IllegalStateException("Deserializer for key: " + key
+                    + " was not found - please verify that all needed deserializers ale loaded correctly");
         }
-        return (DESERIALIZER_TYPE) deserializer;
+        return (T) deserializer;
     }
 
     @Override
-    public void registerDeserializer(MessageCodeKey key,
-            OFGeneralDeserializer deserializer) {
+    public void registerDeserializer(MessageCodeKey key, OFGeneralDeserializer deserializer) {
         if ((key == null) || (deserializer == null)) {
-            throw new NullPointerException("MessageCodeKey or Deserializer is null");
+            throw new IllegalArgumentException("MessageCodeKey or Deserializer is null");
+        }
+        OFGeneralDeserializer desInRegistry = registry.put(key, deserializer);
+        if (desInRegistry != null) {
+            LOGGER.debug("Deserializer for key {} overwritten. Old deserializer: {}, new deserializer: {}", key,
+                    desInRegistry.getClass().getName(), deserializer.getClass().getName());
         }
         if (deserializer instanceof DeserializerRegistryInjector) {
             ((DeserializerRegistryInjector) deserializer).injectDeserializerRegistry(this);
         }
-        registry.put(key, deserializer);
+    }
+
+    @Override
+    public boolean unregisterDeserializer(MessageCodeKey key) {
+        if (key == null) {
+            throw new IllegalArgumentException("MessageCodeKey is null");
+        }
+        OFGeneralDeserializer deserializer = registry.remove(key);
+        if (deserializer == null) {
+            return false;
+        }
+        return true;
     }
 
 }