Bug 5540 - GroupConvertor, GroupStatsConvertor, GroupDescStatsConvertor 44/40944/19
authorTomas Slusny <tomas.slusny@pantheon.sk>
Tue, 28 Jun 2016 13:59:50 +0000 (15:59 +0200)
committerTomas Slusny <tomas.slusny@pantheon.sk>
Wed, 3 Aug 2016 17:01:15 +0000 (17:01 +0000)
- Reworked GroupConvertor and GroupStatsConvertor to new ConvertorManager design
- Added GroupDescStatsConvertor (moved some logic from GroupStatsConvertor)
- Updated (and fixed) tests, and updated usages accordingly

Change-Id: Iabae7191ceeefeb208487ab5cf0280e8f8186c3e
Signed-off-by: Tomas Slusny <tomas.slusny@pantheon.sk>
14 files changed:
openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/services/GroupService.java
openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/SinglePurposeMultipartReplyTranslator.java
openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/GroupDescriptionService.java
openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/compatibility/GroupStatisticsToNotificationTransformer.java
openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/services/direct/GroupDirectStatisticsService.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/OFRpcTaskFactory.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/ConvertorManager.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/GroupConvertor.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/GroupDescStatsResponseConvertor.java [new file with mode: 0644]
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/GroupStatsResponseConvertor.java
openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/translator/MultipartReplyTranslator.java
openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/GroupConvertorTest.java
openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/GroupDescStatsResponseConvertorTest.java [moved from openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/GroupStatsResponseConvertorTest2.java with 70% similarity]
openflowplugin/src/test/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/GroupStatsResponseConvertorTest.java

index 431fea1e23c52b63ae5e59032f96bd22394ea367..b165d8bdb1fa0d24bc74ff8bf96a2d3e729736b9 100644 (file)
@@ -7,10 +7,13 @@
  */
 package org.opendaylight.openflowplugin.impl.services;
 
+import java.util.Optional;
 import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext;
 import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack;
 import org.opendaylight.openflowplugin.api.openflow.device.Xid;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManager;
 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.GroupConvertor;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.Group;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GroupModInputBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.OfHeader;
@@ -23,9 +26,16 @@ final class GroupService<I extends Group, O extends DataObject> extends Abstract
 
     @Override
     protected OfHeader buildRequest(final Xid xid, final I input) {
-        final GroupModInputBuilder ofGroupModInput = GroupConvertor.toGroupModInput(input, getVersion(), getDatapathId());
-        ofGroupModInput.setXid(xid.getValue());
+        final VersionDatapathIdConvertorData data = new VersionDatapathIdConvertorData(getVersion());
+        data.setDatapathId(getDatapathId());
+        final Optional<GroupModInputBuilder> ofGroupModInput = ConvertorManager
+                .getInstance()
+                .convert(input, data);
 
-        return ofGroupModInput.build();
+        final GroupModInputBuilder groupModInputBuilder = ofGroupModInput
+                .orElse(GroupConvertor.defaultResult(getVersion()))
+                .setXid(xid.getValue());
+
+        return groupModInputBuilder.build();
     }
 }
index a4d5ed1cea9bfb2654a25ef4570546f609043364..9447fe04f154f38a76d4aeb5fdcfbd3fe6c36568 100644 (file)
@@ -15,7 +15,7 @@ import java.util.Optional;
 import org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion;
 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManager;
 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.FlowStatsResponseConvertor;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.GroupStatsResponseConvertor;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionConvertorData;
 import org.opendaylight.openflowplugin.openflow.md.util.InventoryDataServiceUtil;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Counter32;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Counter64;
