/*
* Copyright (c) 2014 Pantheon Technologies s.r.o. and others. All rights reserved.
*
* This program and the accompanying materials are made available under the
* 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.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.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;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.queue.property.header.QueueProperty;
/**
* Provides methods for deserialization part of extensibility.
* 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>
*
* This has to be done in this way because of experimenter headers, which
* provide only vendor / experimenter ID. Subtype position may be different
* for different vendors (or not present at all) - that's why vendor has to
* handle it in his own implementations.
* @author michal.polkorab
*/
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
* @return true if deserializer was removed,
* false if no deserializer was found under specified key
*/
boolean unregisterDeserializer(ExperimenterDeserializerKey key);
/**
* Registers action deserializer
* @param key used for deserializer lookup
* @param deserializer deserializer instance
*/
void registerActionDeserializer(ExperimenterActionDeserializerKey key,
OFGeneralDeserializer deserializer);
/**
* Registers instruction deserializer
* @param key used for deserializer lookup
* @param deserializer deserializer instance
*/
void registerInstructionDeserializer(ExperimenterInstructionDeserializerKey key,
OFGeneralDeserializer deserializer);
/**
* Registers match entry deserializer
* @param key used for deserializer lookup
* @param deserializer deserializer instance
*/
void registerMatchEntryDeserializer(MatchEntryDeserializerKey key,
OFGeneralDeserializer deserializer);
/**
* Registers error message deserializer
* @param key used for deserializer lookup
* @param deserializer deserializer instance
*/
void registerErrorDeserializer(ExperimenterIdDeserializerKey key,
OFDeserializer<ErrorMessage> deserializer);
/**
* Registers experimenter (vendor) message deserializer
* @param key used for deserializer lookup
* @param deserializer deserializer instance
*/
void registerExperimenterMessageDeserializer(ExperimenterIdDeserializerKey key,
OFDeserializer<? extends ExperimenterDataOfChoice> deserializer);
/**
* Registers multipart-reply (stats) message deserializer
* @param key used for deserializer lookup
* @param deserializer deserializer instance
*/
void registerMultipartReplyMessageDeserializer(ExperimenterIdDeserializerKey key,
OFDeserializer<? extends ExperimenterDataOfChoice> deserializer);
/**
* Registers multipart-reply table-features message deserializer
* @param key used for deserializer lookup
* @param deserializer deserializer instance
*/
void registerMultipartReplyTFDeserializer(ExperimenterIdDeserializerKey key,
OFGeneralDeserializer deserializer);
/**
* Registers meter band deserializer (used in multipart-reply meter-config)
* @param key used for deserializer lookup
* @param deserializer deserializer instance
*/
void registerMeterBandDeserializer(ExperimenterIdDeserializerKey key,
OFDeserializer<MeterBandExperimenterCase> deserializer);
/**
* Registers queue property (QUEUE_GET_CONFIG_REPLY message) deserializer
* @param key used for deserializer lookup
* @param deserializer deserializer instance
*/
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);
}