DistributedIntentStore: attempt to fix ONOS-103

Change-Id: I075ba95907c9edc2596ac8bb5f88a23d8e2af204
diff --git a/core/store/dist/src/main/java/org/onlab/onos/store/intent/impl/DistributedIntentStore.java b/core/store/dist/src/main/java/org/onlab/onos/store/intent/impl/DistributedIntentStore.java
index 8c18fb0..d786a6c 100644
--- a/core/store/dist/src/main/java/org/onlab/onos/store/intent/impl/DistributedIntentStore.java
+++ b/core/store/dist/src/main/java/org/onlab/onos/store/intent/impl/DistributedIntentStore.java
@@ -16,7 +16,11 @@
 package org.onlab.onos.store.intent.impl;
 
 import com.google.common.collect.ImmutableSet;
+import com.hazelcast.core.EntryAdapter;
+import com.hazelcast.core.EntryEvent;
+import com.hazelcast.core.EntryListener;
 import com.hazelcast.core.IMap;
+import com.hazelcast.core.Member;
 
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
@@ -87,6 +91,8 @@
         // TODO: disable near cache, disable read from backup for this IMap
         IMap<byte[], byte[]> rawStates = super.theInstance.getMap("intent-states");
         states = new SMap<>(rawStates , super.serializer);
+        EntryListener<IntentId, IntentState> listener = new RemoteIntentStateListener();
+        states.addEntryListener(listener , false);
 
         transientStates.clear();
 
@@ -213,5 +219,21 @@
         installable.remove(intentId);
     }
 
-    // FIXME add handler to react to remote event
+    public final class RemoteIntentStateListener extends EntryAdapter<IntentId, IntentState> {
+
+        @Override
+        public void onEntryEvent(EntryEvent<IntentId, IntentState> event) {
+            final Member myself = theInstance.getCluster().getLocalMember();
+            if (!myself.equals(event.getMember())) {
+                // When Intent state was modified by remote node,
+                // clear local transient state.
+                final IntentId intentId = event.getKey();
+                IntentState oldState = transientStates.remove(intentId);
+                if (oldState != null) {
+                    log.debug("{} state updated remotely, removing transient state {}",
+                              intentId, oldState);
+                }
+            }
+        }
+    }
 }