/*
* 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.
*
* 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.
*
* 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