Update MRI projects for Aluminium
[openflowplugin.git] / openflowplugin / src / main / java / org / opendaylight / openflowplugin / openflow / md / core / sal / convertor / GroupConvertor.java
index 6250fa2ae205d4c5dffdd69953be701c46d23f40..3432d6964dbc2e39f974ebb9106a1f4cbe1766bc 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014 Ericsson India Global Services Pvt Ltd. and others.  All rights reserved.
+ * 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,
@@ -8,15 +8,17 @@
 
 package org.opendaylight.openflowplugin.openflow.md.core.sal.convertor;
 
-import java.math.BigInteger;
 import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.List;
+import java.util.Map;
 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.common.Convertor;
 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;
@@ -25,6 +27,7 @@ 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;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.BucketKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.action.rev150203.actions.grouping.Action;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.GroupModCommand;
@@ -33,6 +36,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev13
 import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.protocol.rev130731.GroupModInputBuilder;
 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.buckets.grouping.BucketsListBuilder;
+import org.opendaylight.yangtools.yang.common.Uint64;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -40,16 +44,20 @@ import org.slf4j.LoggerFactory;
  * Decodes the SAL - Group Mod Message and encodes into a OF
  * Library for the OFPT_GROUP_MOD Message. Input:SAL Layer Group command data.
  *
+ * <p>
  * Example usage:
  * <pre>
  * {@code
  * VersionDatapathIdConvertorData data = new VersionDatapathIdConvertorData(version);
  * data.setDatapathId(datapathId);
- * Optional<GroupModInputBuilder> ofGroup = ConvertorManager.getInstance().convert(salGroup, data);
+ * Optional<GroupModInputBuilder> ofGroup = convertorManager.convert(salGroup, data);
  * }
  * </pre>
  */
-public class GroupConvertor implements ParametrizedConvertor<Group, GroupModInputBuilder, VersionDatapathIdConvertorData> {
+public class GroupConvertor extends Convertor<Group, GroupModInputBuilder, VersionDatapathIdConvertorData> {
+    private static final List<Class<?>> TYPES = Arrays.asList(Group.class, AddGroupInput.class,
+            RemoveGroupInput.class, UpdatedGroup.class);
+
     /**
      * Create default empty group mod input builder
      * Use this method, if result from convertor is empty.
@@ -57,7 +65,7 @@ public class GroupConvertor implements ParametrizedConvertor<Group, GroupModInpu
      * @param version Openflow version
      * @return default empty group mod input builder
      */
-    public static GroupModInputBuilder defaultResult(short version) {
+    public static GroupModInputBuilder defaultResult(final short version) {
         return new GroupModInputBuilder()
                 .setVersion(version);
     }
@@ -69,24 +77,27 @@ public class GroupConvertor implements ParametrizedConvertor<Group, GroupModInpu
     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 = (bucket1, bucket2) -> {
-        if (bucket1.getBucketId() == null || bucket2.getBucketId() == null) return 0;
+        if (bucket1.getBucketId() == null || bucket2.getBucketId() == null) {
+            return 0;
+        }
         return bucket1.getBucketId().getValue().compareTo(bucket2.getBucketId().getValue());
     };
 
-    private static List<BucketsList> salToOFBucketList(Buckets buckets, short version, int groupType, BigInteger datapathid) {
+    private List<BucketsList> salToOFBucketList(final List<Bucket> buckets, final short version, final int groupType,
+            final Uint64 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()) {
+        for (org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.Bucket groupBucket :
+                buckets) {
             BucketsListBuilder bucketBuilder = new BucketsListBuilder();
 
             salToOFBucketListWeight(groupBucket, bucketBuilder, groupType);
             salToOFBucketListWatchGroup(groupBucket, bucketBuilder, groupType);
             salToOFBucketListWatchPort(groupBucket, bucketBuilder, groupType);
 
-            Optional<List<Action>> bucketActionList = ConvertorManager.getInstance().convert(
+            Optional<List<Action>> bucketActionList = getConvertorExecutor().convert(
                     groupBucket.getAction(), data);
 
             bucketBuilder.setAction(bucketActionList.orElse(Collections.emptyList()));
@@ -98,7 +109,8 @@ public class GroupConvertor implements ParametrizedConvertor<Group, GroupModInpu
 
     }
 
-    private static void salToOFBucketListWatchPort(Bucket groupBucket, BucketsListBuilder bucketBuilder, int groupType) {
+    private static void salToOFBucketListWatchPort(final Bucket groupBucket, final BucketsListBuilder bucketBuilder,
+            final int groupType) {
         if (null != groupBucket.getWatchPort()) {
             bucketBuilder.setWatchPort(new PortNumber(groupBucket.getWatchPort()));
         } else {
@@ -109,7 +121,8 @@ public class GroupConvertor implements ParametrizedConvertor<Group, GroupModInpu
         }
     }
 
-    private static void salToOFBucketListWatchGroup(Bucket groupBucket, BucketsListBuilder bucketBuilder, int groupType) {
+    private static void salToOFBucketListWatchGroup(final Bucket groupBucket, final BucketsListBuilder bucketBuilder,
+            final int groupType) {
         if (null != groupBucket.getWatchGroup()) {
             bucketBuilder.setWatchGroup(groupBucket.getWatchGroup());
         } else {
@@ -120,7 +133,8 @@ public class GroupConvertor implements ParametrizedConvertor<Group, GroupModInpu
         }
     }
 
-    private static void salToOFBucketListWeight(Bucket groupBucket, BucketsListBuilder bucketBuilder, int groupType) {
+    private static void salToOFBucketListWeight(final Bucket groupBucket, final BucketsListBuilder bucketBuilder,
+            final int groupType) {
         if (null != groupBucket.getWeight()) {
             bucketBuilder.setWeight(groupBucket.getWeight());
         } else {
@@ -132,12 +146,12 @@ public class GroupConvertor implements ParametrizedConvertor<Group, GroupModInpu
     }
 
     @Override
-    public Class<?> getType() {
-        return Group.class;
+    public Collection<Class<?>> getTypes() {
+        return  TYPES;
     }
 
     @Override
-    public GroupModInputBuilder convert(Group source, VersionDatapathIdConvertorData data) {
+    public GroupModInputBuilder convert(final Group source, final VersionDatapathIdConvertorData data) {
         GroupModInputBuilder groupModInputBuilder = new GroupModInputBuilder();
         if (source instanceof AddGroupInput) {
             groupModInputBuilder.setCommand(GroupModCommand.OFPGCADD);
@@ -168,16 +182,22 @@ public class GroupConvertor implements ParametrizedConvertor<Group, GroupModInpu
         // 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);
+            final Buckets buckets = source.getBuckets();
+            if (buckets != null) {
+                final Map<BucketKey, Bucket> bucket = buckets.nonnullBucket();
+                if (!bucket.isEmpty()) {
+                    // TODO: we should be able to just sort the resulting the resulting list and not go through
+                    //       two copies
+                    List<Bucket> bucketList = new ArrayList<>(bucket.values());
+                    Collections.sort(bucketList, COMPARATOR);
+                    List<BucketsList> bucketLists = salToOFBucketList(bucketList, data.getVersion(),
+                        source.getGroupType().getIntValue(), data.getDatapathId());
+                    groupModInputBuilder.setBucketsList(bucketLists);
+                }
             }
         }
 
         groupModInputBuilder.setVersion(data.getVersion());
         return groupModInputBuilder;
     }
-}
\ No newline at end of file
+}