package org.opendaylight.openflowjava.protocol.api.extensibility;
+import org.opendaylight.openflowjava.protocol.api.keys.ExperimenterActionDeserializerKey;
+import org.opendaylight.openflowjava.protocol.api.keys.ExperimenterDeserializerKey;
+import org.opendaylight.openflowjava.protocol.api.keys.ExperimenterIdDeserializerKey;
+import org.opendaylight.openflowjava.protocol.api.keys.ExperimenterInstructionDeserializerKey;
import org.opendaylight.openflowjava.protocol.api.keys.MatchEntryDeserializerKey;
-import org.opendaylight.openflowjava.protocol.api.keys.experimenter.ExperimenterActionDeserializerKey;
-import org.opendaylight.openflowjava.protocol.api.keys.experimenter.ExperimenterDeserializerKey;
-import org.opendaylight.openflowjava.protocol.api.keys.experimenter.ExperimenterIdDeserializerKey;
-import org.opendaylight.openflowjava.protocol.api.keys.experimenter.ExperimenterInstructionDeserializerKey;
+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.ExperimenterMessage;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartReplyMessage;
+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;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.queue.property.header.QueueProperty;
* In case of handling multiple multiple structures of same type (actions,
* instructions, match entries, ... ) which are differentiated by
* vendor / experimenter subtype, vendor has to switch / choose between
- * these subtypes. <br />
+ * these subtypes.<br>
*
* This has to be done in this way because of experimenter headers, which
* provide only vendor / experimenter ID. Subtype position may be different
*/
public interface DeserializerExtensionProvider {
+ /**
+ * Registers deserializer.
+ * Throws IllegalStateException when there is
+ * a deserializer already registered under given key.
+ * <p>
+ * If the deserializer implements {@link DeserializerRegistryInjector} interface,
+ * the deserializer is injected with DeserializerRegistry instance.
+ *
+ * @param key used for deserializer lookup
+ * @param deserializer deserializer instance
+ */
+ void registerDeserializer(MessageCodeKey key,
+ OFGeneralDeserializer deserializer);
+
/**
* Unregisters custom deserializer
* @param key used for deserializer lookup
* @param deserializer deserializer instance
*/
void registerExperimenterMessageDeserializer(ExperimenterIdDeserializerKey key,
- OFDeserializer<ExperimenterMessage> deserializer);
+ OFDeserializer<? extends ExperimenterDataOfChoice> deserializer);
/**
* Registers multipart-reply (stats) message deserializer
* @param deserializer deserializer instance
*/
void registerMultipartReplyMessageDeserializer(ExperimenterIdDeserializerKey key,
- OFDeserializer<MultipartReplyMessage> deserializer);
+ OFDeserializer<? extends ExperimenterDataOfChoice> deserializer);
/**
* Registers multipart-reply table-features message deserializer
*/
void registerQueuePropertyDeserializer(ExperimenterIdDeserializerKey key,
OFDeserializer<QueueProperty> deserializer);
-}
\ No newline at end of file
+
+ /**
+ * 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);
+}