@@ -39,6 +39,8 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.Group
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupType;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.SelectLiveness;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.SelectWeight;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.desc.stats.reply.GroupDescStats;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.statistics.reply.GroupStats;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.MeterConfigStatsUpdatedBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.MeterFeaturesUpdatedBuilder;
@@ -109,8 +111,6 @@ public class SinglePurposeMultipartReplyTranslator {
             .getLogger(SinglePurposeMultipartReplyTranslator.class);
 
     private static FlowStatsResponseConvertor flowStatsConvertor = new FlowStatsResponseConvertor();
-    private static GroupStatsResponseConvertor groupStatsConvertor = new GroupStatsResponseConvertor();
-
 
     public List<DataObject> translate(final BigInteger datapathId, final short version, final OfHeader msg) {
 
@@ -120,12 +120,13 @@ public class SinglePurposeMultipartReplyTranslator {
             MultipartReplyMessage mpReply = (MultipartReplyMessage) msg;
             OpenflowVersion ofVersion = OpenflowVersion.get(version);
             NodeId node = nodeIdFromDatapathId(datapathId);
+            VersionConvertorData simpleConvertorData = new VersionConvertorData(version);
 
             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);
+            translateGroupDesc(listDataObject, mpReply, node, simpleConvertorData);
             translateGroupFeatures(listDataObject, mpReply, node);
             translateMeter(listDataObject, mpReply, node);
             translateMeterConfig(listDataObject, mpReply, node);
@@ -254,7 +255,10 @@ public class SinglePurposeMultipartReplyTranslator {
         message.setTransactionId(generateTransactionId(mpReply.getXid()));
         MultipartReplyGroupCase caseBody = (MultipartReplyGroupCase) mpReply.getMultipartReplyBody();
         MultipartReplyGroup replyBody = caseBody.getMultipartReplyGroup();
-        message.setGroupStats(groupStatsConvertor.toSALGroupStatsList(replyBody.getGroupStats()));
+        final Optional<List<GroupStats>> groupStatsList = ConvertorManager.getInstance().convert(
+                replyBody.getGroupStats());
+
+        message.setGroupStats(groupStatsList.orElse(Collections.emptyList()));
 
         listDataObject.add(message.build());
     }
@@ -262,7 +266,7 @@ public class SinglePurposeMultipartReplyTranslator {
     private static void translateGroupDesc(final List<DataObject> listDataObject,
                                            final MultipartReplyMessage mpReply,
                                            final NodeId node,
-                                           final OpenflowVersion ofVersion) {
+                                           VersionConvertorData simpleConvertorData) {
         if (!MultipartType.OFPMPGROUPDESC.equals(mpReply.getType())) {
             return;
         }
@@ -274,7 +278,10 @@ public class SinglePurposeMultipartReplyTranslator {
         MultipartReplyGroupDescCase caseBody = (MultipartReplyGroupDescCase) mpReply.getMultipartReplyBody();
         MultipartReplyGroupDesc replyBody = caseBody.getMultipartReplyGroupDesc();
 
-        message.setGroupDescStats(groupStatsConvertor.toSALGroupDescStatsList(replyBody.getGroupDesc(), ofVersion));
+        final Optional<List<GroupDescStats>> groupDescStatsList = ConvertorManager.getInstance().convert(
+                replyBody.getGroupDesc(), simpleConvertorData);
+
+        message.setGroupDescStats(groupDescStatsList.orElse(Collections.emptyList()));
 
         listDataObject.add(message.build());
     }
index bb6c9f7b5318d9bd466e58ffc1180a2ef4ce3fb6..f52eb469f3f6025ca962d5cb1935217e6f8b2139 100644 (file)
@@ -9,13 +9,15 @@ package org.opendaylight.openflowplugin.impl.statistics.services;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Optional;
 import java.util.concurrent.atomic.AtomicLong;
 import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext;
 import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack;
 import org.opendaylight.openflowplugin.api.openflow.device.Xid;
 import org.opendaylight.openflowplugin.impl.services.RequestInputUtils;
 import org.opendaylight.openflowplugin.impl.statistics.services.compatibility.AbstractCompatibleStatService;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.GroupStatsResponseConvertor;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManager;
+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.GetGroupDescriptionInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.GetGroupDescriptionOutput;
@@ -35,11 +37,9 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731
 final class GroupDescriptionService
         extends AbstractCompatibleStatService<GetGroupDescriptionInput, GetGroupDescriptionOutput, GroupDescStatsUpdated> {
     private static final MultipartRequestGroupDescCase GROUP_DESC_CASE = new MultipartRequestGroupDescCaseBuilder().build();
-    private final GroupStatsResponseConvertor groupStatsResponseConvertor;
 
     public GroupDescriptionService(RequestContextStack requestContextStack, DeviceContext deviceContext, AtomicLong compatibilityXidSeed) {
         super(requestContextStack, deviceContext, compatibilityXidSeed);
-        groupStatsResponseConvertor = new GroupStatsResponseConvertor();
     }
 
     @Override
@@ -63,11 +63,17 @@ final class GroupDescriptionService
         notification.setTransactionId(emulatedTxId);
 
         notification.setGroupDescStats(new ArrayList<GroupDescStats>());
+        final VersionConvertorData data = new VersionConvertorData(getVersion());
+
         for (MultipartReply mpReply : result) {
             MultipartReplyGroupDescCase caseBody = (MultipartReplyGroupDescCase) mpReply.getMultipartReplyBody();
             MultipartReplyGroupDesc replyBody = caseBody.getMultipartReplyGroupDesc();
-            notification.getGroupDescStats().addAll(
-                    groupStatsResponseConvertor.toSALGroupDescStatsList(replyBody.getGroupDesc(), getOfVersion()));
+            final Optional<List<GroupDescStats>> groupDescStatsList = ConvertorManager.getInstance().convert(
+                    replyBody.getGroupDesc(), data);
+
+            if (groupDescStatsList.isPresent()) {
+                notification.getGroupDescStats().addAll(groupDescStatsList.get());
+            }
         }
 
         return notification.build();
index 5df1440ec25dbc89c66741d593d661ad94735c55..bf476ad6596796ca891ac290083128ff7d917f26 100644 (file)
@@ -10,8 +10,9 @@ package org.opendaylight.openflowplugin.impl.statistics.services.compatibility;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Optional;
 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.ConvertorManager;
 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;
@@ -24,9 +25,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731
  * pulled out group stats to notification transformation
  */
 public class GroupStatisticsToNotificationTransformer {
-
-    private static GroupStatsResponseConvertor groupStatsConvertor = new GroupStatsResponseConvertor();
-
     /**
      * @param mpReplyList   raw multipart response from device
      * @param deviceInfo   device state
@@ -47,7 +45,12 @@ public class GroupStatisticsToNotificationTransformer {
         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 = ConvertorManager.getInstance().convert(
+                    replyBody.getGroupStats());
+
+            if (groupStatsList.isPresent()) {
+                notification.getGroupStats().addAll(groupStatsList.get());
+            }
         }
         return notification.build();
     }
index 75579a18c0ac606a678083ad6b5f6df50e3a12cc..7037656e77f55fb9b88d49cfc2d96a8f2d1fc510 100644 (file)
@@ -10,11 +10,12 @@ package org.opendaylight.openflowplugin.impl.statistics.services.direct;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Optional;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.openflowplugin.api.OFConstants;
 import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext;
 import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.GroupStatsResponseConvertor;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManager;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetGroupStatisticsInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetGroupStatisticsOutput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.direct.statistics.rev160511.GetGroupStatisticsOutputBuilder;
@@ -39,8 +40,6 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
  * The Group direct statistics service.
  */
 public class GroupDirectStatisticsService extends AbstractDirectStatisticsService<GetGroupStatisticsInput, GetGroupStatisticsOutput> {
-    private final GroupStatsResponseConvertor groupStatsConvertor = new GroupStatsResponseConvertor();
-
     /**
      * Instantiates a new Group direct statistics service.
      *
@@ -74,7 +73,12 @@ public class GroupDirectStatisticsService extends AbstractDirectStatisticsServic
             for (final MultipartReply mpReply : input) {
                 final MultipartReplyGroupCase caseBody = (MultipartReplyGroupCase) mpReply.getMultipartReplyBody();
                 final MultipartReplyGroup replyBody = caseBody.getMultipartReplyGroup();
-                groupStats.addAll(groupStatsConvertor.toSALGroupStatsList(replyBody.getGroupStats()));
+                final Optional<List<GroupStats>> groupStatsList = ConvertorManager.getInstance().convert(
+                        replyBody.getGroupStats());
+
+                if (groupStatsList.isPresent()) {
+                    groupStats.addAll(groupStatsList.get());
+                }
             }
         }
 
index ef7741a89c2c4e1c0681db516da3dfd87bbb88c5..a7446eca965c34453999ad9c702c2c8e6815b328 100644 (file)
@@ -34,6 +34,7 @@ import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.GroupConve
 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.MeterConvertor;
 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.PortConvertor;
 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionConvertorData;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData;
 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.match.MatchReactor;
 import org.opendaylight.openflowplugin.openflow.md.util.FlowCreatorUtil;
 import org.opendaylight.openflowplugin.openflow.md.util.InventoryDataServiceUtil;
@@ -464,17 +465,18 @@ public abstract class OFRpcTaskFactory {
             @Override
             public ListenableFuture<RpcResult<UpdateGroupOutput>> call() {
                 ListenableFuture<RpcResult<UpdateGroupOutput>> result = SettableFuture.create();
+                final VersionDatapathIdConvertorData data = new VersionDatapathIdConvertorData(getVersion());
+                data.setDatapathId(getSession().getFeatures().getDatapathId());
 
                 // Convert the AddGroupInput to GroupModInput
-                GroupModInputBuilder ofGroupModInput = GroupConvertor.toGroupModInput(getInput(),
-                        getVersion(), getSession().getFeatures().getDatapathId());
-                final Long xId = getSession().getNextXid();
-                ofGroupModInput.setXid(xId);
+                final java.util.Optional<GroupModInputBuilder> ofGroupModInput = ConvertorManager.getInstance().convert(getInput(), data);
+                final GroupModInputBuilder groupModInputBuilder = ofGroupModInput
+                        .orElse(GroupConvertor.defaultResult(getVersion()))
+                        .setXid(getSession().getNextXid());
 
                 Future<RpcResult<UpdateGroupOutput>> resultFromOFLib = getMessageService()
-                        .groupMod(ofGroupModInput.build(), getCookie());
+                        .groupMod(groupModInputBuilder.build(), getCookie());
                 result = JdkFutureAdapters.listenInPoolThread(resultFromOFLib);
-
                 result = OFRpcTaskUtil.chainFutureBarrier(this, result);
                 OFRpcTaskUtil.hookFutureNotification(this, result,
                         getRpcNotificationProviderService(), createGroupAddedNotification(getInput()));
@@ -592,16 +594,19 @@ public abstract class OFRpcTaskFactory {
             @Override
             public ListenableFuture<RpcResult<UpdateGroupOutput>> call() {
                 ListenableFuture<RpcResult<UpdateGroupOutput>> result = null;
+                final VersionDatapathIdConvertorData data = new VersionDatapathIdConvertorData(getVersion());
+                data.setDatapathId(getSession().getFeatures().getDatapathId());
 
                 // Convert the UpdateGroupInput to GroupModInput
-                GroupModInputBuilder ofGroupModInput = GroupConvertor.toGroupModInput(
-                        getInput().getUpdatedGroup(), getVersion(),
-                        getSession().getFeatures().getDatapathId());
-                final Long xId = getSession().getNextXid();
-                ofGroupModInput.setXid(xId);
+                final java.util.Optional<GroupModInputBuilder> ofGroupModInput =
+                        ConvertorManager.getInstance().convert(getInput().getUpdatedGroup(), data);
+
+                final GroupModInputBuilder groupModInputBuilder = ofGroupModInput
+                        .orElse(GroupConvertor.defaultResult(getVersion()))
+                        .setXid(getSession().getNextXid());
 
                 Future<RpcResult<UpdateGroupOutput>> resultFromOFLib =
-                        getMessageService().groupMod(ofGroupModInput.build(), getCookie());
+                        getMessageService().groupMod(groupModInputBuilder.build(), getCookie());
                 result = JdkFutureAdapters.listenInPoolThread(resultFromOFLib);
 
                 result = OFRpcTaskUtil.chainFutureBarrier(this, result);
@@ -781,17 +786,20 @@ public abstract class OFRpcTaskFactory {
             @Override
             public ListenableFuture<RpcResult<UpdateGroupOutput>> call() {
                 ListenableFuture<RpcResult<UpdateGroupOutput>> result = SettableFuture.create();
+                final VersionDatapathIdConvertorData data = new VersionDatapathIdConvertorData(getVersion());
+                data.setDatapathId(getSession().getFeatures().getDatapathId());
 
                 // Convert the AddGroupInput to GroupModInput
-                GroupModInputBuilder ofGroupModInput = GroupConvertor.toGroupModInput(getInput(),
-                        getVersion(), getSession().getFeatures().getDatapathId());
-                final Long xId = getSession().getNextXid();
-                ofGroupModInput.setXid(xId);
+                final java.util.Optional<GroupModInputBuilder> ofGroupModInput =
+                        ConvertorManager.getInstance().convert(getInput(), data);
+
+                final GroupModInputBuilder groupModInputBuilder = ofGroupModInput
+                        .orElse(GroupConvertor.defaultResult(getVersion()))
+                        .setXid(getSession().getNextXid());
 
                 Future<RpcResult<UpdateGroupOutput>> resultFromOFLib = getMessageService()
-                        .groupMod(ofGroupModInput.build(), getCookie());
+                        .groupMod(groupModInputBuilder.build(), getCookie());
                 result = JdkFutureAdapters.listenInPoolThread(resultFromOFLib);
-
                 result = OFRpcTaskUtil.chainFutureBarrier(this, result);
                 OFRpcTaskUtil.hookFutureNotification(this, result,
                         getRpcNotificationProviderService(), createGroupRemovedNotification(getInput()));
index 067566d1dcb5be5826dba4773f3a15d4e4c68ec7..3d26f331f19b329c8564fae0bf334ad07d245727 100644 (file)
@@ -47,6 +47,9 @@ public class ConvertorManager {
         INSTANCE.registerConvertor(new MatchV10ResponseConvertor());
         INSTANCE.registerConvertor(new ActionConvertor());
         INSTANCE.registerConvertor(new ActionResponseConvertor());
+        INSTANCE.registerConvertor(new GroupConvertor());
+        INSTANCE.registerConvertor(new GroupDescStatsResponseConvertor());
+        INSTANCE.registerConvertor(new GroupStatsResponseConvertor());
     }
 
     // Actual convertor keys
index 8d2ee474ac364ad6493b8ae2fc02762480628f2b..6250fa2ae205d4c5dffdd69953be701c46d23f40 100644 (file)
@@ -1,10 +1,11 @@
-/**
+/*
  * Copyright (c) 2014 Ericsson India Global Services Pvt Ltd. and others.  All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * 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.openflow.md.core.sal.convertor;
 
 import java.math.BigInteger;
@@ -15,9 +16,12 @@ import java.util.List;
 import java.util.Optional;
 import org.opendaylight.openflowjava.protocol.api.util.BinContent;
 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.action.data.ActionConvertorData;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ParametrizedConvertor;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.AddGroupInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.RemoveGroupInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.group.update.UpdatedGroup;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.Group;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupTypes;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.Buckets;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.Bucket;
@@ -33,84 +37,47 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
- * This Utility class decodes the SAL - Group Mod Message and encodes into a OF
+ * Decodes the SAL - Group Mod Message and encodes into a OF
  * Library for the OFPT_GROUP_MOD Message. Input:SAL Layer Group command data.
- * Output:GroupModInput Message.
- *
  *
+ * Example usage:
+ * <pre>
+ * {@code
+ * VersionDatapathIdConvertorData data = new VersionDatapathIdConvertorData(version);
+ * data.setDatapathId(datapathId);
+ * Optional<GroupModInputBuilder> ofGroup = ConvertorManager.getInstance().convert(salGroup, data);
+ * }
+ * </pre>
  */
-public final class GroupConvertor {
+public class GroupConvertor implements ParametrizedConvertor<Group, GroupModInputBuilder, VersionDatapathIdConvertorData> {
+    /**
+     * Create default empty group mod input builder
+     * Use this method, if result from convertor is empty.
+     *
+     * @param version Openflow version
+     * @return default empty group mod input builder
+     */
+    public static GroupModInputBuilder defaultResult(short version) {
+        return new GroupModInputBuilder()
+                .setVersion(version);
+    }
 
     private static final Logger LOG = LoggerFactory.getLogger(GroupConvertor.class);
-
     private static final Integer DEFAULT_WEIGHT = 0;
     private static final Long OFPP_ANY = Long.parseLong("ffffffff", 16);
     private static final Long DEFAULT_WATCH_PORT = OFPP_ANY;
     private static final Long OFPG_ANY = Long.parseLong("ffffffff", 16);
     private static final Long DEFAULT_WATCH_GROUP = OFPG_ANY;
-    private static final Comparator<Bucket> comparator = new Comparator<Bucket>(){
-        @Override
-        public int compare(Bucket bucket1,
-                           Bucket bucket2) {
-            if(bucket1.getBucketId() == null || bucket2.getBucketId() == null) return 0;
-            return  bucket1.getBucketId().getValue().compareTo(bucket2.getBucketId().getValue());
-        }
+    private static final Comparator<Bucket> COMPARATOR = (bucket1, bucket2) -> {
+        if (bucket1.getBucketId() == null || bucket2.getBucketId() == null) return 0;
+        return bucket1.getBucketId().getValue().compareTo(bucket2.getBucketId().getValue());
     };
 
-    private GroupConvertor() {
-
-    }
-
-    public static GroupModInputBuilder toGroupModInput(
-
-    org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.Group source, short version,BigInteger datapathid) {
-        List<BucketsList> bucketLists = null;
-        GroupModInputBuilder groupModInputBuilder = new GroupModInputBuilder();
-        if (source instanceof AddGroupInput) {
-            groupModInputBuilder.setCommand(GroupModCommand.OFPGCADD);
-        } else if (source instanceof RemoveGroupInput) {
-            groupModInputBuilder.setCommand(GroupModCommand.OFPGCDELETE);
-        } else if (source instanceof UpdatedGroup) {
-            groupModInputBuilder.setCommand(GroupModCommand.OFPGCMODIFY);
-        }
-
-        if (GroupTypes.GroupAll.equals(source.getGroupType())) {
-            groupModInputBuilder.setType(GroupType.OFPGTALL);
-        }
-
-        if (GroupTypes.GroupSelect.equals(source.getGroupType())) {
-            groupModInputBuilder.setType(GroupType.OFPGTSELECT);
-        }
-
-        if (GroupTypes.GroupIndirect.equals(source.getGroupType())) {
-            groupModInputBuilder.setType(GroupType.OFPGTINDIRECT);
-        }
-
-        if (GroupTypes.GroupFf.equals(source.getGroupType())) {
-            groupModInputBuilder.setType(GroupType.OFPGTFF);
-        }
-
-        groupModInputBuilder.setGroupId(new GroupId(source.getGroupId().getValue()));
-        // Only if the bucket is configured for the group then add it
-        // During group deletion donot push the buckets
-        if(groupModInputBuilder.getCommand() != GroupModCommand.OFPGCDELETE) {
-            if ((source.getBuckets() != null) && (source.getBuckets().getBucket().size() != 0)) {
-
-                Collections.sort(source.getBuckets().getBucket(), comparator);
-
-                bucketLists = salToOFBucketList(source.getBuckets(), version, source.getGroupType().getIntValue(), datapathid);
-                groupModInputBuilder.setBucketsList(bucketLists);
-            }
-        }
-        groupModInputBuilder.setVersion(version);
-        return groupModInputBuilder;
-
-    }
-
-    private static List<BucketsList> salToOFBucketList(Buckets buckets, short version, int groupType,BigInteger datapathid) {
+    private static List<BucketsList> salToOFBucketList(Buckets buckets, short version, int groupType, BigInteger datapathid) {
         final List<BucketsList> bucketLists = new ArrayList<>();
         final ActionConvertorData data = new ActionConvertorData(version);
         data.setDatapathId(datapathid);
+
         for (org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.Bucket groupBucket : buckets
                 .getBucket()) {
             BucketsListBuilder bucketBuilder = new BucketsListBuilder();
@@ -126,6 +93,7 @@ public final class GroupConvertor {
             BucketsList bucket = bucketBuilder.build();
             bucketLists.add(bucket);
         }
+
         return bucketLists;
 
     }
@@ -154,7 +122,7 @@ public final class GroupConvertor {
 
     private static void salToOFBucketListWeight(Bucket groupBucket, BucketsListBuilder bucketBuilder, int groupType) {
         if (null != groupBucket.getWeight()) {
-            bucketBuilder.setWeight(groupBucket.getWeight().intValue());
+            bucketBuilder.setWeight(groupBucket.getWeight());
         } else {
             bucketBuilder.setWeight(DEFAULT_WEIGHT);
             if (groupType == GroupType.OFPGTSELECT.getIntValue()) {
@@ -163,4 +131,53 @@ public final class GroupConvertor {
         }
     }
 
-}
+    @Override
+    public Class<?> getType() {
+        return Group.class;
+    }
+
+    @Override
+    public GroupModInputBuilder convert(Group source, VersionDatapathIdConvertorData data) {
+        GroupModInputBuilder groupModInputBuilder = new GroupModInputBuilder();
+        if (source instanceof AddGroupInput) {
+            groupModInputBuilder.setCommand(GroupModCommand.OFPGCADD);
+        } else if (source instanceof RemoveGroupInput) {
+            groupModInputBuilder.setCommand(GroupModCommand.OFPGCDELETE);
+        } else if (source instanceof UpdatedGroup) {
+            groupModInputBuilder.setCommand(GroupModCommand.OFPGCMODIFY);
+        }
+
+        if (GroupTypes.GroupAll.equals(source.getGroupType())) {
+            groupModInputBuilder.setType(GroupType.OFPGTALL);
+        }
+
+        if (GroupTypes.GroupSelect.equals(source.getGroupType())) {
+            groupModInputBuilder.setType(GroupType.OFPGTSELECT);
+        }
+
+        if (GroupTypes.GroupIndirect.equals(source.getGroupType())) {
+            groupModInputBuilder.setType(GroupType.OFPGTINDIRECT);
+        }
+
+        if (GroupTypes.GroupFf.equals(source.getGroupType())) {
+            groupModInputBuilder.setType(GroupType.OFPGTFF);
+        }
+
+        groupModInputBuilder.setGroupId(new GroupId(source.getGroupId().getValue()));
+
+        // Only if the bucket is configured for the group then add it
+        // During group deletion do not push the buckets
+        if (groupModInputBuilder.getCommand() != GroupModCommand.OFPGCDELETE) {
+            if ((source.getBuckets() != null) && (source.getBuckets().getBucket().size() != 0)) {
+
+                Collections.sort(source.getBuckets().getBucket(), COMPARATOR);
+
+                List<BucketsList> bucketLists = salToOFBucketList(source.getBuckets(), data.getVersion(), source.getGroupType().getIntValue(), data.getDatapathId());
+                groupModInputBuilder.setBucketsList(bucketLists);
+            }
+        }
+
+        groupModInputBuilder.setVersion(data.getVersion());
+        return groupModInputBuilder;
+    }
+}
\ No newline at end of file
diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/GroupDescStatsResponseConvertor.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/sal/convertor/GroupDescStatsResponseConvertor.java
new file mode 100644 (file)
index 0000000..2556e87
--- /dev/null
@@ -0,0 +1,118 @@
+/*
+ * Copyright (c) 2016 Cisco Systems, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * 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.openflow.md.core.sal.convertor;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Optional;
+import org.opendaylight.openflowplugin.extension.api.path.ActionPath;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.action.data.ActionResponseConvertorData;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.ParametrizedConvertor;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionConvertorData;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.BucketId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupTypes;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.Bucket;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.BucketBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.BucketKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.desc.stats.reply.GroupDescStats;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.desc.stats.reply.GroupDescStatsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.desc.stats.reply.GroupDescStatsKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.buckets.grouping.BucketsList;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.desc._case.multipart.reply.group.desc.GroupDesc;
+
+/**
+ * Converts GroupDesc message from library to MD SAL defined GroupDescStats
+ *
+ * Example usage:
+ * <pre>
+ * {@code
+ * VersionConvertorData data = new VersionConvertorData(version);
+ * Optional<List<GroupDescStats>> salGroupStats = ConvertorManager.getInstance().convert(ofGroupStats, data);
+ * }
+ * </pre>
+ */
+public class GroupDescStatsResponseConvertor implements ParametrizedConvertor<List<GroupDesc>, List<GroupDescStats>, VersionConvertorData> {
+
+    private org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.Buckets toSALBucketsDesc(List<BucketsList> bucketDescStats, short version) {
+        final ActionResponseConvertorData data = new ActionResponseConvertorData(version);
+        data.setActionPath(ActionPath.GROUPDESCSTATSUPDATED_GROUPDESCSTATS_BUCKETS_BUCKET_ACTION);
+
+        org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.BucketsBuilder salBucketsDesc =
+                new org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.BucketsBuilder();
+        List<Bucket> allBuckets = new ArrayList<>();
+        int bucketKey = 0;
+
+        for (BucketsList bucketDetails : bucketDescStats) {
+            BucketBuilder bucketDesc = new BucketBuilder();
+            final Optional<List<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action>> convertedSalActions =
+                    ConvertorManager.getInstance().convert(
+                            bucketDetails.getAction(), data);
+
+
+            if (convertedSalActions.isPresent()) {
+                List<Action> actions = new ArrayList<>();
+
+                int actionKey = 0;
+
+                for (org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action : convertedSalActions.get()) {
+                    ActionBuilder wrappedAction = new ActionBuilder();
+                    wrappedAction.setAction(action);
+                    wrappedAction.setKey(new ActionKey(actionKey));
+                    wrappedAction.setOrder(actionKey);
+                    actions.add(wrappedAction.build());
+                    actionKey++;
+                }
+
+                bucketDesc.setAction(actions);
+            } else {
+                bucketDesc.setAction(Collections.emptyList());
+            }
+
+            bucketDesc.setWeight(bucketDetails.getWeight());
+            bucketDesc.setWatchPort(bucketDetails.getWatchPort().getValue());
+            bucketDesc.setWatchGroup(bucketDetails.getWatchGroup());
+            BucketId bucketId = new BucketId((long) bucketKey);
+            bucketDesc.setBucketId(bucketId);
+            bucketDesc.setKey(new BucketKey(bucketId));
+            bucketKey++;
+            allBuckets.add(bucketDesc.build());
+        }
+
+        salBucketsDesc.setBucket(allBuckets);
+        return salBucketsDesc.build();
+    }
+
+    @Override
+    public Class<?> getType() {
+        return GroupDesc.class;
+    }
+
+    @Override
+    public List<GroupDescStats> convert(List<GroupDesc> source, VersionConvertorData data) {
+        List<GroupDescStats> convertedSALGroupsDesc = new ArrayList<>();
+
+        for (GroupDesc groupDesc : source) {
+            GroupDescStatsBuilder salGroupDescStats = new GroupDescStatsBuilder();
+
+            salGroupDescStats.setBuckets(toSALBucketsDesc(groupDesc.getBucketsList(), data.getVersion()));
+            salGroupDescStats.setGroupId(new GroupId(groupDesc.getGroupId().getValue()));
+            salGroupDescStats.setGroupType(GroupTypes.forValue(groupDesc.getType().getIntValue()));
+            salGroupDescStats.setKey(new GroupDescStatsKey(salGroupDescStats.getGroupId()));
+
+            convertedSALGroupsDesc.add(salGroupDescStats.build());
+        }
+
+        return convertedSALGroupsDesc;
+    }
+}
\ No newline at end of file
index c3e385fc8f6c0b4a02c23303aa1cf0c48eb2b0b6..7326adbcf48d70881b5d5c05423a476c2bf56f17 100644 (file)
@@ -11,24 +11,11 @@ package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
-import java.util.Optional;
-import org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Counter32;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Counter64;
-import org.opendaylight.openflowplugin.extension.api.path.ActionPath;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.action.data.ActionResponseConvertorData;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionKey;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.common.Convertor;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.BucketId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupId;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupTypes;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.Bucket;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.BucketBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.BucketKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.desc.stats.reply.GroupDescStats;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.desc.stats.reply.GroupDescStatsBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.desc.stats.reply.GroupDescStatsKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.statistics.Buckets;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.statistics.BucketsBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.statistics.DurationBuilder;
@@ -38,148 +25,71 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.statistics.reply.GroupStats;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.statistics.reply.GroupStatsBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.statistics.reply.GroupStatsKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.buckets.grouping.BucketsList;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group._case.multipart.reply.group.group.stats.BucketStats;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group.desc._case.multipart.reply.group.desc.GroupDesc;
 
 /**
- * Class is an utility class for converting group related statistics messages coming from switch to MD-SAL
- * messages.
- * @author avishnoi@in.ibm.com
+ * Converts group related statistics messages coming from switch to MD-SAL messages.
  *
+ * Example usage:
+ * <pre>
+ * {@code
+ * Optional<List<GroupStats>> salGroupStats = ConvertorManager.getInstance().convert(ofGroupStats);
+ * }
+ * </pre>
  */
-public class GroupStatsResponseConvertor {
+public class GroupStatsResponseConvertor implements Convertor<
+        List<org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group._case.multipart.reply.group.GroupStats>,
+        List<GroupStats>> {
 
-    public List<GroupStats> toSALGroupStatsList(
-            List<org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply
-            .multipart.reply.body.multipart.reply.group._case.multipart.reply.group.GroupStats> allGroupStats){
-        List<GroupStats> convertedSALGroups = new ArrayList<>();
-        for(org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply
-                .multipart.reply.body.multipart.reply.group._case.multipart.reply.group.GroupStats group: allGroupStats){
-            convertedSALGroups.add(toSALGroupStats(group));
-        }
-        return convertedSALGroups;
-
-    }
-    /**
-     * Method convert GroupStats message from library to MD SAL defined GroupStats
-     * @param groupStats GroupStats from library
-     * @return GroupStats -- GroupStats defined in MD-SAL
-     */
-    public GroupStats toSALGroupStats(
-            org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.
-            multipart.reply.body.multipart.reply.group._case.multipart.reply.group.GroupStats groupStats){
-
-        GroupStatsBuilder salGroupStats = new GroupStatsBuilder();
-
-        salGroupStats.setBuckets(toSALBuckets(groupStats.getBucketStats()));
-        salGroupStats.setByteCount(new Counter64(groupStats.getByteCount()));
-
-        DurationBuilder time = new DurationBuilder();
-        time.setSecond(new Counter32(groupStats.getDurationSec()));
-        time.setNanosecond(new Counter32(groupStats.getDurationNsec()));
-
-        salGroupStats.setDuration(time.build());
-        salGroupStats.setGroupId(new GroupId(groupStats.getGroupId().getValue()));
-        salGroupStats.setPacketCount(new Counter64(groupStats.getPacketCount()));
-        salGroupStats.setRefCount(new Counter32(groupStats.getRefCount()));
-        salGroupStats.setKey(new GroupStatsKey(salGroupStats.getGroupId()));
-
-        return salGroupStats.build();
-    }
-
-    public Buckets toSALBuckets(
-            List<BucketStats> bucketStats ){
-
-        BucketsBuilder salBuckets  = new BucketsBuilder();
+    private Buckets toSALBuckets(List<BucketStats> bucketStats) {
+        BucketsBuilder salBuckets = new BucketsBuilder();
 
         List<BucketCounter> allBucketStats = new ArrayList<>();
         int bucketKey = 0;
-        for(BucketStats bucketStat : bucketStats){
+
+        for (BucketStats bucketStat : bucketStats) {
             BucketCounterBuilder bucketCounter = new BucketCounterBuilder();
             bucketCounter.setByteCount(new Counter64(bucketStat.getByteCount()));
             bucketCounter.setPacketCount(new Counter64(bucketStat.getPacketCount()));
-            BucketId bucketId = new BucketId((long)bucketKey);
+            BucketId bucketId = new BucketId((long) bucketKey);
             bucketCounter.setKey(new BucketCounterKey(bucketId));
             bucketCounter.setBucketId(bucketId);
             bucketKey++;
             allBucketStats.add(bucketCounter.build());
         }
+
         salBuckets.setBucketCounter(allBucketStats);
         return salBuckets.build();
     }
 
-
-    public List<GroupDescStats> toSALGroupDescStatsList(
-            List<GroupDesc> allGroupDescStats, OpenflowVersion ofVersion){
-
-        List<GroupDescStats> convertedSALGroupsDesc = new ArrayList<>();
-        for(GroupDesc groupDesc: allGroupDescStats){
-            convertedSALGroupsDesc.add(toSALGroupDescStats(groupDesc, ofVersion));
-        }
-        return convertedSALGroupsDesc;
-
-    }
-    /**
-     * Method convert GroupStats message from library to MD SAL defined GroupStats
-     * @param groupDesc GroupStats from library
-     * @param ofVersion current ofp version
-     * @return GroupStats -- GroupStats defined in MD-SAL
-     */
-    public GroupDescStats toSALGroupDescStats(GroupDesc groupDesc, OpenflowVersion ofVersion){
-
-        GroupDescStatsBuilder salGroupDescStats = new GroupDescStatsBuilder();
-
-        salGroupDescStats.setBuckets(toSALBucketsDesc(groupDesc.getBucketsList(), ofVersion));
-        salGroupDescStats.setGroupId(new GroupId(groupDesc.getGroupId().getValue()));
-        salGroupDescStats.setGroupType(GroupTypes.forValue(groupDesc.getType().getIntValue()));
-        salGroupDescStats.setKey(new GroupDescStatsKey(salGroupDescStats.getGroupId()));
-
-        return salGroupDescStats.build();
+    @Override
+    public Class<?> getType() {
+        return org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group._case.multipart.reply.group.GroupStats.class;
     }
 
-    public  org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.Buckets toSALBucketsDesc(
-            List<BucketsList> bucketDescStats, OpenflowVersion ofVersion ){
-        final ActionResponseConvertorData data = new ActionResponseConvertorData(ofVersion.getVersion());
-        data.setActionPath(ActionPath.GROUPDESCSTATSUPDATED_GROUPDESCSTATS_BUCKETS_BUCKET_ACTION);
+    @Override
+    public List<GroupStats> convert(List<org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply.multipart.reply.body.multipart.reply.group._case.multipart.reply.group.GroupStats> source) {
+        List<GroupStats> convertedSALGroups = new ArrayList<>();
 
-        org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.BucketsBuilder salBucketsDesc  =
-                new org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.BucketsBuilder();
-        List<Bucket> allBuckets = new ArrayList<>();
-        int bucketKey = 0;
-        for(BucketsList bucketDetails : bucketDescStats){
-            BucketBuilder bucketDesc = new BucketBuilder();
-            final Optional<List<org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action>> convertedSalActions =
-                    ConvertorManager.getInstance().convert(bucketDetails.getAction(), data);
+        for (org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.multipart.reply
+                .multipart.reply.body.multipart.reply.group._case.multipart.reply.group.GroupStats groupStats : source) {
+            GroupStatsBuilder salGroupStats = new GroupStatsBuilder();
 
-            if (convertedSalActions.isPresent()) {
-                List<Action> actions = new ArrayList<>();
-                int actionKey = 0;
-                for (org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action action : convertedSalActions.get()) {
-                    ActionBuilder wrappedAction = new ActionBuilder();
-                    wrappedAction.setAction(action);
-                    wrappedAction.setKey(new ActionKey(actionKey));
-                    wrappedAction.setOrder(actionKey);
-                    actions.add(wrappedAction.build());
-                    actionKey++;
-                }
+            salGroupStats.setBuckets(toSALBuckets(groupStats.getBucketStats()));
+            salGroupStats.setByteCount(new Counter64(groupStats.getByteCount()));
 
-                bucketDesc.setAction(actions);
-            } else {
-                bucketDesc.setAction(Collections.emptyList());
-            }
+            DurationBuilder time = new DurationBuilder();
+            time.setSecond(new Counter32(groupStats.getDurationSec()));
+            time.setNanosecond(new Counter32(groupStats.getDurationNsec()));
 
-            bucketDesc.setWeight(bucketDetails.getWeight());
-            bucketDesc.setWatchPort(bucketDetails.getWatchPort().getValue());
-            bucketDesc.setWatchGroup(bucketDetails.getWatchGroup());
-            BucketId bucketId = new BucketId((long)bucketKey);
-            bucketDesc.setBucketId(bucketId);
-            bucketDesc.setKey(new BucketKey(bucketId));
-            bucketKey++;
-            allBuckets.add(bucketDesc.build());
+            salGroupStats.setDuration(time.build());
+            salGroupStats.setGroupId(new GroupId(groupStats.getGroupId().getValue()));
+            salGroupStats.setPacketCount(new Counter64(groupStats.getPacketCount()));
+            salGroupStats.setRefCount(new Counter32(groupStats.getRefCount()));
+            salGroupStats.setKey(new GroupStatsKey(salGroupStats.getGroupId()));
+            convertedSALGroups.add(salGroupStats.build());
         }
-        salBucketsDesc.setBucket(allBuckets);
-        return salBucketsDesc.build();
-    }
 
+        return convertedSALGroups;
+    }
 }
index 98a0c5bec991be1cf55b1ef59795ce8aa4e9b218..94295ca69c85df6260e733f64b18ea51cf007ed0 100644 (file)
@@ -20,7 +20,7 @@ import org.opendaylight.openflowplugin.api.openflow.md.core.session.SessionConte
 import org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion;
 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorManager;
 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.FlowStatsResponseConvertor;
-import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.GroupStatsResponseConvertor;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionConvertorData;
 import org.opendaylight.openflowplugin.openflow.md.util.InventoryDataServiceUtil;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Counter32;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Counter64;
@@ -44,6 +44,8 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.Group
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupType;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.SelectLiveness;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.SelectWeight;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.desc.stats.reply.GroupDescStats;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.statistics.reply.GroupStats;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.MeterConfigStatsUpdatedBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.MeterFeaturesUpdatedBuilder;
@@ -112,7 +114,6 @@ public class MultipartReplyTranslator implements IMDMessageTranslator<OfHeader,
             .getLogger(MultipartReplyTranslator.class);
 
     private static FlowStatsResponseConvertor flowStatsConvertor = new FlowStatsResponseConvertor();
-    private static GroupStatsResponseConvertor groupStatsConvertor = new GroupStatsResponseConvertor();
 
 
     @Override
@@ -224,8 +225,8 @@ public class MultipartReplyTranslator implements IMDMessageTranslator<OfHeader,
                 message.setTransactionId(generateTransactionId(mpReply.getXid()));
                 MultipartReplyGroupCase caseBody = (MultipartReplyGroupCase)mpReply.getMultipartReplyBody();
                 MultipartReplyGroup replyBody = caseBody.getMultipartReplyGroup();
-                message.setGroupStats(groupStatsConvertor.toSALGroupStatsList(replyBody.getGroupStats()));
-
+                final Optional<List<GroupStats>> groupStatsList = ConvertorManager.getInstance().convert(replyBody.getGroupStats());
+                message.setGroupStats(groupStatsList.orElse(Collections.emptyList()));
                 logger.debug("Converted group statistics : {}",message.toString());
                 listDataObject.add(message.build());
                 return listDataObject;
@@ -240,8 +241,9 @@ public class MultipartReplyTranslator implements IMDMessageTranslator<OfHeader,
                 MultipartReplyGroupDescCase caseBody = (MultipartReplyGroupDescCase)mpReply.getMultipartReplyBody();
                 MultipartReplyGroupDesc replyBody = caseBody.getMultipartReplyGroupDesc();
 
-                message.setGroupDescStats(groupStatsConvertor.toSALGroupDescStatsList(replyBody.getGroupDesc(), ofVersion));
-
+                final VersionConvertorData data = new VersionConvertorData(sc.getPrimaryConductor().getVersion());
+                final Optional<List<GroupDescStats>> groupDescStatsList = ConvertorManager.getInstance().convert(replyBody.getGroupDesc(), data);
+                message.setGroupDescStats(groupDescStatsList.orElse(Collections.emptyList()));
                 logger.debug("Converted group statistics : {}",message.toString());
                 listDataObject.add(message.build());
                 return listDataObject;
index f0358c4dfbf706a2183684e6fe4e1cfa9a14e44f..73174ede7086bec593202ddccdd0aabe0449b4a9 100644 (file)
@@ -11,8 +11,10 @@ import com.google.common.collect.ImmutableList;
 import java.math.BigInteger;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Optional;
 import org.junit.Assert;
 import org.junit.Test;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData;
 import org.opendaylight.openflowplugin.openflow.md.util.OpenflowPortsUtil;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Uri;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.CopyTtlInCaseBuilder;
@@ -31,6 +33,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.acti
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.AddGroupInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.service.rev130918.AddGroupInputBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.BucketId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.Group;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupTypes;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.Buckets;
@@ -46,7 +49,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731
 public class GroupConvertorTest {
 
     /**
-     * test of {@link GroupConvertor#toGroupModInput(org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.Group, short, java.math.BigInteger)}
+     * test of {@link org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.GroupConvertor#convert(org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.Group, org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData)} }
      */
     @Test
     public void testGroupModConvertorwithallParameters() {
@@ -126,7 +129,10 @@ public class GroupConvertorTest {
 
         addGroupBuilder.setBuckets(buckets);
 
-        final GroupModInputBuilder outAddGroupInput = GroupConvertor.toGroupModInput(addGroupBuilder.build(), (short) 0X4, BigInteger.valueOf(1));
+        VersionDatapathIdConvertorData data = new VersionDatapathIdConvertorData((short) 0X4);
+        data.setDatapathId(BigInteger.valueOf(1));
+
+        final GroupModInputBuilder outAddGroupInput = convert(addGroupBuilder.build(), data);
 
         Assert.assertEquals(GroupModCommand.OFPGCADD, outAddGroupInput.getCommand());
         Assert.assertEquals(GroupType.OFPGTALL, outAddGroupInput.getType());
@@ -166,7 +172,7 @@ public class GroupConvertorTest {
     }
 
     /**
-     * test of {@link GroupConvertor#toGroupModInput(org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.Group, short, java.math.BigInteger)}
+     * test of {@link org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.GroupConvertor#convert(org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.Group, org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData)} }
      */
     @Test
     public void testGroupModConvertorNoBucket() {
@@ -176,14 +182,16 @@ public class GroupConvertorTest {
 
         addGroupBuilder.setGroupType(GroupTypes.GroupAll);
 
-        final GroupModInputBuilder outAddGroupInput = GroupConvertor.toGroupModInput(addGroupBuilder.build(), (short) 0X4, BigInteger.valueOf(1));
+        VersionDatapathIdConvertorData data = new VersionDatapathIdConvertorData((short) 0X4);
+        data.setDatapathId(BigInteger.valueOf(1));
 
+        final GroupModInputBuilder outAddGroupInput = convert(addGroupBuilder.build(), data);
         Assert.assertEquals(GroupModCommand.OFPGCADD, outAddGroupInput.getCommand());
         Assert.assertEquals(GroupType.OFPGTALL, outAddGroupInput.getType());
     }
 
     /**
-     * test of {@link GroupConvertor#toGroupModInput(org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.Group, short, java.math.BigInteger)}
+     * test of {@link org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.GroupConvertor#convert(org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.Group, org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData)} }
      */
     @Test
     public void testGroupModConvertorBucketwithNOWieghtValuesForGroupTypeFastFailure() {
@@ -233,7 +241,10 @@ public class GroupConvertorTest {
 
         addGroupBuilder.setBuckets(buckets);
 
-        final GroupModInputBuilder outAddGroupInput = GroupConvertor.toGroupModInput(addGroupBuilder.build(), (short) 0X4, BigInteger.valueOf(1));
+        VersionDatapathIdConvertorData data = new VersionDatapathIdConvertorData((short) 0X4);
+        data.setDatapathId(BigInteger.valueOf(1));
+
+        final GroupModInputBuilder outAddGroupInput = convert(addGroupBuilder.build(), data);
 
         Assert.assertEquals(GroupModCommand.OFPGCADD, outAddGroupInput.getCommand());
         Assert.assertEquals(GroupType.OFPGTFF, outAddGroupInput.getType());
@@ -260,7 +271,7 @@ public class GroupConvertorTest {
     }
 
     /**
-     * test of {@link GroupConvertor#toGroupModInput(org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.Group, short, java.math.BigInteger)}
+     * test of {@link org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.GroupConvertor#convert(org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.Group, org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData)} }
      */
     @Test
     public void testGroupModConvertSortedBuckets() {
@@ -270,88 +281,91 @@ public class GroupConvertorTest {
         final ArrayList<Bucket> bucket = new ArrayList<Bucket>();
 
         bucket.add(new BucketBuilder()
-                        .setBucketId(new BucketId((long) 4))
-                        .setWatchPort((long)2)
-                        .setWatchGroup((long) 1)
-                        .setAction(ImmutableList.of(new ActionBuilder()
+                .setBucketId(new BucketId((long) 4))
+                .setWatchPort((long)2)
+                .setWatchGroup((long) 1)
+                .setAction(ImmutableList.of(new ActionBuilder()
                         .setOrder(0)
                         .setAction(new OutputActionCaseBuilder()
-                                        .setOutputAction(new OutputActionBuilder()
-                                                                .setOutputNodeConnector(new Uri("openflow:1:2"))
-                                                                .build())
+                                .setOutputAction(new OutputActionBuilder()
+                                        .setOutputNodeConnector(new Uri("openflow:1:2"))
                                         .build())
+                                .build())
                         .build()))
-        .build());
+                .build());
 
         bucket.add(new BucketBuilder()
-                        .setBucketId(new BucketId((long) 3))
-                        .setWatchPort((long)6)
-                        .setWatchGroup((long) 1)
-                        .setAction(ImmutableList.of(new ActionBuilder()
+                .setBucketId(new BucketId((long) 3))
+                .setWatchPort((long)6)
+                .setWatchGroup((long) 1)
+                .setAction(ImmutableList.of(new ActionBuilder()
                         .setOrder(0)
                         .setAction(new OutputActionCaseBuilder()
-                                        .setOutputAction(new OutputActionBuilder()
-                                                                .setOutputNodeConnector(new Uri("openflow:1:6"))
-                                                                .build())
+                                .setOutputAction(new OutputActionBuilder()
+                                        .setOutputNodeConnector(new Uri("openflow:1:6"))
                                         .build())
+                                .build())
                         .build()))
                 .build());
 
         bucket.add(new BucketBuilder()
-                        .setBucketId(new BucketId((long) 2))
-                        .setWatchPort((long)5)
-                        .setWatchGroup((long) 1)
-                        .setAction(ImmutableList.of(new ActionBuilder()
+                .setBucketId(new BucketId((long) 2))
+                .setWatchPort((long)5)
+                .setWatchGroup((long) 1)
+                .setAction(ImmutableList.of(new ActionBuilder()
                         .setOrder(0)
                         .setAction(new OutputActionCaseBuilder()
-                                        .setOutputAction(new OutputActionBuilder()
-                                                                .setOutputNodeConnector(new Uri("openflow:1:5"))
-                                                                .build())
+                                .setOutputAction(new OutputActionBuilder()
+                                        .setOutputNodeConnector(new Uri("openflow:1:5"))
                                         .build())
+                                .build())
                         .build()))
                 .build());
 
         bucket.add(new BucketBuilder()
-                    .setBucketId(new BucketId((long) 1))
-                    .setWatchPort((long)4)
-                    .setWatchGroup((long) 1)
-                    .setAction(ImmutableList.of(new ActionBuilder()
-                    .setOrder(0)
-                    .setAction(new OutputActionCaseBuilder()
-                                    .setOutputAction(new OutputActionBuilder()
-                                                            .setOutputNodeConnector(new Uri("openflow:1:4"))
-                                                            .build())
-                                    .build())
-                    .build()))
-            .build());
+                .setBucketId(new BucketId((long) 1))
+                .setWatchPort((long)4)
+                .setWatchGroup((long) 1)
+                .setAction(ImmutableList.of(new ActionBuilder()
+                        .setOrder(0)
+                        .setAction(new OutputActionCaseBuilder()
+                                .setOutputAction(new OutputActionBuilder()
+                                        .setOutputNodeConnector(new Uri("openflow:1:4"))
+                                        .build())
+                                .build())
+                        .build()))
+                .build());
 
         bucket.add(new BucketBuilder()
-                    .setBucketId(new BucketId((long) 0))
-                    .setWatchPort((long)3)
-                    .setWatchGroup((long) 1)
-                    .setAction(ImmutableList.of(new ActionBuilder()
-                    .setOrder(0)
-                    .setAction(new OutputActionCaseBuilder()
-                                    .setOutputAction(new OutputActionBuilder()
-                                                            .setOutputNodeConnector(new Uri("openflow:1:3"))
-                                                            .build())
-                                    .build())
-                    .build()))
-                    .build());
+                .setBucketId(new BucketId((long) 0))
+                .setWatchPort((long)3)
+                .setWatchGroup((long) 1)
+                .setAction(ImmutableList.of(new ActionBuilder()
+                        .setOrder(0)
+                        .setAction(new OutputActionCaseBuilder()
+                                .setOutputAction(new OutputActionBuilder()
+                                        .setOutputNodeConnector(new Uri("openflow:1:3"))
+                                        .build())
+                                .build())
+                        .build()))
+                .build());
 
 
         final AddGroupInput input = new AddGroupInputBuilder()
-                                    .setGroupId(new GroupId((long) 1))
-                                    .setGroupName("Foo")
-                                    .setGroupType(GroupTypes.GroupFf)
-                                    .setBuckets(new BucketsBuilder()
-                                                       .setBucket(bucket)
-                                                       .build())
-                                    .build();
+                .setGroupId(new GroupId((long) 1))
+                .setGroupName("Foo")
+                .setGroupType(GroupTypes.GroupFf)
+                .setBuckets(new BucketsBuilder()
+                        .setBucket(bucket)
+                        .build())
+                .build();
 
         OpenflowPortsUtil.init();
 
-        final GroupModInputBuilder outAddGroupInput = GroupConvertor.toGroupModInput(input, (short) 0X4, BigInteger.valueOf(1));
+        VersionDatapathIdConvertorData data = new VersionDatapathIdConvertorData((short) 0X4);
+        data.setDatapathId(BigInteger.valueOf(1));
+
+        final GroupModInputBuilder outAddGroupInput = convert(input, data);
 
         final List<BucketsList> bucketList = outAddGroupInput.getBucketsList();
         Assert.assertEquals( Long.valueOf(1), bucketList.get(0).getWatchGroup());
@@ -412,7 +426,7 @@ public class GroupConvertorTest {
     }
 
     /**
-     * test of {@link GroupConvertor#toGroupModInput(org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.Group, short, java.math.BigInteger)} )}
+     * test of {@link org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.GroupConvertor#convert(org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.Group, org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionDatapathIdConvertorData)} }
      */
     @Test
     public void testGroupModConvertorBucketwithNOWieghtValuesForGroupTypeAll() {
@@ -460,7 +474,10 @@ public class GroupConvertorTest {
 
         addGroupBuilder.setBuckets(buckets);
 
-        final GroupModInputBuilder outAddGroupInput = GroupConvertor.toGroupModInput(addGroupBuilder.build(), (short) 0X4, BigInteger.valueOf(1));
+        VersionDatapathIdConvertorData data = new VersionDatapathIdConvertorData((short) 0X4);
+        data.setDatapathId(BigInteger.valueOf(1));
+
+        final GroupModInputBuilder outAddGroupInput = convert(addGroupBuilder.build(), data);
 
         Assert.assertEquals(GroupModCommand.OFPGCADD, outAddGroupInput.getCommand());
         Assert.assertEquals(GroupType.OFPGTALL, outAddGroupInput.getType());
@@ -491,4 +508,10 @@ public class GroupConvertorTest {
         }
 
     }
+
+    private GroupModInputBuilder convert(Group group, VersionDatapathIdConvertorData data) {
+        final Optional<GroupModInputBuilder> outAddGroupInputOptional = ConvertorManager.getInstance().convert(group, data);
+        Assert.assertTrue("Group convertor not found", outAddGroupInputOptional.isPresent());
+        return outAddGroupInputOptional.get();
+    }
 }
@@ -9,14 +9,20 @@
 package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor;\r
 \r
 import java.util.ArrayList;\r
+import java.util.Collections;\r
 import java.util.List;\r
-\r
+import java.util.Optional;\r
 import org.junit.Assert;\r
 import org.junit.Test;\r
-import org.opendaylight.openflowplugin.api.openflow.md.util.OpenflowVersion;\r
+import org.opendaylight.openflowplugin.api.OFConstants;\r
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.data.VersionConvertorData;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.GroupTypes;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.Bucket;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.desc.stats.reply.GroupDescStats;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.CopyTtlInCaseBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.CopyTtlOutCaseBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.DecNwTtlCaseBuilder;\r
+import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.action.grouping.action.choice.PopPbbCaseBuilder;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.actions.grouping.Action;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.actions.grouping.ActionBuilder;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupId;\r
@@ -31,9 +37,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731
  * @author michal.polkorab\r
  *\r
  */\r
-public class GroupStatsResponseConvertorTest2 {\r
-\r
-    GroupStatsResponseConvertor convertor =  new GroupStatsResponseConvertor();\r
+public class GroupDescStatsResponseConvertorTest {\r
 \r
     /**\r
      * Test empty GroupDescStats conversion\r
@@ -42,8 +46,8 @@ public class GroupStatsResponseConvertorTest2 {
     public void test() {\r
         List<GroupDesc> groupDescStats = new ArrayList<>();\r
 \r
-        List<GroupDescStats> statsList = convertor.toSALGroupDescStatsList(groupDescStats, OpenflowVersion.OF13);\r
-\r
+        VersionConvertorData data = new VersionConvertorData(OFConstants.OFP_VERSION_1_3);\r
+        List<GroupDescStats> statsList = convert(groupDescStats, data);\r
         Assert.assertEquals("Wrong groupDesc stats size", 0, statsList.size());\r
     }\r
 \r
@@ -56,10 +60,11 @@ public class GroupStatsResponseConvertorTest2 {
         GroupDescBuilder builder = new GroupDescBuilder();\r
         builder.setType(GroupType.OFPGTALL);\r
         builder.setGroupId(new GroupId(42L));\r
-        builder.setBucketsList(new ArrayList<BucketsList>());\r
+        builder.setBucketsList(new ArrayList<>());\r
         groupDescStats.add(builder.build());\r
 \r
-        List<GroupDescStats> statsList = convertor.toSALGroupDescStatsList(groupDescStats, OpenflowVersion.OF13);\r
+        VersionConvertorData data = new VersionConvertorData(OFConstants.OFP_VERSION_1_3);\r
+        List<GroupDescStats> statsList = convert(groupDescStats, data);\r
 \r
         Assert.assertEquals("Wrong groupDesc stats size", 1, statsList.size());\r
         GroupDescStats stat = statsList.get(0);\r
@@ -75,56 +80,100 @@ public class GroupStatsResponseConvertorTest2 {
     @Test\r
     public void testGroupDescStats() {\r
         List<GroupDesc> groupDescStats = new ArrayList<>();\r
+\r
+        // **********************************************\r
+        // First group desc\r
+        // **********************************************\r
         GroupDescBuilder builder = new GroupDescBuilder();\r
         builder.setType(GroupType.OFPGTFF);\r
         builder.setGroupId(new GroupId(42L));\r
+\r
+        // Buckets for first group desc\r
         List<BucketsList> bucketsList = new ArrayList<>();\r
         BucketsListBuilder bucketsBuilder = new BucketsListBuilder();\r
         bucketsBuilder.setWeight(16);\r
         bucketsBuilder.setWatchPort(new PortNumber(84L));\r
         bucketsBuilder.setWatchGroup(168L);\r
+\r
+        // Actions for buckets for first group desc\r
         List<Action> actions = new ArrayList<>();\r
         ActionBuilder actionBuilder = new ActionBuilder();\r
+        actionBuilder.setActionChoice(new CopyTtlInCaseBuilder().build());\r
         actions.add(actionBuilder.build());\r
+\r
+        // Build bucket with actions\r
         bucketsBuilder.setAction(actions);\r
         bucketsList.add(bucketsBuilder.build());\r
+\r
+        // Build first group desc\r
         builder.setBucketsList(bucketsList);\r
         groupDescStats.add(builder.build());\r
+\r
+        // **********************************************\r
+        // Second group desc\r
+        // **********************************************\r
         builder = new GroupDescBuilder();\r
         builder.setType(GroupType.OFPGTINDIRECT);\r
         builder.setGroupId(new GroupId(50L));\r
+\r
+        // First buckets for second group desc\r
         bucketsList = new ArrayList<>();\r
         bucketsBuilder = new BucketsListBuilder();\r
         bucketsBuilder.setWeight(100);\r
         bucketsBuilder.setWatchPort(new PortNumber(200L));\r
         bucketsBuilder.setWatchGroup(400L);\r
+\r
+        // Actions for first buckets for second group desc\r
         actions = new ArrayList<>();\r
+\r
         actionBuilder = new ActionBuilder();\r
+        actionBuilder.setActionChoice(new CopyTtlOutCaseBuilder().build());\r
         actions.add(actionBuilder.build());\r
+\r
         actionBuilder = new ActionBuilder();\r
+        actionBuilder.setActionChoice(new DecNwTtlCaseBuilder().build());\r
         actions.add(actionBuilder.build());\r
+\r
         actionBuilder = new ActionBuilder();\r
+        actionBuilder.setActionChoice(new PopPbbCaseBuilder().build());\r
         actions.add(actionBuilder.build());\r
+\r
+        // Build first bucket with actions\r
         bucketsBuilder.setAction(actions);\r
         bucketsList.add(bucketsBuilder.build());\r
+\r
+        // Second buckets for second group desc\r
         bucketsBuilder = new BucketsListBuilder();\r
         bucketsBuilder.setWeight(5);\r
         bucketsBuilder.setWatchPort(new PortNumber(10L));\r
         bucketsBuilder.setWatchGroup(15L);\r
+\r
+        // Actions for second buckets for second group desc\r
         actions = new ArrayList<>();\r
+\r
+        // Build second bucket with actions\r
         bucketsBuilder.setAction(actions);\r
         bucketsList.add(bucketsBuilder.build());\r
+\r
+        // Build second group desc\r
         builder.setBucketsList(bucketsList);\r
         groupDescStats.add(builder.build());\r
 \r
-        List<GroupDescStats> statsList = convertor.toSALGroupDescStatsList(groupDescStats, OpenflowVersion.OF13);\r
 \r
+        VersionConvertorData data = new VersionConvertorData(OFConstants.OFP_VERSION_1_3);\r
+        List<GroupDescStats> statsList = convert(groupDescStats, data);\r
         Assert.assertEquals("Wrong groupDesc stats size", 2, statsList.size());\r
+\r
+        // **********************************************\r
+        // Test first group desc\r
+        // **********************************************\r
         GroupDescStats stat = statsList.get(0);\r
         Assert.assertEquals("Wrong type", GroupTypes.GroupFf, stat.getGroupType());\r
         Assert.assertEquals("Wrong group-id", 42, stat.getGroupId().getValue().intValue());\r
         Assert.assertEquals("Wrong key", 42, stat.getKey().getGroupId().getValue().intValue());\r
         Assert.assertEquals("Wrong buckets size", 1, stat.getBuckets().getBucket().size());\r
+\r
+        // Test first bucket for first group desc\r
         Bucket bucket = stat.getBuckets().getBucket().get(0);\r
         Assert.assertEquals("Wrong type", 0, bucket.getKey().getBucketId().getValue().intValue());\r
         Assert.assertEquals("Wrong type", 0, bucket.getBucketId().getValue().intValue());\r
@@ -132,17 +181,24 @@ public class GroupStatsResponseConvertorTest2 {
         Assert.assertEquals("Wrong type", 168, bucket.getWatchGroup().intValue());\r
         Assert.assertEquals("Wrong type", 84, bucket.getWatchPort().intValue());\r
         Assert.assertEquals("Wrong type", 1, bucket.getAction().size());\r
+\r
+        // Test first action for first bucket for first group desc\r
         org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list\r
-        .Action action = bucket.getAction().get(0);\r
+                .Action action = bucket.getAction().get(0);\r
         Assert.assertEquals("Wrong type", 0, action.getOrder().intValue());\r
         Assert.assertEquals("Wrong type", "org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112"\r
                 + ".action.action.CopyTtlInCase", action.getAction().getImplementedInterface().getName());\r
 \r
+        // **********************************************\r
+        // Test second group desc\r
+        // **********************************************\r
         stat = statsList.get(1);\r
         Assert.assertEquals("Wrong type", GroupTypes.GroupIndirect, stat.getGroupType());\r
         Assert.assertEquals("Wrong group-id", 50, stat.getGroupId().getValue().intValue());\r
         Assert.assertEquals("Wrong key", 50, stat.getKey().getGroupId().getValue().intValue());\r
         Assert.assertEquals("Wrong buckets size", 2, stat.getBuckets().getBucket().size());\r
+\r
+        // Test first bucket for second group desc\r
         bucket = stat.getBuckets().getBucket().get(0);\r
         Assert.assertEquals("Wrong type", 0, bucket.getKey().getBucketId().getValue().intValue());\r
         Assert.assertEquals("Wrong type", 0, bucket.getBucketId().getValue().intValue());\r
@@ -150,18 +206,26 @@ public class GroupStatsResponseConvertorTest2 {
         Assert.assertEquals("Wrong type", 400, bucket.getWatchGroup().intValue());\r
         Assert.assertEquals("Wrong type", 200, bucket.getWatchPort().intValue());\r
         Assert.assertEquals("Wrong type", 3, bucket.getAction().size());\r
+\r
+        // Test first action for first bucket of second group desc\r
         action = bucket.getAction().get(0);\r
         Assert.assertEquals("Wrong type", 0, action.getOrder().intValue());\r
         Assert.assertEquals("Wrong type", "org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112"\r
                 + ".action.action.CopyTtlOutCase", action.getAction().getImplementedInterface().getName());\r
+\r
+        // Test second action for first bucket of second group desc\r
         action = bucket.getAction().get(1);\r
         Assert.assertEquals("Wrong type", 1, action.getOrder().intValue());\r
         Assert.assertEquals("Wrong type", "org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112"\r
                 + ".action.action.DecNwTtlCase", action.getAction().getImplementedInterface().getName());\r
+\r
+        // Test third action for first bucket of second group desc\r
         action = bucket.getAction().get(2);\r
         Assert.assertEquals("Wrong type", 2, action.getOrder().intValue());\r
         Assert.assertEquals("Wrong type", "org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112"\r
                 + ".action.action.PopPbbActionCase", action.getAction().getImplementedInterface().getName());\r
+\r
+        // Test second bucket for second group desc\r
         bucket = stat.getBuckets().getBucket().get(1);\r
         Assert.assertEquals("Wrong type", 1, bucket.getKey().getBucketId().getValue().intValue());\r
         Assert.assertEquals("Wrong type", 1, bucket.getBucketId().getValue().intValue());\r
@@ -170,4 +234,9 @@ public class GroupStatsResponseConvertorTest2 {
         Assert.assertEquals("Wrong type", 10, bucket.getWatchPort().intValue());\r
         Assert.assertEquals("Wrong type", 0, bucket.getAction().size());\r
     }\r
-}
\ No newline at end of file
+\r
+    private List<GroupDescStats> convert(List<GroupDesc> groupDescStats,VersionConvertorData data) {\r
+        Optional<List<GroupDescStats>> statsListOptional = ConvertorManager.getInstance().convert(groupDescStats, data);\r
+        return  statsListOptional.orElse(Collections.emptyList());\r
+    }\r
+}\r
index df7a13546010cb0bec85c1e351fa7eebfdb7417e..64531a5320c147f37e0c0197d07f55fdd18030a2 100644 (file)
@@ -12,6 +12,7 @@ import java.math.BigInteger;
 import java.util.ArrayList;\r
 import java.util.List;\r
 \r
+import java.util.Optional;\r
 import org.junit.Assert;\r
 import org.junit.Test;\r
 import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.statistics.buckets.BucketCounter;\r
@@ -27,8 +28,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731
  */\r
 public class GroupStatsResponseConvertorTest {\r
 \r
-    GroupStatsResponseConvertor convertor =  new GroupStatsResponseConvertor();\r
-\r
     /**\r
      * Test empty GroupStats conversion\r
      */\r
@@ -36,10 +35,10 @@ public class GroupStatsResponseConvertorTest {
     public void testEmptyGroupStats() {\r
         List<GroupStats> groupStats = new ArrayList<>();\r
 \r
-        List<org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.statistics.reply\r
-        .GroupStats> salGroupStats = convertor.toSALGroupStatsList(groupStats);\r
+        Optional<List<org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.statistics.reply\r
+                .GroupStats>> salGroupStats = ConvertorManager.getInstance().convert(groupStats);\r
 \r
-        Assert.assertEquals("Wrong group stats size", 0, salGroupStats.size());\r
+        Assert.assertFalse("Group stats response should be not present", salGroupStats.isPresent());\r
     }\r
 \r
     /**\r
@@ -58,12 +57,15 @@ public class GroupStatsResponseConvertorTest {
         statsBuilder.setBucketStats(new ArrayList<BucketStats>());\r
         groupStats.add(statsBuilder.build());\r
 \r
+        Optional<List<org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.statistics.reply\r
+                .GroupStats>> salGroupStatsOptional = ConvertorManager.getInstance().convert(groupStats);\r
+        Assert.assertTrue("Group stats response convertor not found", salGroupStatsOptional.isPresent());\r
         List<org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.statistics.reply\r
-        .GroupStats> salGroupStats = convertor.toSALGroupStatsList(groupStats);\r
+                .GroupStats> salGroupStats = salGroupStatsOptional.get();\r
 \r
         Assert.assertEquals("Wrong group stats size", 1, salGroupStats.size());\r
         org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.statistics.reply\r
-        .GroupStats stat = salGroupStats.get(0);\r
+                .GroupStats stat = salGroupStats.get(0);\r
         Assert.assertEquals("Wrong group-id", 42, stat.getGroupId().getValue().intValue());\r
         Assert.assertEquals("Wrong ref-count", 24, stat.getRefCount().getValue().intValue());\r
         Assert.assertEquals("Wrong packet count", 54321, stat.getPacketCount().getValue().intValue());\r
@@ -98,12 +100,15 @@ public class GroupStatsResponseConvertorTest {
         statsBuilder.setBucketStats(new ArrayList<BucketStats>());\r
         groupStats.add(statsBuilder.build());\r
 \r
+        Optional<List<org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.statistics.reply\r
+                .GroupStats>> salGroupStatsOptional = ConvertorManager.getInstance().convert(groupStats);\r
+        Assert.assertTrue("Group stats response convertor not found", salGroupStatsOptional.isPresent());\r
         List<org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.statistics.reply\r
-        .GroupStats> salGroupStats = convertor.toSALGroupStatsList(groupStats);\r
+                .GroupStats> salGroupStats = salGroupStatsOptional.get();\r
 \r
         Assert.assertEquals("Wrong group stats size", 2, salGroupStats.size());\r
         org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.statistics.reply\r
-        .GroupStats stat = salGroupStats.get(0);\r
+                .GroupStats stat = salGroupStats.get(0);\r
         Assert.assertEquals("Wrong group-id", 42, stat.getGroupId().getValue().intValue());\r
         Assert.assertEquals("Wrong key", 42, stat.getKey().getGroupId().getValue().intValue());\r
         Assert.assertEquals("Wrong ref-count", 24, stat.getRefCount().getValue().intValue());\r
@@ -148,12 +153,15 @@ public class GroupStatsResponseConvertorTest {
         statsBuilder.setBucketStats(bucketStats);\r
         groupStats.add(statsBuilder.build());\r
 \r
+        Optional<List<org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.statistics.reply\r
+                .GroupStats>> salGroupStatsOptional = ConvertorManager.getInstance().convert(groupStats);\r
+        Assert.assertTrue("Group stats response convertor not found", salGroupStatsOptional.isPresent());\r
         List<org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.statistics.reply\r
-        .GroupStats> salGroupStats = convertor.toSALGroupStatsList(groupStats);\r
+                .GroupStats> salGroupStats = salGroupStatsOptional.get();\r
 \r
         Assert.assertEquals("Wrong group stats size", 1, salGroupStats.size());\r
         org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.statistics.reply\r
-        .GroupStats stat = salGroupStats.get(0);\r
+                .GroupStats stat = salGroupStats.get(0);\r
         Assert.assertEquals("Wrong group-id", 42, stat.getGroupId().getValue().intValue());\r
         Assert.assertEquals("Wrong ref-count", 24, stat.getRefCount().getValue().intValue());\r
         Assert.assertEquals("Wrong packet count", 54321, stat.getPacketCount().getValue().intValue());\r
@@ -169,4 +177,4 @@ public class GroupStatsResponseConvertorTest {
         Assert.assertEquals("Wrong bucket packet count", 456, list.get(1).getPacketCount().getValue().intValue());\r
         Assert.assertEquals("Wrong bucket byte count", 123, list.get(1).getByteCount().getValue().intValue());\r
     }\r
-}
\ No newline at end of file
+}\r