ONOS-4380 Refactor AlarmId and Alarm construction and update

Change-Id: I0117afda723ba27aadb1db306f7ce15b666f102d
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 7f78cda..bfe7627 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
@@ -16,7 +16,6 @@
 package org.onosproject.faultmanagement.impl;
 
 import com.google.common.collect.ImmutableSet;
-import org.apache.commons.collections.CollectionUtils;
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Deactivate;
@@ -95,33 +94,52 @@
         return true;
     }
 
+    //TODO maybe map for field to update ?
     @Override
     public Alarm updateBookkeepingFields(AlarmId id, boolean isAcknowledged, String assignedUser) {
-
         Alarm found = store.getAlarm(id);
         if (found == null) {
             throw new ItemNotFoundException("Alarm with id " + id + " found");
         }
-
         Alarm updated = new DefaultAlarm.Builder(found)
                 .withId(found.id())
                 .withAcknowledged(isAcknowledged)
                 .withAssignedUser(assignedUser).build();
-        store.setAlarm(updated);
+        store.createOrUpdateAlarm(updated);
         return updated;
     }
 
-    public Alarm clear(AlarmId id) {
+    @Override
+    public Alarm updateBookkeepingFields(AlarmId id, boolean clear, boolean isAcknowledged,
+                                         String assignedUser) {
+        checkNotNull(id, "Alarm id is null");
         Alarm found = store.getAlarm(id);
         if (found == null) {
-            log.warn("Alarm {} is not present", id);
-            return null;
+            throw new ItemNotFoundException("Alarm with id " + id + " found");
         }
-        Alarm updated = new DefaultAlarm.Builder(found).withId(id).clear().build();
-        store.setAlarm(updated);
+        long now = System.currentTimeMillis();
+        DefaultAlarm.Builder alarmBuilder = new DefaultAlarm.Builder(found).withTimeUpdated(now);
+        if (found.cleared() != clear) {
+            alarmBuilder.clear().withTimeCleared(now);
+        }
+        if (found.acknowledged() != isAcknowledged) {
+            alarmBuilder.withAcknowledged(isAcknowledged);
+        }
+        if (assignedUser != null && !found.assignedUser().equals(assignedUser)) {
+            alarmBuilder.withAssignedUser(assignedUser);
+        }
+        DefaultAlarm updated = alarmBuilder.build();
+        store.createOrUpdateAlarm(updated);
         return updated;
     }
 
+    //TODO move to AlarmAdminService
+    @Override
+    public void remove(AlarmId id) {
+        checkNotNull(id, "Alarm id is null");
+        store.removeAlarm(id);
+    }
+
     @Override
     public Map<Alarm.SeverityLevel, Long> getAlarmCounts(DeviceId deviceId) {
         return getAlarms(deviceId).stream().collect(
@@ -185,35 +203,6 @@
         return new InternalAlarmProviderService(provider);
     }
 
-    // Synchronised to prevent duplicate NE alarms being raised
-    protected synchronized void updateAlarms(DeviceId deviceId, Set<Alarm> discoveredSet) {
-        Set<Alarm> storedSet = getActiveAlarms(deviceId);
-        log.debug("CurrentNeAlarms={}. DiscoveredAlarms={}", storedSet, discoveredSet);
-
-        if (CollectionUtils.isEqualCollection(storedSet, discoveredSet)) {
-            log.debug("No update for {}.", deviceId);
-            return;
-        }
-        //TODO implement distinction between UPDATED and CLEARED ALARMS
-        storedSet.stream().filter(
-                (stored) -> (!discoveredSet.contains(stored))).forEach((stored) -> {
-            log.debug("Alarm will be Cleared as it is not on the device. Cleared alarm: {}.", stored);
-            clear(stored.id());
-        });
-
-        discoveredSet.stream().filter(
-                (discovered) -> (!storedSet.contains(discovered))).forEach((discovered) -> {
-            log.info("New alarm raised {}", discovered);
-            AlarmId id = generateAlarmId();
-            store.setAlarm(new DefaultAlarm.Builder(discovered).withId(id).build());
-        });
-    }
-
-    //TODO improve implementation of AlarmId
-    private AlarmId generateAlarmId() {
-        return AlarmId.alarmId(alarmIdGenerator.incrementAndGet());
-    }
-
     private class InternalAlarmProviderService extends AbstractProviderService<AlarmProvider>
             implements AlarmProviderService {
 
@@ -223,7 +212,7 @@
 
         @Override
         public void updateAlarmList(DeviceId deviceId, Collection<Alarm> alarms) {
-            updateAlarms(deviceId, ImmutableSet.copyOf(alarms));
+            alarms.forEach(alarm -> store.createOrUpdateAlarm(alarm));
         }
     }
 }