Update MRI projects for Aluminium
[openflowplugin.git] / openflowplugin-impl / src / main / java / org / opendaylight / openflowplugin / impl / statistics / services / compatibility / GroupStatisticsToNotificationTransformer.java
index 5df1440ec25dbc89c66741d593d661ad94735c55..147c738b27de37dbfc3333e75fa97d966bbabd7f 100644 (file)
@@ -8,10 +8,16 @@
 
 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 java.util.Optional;
+import java.util.Set;
+import java.util.stream.Collectors;
 import org.opendaylight.openflowplugin.api.openflow.device.DeviceInfo;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.GroupStatsResponseConvertor;
+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.group.statistics.rev131111.GroupStatisticsUpdated;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GroupStatisticsUpdatedBuilder;
@@ -21,33 +27,51 @@ 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.group._case.MultipartReplyGroup;
 
 /**
- * pulled out group stats to notification transformation
+ * Pulled out group stats to notification transformation.
  */
-public class GroupStatisticsToNotificationTransformer {
+public final class GroupStatisticsToNotificationTransformer {
 
-    private static GroupStatsResponseConvertor groupStatsConvertor = new GroupStatsResponseConvertor();
+    private GroupStatisticsToNotificationTransformer() {
+        // Hide implicit constructor
+    }
 
     /**
+     * Transform statistics to notification.
      * @param mpReplyList   raw multipart response from device
      * @param deviceInfo   device state
-     * @param emulatedTxId
+     * @param emulatedTxId emulated transaction id
+     * @param convertorExecutor convertor executor
      * @return notification containing flow stats
      */
     public static GroupStatisticsUpdated transformToNotification(final List<MultipartReply> mpReplyList,
                                                                  final DeviceInfo deviceInfo,
-                                                                 final TransactionId emulatedTxId) {
+                                                                 final TransactionId emulatedTxId,
+                                                                 final ConvertorExecutor convertorExecutor) {
 
+        VersionConvertorData data = new VersionConvertorData(deviceInfo.getVersion());
         GroupStatisticsUpdatedBuilder notification = new GroupStatisticsUpdatedBuilder();
         notification.setId(deviceInfo.getNodeId());
         notification.setMoreReplies(Boolean.FALSE);
         notification.setTransactionId(emulatedTxId);
 
-        notification.setGroupStats(new ArrayList<GroupStats>());
+        notification.setGroupStats(new ArrayList<>());
 
         for (MultipartReply mpReply : mpReplyList) {
             MultipartReplyGroupCase caseBody = (MultipartReplyGroupCase) mpReply.getMultipartReplyBody();
             MultipartReplyGroup replyBody = caseBody.getMultipartReplyGroup();
-            notification.getGroupStats().addAll(groupStatsConvertor.toSALGroupStatsList(replyBody.getGroupStats()));
+            final Optional<List<GroupStats>> groupStatsList = convertorExecutor.convert(
+                    replyBody.getGroupStats(), data);
+
+            groupStatsList.ifPresent(groupStats -> {
+                if (notification.getGroupStats() == null) {
+                    List<GroupStats> stats = Lists.newArrayList(groupStats);
+                    notification.setGroupStats(stats);
+                } else {
+                    Set<GroupStats> stats = new HashSet<>(notification.getGroupStats().values());
+                    stats.addAll(groupStats);
+                    notification.setGroupStats(stats.stream().collect(Collectors.toList()));
+                }
+            });
         }
         return notification.build();
     }