SONAR TD - SinglePurposeMultipartReplyTranslator - CC 43/42043/1
authorTomas Slusny <tomas.slusny@pantheon.sk>
Tue, 19 Jul 2016 12:19:14 +0000 (14:19 +0200)
committerTomas Slusny <tomas.slusny@pantheon.sk>
Tue, 19 Jul 2016 12:19:14 +0000 (14:19 +0200)
- Reduced cyclomatic complexity of method
  SinglePurposeMultipartReplyTranslator.translate

Change-Id: Ib410f51d646ec39f3795f344c5e3199fd912eae4
Signed-off-by: Tomas Slusny <tomas.slusny@pantheon.sk>
openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/SinglePurposeMultipartReplyTranslator.java

index 154582e61746fc2f8574e7a70cff9de4911157e6..732bc4f465ba2cce2f0a1213424fbacc0bd56810 100644 (file)
@@ -52,6 +52,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.Meter
 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.statistics.types.rev130925.duration.DurationBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.statistics.types.rev130925.node.connector.statistics.BytesBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.model.statistics.types.rev130925.node.connector.statistics.PacketsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.MultipartReplyMessage;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.MultipartReplyAggregateCase;
@@ -118,312 +119,384 @@ public class SinglePurposeMultipartReplyTranslator {
         if (msg instanceof MultipartReplyMessage) {
             MultipartReplyMessage mpReply = (MultipartReplyMessage) msg;
             NodeId node = SinglePurposeMultipartReplyTranslator.nodeIdFromDatapathId(datapathId);
-            switch (mpReply.getType()) {
-                case OFPMPFLOW: {
-                    FlowsStatisticsUpdateBuilder message = new FlowsStatisticsUpdateBuilder();
-                    message.setId(node);
-                    message.setMoreReplies(mpReply.getFlags().isOFPMPFREQMORE());
-                    message.setTransactionId(generateTransactionId(mpReply.getXid()));
-                    MultipartReplyFlowCase caseBody = (MultipartReplyFlowCase) mpReply.getMultipartReplyBody();
-                    MultipartReplyFlow replyBody = caseBody.getMultipartReplyFlow();
-                    message.setFlowAndStatisticsMapList(flowStatsConvertor.toSALFlowStatsList(replyBody.getFlowStats(), datapathId, ofVersion));
-
-                    listDataObject.add(message.build());
-                    return listDataObject;
-                }
-                case OFPMPAGGREGATE: {
-                    AggregateFlowStatisticsUpdateBuilder message = new AggregateFlowStatisticsUpdateBuilder();
-                    message.setId(node);
-                    message.setMoreReplies(mpReply.getFlags().isOFPMPFREQMORE());
-                    message.setTransactionId(generateTransactionId(mpReply.getXid()));
-
-                    MultipartReplyAggregateCase caseBody = (MultipartReplyAggregateCase) mpReply.getMultipartReplyBody();
-                    MultipartReplyAggregate replyBody = caseBody.getMultipartReplyAggregate();
-                    message.setByteCount(new Counter64(replyBody.getByteCount()));
-                    message.setPacketCount(new Counter64(replyBody.getPacketCount()));
-                    message.setFlowCount(new Counter32(replyBody.getFlowCount()));
-
-                    listDataObject.add(message.build());
-                    return listDataObject;
-                }
-                case OFPMPPORTSTATS: {
-
-
-                    NodeConnectorStatisticsUpdateBuilder message = new NodeConnectorStatisticsUpdateBuilder();
-                    message.setId(node);
-                    message.setMoreReplies(mpReply.getFlags().isOFPMPFREQMORE());
-                    message.setTransactionId(generateTransactionId(mpReply.getXid()));
-
-                    MultipartReplyPortStatsCase caseBody = (MultipartReplyPortStatsCase) mpReply.getMultipartReplyBody();
-                    MultipartReplyPortStats replyBody = caseBody.getMultipartReplyPortStats();
-
-                    List<NodeConnectorStatisticsAndPortNumberMap> statsMap =
-                            new ArrayList<NodeConnectorStatisticsAndPortNumberMap>();
-                    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();
-                        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.setKey(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);
-
-
-                    listDataObject.add(message.build());
-                    return listDataObject;
-                }
-                case OFPMPGROUP: {
-                    GroupStatisticsUpdatedBuilder message = new GroupStatisticsUpdatedBuilder();
-                    message.setId(node);
-                    message.setMoreReplies(mpReply.getFlags().isOFPMPFREQMORE());
-                    message.setTransactionId(generateTransactionId(mpReply.getXid()));
-                    MultipartReplyGroupCase caseBody = (MultipartReplyGroupCase) mpReply.getMultipartReplyBody();
-                    MultipartReplyGroup replyBody = caseBody.getMultipartReplyGroup();
-                    message.setGroupStats(groupStatsConvertor.toSALGroupStatsList(replyBody.getGroupStats()));
-
-                    listDataObject.add(message.build());
-                    return listDataObject;
-                }
-                case OFPMPGROUPDESC: {
-
-                    GroupDescStatsUpdatedBuilder message = new GroupDescStatsUpdatedBuilder();
-                    message.setId(node);
-                    message.setMoreReplies(mpReply.getFlags().isOFPMPFREQMORE());
-                    message.setTransactionId(generateTransactionId(mpReply.getXid()));
-                    MultipartReplyGroupDescCase caseBody = (MultipartReplyGroupDescCase) mpReply.getMultipartReplyBody();
-                    MultipartReplyGroupDesc replyBody = caseBody.getMultipartReplyGroupDesc();
-
-                    message.setGroupDescStats(groupStatsConvertor.toSALGroupDescStatsList(replyBody.getGroupDesc(), ofVersion));
-
-                    listDataObject.add(message.build());
-                    return listDataObject;
-                }
-                case OFPMPGROUPFEATURES: {
-                    GroupFeaturesUpdatedBuilder message = new GroupFeaturesUpdatedBuilder();
-                    message.setId(node);
-                    message.setMoreReplies(mpReply.getFlags().isOFPMPFREQMORE());
-                    message.setTransactionId(generateTransactionId(mpReply.getXid()));
-                    MultipartReplyGroupFeaturesCase caseBody = (MultipartReplyGroupFeaturesCase) mpReply.getMultipartReplyBody();
-                    MultipartReplyGroupFeatures replyBody = caseBody.getMultipartReplyGroupFeatures();
-                    List<Class<? extends GroupType>> supportedGroups =
-                            new ArrayList<Class<? extends GroupType>>();
-
-                    if (replyBody.getTypes().isOFPGTALL()) {
-                        supportedGroups.add(GroupAll.class);
-                    }
-                    if (replyBody.getTypes().isOFPGTSELECT()) {
-                        supportedGroups.add(GroupSelect.class);
-                    }
-                    if (replyBody.getTypes().isOFPGTINDIRECT()) {
-                        supportedGroups.add(GroupIndirect.class);
-                    }
-                    if (replyBody.getTypes().isOFPGTFF()) {
-                        supportedGroups.add(GroupFf.class);
-                    }
-                    message.setGroupTypesSupported(supportedGroups);
-                    message.setMaxGroups(replyBody.getMaxGroups());
-
-                    List<Class<? extends GroupCapability>> supportedCapabilities =
-                            new ArrayList<Class<? extends GroupCapability>>();
-
-                    if (replyBody.getCapabilities().isOFPGFCCHAINING()) {
-                        supportedCapabilities.add(Chaining.class);
-                    }
-                    if (replyBody.getCapabilities().isOFPGFCCHAININGCHECKS()) {
-                        supportedCapabilities.add(ChainingChecks.class);
-                    }
-                    if (replyBody.getCapabilities().isOFPGFCSELECTLIVENESS()) {
-                        supportedCapabilities.add(SelectLiveness.class);
-                    }
-                    if (replyBody.getCapabilities().isOFPGFCSELECTWEIGHT()) {
-                        supportedCapabilities.add(SelectWeight.class);
-                    }
-
-                    message.setGroupCapabilitiesSupported(supportedCapabilities);
-
-                    message.setActions(getGroupActionsSupportBitmap(replyBody.getActionsBitmap()));
-                    listDataObject.add(message.build());
-
-                    return listDataObject;
-                }
-                case OFPMPMETER: {
-                    MeterStatisticsUpdatedBuilder message = new MeterStatisticsUpdatedBuilder();
-                    message.setId(node);
-                    message.setMoreReplies(mpReply.getFlags().isOFPMPFREQMORE());
-                    message.setTransactionId(generateTransactionId(mpReply.getXid()));
-
-                    MultipartReplyMeterCase caseBody = (MultipartReplyMeterCase) mpReply.getMultipartReplyBody();
-                    MultipartReplyMeter replyBody = caseBody.getMultipartReplyMeter();
-                    message.setMeterStats(meterStatsConvertor.toSALMeterStatsList(replyBody.getMeterStats()));
-
-                    listDataObject.add(message.build());
-                    return listDataObject;
-                }
-                case OFPMPMETERCONFIG: {
-
-                    MeterConfigStatsUpdatedBuilder message = new MeterConfigStatsUpdatedBuilder();
-                    message.setId(node);
-                    message.setMoreReplies(mpReply.getFlags().isOFPMPFREQMORE());
-                    message.setTransactionId(generateTransactionId(mpReply.getXid()));
-
-                    MultipartReplyMeterConfigCase caseBody = (MultipartReplyMeterConfigCase) mpReply.getMultipartReplyBody();
-                    MultipartReplyMeterConfig replyBody = caseBody.getMultipartReplyMeterConfig();
-                    message.setMeterConfigStats(meterStatsConvertor.toSALMeterConfigList(replyBody.getMeterConfig()));
-
-                    listDataObject.add(message.build());
-                    return listDataObject;
-                }
-                case OFPMPMETERFEATURES: {
-                    //Convert OF message and send it to SAL listener
-                    MeterFeaturesUpdatedBuilder message = new MeterFeaturesUpdatedBuilder();
-                    message.setId(node);
-                    message.setMoreReplies(mpReply.getFlags().isOFPMPFREQMORE());
-                    message.setTransactionId(generateTransactionId(mpReply.getXid()));
-
-                    MultipartReplyMeterFeaturesCase caseBody = (MultipartReplyMeterFeaturesCase) mpReply.getMultipartReplyBody();
-                    MultipartReplyMeterFeatures replyBody = caseBody.getMultipartReplyMeterFeatures();
-                    message.setMaxBands(replyBody.getMaxBands());
-                    message.setMaxColor(replyBody.getMaxColor());
-                    message.setMaxMeter(new Counter32(replyBody.getMaxMeter()));
-
-                    List<Class<? extends MeterCapability>> supportedCapabilities =
-                            new ArrayList<Class<? extends MeterCapability>>();
-                    if (replyBody.getCapabilities().isOFPMFBURST()) {
-                        supportedCapabilities.add(MeterBurst.class);
-                    }
-                    if (replyBody.getCapabilities().isOFPMFKBPS()) {
-                        supportedCapabilities.add(MeterKbps.class);
-
-                    }
-                    if (replyBody.getCapabilities().isOFPMFPKTPS()) {
-                        supportedCapabilities.add(MeterPktps.class);
-
-                    }
-                    if (replyBody.getCapabilities().isOFPMFSTATS()) {
-                        supportedCapabilities.add(MeterStats.class);
-
-                    }
-                    message.setMeterCapabilitiesSupported(supportedCapabilities);
-
-                    List<Class<? extends MeterBand>> supportedMeterBand =
-                            new ArrayList<Class<? extends MeterBand>>();
-                    if (replyBody.getBandTypes().isOFPMBTDROP()) {
-                        supportedMeterBand.add(MeterBandDrop.class);
-                    }
-                    if (replyBody.getBandTypes().isOFPMBTDSCPREMARK()) {
-                        supportedMeterBand.add(MeterBandDscpRemark.class);
-                    }
-                    message.setMeterBandSupported(supportedMeterBand);
-                    listDataObject.add(message.build());
-
-                    return listDataObject;
-                }
-                case OFPMPTABLE: {
-
-                    FlowTableStatisticsUpdateBuilder message = new FlowTableStatisticsUpdateBuilder();
-                    message.setId(node);
-                    message.setMoreReplies(mpReply.getFlags().isOFPMPFREQMORE());
-                    message.setTransactionId(generateTransactionId(mpReply.getXid()));
-
-                    MultipartReplyTableCase caseBody = (MultipartReplyTableCase) mpReply.getMultipartReplyBody();
-                    MultipartReplyTable replyBody = caseBody.getMultipartReplyTable();
-                    List<TableStats> swTablesStats = replyBody.getTableStats();
-
-                    List<FlowTableAndStatisticsMap> salFlowStats = new ArrayList<FlowTableAndStatisticsMap>();
-                    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);
-                    listDataObject.add(message.build());
-                    return listDataObject;
-                }
-                case OFPMPQUEUE: {
-
-                    QueueStatisticsUpdateBuilder message = new QueueStatisticsUpdateBuilder();
-                    message.setId(node);
-                    message.setMoreReplies(mpReply.getFlags().isOFPMPFREQMORE());
-                    message.setTransactionId(generateTransactionId(mpReply.getXid()));
-
-                    MultipartReplyQueueCase caseBody = (MultipartReplyQueueCase) mpReply.getMultipartReplyBody();
-                    MultipartReplyQueue replyBody = caseBody.getMultipartReplyQueue();
-
-                    List<QueueIdAndStatisticsMap> statsMap =
-                            new ArrayList<QueueIdAndStatisticsMap>();
-
-                    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);
-
-                    listDataObject.add(message.build());
-                    return listDataObject;
-                }
-
-                default:
-                    return listDataObject;
-            }
+
+            translateFlow(listDataObject, mpReply, node, ofVersion, datapathId);
+            translateAggregate(listDataObject, mpReply, node);
+            translatePortStats(listDataObject, mpReply, node, ofVersion, datapathId);
+            translateGroup(listDataObject, mpReply, node);
+            translateGroupDesc(listDataObject, mpReply, node, ofVersion);
+            translateGroupFeatures(listDataObject, mpReply, node);
+            translateMeter(listDataObject, mpReply, node);
+            translateMeterConfig(listDataObject, mpReply, node);
+            translateMeterFeatures(listDataObject, mpReply, node);
+            translateTable(listDataObject, mpReply, node);
+            translateQueue(listDataObject, mpReply, node, ofVersion, datapathId);
         }
 
         return listDataObject;
     }
 
