resources cmd: option to show only available resource

Change-Id: I75fd80c2d3258b76ca1b99581b0b5ada8e203f11
diff --git a/cli/src/main/java/org/onosproject/cli/net/ResourcesCommand.java b/cli/src/main/java/org/onosproject/cli/net/ResourcesCommand.java
index ca4fa33..22b0f87 100644
--- a/cli/src/main/java/org/onosproject/cli/net/ResourcesCommand.java
+++ b/cli/src/main/java/org/onosproject/cli/net/ResourcesCommand.java
@@ -56,6 +56,11 @@
          description = "Lists registered resources")
 public class ResourcesCommand extends AbstractShellCommand {
 
+    @Option(name = "-a", aliases = "--available",
+            description = "Output available resources only",
+            required = false, multiValued = false)
+    boolean availablesOnly = false;
+
     @Option(name = "-s", aliases = "--sort", description = "Sort output",
             required = false, multiValued = false)
     boolean sort = false;
@@ -102,7 +107,6 @@
     }
 
     private void printResource(Resource resource, int level) {
-        // TODO add an option to show only available resource
         // workaround to preserve the original behavior of ResourceService#getRegisteredResources
         Set<Resource> children;
         if (resource instanceof DiscreteResource) {
@@ -118,21 +122,27 @@
             if (resource instanceof ContinuousResource) {
                 print("%s%s: %f", Strings.repeat(" ", level),
                                   resourceName,
-                                  // Note: last() does not return, what we've registered
-                                  // following does not work
-                                  //((Class<?>) resource.last()).getSimpleName(),
                                   ((ContinuousResource) resource).value());
                 // Continuous resource is terminal node, stop here
                 return;
             } else {
+                String availability = "";
+                if (availablesOnly && !children.isEmpty()) {
+                    // intermediate nodes cannot be omitted, print availability
+                    if (resourceService.isAvailable(resource)) {
+                        availability = " ✔";
+                    } else {
+                        availability = " ✘";
+                    }
+                }
                 String toString = String.valueOf(resource.valueAs(Object.class).orElse(""));
                 if (toString.startsWith(resourceName)) {
-                    print("%s%s", Strings.repeat(" ", level),
-                          toString);
+                    print("%s%s%s", Strings.repeat(" ", level),
+                          toString, availability);
                 } else {
-                    print("%s%s: %s", Strings.repeat(" ", level),
+                    print("%s%s: %s%s", Strings.repeat(" ", level),
                           resourceName,
-                          toString);
+                          toString, availability);
                 }
             }
         }
@@ -219,6 +229,10 @@
                 // resource which has children should be printed
                 return true;
             }
+            if (availablesOnly && !resourceService.isAvailable(resource)) {
+                // don't print unavailable discrete resource
+                return false;
+            }
         } else if (!(resource instanceof ContinuousResource)) {
             log.warn("Unexpected resource class: {}", resource.getClass().getSimpleName());
             return false;