Updating IntentCleanup to check for stalled *_REQ and *ING intents.

Change-Id: Ibe06ee99463bb8230acf9751da4fb1012859b0ea
diff --git a/core/store/dist/src/main/java/org/onosproject/store/impl/WallClockTimestamp.java b/core/store/dist/src/main/java/org/onosproject/store/impl/WallClockTimestamp.java
index a158928..e7efb29 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/impl/WallClockTimestamp.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/impl/WallClockTimestamp.java
@@ -36,6 +36,10 @@
         unixTimestamp = System.currentTimeMillis();
     }
 
+    public WallClockTimestamp(long timestamp) {
+        unixTimestamp = timestamp;
+    }
+
     @Override
     public int compareTo(Timestamp o) {
         checkArgument(o instanceof WallClockTimestamp,
diff --git a/core/store/dist/src/main/java/org/onosproject/store/intent/impl/GossipIntentStore.java b/core/store/dist/src/main/java/org/onosproject/store/intent/impl/GossipIntentStore.java
index 4f0ad66..7de2d17 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/intent/impl/GossipIntentStore.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/intent/impl/GossipIntentStore.java
@@ -132,10 +132,13 @@
     }
 
     @Override
-    public Iterable<IntentData> getIntentData(boolean localOnly) {
-        if (localOnly) {
+    public Iterable<IntentData> getIntentData(boolean localOnly, long olderThan) {
+        if (localOnly || olderThan > 0) {
+            long now = System.currentTimeMillis();
+            final WallClockTimestamp time = new WallClockTimestamp(now - olderThan);
             return currentMap.values().stream()
-                    .filter(data -> isMaster(data.key()))
+                    .filter(data -> data.version().isOlderThan(time) &&
+                            (!localOnly || isMaster(data.key())))
                     .collect(Collectors.toList());
         }
         return currentMap.values();
@@ -261,6 +264,21 @@
                 .collect(Collectors.toList());
     }
 
+    @Override
+    public Iterable<IntentData> getPendingData() {
+        return pendingMap.values();
+    }
+
+    @Override
+    public Iterable<IntentData> getPendingData(boolean localOnly, long olderThan) {
+        long now = System.currentTimeMillis();
+        final WallClockTimestamp time = new WallClockTimestamp(now - olderThan);
+        return pendingMap.values().stream()
+                .filter(data -> data.version().isOlderThan(time) &&
+                                (!localOnly || isMaster(data.key())))
+                .collect(Collectors.toList());
+    }
+
     private void notifyDelegateIfNotNull(IntentEvent event) {
         if (event != null) {
             notifyDelegate(event);
diff --git a/core/store/trivial/src/main/java/org/onosproject/store/trivial/impl/SimpleIntentStore.java b/core/store/trivial/src/main/java/org/onosproject/store/trivial/impl/SimpleIntentStore.java
index 186fdd9..72a5dce 100644
--- a/core/store/trivial/src/main/java/org/onosproject/store/trivial/impl/SimpleIntentStore.java
+++ b/core/store/trivial/src/main/java/org/onosproject/store/trivial/impl/SimpleIntentStore.java
@@ -36,7 +36,7 @@
 import java.util.stream.Collectors;
 
 import static com.google.common.base.Preconditions.checkNotNull;
-import static org.onosproject.net.intent.IntentState.*;
+import static org.onosproject.net.intent.IntentState.PURGE_REQ;
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
@@ -76,11 +76,15 @@
     }
 
     @Override
-    public Iterable<IntentData> getIntentData(boolean localOnly) {
-        if (localOnly) {
-            return current.values().stream()
-                    .filter(data -> isMaster(data.key()))
+    public Iterable<IntentData> getIntentData(boolean localOnly, long olderThan) {
+        if (localOnly || olderThan > 0) {
+            long older = System.nanoTime() - olderThan * 1_000_000; //convert ms to ns
+            final SystemClockTimestamp time = new SystemClockTimestamp(older);
+            return pending.values().stream()
+                    .filter(data -> data.version().isOlderThan(time) &&
+                            (!localOnly || isMaster(data.key())))
                     .collect(Collectors.toList());
+
         }
         return Lists.newArrayList(current.values());
     }
@@ -191,4 +195,19 @@
                 .map(IntentData::intent)
                 .collect(Collectors.toList());
     }
+
+    @Override
+    public Iterable<IntentData> getPendingData() {
+        return Lists.newArrayList(pending.values());
+    }
+
+    @Override
+    public Iterable<IntentData> getPendingData(boolean localOnly, long olderThan) {
+        long older = System.nanoTime() - olderThan * 1_000_000; //convert ms to ns
+        final SystemClockTimestamp time = new SystemClockTimestamp(older);
+        return pending.values().stream()
+                .filter(data -> data.version().isOlderThan(time) &&
+                        (!localOnly || isMaster(data.key())))
+                .collect(Collectors.toList());
+    }
 }
diff --git a/core/store/trivial/src/main/java/org/onosproject/store/trivial/impl/SystemClockTimestamp.java b/core/store/trivial/src/main/java/org/onosproject/store/trivial/impl/SystemClockTimestamp.java
index d79797e..1e98a7a 100644
--- a/core/store/trivial/src/main/java/org/onosproject/store/trivial/impl/SystemClockTimestamp.java
+++ b/core/store/trivial/src/main/java/org/onosproject/store/trivial/impl/SystemClockTimestamp.java
@@ -29,10 +29,14 @@
  */
 public class SystemClockTimestamp implements Timestamp {
 
-    private final long unixTimestamp;
+    private final long nanoTimestamp;
 
     public SystemClockTimestamp() {
-        unixTimestamp = System.nanoTime();
+        nanoTimestamp = System.nanoTime();
+    }
+
+    public SystemClockTimestamp(long timestamp) {
+        nanoTimestamp = timestamp;
     }
 
     @Override
@@ -42,12 +46,12 @@
         SystemClockTimestamp that = (SystemClockTimestamp) o;
 
         return ComparisonChain.start()
-                .compare(this.unixTimestamp, that.unixTimestamp)
+                .compare(this.nanoTimestamp, that.nanoTimestamp)
                 .result();
     }
     @Override
     public int hashCode() {
-        return Objects.hash(unixTimestamp);
+        return Objects.hash(nanoTimestamp);
     }
 
     @Override
@@ -59,17 +63,21 @@
             return false;
         }
         SystemClockTimestamp that = (SystemClockTimestamp) obj;
-        return Objects.equals(this.unixTimestamp, that.unixTimestamp);
+        return Objects.equals(this.nanoTimestamp, that.nanoTimestamp);
     }
 
     @Override
     public String toString() {
         return MoreObjects.toStringHelper(getClass())
-                    .add("unixTimestamp", unixTimestamp)
+                    .add("nanoTimestamp", nanoTimestamp)
                     .toString();
     }
 
+    public long nanoTimestamp() {
+        return nanoTimestamp;
+    }
+
     public long systemTimestamp() {
-        return unixTimestamp;
+        return nanoTimestamp / 1_000_000; // convert ns to ms
     }
 }