ONOS-5894 FaultManagement minor refactoring and optimizing CLI commands

Change-Id: I84fca00caaa191b511a642962caeed61a7decbd8
diff --git a/apps/faultmanagement/fmcli/src/main/java/org/onosproject/faultmanagement/alarms/cli/GetAllActiveAlarms.java b/apps/faultmanagement/fmcli/src/main/java/org/onosproject/faultmanagement/alarms/cli/GetAllActiveAlarms.java
deleted file mode 100644
index 7fa9d06..0000000
--- a/apps/faultmanagement/fmcli/src/main/java/org/onosproject/faultmanagement/alarms/cli/GetAllActiveAlarms.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright 2015-present Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.faultmanagement.alarms.cli;
-
-import java.util.Set;
-import org.apache.commons.lang3.builder.ToStringBuilder;
-import org.apache.commons.lang3.builder.ToStringStyle;
-import org.apache.karaf.shell.commands.Command;
-import org.onosproject.cli.AbstractShellCommand;
-import org.onosproject.incubator.net.faultmanagement.alarm.Alarm;
-import org.onosproject.incubator.net.faultmanagement.alarm.AlarmService;
-
-/**
- * Lists active alarms across all devices.
- */
-@Command(scope = "onos", name = "alarm-list-active",
-        description = "Lists all the ACTIVE alarms across all devices.")
-public class GetAllActiveAlarms extends AbstractShellCommand {
-
-
-    @Override
-    protected void execute() {
-        printAlarms(AbstractShellCommand.get(AlarmService.class).getActiveAlarms());
-    }
-
-    void printAlarms(Set<Alarm> alarms) {
-        alarms.forEach((alarm) -> {
-            print(ToStringBuilder.reflectionToString(alarm, ToStringStyle.SHORT_PREFIX_STYLE));
-        });
-    }
-}
diff --git a/apps/faultmanagement/fmcli/src/main/java/org/onosproject/faultmanagement/alarms/cli/GetAllAlarms.java b/apps/faultmanagement/fmcli/src/main/java/org/onosproject/faultmanagement/alarms/cli/GetAllAlarms.java
index a44dc1e..49456da 100644
--- a/apps/faultmanagement/fmcli/src/main/java/org/onosproject/faultmanagement/alarms/cli/GetAllAlarms.java
+++ b/apps/faultmanagement/fmcli/src/main/java/org/onosproject/faultmanagement/alarms/cli/GetAllAlarms.java
@@ -15,27 +15,55 @@
  */
 package org.onosproject.faultmanagement.alarms.cli;
 
-import java.util.Set;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
+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.incubator.net.faultmanagement.alarm.Alarm;
 import org.onosproject.incubator.net.faultmanagement.alarm.AlarmService;
+import org.onosproject.net.DeviceId;
+
+import java.util.Set;
 
 /**
  * Lists alarms across all devices.
  */
