X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=openflowplugin-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fopenflowplugin%2Fimpl%2Fcommon%2FMultipartReplyTranslatorUtil.java;h=39403cf0471a3b7b1c47f642417bd19026cfe743;hb=777c94332871b8c34f56f7f2010de1536cb759ba;hp=a1d0fdc0877403ad6a9db625b90a9719881aec93;hpb=13e1d5e6c0237b9378d60526dd8c1d79db6d2b49;p=openflowplugin.git diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/common/MultipartReplyTranslatorUtil.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/common/MultipartReplyTranslatorUtil.java index a1d0fdc087..39403cf047 100644 --- a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/common/MultipartReplyTranslatorUtil.java +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/common/MultipartReplyTranslatorUtil.java @@ -5,15 +5,14 @@ * 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.common; -import java.util.ArrayList; -import java.util.Collections; +import com.google.common.collect.ImmutableSet; import java.util.List; +import java.util.Map; import java.util.Optional; import java.util.stream.Collectors; -import javax.annotation.Nullable; +import org.eclipse.jdt.annotation.Nullable; import org.opendaylight.openflowplugin.api.openflow.device.DeviceInfo; import org.opendaylight.openflowplugin.api.openflow.device.MessageTranslator; import org.opendaylight.openflowplugin.api.openflow.device.TranslatorLibrary; @@ -35,7 +34,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.m import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.multipart.reply.multipart.reply.body.MultipartReplyFlowAggregateStatsBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.multipart.reply.multipart.reply.body.MultipartReplyFlowStats; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.statistics.rev130819.multipart.reply.multipart.reply.body.MultipartReplyFlowStatsBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.flow.table.and.statistics.map.FlowTableAndStatisticsMap; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.flow.table.and.statistics.map.FlowTableAndStatisticsMapBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.multipart.reply.multipart.reply.body.MultipartReplyFlowTableStats; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.multipart.reply.multipart.reply.body.MultipartReplyFlowTableStatsBuilder; @@ -95,7 +93,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyTableFeaturesCase; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.aggregate._case.MultipartReplyAggregate; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.desc._case.MultipartReplyDesc; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.flow._case.MultipartReplyFlow; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group._case.MultipartReplyGroup; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.desc._case.MultipartReplyGroupDesc; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.features._case.MultipartReplyGroupFeatures; @@ -104,10 +101,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.meter.features._case.MultipartReplyMeterFeatures; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.port.stats._case.MultipartReplyPortStats; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.port.stats._case.multipart.reply.port.stats.PortStats; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.queue._case.MultipartReplyQueue; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.queue._case.multipart.reply.queue.QueueStats; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.table._case.MultipartReplyTable; -import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.table._case.multipart.reply.table.TableStats; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.table.features._case.MultipartReplyTableFeatures; import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.multipart.reply.multipart.reply.body.MultipartReplyPortStatsBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.node.connector.statistics.and.port.number.map.NodeConnectorStatisticsAndPortNumberMap; @@ -115,11 +108,12 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.n import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.node.connector.statistics.and.port.number.map.NodeConnectorStatisticsAndPortNumberMapKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.multipart.reply.multipart.reply.body.MultipartReplyQueueStats; import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.multipart.reply.multipart.reply.body.MultipartReplyQueueStatsBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.queue.id.and.statistics.map.QueueIdAndStatisticsMap; import org.opendaylight.yang.gen.v1.urn.opendaylight.queue.statistics.rev131216.queue.id.and.statistics.map.QueueIdAndStatisticsMapBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.TableId; import org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.multipart.reply.multipart.reply.body.MultipartReplyTableFeaturesBuilder; +import org.opendaylight.yangtools.yang.binding.util.BindingMap; import org.opendaylight.yangtools.yang.common.Uint64; +import org.opendaylight.yangtools.yang.common.Uint8; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -131,17 +125,13 @@ public final class MultipartReplyTranslatorUtil { private static final Logger LOG = LoggerFactory.getLogger(MultipartReplyTranslatorUtil.class); private MultipartReplyTranslatorUtil() { + // Hidden on purpose } - public static Optional translate( - final OfHeader message, - final DeviceInfo deviceInfo, - @Nullable final ConvertorExecutor convertorExecutor, - @Nullable final TranslatorLibrary translatorLibrary) { + public static Optional translate(final OfHeader message, final DeviceInfo deviceInfo, + final @Nullable ConvertorExecutor convertorExecutor, final @Nullable TranslatorLibrary translatorLibrary) { if (message instanceof MultipartReply) { - final Optional convertor = Optional.ofNullable(convertorExecutor); - final Optional translator = Optional.ofNullable(translatorLibrary); final MultipartReply msg = (MultipartReply) message; final OpenflowVersion ofVersion = OpenflowVersion.get(deviceInfo.getVersion()); final VersionDatapathIdConvertorData data = new VersionDatapathIdConvertorData(deviceInfo.getVersion()); @@ -149,21 +139,21 @@ public final class MultipartReplyTranslatorUtil { switch (msg.getType()) { case OFPMPFLOW: - return convertor.flatMap(c -> Optional.of(translateFlow(msg, data, c))); + return translateFlow(msg, data, convertorExecutor); case OFPMPAGGREGATE: return Optional.of(translateAggregate(msg)); case OFPMPPORTSTATS: return Optional.of(translatePortStats(msg, ofVersion, deviceInfo.getDatapathId())); case OFPMPGROUP: - return convertor.flatMap(c -> Optional.of(translateGroup(msg, data, c))); + return translateGroup(msg, data, convertorExecutor); case OFPMPGROUPDESC: - return convertor.flatMap(c -> Optional.of(translateGroupDesc(msg, data, c))); + return translateGroupDesc(msg, data, convertorExecutor); case OFPMPGROUPFEATURES: return Optional.of(translateGroupFeatures(msg)); case OFPMPMETER: - return convertor.flatMap(c -> Optional.of(translateMeter(msg, data, c))); + return translateMeter(msg, data, convertorExecutor); case OFPMPMETERCONFIG: - return convertor.flatMap(c -> Optional.of(translateMeterConfig(msg, data, c))); + return translateMeterConfig(msg, data, convertorExecutor); case OFPMPMETERFEATURES: return Optional.of(translateMeterFeatures(msg)); case OFPMPTABLE: @@ -173,10 +163,12 @@ public final class MultipartReplyTranslatorUtil { case OFPMPDESC: return Optional.of(translateDesc(msg)); case OFPMPTABLEFEATURES: - return convertor.flatMap(c -> Optional.of(translateTableFeatures(msg, deviceInfo.getVersion(), c))); + return translateTableFeatures(msg, deviceInfo.getVersion(), convertorExecutor); case OFPMPPORTDESC: - return translator.flatMap(t -> Optional.of(translatePortDesc(msg, deviceInfo, t))); + return translatePortDesc(msg, deviceInfo, translatorLibrary); default: + // TODO: log something? + break; } } else if (message instanceof org.opendaylight.yang.gen.v1.urn.opendaylight.multipart.types.rev170112 .MultipartReply) { @@ -188,44 +180,42 @@ public final class MultipartReplyTranslatorUtil { return Optional.empty(); } - private static MultipartReplyPortDesc translatePortDesc(final MultipartReply msg, - final DeviceInfo deviceInfo, - final TranslatorLibrary translatorLibrary) { - return new MultipartReplyPortDescBuilder() + private static Optional translatePortDesc(final MultipartReply msg, + final DeviceInfo deviceInfo, final TranslatorLibrary translatorLibrary) { + if (translatorLibrary == null) { + return Optional.empty(); + } + + return Optional.of(new MultipartReplyPortDescBuilder() .setPorts(((MultipartReplyPortDescCase) msg.getMultipartReplyBody()) - .getMultipartReplyPortDesc() - .getPorts() - .stream() + .getMultipartReplyPortDesc().nonnullPorts().stream() .map(port -> { - final TranslatorKey translatorKey = new TranslatorKey( - deviceInfo.getVersion(), - PortGrouping.class.getName()); - - final MessageTranslator translator = translatorLibrary - .lookupTranslator(translatorKey); + final MessageTranslator translator = + translatorLibrary .lookupTranslator(new TranslatorKey(deviceInfo.getVersion(), + PortGrouping.class.getName())); - return new PortsBuilder(translator - .translate(port, deviceInfo, null)) - .build(); + return new PortsBuilder(translator.translate(port, deviceInfo, null)).build(); }) .collect(Collectors.toList())) - .build(); + .build()); } - private static org.opendaylight.yang.gen.v1.urn.opendaylight.table.types.rev131026.multipart.reply.multipart - .reply.body.MultipartReplyTableFeatures translateTableFeatures( - final MultipartReply msg, - final short version, - final ConvertorExecutor convertorExecutor) { - MultipartReplyTableFeaturesCase caseBody = (MultipartReplyTableFeaturesCase) msg.getMultipartReplyBody(); - final MultipartReplyTableFeatures multipartReplyTableFeatures = caseBody.getMultipartReplyTableFeatures(); + private static Optional translateTableFeatures(final MultipartReply msg, + final Uint8 version, final ConvertorExecutor convertorExecutor) { + if (convertorExecutor == null) { + return Optional.empty(); + } + + final MultipartReplyTableFeatures multipartReplyTableFeatures = + ((MultipartReplyTableFeaturesCase) msg.getMultipartReplyBody()).getMultipartReplyTableFeatures(); final Optional> tableFeaturesList = convertorExecutor .convert(multipartReplyTableFeatures, new VersionConvertorData(version)); - return new MultipartReplyTableFeaturesBuilder() - .setTableFeatures(tableFeaturesList.orElse(Collections.emptyList())) - .build(); + return Optional.of(new MultipartReplyTableFeaturesBuilder() + .setTableFeatures(tableFeaturesList.map(BindingMap::ordered).orElse(Map.of())) + .build()); } private static org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.multipart.reply.multipart @@ -241,292 +231,268 @@ public final class MultipartReplyTranslatorUtil { .build(); } - private static MultipartReplyFlowStats translateFlow(final MultipartReply msg, - final VersionDatapathIdConvertorData data, - final ConvertorExecutor convertorExecutor) { - FlowStatsResponseConvertorData flowData = new FlowStatsResponseConvertorData(data.getVersion()); + private static Optional translateFlow(final MultipartReply msg, + final VersionDatapathIdConvertorData data, final ConvertorExecutor convertor) { + if (convertor == null) { + return Optional.empty(); + } + + final FlowStatsResponseConvertorData flowData = new FlowStatsResponseConvertorData(data.getVersion()); flowData.setDatapathId(data.getDatapathId()); flowData.setMatchPath(MatchPath.FLOWS_STATISTICS_UPDATE_MATCH); - MultipartReplyFlowStatsBuilder message = new MultipartReplyFlowStatsBuilder(); - MultipartReplyFlowCase caseBody = (MultipartReplyFlowCase) msg.getMultipartReplyBody(); - MultipartReplyFlow replyBody = caseBody.getMultipartReplyFlow(); + + final MultipartReplyFlowCase caseBody = (MultipartReplyFlowCase) msg.getMultipartReplyBody(); final Optional> flowAndStatisticsMapLists = - convertorExecutor.convert(replyBody.getFlowStats(), flowData); + convertor.convert(caseBody.getMultipartReplyFlow().getFlowStats(), flowData); - message.setFlowAndStatisticsMapList(flowAndStatisticsMapLists.orElse(Collections.emptyList())); - return message.build(); + return Optional.of(new MultipartReplyFlowStatsBuilder() + .setFlowAndStatisticsMapList(flowAndStatisticsMapLists.orElse(List.of())) + .build()); } private static MultipartReplyFlowAggregateStats translateAggregate(final MultipartReply msg) { - MultipartReplyFlowAggregateStatsBuilder message = new MultipartReplyFlowAggregateStatsBuilder(); - MultipartReplyAggregateCase caseBody = (MultipartReplyAggregateCase) msg.getMultipartReplyBody(); - MultipartReplyAggregate replyBody = caseBody.getMultipartReplyAggregate(); - message.setByteCount(new Counter64(replyBody.getByteCount())); - message.setPacketCount(new Counter64(replyBody.getPacketCount())); - message.setFlowCount(new Counter32(replyBody.getFlowCount())); - return message.build(); + final MultipartReplyAggregate replyBody = ((MultipartReplyAggregateCase) msg.getMultipartReplyBody()) + .getMultipartReplyAggregate(); + + return new MultipartReplyFlowAggregateStatsBuilder() + .setByteCount(new Counter64(replyBody.getByteCount())) + .setPacketCount(new Counter64(replyBody.getPacketCount())) + .setFlowCount(new Counter32(replyBody.getFlowCount())) + .build(); } private static org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.multipart.reply.multipart - .reply.body.MultipartReplyPortStats translatePortStats( - final MultipartReply msg, - final OpenflowVersion ofVersion, - final Uint64 datapathId) { - MultipartReplyPortStatsBuilder message = new MultipartReplyPortStatsBuilder(); + .reply.body.MultipartReplyPortStats translatePortStats(final MultipartReply msg, + final OpenflowVersion ofVersion, final Uint64 datapathId) { MultipartReplyPortStatsCase caseBody = (MultipartReplyPortStatsCase) msg.getMultipartReplyBody(); MultipartReplyPortStats replyBody = caseBody.getMultipartReplyPortStats(); - List statsMap = - new ArrayList<>(); - for (PortStats portStats : replyBody.getPortStats()) { - - NodeConnectorStatisticsAndPortNumberMapBuilder statsBuilder = - new NodeConnectorStatisticsAndPortNumberMapBuilder(); - statsBuilder.setNodeConnectorId( - InventoryDataServiceUtil.nodeConnectorIdfromDatapathPortNo(datapathId, - portStats.getPortNo(), ofVersion)); - - BytesBuilder bytesBuilder = new BytesBuilder(); - bytesBuilder.setReceived(portStats.getRxBytes()); - bytesBuilder.setTransmitted(portStats.getTxBytes()); - statsBuilder.setBytes(bytesBuilder.build()); - - PacketsBuilder packetsBuilder = new PacketsBuilder(); - packetsBuilder.setReceived(portStats.getRxPackets()); - packetsBuilder.setTransmitted(portStats.getTxPackets()); - statsBuilder.setPackets(packetsBuilder.build()); - - DurationBuilder durationBuilder = new DurationBuilder(); + final var statsMap = BindingMap.orderedBuilder(); + for (PortStats portStats : replyBody.nonnullPortStats()) { + final DurationBuilder durationBuilder = new DurationBuilder(); if (portStats.getDurationSec() != null) { durationBuilder.setSecond(new Counter32(portStats.getDurationSec())); } if (portStats.getDurationNsec() != null) { durationBuilder.setNanosecond(new Counter32(portStats.getDurationNsec())); } - statsBuilder.setDuration(durationBuilder.build()); - statsBuilder.setCollisionCount(portStats.getCollisions()); - statsBuilder.withKey(new NodeConnectorStatisticsAndPortNumberMapKey(statsBuilder.getNodeConnectorId())); - statsBuilder.setReceiveCrcError(portStats.getRxCrcErr()); - statsBuilder.setReceiveDrops(portStats.getRxDropped()); - statsBuilder.setReceiveErrors(portStats.getRxErrors()); - statsBuilder.setReceiveFrameError(portStats.getRxFrameErr()); - statsBuilder.setReceiveOverRunError(portStats.getRxOverErr()); - statsBuilder.setTransmitDrops(portStats.getTxDropped()); - statsBuilder.setTransmitErrors(portStats.getTxErrors()); - - statsMap.add(statsBuilder.build()); - } - message.setNodeConnectorStatisticsAndPortNumberMap(statsMap); + statsMap.add(new NodeConnectorStatisticsAndPortNumberMapBuilder() + .setNodeConnectorId(InventoryDataServiceUtil.nodeConnectorIdfromDatapathPortNo(datapathId, + portStats.getPortNo(), ofVersion)) + .setBytes(new BytesBuilder() + .setReceived(portStats.getRxBytes()) + .setTransmitted(portStats.getTxBytes()) + .build()) + .setPackets(new PacketsBuilder() + .setReceived(portStats.getRxPackets()) + .setTransmitted(portStats.getTxPackets()) + .build()) + .setDuration(durationBuilder.build()) + .setCollisionCount(portStats.getCollisions()) + .setReceiveCrcError(portStats.getRxCrcErr()) + .setReceiveDrops(portStats.getRxDropped()) + .setReceiveErrors(portStats.getRxErrors()) + .setReceiveFrameError(portStats.getRxFrameErr()) + .setReceiveOverRunError(portStats.getRxOverErr()) + .setTransmitDrops(portStats.getTxDropped()) + .setTransmitErrors(portStats.getTxErrors()) + .build()); + } - return message.build(); + return new MultipartReplyPortStatsBuilder() + .setNodeConnectorStatisticsAndPortNumberMap(statsMap.build()) + .build(); } - private static MultipartReplyGroupStats translateGroup(final MultipartReply msg, - final VersionDatapathIdConvertorData data, - final ConvertorExecutor convertorExecutor) { - MultipartReplyGroupStatsBuilder message = new MultipartReplyGroupStatsBuilder(); - MultipartReplyGroupCase caseBody = (MultipartReplyGroupCase) msg.getMultipartReplyBody(); - MultipartReplyGroup replyBody = caseBody.getMultipartReplyGroup(); + private static Optional translateGroup(final MultipartReply msg, + final VersionDatapathIdConvertorData data, final ConvertorExecutor convertorExecutor) { + if (convertorExecutor == null) { + return Optional.empty(); + } + + final MultipartReplyGroup replyBody = ((MultipartReplyGroupCase) msg.getMultipartReplyBody()) + .getMultipartReplyGroup(); final Optional> groupStatsList = convertorExecutor.convert( replyBody.getGroupStats(), data); - message.setGroupStats(groupStatsList.orElse(Collections.emptyList())); - - return message.build(); + return Optional.of(new MultipartReplyGroupStatsBuilder() + .setGroupStats(groupStatsList.map(BindingMap::ordered).orElse(Map.of())) + .build()); } - private static org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.multipart.reply.multipart - .reply.body.MultipartReplyGroupDesc translateGroupDesc( - final MultipartReply msg, - final VersionDatapathIdConvertorData data, - final ConvertorExecutor convertorExecutor) { - MultipartReplyGroupDescBuilder message = new MultipartReplyGroupDescBuilder(); + private static Optional translateGroupDesc(final MultipartReply msg, + final VersionDatapathIdConvertorData data, final ConvertorExecutor convertorExecutor) { + if (convertorExecutor == null) { + return Optional.empty(); + } + MultipartReplyGroupDescCase caseBody = (MultipartReplyGroupDescCase) msg.getMultipartReplyBody(); MultipartReplyGroupDesc replyBody = caseBody.getMultipartReplyGroupDesc(); final Optional> groupDescStatsList = convertorExecutor.convert( replyBody.getGroupDesc(), data); - message.setGroupDescStats(groupDescStatsList.orElse(Collections.emptyList())); - - return message.build(); + return Optional.of(new MultipartReplyGroupDescBuilder() + .setGroupDescStats(groupDescStatsList.map(BindingMap::ordered).orElse(Map.of())) + .build()); } private static org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.multipart.reply.multipart .reply.body.MultipartReplyGroupFeatures translateGroupFeatures(final MultipartReply msg) { - final MultipartReplyGroupFeaturesBuilder message = new MultipartReplyGroupFeaturesBuilder(); - final MultipartReplyGroupFeaturesCase caseBody = (MultipartReplyGroupFeaturesCase) msg.getMultipartReplyBody(); - final MultipartReplyGroupFeatures replyBody = caseBody.getMultipartReplyGroupFeatures(); - List> supportedGroups = - new ArrayList<>(); + final MultipartReplyGroupFeatures replyBody = ((MultipartReplyGroupFeaturesCase) msg.getMultipartReplyBody()) + .getMultipartReplyGroupFeatures(); - if (replyBody.getTypes().isOFPGTALL()) { + final var replyTypes = replyBody.getTypes(); + final var supportedGroups = ImmutableSet.>builder(); + if (replyTypes.getOFPGTALL()) { supportedGroups.add(GroupAll.class); } - if (replyBody.getTypes().isOFPGTSELECT()) { + if (replyTypes.getOFPGTSELECT()) { supportedGroups.add(GroupSelect.class); } - if (replyBody.getTypes().isOFPGTINDIRECT()) { + if (replyTypes.getOFPGTINDIRECT()) { supportedGroups.add(GroupIndirect.class); } - if (replyBody.getTypes().isOFPGTFF()) { + if (replyTypes.getOFPGTFF()) { supportedGroups.add(GroupFf.class); } - message.setGroupTypesSupported(supportedGroups); - message.setMaxGroups(replyBody.getMaxGroups()); - - List> supportedCapabilities = - new ArrayList<>(); - if (replyBody.getCapabilities().isOFPGFCCHAINING()) { + final var replyCapabilities = replyBody.getCapabilities(); + final var supportedCapabilities = ImmutableSet.>builder(); + if (replyCapabilities.getOFPGFCCHAINING()) { supportedCapabilities.add(Chaining.class); } - if (replyBody.getCapabilities().isOFPGFCCHAININGCHECKS()) { + if (replyCapabilities.getOFPGFCCHAININGCHECKS()) { supportedCapabilities.add(ChainingChecks.class); } - if (replyBody.getCapabilities().isOFPGFCSELECTLIVENESS()) { + if (replyCapabilities.getOFPGFCSELECTLIVENESS()) { supportedCapabilities.add(SelectLiveness.class); } - if (replyBody.getCapabilities().isOFPGFCSELECTWEIGHT()) { + if (replyCapabilities.getOFPGFCSELECTWEIGHT()) { supportedCapabilities.add(SelectWeight.class); } - message.setGroupCapabilitiesSupported(supportedCapabilities); - - message.setActions(GroupUtil.extractGroupActionsSupportBitmap(replyBody.getActionsBitmap())); - return message.build(); + return new MultipartReplyGroupFeaturesBuilder() + .setGroupTypesSupported(supportedGroups.build()) + .setMaxGroups(replyBody.getMaxGroups()) + .setGroupCapabilitiesSupported(supportedCapabilities.build()) + .setActions(GroupUtil.extractGroupActionsSupportBitmap(replyBody.getActionsBitmap())) + .build(); } - private static MultipartReplyMeterStats translateMeter(final MultipartReply msg, - final VersionDatapathIdConvertorData data, - final ConvertorExecutor convertorExecutor) { - MultipartReplyMeterStatsBuilder message = new MultipartReplyMeterStatsBuilder(); - MultipartReplyMeterCase caseBody = (MultipartReplyMeterCase) msg.getMultipartReplyBody(); - MultipartReplyMeter replyBody = caseBody.getMultipartReplyMeter(); + private static Optional translateMeter(final MultipartReply msg, + final VersionDatapathIdConvertorData data, final ConvertorExecutor convertorExecutor) { + if (convertorExecutor == null) { + return Optional.empty(); + } + + final MultipartReplyMeter replyBody = ((MultipartReplyMeterCase) msg.getMultipartReplyBody()) + .getMultipartReplyMeter(); final Optional> + org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.statistics.reply.MeterStats>> meterStatsList = convertorExecutor.convert(replyBody.getMeterStats(), data); - message.setMeterStats(meterStatsList.orElse(Collections.emptyList())); - - return message.build(); + return Optional.of(new MultipartReplyMeterStatsBuilder() + .setMeterStats(meterStatsList.map(BindingMap::ordered).orElse(Map.of())) + .build()); } - private static org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.multipart.reply.multipart - .reply.body.MultipartReplyMeterConfig translateMeterConfig( - final MultipartReply msg, - final VersionDatapathIdConvertorData data, - final ConvertorExecutor convertorExecutor) { - MultipartReplyMeterConfigBuilder message = new MultipartReplyMeterConfigBuilder(); + private static Optional translateMeterConfig(final MultipartReply msg, + final VersionDatapathIdConvertorData data, final ConvertorExecutor convertorExecutor) { + if (convertorExecutor == null) { + return Optional.empty(); + } + MultipartReplyMeterConfigCase caseBody = (MultipartReplyMeterConfigCase) msg.getMultipartReplyBody(); MultipartReplyMeterConfig replyBody = caseBody.getMultipartReplyMeterConfig(); final Optional> meterConfigStatsList = convertorExecutor.convert(replyBody.getMeterConfig(), data); - message.setMeterConfigStats(meterConfigStatsList.orElse(Collections.emptyList())); - - return message.build(); + return Optional.of(new MultipartReplyMeterConfigBuilder() + .setMeterConfigStats(meterConfigStatsList.map(BindingMap::ordered).orElse(Map.of())) + .build()); } private static org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.multipart.reply.multipart .reply.body.MultipartReplyMeterFeatures translateMeterFeatures(final MultipartReply msg) { - MultipartReplyMeterFeaturesBuilder message = new MultipartReplyMeterFeaturesBuilder(); MultipartReplyMeterFeaturesCase caseBody = (MultipartReplyMeterFeaturesCase) msg.getMultipartReplyBody(); MultipartReplyMeterFeatures replyBody = caseBody.getMultipartReplyMeterFeatures(); - message.setMaxBands(replyBody.getMaxBands()); - message.setMaxColor(replyBody.getMaxColor()); - message.setMaxMeter(new Counter32(replyBody.getMaxMeter())); - List> supportedCapabilities = - new ArrayList<>(); - if (replyBody.getCapabilities().isOFPMFBURST()) { + final var replyCapabilities = replyBody.getCapabilities(); + final var supportedCapabilities = ImmutableSet.>builder(); + if (replyCapabilities.getOFPMFBURST()) { supportedCapabilities.add(MeterBurst.class); } - if (replyBody.getCapabilities().isOFPMFKBPS()) { + if (replyCapabilities.getOFPMFKBPS()) { supportedCapabilities.add(MeterKbps.class); - } - if (replyBody.getCapabilities().isOFPMFPKTPS()) { + if (replyCapabilities.getOFPMFPKTPS()) { supportedCapabilities.add(MeterPktps.class); - } - if (replyBody.getCapabilities().isOFPMFSTATS()) { + if (replyCapabilities.getOFPMFSTATS()) { supportedCapabilities.add(MeterStats.class); - } - message.setMeterCapabilitiesSupported(supportedCapabilities); - List> supportedMeterBand = - new ArrayList<>(); - if (replyBody.getBandTypes().isOFPMBTDROP()) { + final var replyMeterBand = replyBody.getBandTypes(); + final var supportedMeterBand = ImmutableSet.>builder(); + if (replyMeterBand.getOFPMBTDROP()) { supportedMeterBand.add(MeterBandDrop.class); } - if (replyBody.getBandTypes().isOFPMBTDSCPREMARK()) { + if (replyMeterBand.getOFPMBTDSCPREMARK()) { supportedMeterBand.add(MeterBandDscpRemark.class); } - message.setMeterBandSupported(supportedMeterBand); - return message.build(); + + return new MultipartReplyMeterFeaturesBuilder() + .setMaxBands(replyBody.getMaxBands()) + .setMaxColor(replyBody.getMaxColor()) + .setMaxMeter(new Counter32(replyBody.getMaxMeter())) + .setMeterCapabilitiesSupported(supportedCapabilities.build()) + .setMeterBandSupported(supportedMeterBand.build()) + .build(); } private static MultipartReplyFlowTableStats translateTable(final MultipartReply msg) { - MultipartReplyFlowTableStatsBuilder message = new MultipartReplyFlowTableStatsBuilder(); - MultipartReplyTableCase caseBody = (MultipartReplyTableCase) msg.getMultipartReplyBody(); - MultipartReplyTable replyBody = caseBody.getMultipartReplyTable(); - List swTablesStats = replyBody.getTableStats(); - - List salFlowStats = new ArrayList<>(); - //TODO: Duplicate code: look at OpendaylightFlowTableStatisticsServiceImpl method transformToNotification - for (TableStats swTableStats : swTablesStats) { - FlowTableAndStatisticsMapBuilder statisticsBuilder = new FlowTableAndStatisticsMapBuilder(); - - statisticsBuilder.setActiveFlows(new Counter32(swTableStats.getActiveCount())); - statisticsBuilder.setPacketsLookedUp(new Counter64(swTableStats.getLookupCount())); - statisticsBuilder.setPacketsMatched(new Counter64(swTableStats.getMatchedCount())); - statisticsBuilder.setTableId(new TableId(swTableStats.getTableId())); - salFlowStats.add(statisticsBuilder.build()); - } - - message.setFlowTableAndStatisticsMap(salFlowStats); - return message.build(); + final var salFlowStats = ((MultipartReplyTableCase) msg.getMultipartReplyBody()).getMultipartReplyTable() + .nonnullTableStats().stream() + //TODO: Duplicate code: look at OpendaylightFlowTableStatisticsServiceImpl method transformToNotification + .map(swTableStats -> new FlowTableAndStatisticsMapBuilder() + .setActiveFlows(new Counter32(swTableStats.getActiveCount())) + .setPacketsLookedUp(new Counter64(swTableStats.getLookupCount())) + .setPacketsMatched(new Counter64(swTableStats.getMatchedCount())) + .setTableId(new TableId(swTableStats.getTableId())) + .build()) + .collect(BindingMap.toOrderedMap()); + + return new MultipartReplyFlowTableStatsBuilder() + .setFlowTableAndStatisticsMap(salFlowStats) + .build(); } private static MultipartReplyQueueStats translateQueue(final MultipartReply msg, final OpenflowVersion ofVersion, final Uint64 datapathId) { - MultipartReplyQueueStatsBuilder message = new MultipartReplyQueueStatsBuilder(); - MultipartReplyQueueCase caseBody = (MultipartReplyQueueCase) msg.getMultipartReplyBody(); - MultipartReplyQueue replyBody = caseBody.getMultipartReplyQueue(); - - List statsMap = - new ArrayList<>(); - - for (QueueStats queueStats : replyBody.getQueueStats()) { - - QueueIdAndStatisticsMapBuilder statsBuilder = - new QueueIdAndStatisticsMapBuilder(); - statsBuilder.setNodeConnectorId( - InventoryDataServiceUtil.nodeConnectorIdfromDatapathPortNo(datapathId, - queueStats.getPortNo(), ofVersion)); - statsBuilder.setTransmissionErrors(new Counter64(queueStats.getTxErrors())); - statsBuilder.setTransmittedBytes(new Counter64(queueStats.getTxBytes())); - statsBuilder.setTransmittedPackets(new Counter64(queueStats.getTxPackets())); - - DurationBuilder durationBuilder = new DurationBuilder(); - durationBuilder.setSecond(new Counter32(queueStats.getDurationSec())); - durationBuilder.setNanosecond(new Counter32(queueStats.getDurationNsec())); - statsBuilder.setDuration(durationBuilder.build()); - - statsBuilder.setQueueId(new QueueId(queueStats.getQueueId())); - statsBuilder.setNodeConnectorId(InventoryDataServiceUtil.nodeConnectorIdfromDatapathPortNo(datapathId, - queueStats.getPortNo(), ofVersion)); - - statsMap.add(statsBuilder.build()); - } - message.setQueueIdAndStatisticsMap(statsMap); - - return message.build(); + final var statsMap = ((MultipartReplyQueueCase) msg.getMultipartReplyBody()).getMultipartReplyQueue() + .nonnullQueueStats().stream() + .map(queueStats -> new QueueIdAndStatisticsMapBuilder() + .setNodeConnectorId(InventoryDataServiceUtil.nodeConnectorIdfromDatapathPortNo(datapathId, + queueStats.getPortNo(), ofVersion)) + .setQueueId(new QueueId(queueStats.getQueueId())) + .setTransmissionErrors(new Counter64(queueStats.getTxErrors())) + .setTransmittedBytes(new Counter64(queueStats.getTxBytes())) + .setTransmittedPackets(new Counter64(queueStats.getTxPackets())) + .setDuration(new DurationBuilder() + .setSecond(new Counter32(queueStats.getDurationSec())) + .setNanosecond(new Counter32(queueStats.getDurationNsec())) + .build()) + .build()) + .collect(BindingMap.toOrderedMap()); + + return new MultipartReplyQueueStatsBuilder() + .setQueueIdAndStatisticsMap(statsMap) + .build(); } - }