/*
* Copyright (c) 2017 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.openflowplugin.impl.protocol.serialization.multipart;
import io.netty.buffer.ByteBuf;
import java.util.Optional;
import org.opendaylight.openflowjava.protocol.api.extensibility.OFSerializer;
import org.opendaylight.openflowjava.protocol.api.extensibility.SerializerRegistry;
import org.opendaylight.openflowjava.protocol.api.extensibility.SerializerRegistryInjector;
import org.opendaylight.openflowjava.protocol.api.keys.MessageTypeKey;
import org.opendaylight.openflowjava.protocol.api.util.EncodeConstants;
import org.opendaylight.openflowjava.util.ExperimenterSerializerKeyFactory;
import org.opendaylight.openflowplugin.api.OFConstants;
import org.opendaylight.openflowplugin.extension.api.TypeVersionKey;
import org.opendaylight.openflowplugin.extension.api.exception.ConversionException;
import org.opendaylight.openflowplugin.openflow.md.core.session.OFSessionUtil;
import org.opendaylight.yang.gen.v1.urn.opendaylight.multipart.types.rev170112.multipart.request.MultipartRequestBody;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.experimenter.core.ExperimenterDataOfChoice;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.experimenter.types.rev151020.experimenter.core.message.ExperimenterMessageOfChoice;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.experimenter.types.rev151020.multipart.request.multipart.request.body.MultipartRequestExperimenter;
public class MultipartRequestExperimenterSerializer implements OFSerializer<MultipartRequestBody>, SerializerRegistryInjector {
private SerializerRegistry registry;
@Override
@SuppressWarnings("unchecked")
public void serialize(final MultipartRequestBody multipartRequestBody, final ByteBuf byteBuf) {
final MultipartRequestExperimenter multipartRequestExperimenter = MultipartRequestExperimenter
.class
.cast(multipartRequestBody);
try {
final OFSerializer<ExperimenterMessageOfChoice> serializer = registry
.getSerializer(new MessageTypeKey<>(
EncodeConstants.OF13_VERSION_ID,
multipartRequestExperimenter.getExperimenterMessageOfChoice().getImplementedInterface()));
serializer.serialize(multipartRequestExperimenter.getExperimenterMessageOfChoice(), byteBuf);
} catch (ClassCastException | IllegalStateException ex) {
Optional
.ofNullable(OFSessionUtil.getExtensionConvertorProvider().<ExperimenterMessageOfChoice, ExperimenterDataOfChoice>getMessageConverter(new TypeVersionKey<>(
(Class<ExperimenterMessageOfChoice>)multipartRequestExperimenter.getExperimenterMessageOfChoice().getImplementedInterface(),
OFConstants.OFP_VERSION_1_3)))
.ifPresent(converter -> {
final OFSerializer<ExperimenterDataOfChoice> serializer = registry
.getSerializer(ExperimenterSerializerKeyFactory
.createMultipartRequestSerializerKey(
EncodeConstants.OF13_VERSION_ID,
converter.getExperimenterId().getValue(),
converter.getType()));
try {
serializer.serialize(converter.convert(multipartRequestExperimenter.getExperimenterMessageOfChoice()), byteBuf);
} catch (ConversionException e) {
throw new IllegalStateException(e);
}
});
}
}
@Override
public void injectSerializerRegistry(final SerializerRegistry serializerRegistry) {
registry = serializerRegistry;
}
}