ONOS-6654_Master - groups CLI command enhancement

Change-Id: I39d82a4ea9649b89cf39a2f6523fd9fbbb922bf5
diff --git a/cli/src/main/java/org/onosproject/cli/net/GroupsListCommand.java b/cli/src/main/java/org/onosproject/cli/net/GroupsListCommand.java
index be50a39..567880d 100644
--- a/cli/src/main/java/org/onosproject/cli/net/GroupsListCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/GroupsListCommand.java
@@ -15,27 +15,28 @@
  */
 package org.onosproject.cli.net;
 
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.SortedMap;
-import java.util.TreeMap;
-
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.node.ArrayNode;
 import org.apache.karaf.shell.commands.Argument;
 import org.apache.karaf.shell.commands.Command;
 import org.apache.karaf.shell.commands.Option;
 import org.onosproject.cli.AbstractShellCommand;
-import org.onosproject.utils.Comparators;
 import org.onosproject.net.Device;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.device.DeviceService;
 import org.onosproject.net.group.Group;
 import org.onosproject.net.group.Group.GroupState;
 import org.onosproject.net.group.GroupBucket;
+import org.onosproject.net.group.GroupDescription;
 import org.onosproject.net.group.GroupService;
+import org.onosproject.utils.Comparators;
 
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.node.ArrayNode;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.SortedMap;
+import java.util.TreeMap;
+import java.util.stream.Collectors;
 
 import static com.google.common.collect.Lists.newArrayList;
 
@@ -49,7 +50,7 @@
     public static final String ANY = "any";
 
     private static final String FORMAT =
-            "   id=0x%s, state=%s, type=%s, bytes=%s, packets=%s, appId=%s";
+            "   id=0x%s, state=%s, type=%s, bytes=%s, packets=%s, appId=%s, referenceCount=%s";
     private static final String BUCKET_FORMAT =
             "   id=0x%s, bucket=%s, bytes=%s, packets=%s, actions=%s";
 
@@ -66,6 +67,12 @@
             required = false, multiValued = false)
     private boolean countOnly = false;
 
+    @Option(name = "-t", aliases = "--type",
+            description = "Print groups with specified type",
+            required = false, multiValued = false)
+    private String type = null;
+
+
     private JsonNode json(Map<Device, List<Group>> sortedGroups) {
         ArrayNode result = mapper().createArrayNode();
 
@@ -82,14 +89,12 @@
         GroupService groupService = get(GroupService.class);
         SortedMap<Device, List<Group>> sortedGroups =
                 getSortedGroups(deviceService, groupService);
-
         if (outputJson()) {
             print("%s", json(sortedGroups));
         } else {
             sortedGroups.forEach((device, groups) -> printGroups(device.id(), groups));
         }
     }
-
     /**
      * Returns the list of devices sorted using the device ID URIs.
      *
@@ -128,6 +133,13 @@
             groups.sort(Comparators.GROUP_COMPARATOR);
             sortedGroups.put(d, groups);
         }
+        if (type != null) {
+            for (Device device : sortedGroups.keySet()) {
+                sortedGroups.put(device, sortedGroups.get(device).stream()
+                        .filter(group -> GroupDescription.Type.valueOf(type.toUpperCase()).equals(group.type()))
+                        .collect(Collectors.toList()));
+            }
+        }
         return sortedGroups;
     }
 
@@ -140,7 +152,7 @@
 
         for (Group group : groups) {
             print(FORMAT, Integer.toHexString(group.id().id()), group.state(), group.type(),
-                  group.bytes(), group.packets(), group.appId().name());
+                  group.bytes(), group.packets(), group.appId().name(), group.referenceCount());
             int i = 0;
             for (GroupBucket bucket:group.buckets().buckets()) {
                 print(BUCKET_FORMAT, Integer.toHexString(group.id().id()), ++i,