+    private static void translateFlow(final List<DataObject> listDataObject,
+                                      final MultipartReplyMessage mpReply,
+                                      final NodeId node,
+                                      final OpenflowVersion ofVersion,
+                                      final BigInteger datapathId) {
+        if (!MultipartType.OFPMPFLOW.equals(mpReply.getType())) {
+            return;
+        }
+
+        FlowsStatisticsUpdateBuilder message = new FlowsStatisticsUpdateBuilder();
+        message.setId(node);
+        message.setMoreReplies(mpReply.getFlags().isOFPMPFREQMORE());
+        message.setTransactionId(generateTransactionId(mpReply.getXid()));
+        MultipartReplyFlowCase caseBody = (MultipartReplyFlowCase) mpReply.getMultipartReplyBody();
+        MultipartReplyFlow replyBody = caseBody.getMultipartReplyFlow();
+        message.setFlowAndStatisticsMapList(flowStatsConvertor.toSALFlowStatsList(replyBody.getFlowStats(), datapathId, ofVersion));
+
+        listDataObject.add(message.build());
+    }
+
+    private static void translateAggregate(final List<DataObject> listDataObject,
+                                           final MultipartReplyMessage mpReply,
+                                           final NodeId node) {
+        if (!MultipartType.OFPMPAGGREGATE.equals(mpReply.getType())) {
+            return;
+        }
+
+        AggregateFlowStatisticsUpdateBuilder message = new AggregateFlowStatisticsUpdateBuilder();
+        message.setId(node);
+        message.setMoreReplies(mpReply.getFlags().isOFPMPFREQMORE());
+        message.setTransactionId(generateTransactionId(mpReply.getXid()));
+
+        MultipartReplyAggregateCase caseBody = (MultipartReplyAggregateCase) mpReply.getMultipartReplyBody();
+        MultipartReplyAggregate replyBody = caseBody.getMultipartReplyAggregate();
+        message.setByteCount(new Counter64(replyBody.getByteCount()));
+        message.setPacketCount(new Counter64(replyBody.getPacketCount()));
+        message.setFlowCount(new Counter32(replyBody.getFlowCount()));
+
+        listDataObject.add(message.build());
+    }
+
+    private static void translatePortStats(final List<DataObject> listDataObject,
+                                           final MultipartReplyMessage mpReply,
+                                           final NodeId node,
+                                           final OpenflowVersion ofVersion,
+                                           final BigInteger datapathId) {
+        if (!MultipartType.OFPMPPORTSTATS.equals(mpReply.getType())) {
+            return;
+        }
+
+        NodeConnectorStatisticsUpdateBuilder message = new NodeConnectorStatisticsUpdateBuilder();
+        message.setId(node);
+        message.setMoreReplies(mpReply.getFlags().isOFPMPFREQMORE());
+        message.setTransactionId(generateTransactionId(mpReply.getXid()));
+
+        MultipartReplyPortStatsCase caseBody = (MultipartReplyPortStatsCase) mpReply.getMultipartReplyBody();
+        MultipartReplyPortStats replyBody = caseBody.getMultipartReplyPortStats();
+
+        List<NodeConnectorStatisticsAndPortNumberMap> 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();
+            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.setKey(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);
+
+
+        listDataObject.add(message.build());
+    }
+
+    private static void translateGroup(final List<DataObject> listDataObject,
+                                       final MultipartReplyMessage mpReply,
+                                       final NodeId node) {
+        if (!MultipartType.OFPMPGROUP.equals(mpReply.getType())) {
+            return;
+        }
+
+        GroupStatisticsUpdatedBuilder message = new GroupStatisticsUpdatedBuilder();
+        message.setId(node);
+        message.setMoreReplies(mpReply.getFlags().isOFPMPFREQMORE());
+        message.setTransactionId(generateTransactionId(mpReply.getXid()));
+        MultipartReplyGroupCase caseBody = (MultipartReplyGroupCase) mpReply.getMultipartReplyBody();
+        MultipartReplyGroup replyBody = caseBody.getMultipartReplyGroup();
+        message.setGroupStats(groupStatsConvertor.toSALGroupStatsList(replyBody.getGroupStats()));
+
+        listDataObject.add(message.build());
+    }
+
+    private static void translateGroupDesc(final List<DataObject> listDataObject,
+                                           final MultipartReplyMessage mpReply,
+                                           final NodeId node,
+                                           final OpenflowVersion ofVersion) {
+        if (!MultipartType.OFPMPGROUPDESC.equals(mpReply.getType())) {
+            return;
+        }
+
+        GroupDescStatsUpdatedBuilder message = new GroupDescStatsUpdatedBuilder();
+        message.setId(node);
+        message.setMoreReplies(mpReply.getFlags().isOFPMPFREQMORE());
+        message.setTransactionId(generateTransactionId(mpReply.getXid()));
+        MultipartReplyGroupDescCase caseBody = (MultipartReplyGroupDescCase) mpReply.getMultipartReplyBody();
+        MultipartReplyGroupDesc replyBody = caseBody.getMultipartReplyGroupDesc();
+
+        message.setGroupDescStats(groupStatsConvertor.toSALGroupDescStatsList(replyBody.getGroupDesc(), ofVersion));
+
+        listDataObject.add(message.build());
+    }
+
+    private static void translateGroupFeatures(final List<DataObject> listDataObject,
+                                               final MultipartReplyMessage mpReply,
+                                               final NodeId node) {
+        if (!MultipartType.OFPMPGROUPFEATURES.equals(mpReply.getType())) {
+            return;
+        }
+
+        GroupFeaturesUpdatedBuilder message = new GroupFeaturesUpdatedBuilder();
+        message.setId(node);
+        message.setMoreReplies(mpReply.getFlags().isOFPMPFREQMORE());
+        message.setTransactionId(generateTransactionId(mpReply.getXid()));
+        MultipartReplyGroupFeaturesCase caseBody = (MultipartReplyGroupFeaturesCase) mpReply.getMultipartReplyBody();
+        MultipartReplyGroupFeatures replyBody = caseBody.getMultipartReplyGroupFeatures();
+        List<Class<? extends GroupType>> supportedGroups =
+                new ArrayList<>();
+
+        if (replyBody.getTypes().isOFPGTALL()) {
+            supportedGroups.add(GroupAll.class);
+        }
+        if (replyBody.getTypes().isOFPGTSELECT()) {
+            supportedGroups.add(GroupSelect.class);
+        }
+        if (replyBody.getTypes().isOFPGTINDIRECT()) {
+            supportedGroups.add(GroupIndirect.class);
+        }
+        if (replyBody.getTypes().isOFPGTFF()) {
+            supportedGroups.add(GroupFf.class);
+        }
+        message.setGroupTypesSupported(supportedGroups);
+        message.setMaxGroups(replyBody.getMaxGroups());
+
+        List<Class<? extends GroupCapability>> supportedCapabilities =
+                new ArrayList<>();
+
+        if (replyBody.getCapabilities().isOFPGFCCHAINING()) {
+            supportedCapabilities.add(Chaining.class);
+        }
+        if (replyBody.getCapabilities().isOFPGFCCHAININGCHECKS()) {
+            supportedCapabilities.add(ChainingChecks.class);
+        }
+        if (replyBody.getCapabilities().isOFPGFCSELECTLIVENESS()) {
+            supportedCapabilities.add(SelectLiveness.class);
+        }
+        if (replyBody.getCapabilities().isOFPGFCSELECTWEIGHT()) {
+            supportedCapabilities.add(SelectWeight.class);
+        }
+
+        message.setGroupCapabilitiesSupported(supportedCapabilities);
+
+        message.setActions(getGroupActionsSupportBitmap(replyBody.getActionsBitmap()));
+        listDataObject.add(message.build());
+    }
+
+    private static void translateMeter(final List<DataObject> listDataObject,
+                                       final MultipartReplyMessage mpReply,
+                                       final NodeId node) {
+        if (!MultipartType.OFPMPMETER.equals(mpReply.getType())) {
+            return;
+        }
+
+        MeterStatisticsUpdatedBuilder message = new MeterStatisticsUpdatedBuilder();
+        message.setId(node);
+        message.setMoreReplies(mpReply.getFlags().isOFPMPFREQMORE());
+        message.setTransactionId(generateTransactionId(mpReply.getXid()));
+
+        MultipartReplyMeterCase caseBody = (MultipartReplyMeterCase) mpReply.getMultipartReplyBody();
+        MultipartReplyMeter replyBody = caseBody.getMultipartReplyMeter();
+        message.setMeterStats(meterStatsConvertor.toSALMeterStatsList(replyBody.getMeterStats()));
+
+        listDataObject.add(message.build());
+    }
+
+    private static void translateMeterConfig(final List<DataObject> listDataObject,
+                                             final MultipartReplyMessage mpReply,
+                                             final NodeId node) {
+        if (!MultipartType.OFPMPMETERCONFIG.equals(mpReply.getType())) {
+            return;
+        }
+
+        MeterConfigStatsUpdatedBuilder message = new MeterConfigStatsUpdatedBuilder();
+        message.setId(node);
+        message.setMoreReplies(mpReply.getFlags().isOFPMPFREQMORE());
+        message.setTransactionId(generateTransactionId(mpReply.getXid()));
+
+        MultipartReplyMeterConfigCase caseBody = (MultipartReplyMeterConfigCase) mpReply.getMultipartReplyBody();
+        MultipartReplyMeterConfig replyBody = caseBody.getMultipartReplyMeterConfig();
+        message.setMeterConfigStats(meterStatsConvertor.toSALMeterConfigList(replyBody.getMeterConfig()));
+
+        listDataObject.add(message.build());
+    }
+
+    private static void translateMeterFeatures(final List<DataObject> listDataObject,
+                                               final MultipartReplyMessage mpReply,
+                                               final NodeId node) {
+        if (!MultipartType.OFPMPMETERFEATURES.equals(mpReply.getType())) {
+            return;
+        }
+
+        //Convert OF message and send it to SAL listener
+        MeterFeaturesUpdatedBuilder message = new MeterFeaturesUpdatedBuilder();
+        message.setId(node);
+        message.setMoreReplies(mpReply.getFlags().isOFPMPFREQMORE());
+        message.setTransactionId(generateTransactionId(mpReply.getXid()));
+
+        MultipartReplyMeterFeaturesCase caseBody = (MultipartReplyMeterFeaturesCase) mpReply.getMultipartReplyBody();
+        MultipartReplyMeterFeatures replyBody = caseBody.getMultipartReplyMeterFeatures();
+        message.setMaxBands(replyBody.getMaxBands());
+        message.setMaxColor(replyBody.getMaxColor());
+        message.setMaxMeter(new Counter32(replyBody.getMaxMeter()));
+
+        List<Class<? extends MeterCapability>> supportedCapabilities =
+                new ArrayList<>();
+        if (replyBody.getCapabilities().isOFPMFBURST()) {
+            supportedCapabilities.add(MeterBurst.class);
+        }
+        if (replyBody.getCapabilities().isOFPMFKBPS()) {
+            supportedCapabilities.add(MeterKbps.class);
+
+        }
+        if (replyBody.getCapabilities().isOFPMFPKTPS()) {
+            supportedCapabilities.add(MeterPktps.class);
+
+        }
+        if (replyBody.getCapabilities().isOFPMFSTATS()) {
+            supportedCapabilities.add(MeterStats.class);
+
+        }
+        message.setMeterCapabilitiesSupported(supportedCapabilities);
+
+        List<Class<? extends MeterBand>> supportedMeterBand =
+                new ArrayList<>();
+        if (replyBody.getBandTypes().isOFPMBTDROP()) {
+            supportedMeterBand.add(MeterBandDrop.class);
+        }
+        if (replyBody.getBandTypes().isOFPMBTDSCPREMARK()) {
+            supportedMeterBand.add(MeterBandDscpRemark.class);
+        }
+        message.setMeterBandSupported(supportedMeterBand);
+        listDataObject.add(message.build());
+    }
+
+    private static void translateTable(final List<DataObject> listDataObject,
+                                       final MultipartReplyMessage mpReply,
+                                       final NodeId node) {
+        if (!MultipartType.OFPMPTABLE.equals(mpReply.getType())) {
+            return;
+        }
+
+        FlowTableStatisticsUpdateBuilder message = new FlowTableStatisticsUpdateBuilder();
+        message.setId(node);
+        message.setMoreReplies(mpReply.getFlags().isOFPMPFREQMORE());
+        message.setTransactionId(generateTransactionId(mpReply.getXid()));
+
+        MultipartReplyTableCase caseBody = (MultipartReplyTableCase) mpReply.getMultipartReplyBody();
+        MultipartReplyTable replyBody = caseBody.getMultipartReplyTable();
+        List<TableStats> swTablesStats = replyBody.getTableStats();
+
+        List<FlowTableAndStatisticsMap> salFlowStats = new ArrayList<FlowTableAndStatisticsMap>();
+        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);
+        listDataObject.add(message.build());
+    }
+
+    private static void translateQueue(final List<DataObject> listDataObject,
+                                       final MultipartReplyMessage mpReply,
+                                       final NodeId node,
+                                       final OpenflowVersion ofVersion,
+                                       final BigInteger datapathId) {
+        if (!MultipartType.OFPMPQUEUE.equals(mpReply.getType())) {
+            return;
+        }
+
+        QueueStatisticsUpdateBuilder message = new QueueStatisticsUpdateBuilder();
+        message.setId(node);
+        message.setMoreReplies(mpReply.getFlags().isOFPMPFREQMORE());
+        message.setTransactionId(generateTransactionId(mpReply.getXid()));
+
+        MultipartReplyQueueCase caseBody = (MultipartReplyQueueCase) mpReply.getMultipartReplyBody();
+        MultipartReplyQueue replyBody = caseBody.getMultipartReplyQueue();
+
+        List<QueueIdAndStatisticsMap> statsMap =
+                new ArrayList<QueueIdAndStatisticsMap>();
+
+        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);
+
+        listDataObject.add(message.build());
+    }
+
     private static NodeId nodeIdFromDatapathId(final BigInteger datapathId) {
         String current = datapathId.toString();
         return new NodeId("openflow:" + current);