import io.netty.buffer.ByteBuf;
import java.util.LinkedHashMap;
+import java.util.List;
import java.util.Map;
import java.util.Objects;
+import java.util.Optional;
import org.opendaylight.openflowjava.protocol.api.extensibility.HeaderSerializer;
import org.opendaylight.openflowjava.protocol.api.extensibility.OFSerializer;
import org.opendaylight.openflowjava.protocol.api.extensibility.SerializerRegistry;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.augments.rev150225.oxm.container.match.entry.value.ExperimenterIdCase;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.ExperimenterClass;
import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.oxm.rev150225.match.entries.grouping.MatchEntry;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.ExtensionKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflowplugin.extension.general.rev140714.general.extension.list.grouping.ExtensionList;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Override
public void serialize(Match match, ByteBuf outBuffer) {
- if (match == null) {
- LOG.debug("Match is null");
- return;
- }
-
// Save start index in buffer
int matchStartIndex = outBuffer.writerIndex();
@Override
public void serializeHeader(Match match, ByteBuf outBuffer) {
if (match == null) {
- LOG.debug("Match is null");
+ LOG.debug("Match is null, skipping serialization of match entries");
return;
}
// Serialize match entries
- entryRegistry.entrySet().forEach(entry -> {
- if (entry.getValue().matchTypeCheck(match)) {
- entry.getValue().serialize(match, outBuffer);
+ entryRegistry.forEach((key, value) -> {
+ if (value.matchTypeCheck(match)) {
+ value.serialize(match, outBuffer);
}
});
// Serialize match extensions
- ExtensionResolvers.getMatchExtensionResolver().getExtension(match).transform(extensions -> {
- if (Objects.nonNull(extensions)) {
- extensions.getExtensionList().forEach(extension-> {
- // TODO: Remove also extension converters
- final MatchEntry entry = OFSessionUtil
- .getExtensionConvertorProvider()
- .<MatchEntry>getConverter(new ConverterExtensionKey<>(
- extension.getExtensionKey(),
- OFConstants.OFP_VERSION_1_3))
- .convert(extension.getExtension());
-
- final MatchEntrySerializerKey<?, ?> key = new MatchEntrySerializerKey<>(
- EncodeConstants.OF13_VERSION_ID, entry.getOxmClass(), entry.getOxmMatchField());
-
- // If entry is experimenter, set experimenter ID to key
- if (entry.getOxmClass().equals(ExperimenterClass.class)) {
- key.setExperimenterId(ExperimenterIdCase.class.cast(entry.getMatchEntryValue())
- .getExperimenter().getExperimenter().getValue());
- }
-
- final OFSerializer<MatchEntry> entrySerializer = registry.getSerializer(key);
- entrySerializer.serialize(entry, outBuffer);
- });
- }
+ ExtensionResolvers
+ .getMatchExtensionResolver()
+ .getExtension(match)
+ .flatMap(extensions -> Optional.ofNullable(extensions.getExtensionList()))
+ .ifPresent(extensionList -> serializeExtensionList(extensionList, outBuffer));
+ }
- return extensions;
+ private void serializeExtensionList(final List<ExtensionList> extensionList, final ByteBuf outBuffer) {
+ // TODO: Remove also extension converters
+ extensionList.forEach(extension -> {
+ final ConverterExtensionKey<? extends ExtensionKey> converterExtensionKey =
+ new ConverterExtensionKey<>(extension.getExtensionKey(), OFConstants.OFP_VERSION_1_3);
+
+ Optional.ofNullable(OFSessionUtil.getExtensionConvertorProvider())
+ .flatMap(provider -> Optional.ofNullable(provider.<MatchEntry>getConverter(converterExtensionKey)))
+ .map(matchEntryConvertorToOFJava -> {
+ final MatchEntry entry = matchEntryConvertorToOFJava.convert(extension.getExtension());
+
+ final MatchEntrySerializerKey<?, ?> key = new MatchEntrySerializerKey<>(
+ EncodeConstants.OF13_VERSION_ID, entry.getOxmClass(), entry.getOxmMatchField());
+
+ // If entry is experimenter, set experimenter ID to key
+ if (entry.getOxmClass().equals(ExperimenterClass.class)) {
+ key.setExperimenterId(ExperimenterIdCase.class.cast(entry.getMatchEntryValue())
+ .getExperimenter().getExperimenter().getValue());
+ }
+
+ final OFSerializer<MatchEntry> entrySerializer = registry.getSerializer(key);
+ entrySerializer.serialize(entry, outBuffer);
+ return entry;
+ })
+ .orElseGet(() -> {
+ LOG.warn("Serializer for match entry {} for version {} not found.",
+ extension.getExtension().getImplementedInterface(),
+ OFConstants.OFP_VERSION_1_3);
+ return null;
+ });
});
}