-@Command(scope = "onos", name = "alarm-list",
-        description = "Lists active alarms across all devices.")
+@Command(scope = "onos", name = "alarms",
+        description = "Lists alarms")
 public class GetAllAlarms extends AbstractShellCommand {
 
+    @Option(name = "-a", aliases = "--active", description = "Shows ACTIVE alarms only",
+            required = false, multiValued = false)
+    private boolean activeOnly = false;
+
+    @Argument(index = 0, name = "deviceId", description = "Device identity",
+            required = false, multiValued = false)
+    String deviceId = null;
+
+    private AlarmService alarmService = AbstractShellCommand.get(AlarmService.class);
+    private Set<Alarm> alarms;
+
     @Override
     protected void execute() {
-        printAlarms(AbstractShellCommand.get(AlarmService.class).getAlarms());
+        if (deviceId != null) {
+            if (activeOnly) {
+                alarms = alarmService.getActiveAlarms(DeviceId.deviceId(deviceId));
+            } else {
+                alarms = alarmService.getAlarms(DeviceId.deviceId(deviceId));
+            }
+        } else if (activeOnly) {
+            alarms = alarmService.getActiveAlarms();
+        } else {
+            alarms = alarmService.getAlarms();
+        }
+        printAlarms(alarms);
     }
 
+
     void printAlarms(Set<Alarm> alarms) {
+        //FIXME this can be better formatted
         alarms.forEach((alarm) -> {
             print(ToStringBuilder.reflectionToString(alarm, ToStringStyle.SHORT_PREFIX_STYLE));
         });
diff --git a/apps/faultmanagement/fmcli/src/main/java/org/onosproject/faultmanagement/alarms/cli/GetAllAlarmsCounts.java b/apps/faultmanagement/fmcli/src/main/java/org/onosproject/faultmanagement/alarms/cli/GetAllAlarmsCounts.java
index 9f689e4..a5413dc 100644
--- a/apps/faultmanagement/fmcli/src/main/java/org/onosproject/faultmanagement/alarms/cli/GetAllAlarmsCounts.java
+++ b/apps/faultmanagement/fmcli/src/main/java/org/onosproject/faultmanagement/alarms/cli/GetAllAlarmsCounts.java
@@ -15,30 +15,59 @@
  */
 package org.onosproject.faultmanagement.alarms.cli;
 
-import java.util.Map;
+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.incubator.net.faultmanagement.alarm.Alarm;
 import org.onosproject.incubator.net.faultmanagement.alarm.AlarmService;
+import org.onosproject.net.DeviceId;
+
+import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * Lists alarm counts across all devices.
  */
-@Command(scope = "onos", name = "alarm-counts",
-        description = "Lists alarm counts across all devices.")
+@Command(scope = "onos", name = "alarms-counts",
+        description = "Lists the count of alarms for each severity")
 public class GetAllAlarmsCounts extends AbstractShellCommand {
 
+    @Option(name = "-a", aliases = "--active", description = "Shows ACTIVE alarms only",
+            required = false, multiValued = false)
+    private boolean activeOnly = false;
+
+    @Argument(index = 0, name = "deviceId", description = "Device identity",
+            required = false, multiValued = false)
+    String deviceId = null;
+
+    private AlarmService alarmService = AbstractShellCommand.get(AlarmService.class);
+    private Map<Alarm.SeverityLevel, Long> alarmCounts;
+
     @Override
     protected void execute() {
-        Map<Alarm.SeverityLevel, Long> alarmCounts
-                = AbstractShellCommand.get(AlarmService.class).getAlarmCounts();
+        if (deviceId != null) {
+            if (activeOnly) {
+                alarmCounts = alarmService.getActiveAlarms(DeviceId.deviceId(deviceId))
+                        .stream().filter(a -> !a.severity().equals(Alarm.SeverityLevel.CLEARED))
+                        .collect(Collectors.groupingBy(Alarm::severity, Collectors.counting()));
+            } else {
+                alarmCounts = alarmService.
+                        getAlarmCounts(DeviceId.deviceId(deviceId));
+            }
+        } else if (activeOnly) {
+            alarmCounts = alarmService.getActiveAlarms()
+                    .stream().filter(a -> !a.severity().equals(Alarm.SeverityLevel.CLEARED))
+                    .collect(Collectors.groupingBy(Alarm::severity, Collectors.counting()));
+        } else {
+            alarmCounts = alarmService.getAlarmCounts();
+        }
         printCounts(alarmCounts);
     }
 
     void printCounts(Map<Alarm.SeverityLevel, Long> alarmCounts) {
         alarmCounts.entrySet().forEach((countEntry) -> {
-            print(String.format("%s, %d",
-                    countEntry.getKey(), countEntry.getValue()));
+            print(String.format("%s, %d", countEntry.getKey(), countEntry.getValue()));
 
         });
     }
diff --git a/apps/faultmanagement/fmcli/src/main/java/org/onosproject/faultmanagement/alarms/cli/GetDeviceAlarmsCounts.java b/apps/faultmanagement/fmcli/src/main/java/org/onosproject/faultmanagement/alarms/cli/GetDeviceAlarmsCounts.java
deleted file mode 100644
index f446ef7..0000000
--- a/apps/faultmanagement/fmcli/src/main/java/org/onosproject/faultmanagement/alarms/cli/GetDeviceAlarmsCounts.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright 2015-present Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.faultmanagement.alarms.cli;
-
-import java.util.Map;
-import org.apache.karaf.shell.commands.Argument;
-import org.apache.karaf.shell.commands.Command;
-import org.onosproject.cli.AbstractShellCommand;
-import org.onosproject.incubator.net.faultmanagement.alarm.Alarm;
-import org.onosproject.incubator.net.faultmanagement.alarm.AlarmService;
-import org.onosproject.net.DeviceId;
-
-/**
- * Lists alarm counts across specified device.
- */
-@Command(scope = "onos", name = "alarm-counts-device",
-        description = "Lists alarm counts across specified device.")
-public class GetDeviceAlarmsCounts extends AbstractShellCommand {
-
-    @Argument(index = 0, name = "deviceId", description = "Device identity", required = true, multiValued = false)
-    String deviceId = null;
-
-    @Override
-    protected void execute() {
-        Map<Alarm.SeverityLevel, Long> alarmCounts = AbstractShellCommand.get(AlarmService.class).
-                getAlarmCounts(DeviceId.deviceId(deviceId));
-        // Deliberately using same formatting for both ...
-        printCounts(alarmCounts);
-    }
-
-    void printCounts(Map<Alarm.SeverityLevel, Long> alarmCounts) {
-        alarmCounts.entrySet().forEach((countEntry) -> {
-            print(String.format("%s, %d",
-                    countEntry.getKey(), countEntry.getValue()));
-
-        });
-    }
-}
diff --git a/apps/faultmanagement/fmcli/src/main/resources/OSGI-INF/blueprint/shell-config.xml b/apps/faultmanagement/fmcli/src/main/resources/OSGI-INF/blueprint/shell-config.xml
index 5beb281..198dcc7 100644
--- a/apps/faultmanagement/fmcli/src/main/resources/OSGI-INF/blueprint/shell-config.xml
+++ b/apps/faultmanagement/fmcli/src/main/resources/OSGI-INF/blueprint/shell-config.xml
@@ -18,22 +18,18 @@
     <command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.1.0">
 
         <command>
-            <action class="org.onosproject.faultmanagement.alarms.cli.GetAllActiveAlarms"/>
-        </command>
-        <command>
             <action class="org.onosproject.faultmanagement.alarms.cli.GetAllAlarms"/>
+            <completers>
+                <ref component-id="deviceIdCompleter"/>
+            </completers>
         </command>
         <command>
             <action class="org.onosproject.faultmanagement.alarms.cli.GetAllAlarmsCounts"/>
-        </command>        
-        <command>
-            <action class="org.onosproject.faultmanagement.alarms.cli.GetDeviceAlarmsCounts"/>
             <completers>
                 <ref component-id="deviceIdCompleter"/>
             </completers>
         </command>
     </command-bundle>
- 
 
     <bean id="deviceIdCompleter" class="org.onosproject.cli.net.DeviceIdCompleter"/>
 
diff --git a/apps/faultmanagement/fmmgr/src/main/java/org/onosproject/faultmanagement/impl/AlarmManager.java b/apps/faultmanagement/fmmgr/src/main/java/org/onosproject/faultmanagement/impl/AlarmManager.java
index 80d3ed5..7f78cda 100644
--- a/apps/faultmanagement/fmmgr/src/main/java/org/onosproject/faultmanagement/impl/AlarmManager.java
+++ b/apps/faultmanagement/fmmgr/src/main/java/org/onosproject/faultmanagement/impl/AlarmManager.java
@@ -164,12 +164,6 @@
         return ImmutableSet.copyOf(store.getAlarms(deviceId));
     }
 
-    private Set<Alarm> getActiveAlarms(DeviceId deviceId) {
-        return ImmutableSet.copyOf(getActiveAlarms().stream().filter(
-                a -> deviceId.equals(a.deviceId())).
-                collect(Collectors.toSet()));
-    }
-
     @Override
     public Set<Alarm> getAlarms(DeviceId deviceId, AlarmEntityId source) {
         return ImmutableSet.copyOf(getAlarms(deviceId).stream().filter(
diff --git a/incubator/api/src/main/java/org/onosproject/incubator/net/faultmanagement/alarm/AlarmService.java b/incubator/api/src/main/java/org/onosproject/incubator/net/faultmanagement/alarm/AlarmService.java
index d233e34..4cee1ca 100644
--- a/incubator/api/src/main/java/org/onosproject/incubator/net/faultmanagement/alarm/AlarmService.java
+++ b/incubator/api/src/main/java/org/onosproject/incubator/net/faultmanagement/alarm/AlarmService.java
@@ -21,6 +21,7 @@
 
 import java.util.Map;
 import java.util.Set;
+import java.util.stream.Collectors;
 
 /**
  * Service for interacting with the alarm handling of devices. Unless stated otherwise, getter methods
@@ -93,6 +94,18 @@
     Set<Alarm> getAlarms(DeviceId deviceId);
 
     /**
+     * Returns all of the ACTIVE alarms for a specific device. Recently cleared alarms excluded.
+     *
+     * @param deviceId the device to use when searching alarms.
+     * @return set of alarms; empty set if no alarms
+     */
+    default Set<Alarm> getActiveAlarms(DeviceId deviceId) {
+        return getActiveAlarms().stream()
+                .filter(a -> deviceId.equals(a.deviceId()))
+                .collect(Collectors.toSet());
+    }
+
+    /**
      * Returns the alarm for a given device and source.
      *
      * @param deviceId the device