Bug 2756 - Match model update
[openflowjava.git] / openflow-protocol-impl / src / main / java / org / opendaylight / openflowjava / protocol / impl / deserialization / DeserializerRegistryImpl.java
index 6a08db8c40262137b2eadfdcc9e1b0c5df6e8389..0ee3fb281ea6dec2204b4c82d1bb8634cd2048a7 100644 (file)
@@ -13,23 +13,23 @@ 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.ActionsDeserializer;
-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.OF10ActionsDeserializer;
 import org.opendaylight.openflowjava.protocol.impl.util.OF10MatchDeserializer;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev130731.actions.grouping.Action;
-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;
 
     /**
@@ -39,48 +39,61 @@ public class DeserializerRegistryImpl implements DeserializerRegistry {
     public void init() {
         registry = new HashMap<>();
         // register message deserializers
-        MessageDerializerInitializer.registerMessageDeserializers(this);
+        MessageDeserializerInitializer.registerMessageDeserializers(this);
 
         // register common structure deserializers
         registerDeserializer(new MessageCodeKey(EncodeConstants.OF10_VERSION_ID,
                 EncodeConstants.EMPTY_VALUE, MatchV10.class), new OF10MatchDeserializer());
-        registerDeserializer(new MessageCodeKey(EncodeConstants.OF10_VERSION_ID,
-                EncodeConstants.EMPTY_VALUE, Action.class), new OF10ActionsDeserializer());
         registerDeserializer(new MessageCodeKey(EncodeConstants.OF13_VERSION_ID,
                 EncodeConstants.EMPTY_VALUE, Match.class), new MatchDeserializer());
-        registerDeserializer(new MessageCodeKey(EncodeConstants.OF13_VERSION_ID,
-                EncodeConstants.EMPTY_VALUE, Action.class), new ActionsDeserializer());
 
         // register match entry deserializers
         MatchEntryDeserializerInitializer.registerMatchEntryDeserializers(this);
-        //register instruction deserializers
+        // register action deserializers
+        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(
+    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) {
         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 " + key + " overwritten. Old deserializer: "
+                    + desInRegistry.getClass().getName() + ", new deserializer: "
+                    + 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;
     }
 
 }