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;
/**
@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);
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;
}
}