Update MRI projects for Aluminium
[openflowplugin.git] / openflowplugin-impl / src / main / java / org / opendaylight / openflowplugin / impl / statistics / services / compatibility / MeterStatisticsToNotificationTransformer.java
index 4bf30e29cebfbd197cab9d03b2ff17d3195b1125..de3788bb936657665ec95950f8dab38a2d9afb3e 100644 (file)
@@ -8,11 +8,17 @@
 
 package org.opendaylight.openflowplugin.impl.statistics.services.compatibility;
 
+import com.google.common.collect.Lists;
 import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.List;
-import org.opendaylight.openflowplugin.api.openflow.device.DeviceState;
+import java.util.Optional;
+import java.util.Set;
+import java.util.stream.Collectors;
+import org.opendaylight.openflowplugin.api.openflow.device.DeviceInfo;
 import org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.MeterStatsResponseConvertor;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionConvertorData;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev150304.TransactionId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.MeterStatisticsUpdated;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.MeterStatisticsUpdatedBuilder;
@@ -22,34 +28,52 @@ 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._case.MultipartReplyMeter;
 
 /**
- * pulled out meter stats to notification transformation
+ * Pulled out meter stats to notification transformation.
  */
-public class MeterStatisticsToNotificationTransformer {
+public final class MeterStatisticsToNotificationTransformer {
 
-    private static MeterStatsResponseConvertor meterStatsConvertor = new MeterStatsResponseConvertor();
+    private MeterStatisticsToNotificationTransformer() {
+        // Hide implicit constructor
+    }
 
     /**
+     * Transform statistics to notification.
+     *
      * @param mpReplyList   raw multipart response from device
-     * @param deviceState   device state
+     * @param deviceInfo    device state
      * @param ofVersion     device version
-     * @param emulatedTxId
+     * @param emulatedTxId  emulated transaction Id
+     * @param convertorExecutor convertor executor
      * @return notification containing flow stats
      */
     public static MeterStatisticsUpdated transformToNotification(final List<MultipartReply> mpReplyList,
-                                                                 final DeviceState deviceState,
+                                                                 final DeviceInfo deviceInfo,
                                                                  final OpenflowVersion ofVersion,
-                                                                 final TransactionId emulatedTxId) {
+                                                                 final TransactionId emulatedTxId,
+                                                                 final ConvertorExecutor convertorExecutor) {
 
+        VersionConvertorData data = new VersionConvertorData(deviceInfo.getVersion());
         MeterStatisticsUpdatedBuilder notification = new MeterStatisticsUpdatedBuilder();
-        notification.setId(deviceState.getNodeId());
+        notification.setId(deviceInfo.getNodeId());
         notification.setMoreReplies(Boolean.FALSE);
         notification.setTransactionId(emulatedTxId);
 
-        notification.setMeterStats(new ArrayList<MeterStats>());
+        notification.setMeterStats(new ArrayList<>());
         for (MultipartReply mpReply : mpReplyList) {
             MultipartReplyMeterCase caseBody = (MultipartReplyMeterCase) mpReply.getMultipartReplyBody();
             MultipartReplyMeter replyBody = caseBody.getMultipartReplyMeter();
-            notification.getMeterStats().addAll(meterStatsConvertor.toSALMeterStatsList(replyBody.getMeterStats()));
+            final Optional<List<MeterStats>> meterStatsList =
+                    convertorExecutor.convert(replyBody.getMeterStats(), data);
+
+            meterStatsList.ifPresent(meterStats -> {
+                if (notification.getMeterStats() == null) {
+                    notification.setMeterStats(Lists.newArrayList(meterStats));
+                } else {
+                    Set<MeterStats> stats = new HashSet<>(notification.getMeterStats().values());
+                    stats.addAll(meterStats);
+                    notification.setMeterStats(stats.stream().collect(Collectors.toList()));
+                }
+            });
         }
 
         return notification.build();