ONOS-4403 Remove intents using appId when apps get deactivated.

Change-Id: Ieaea8aeff2f2c29287a3e2eea33654fa22d38c09
diff --git a/apps/routing-api/src/main/java/org/onosproject/routing/IntentSynchronizationService.java b/apps/routing-api/src/main/java/org/onosproject/routing/IntentSynchronizationService.java
index f9cf7f9..8f97264 100644
--- a/apps/routing-api/src/main/java/org/onosproject/routing/IntentSynchronizationService.java
+++ b/apps/routing-api/src/main/java/org/onosproject/routing/IntentSynchronizationService.java
@@ -16,6 +16,7 @@
 
 package org.onosproject.routing;
 
+import org.onosproject.core.ApplicationId;
 import org.onosproject.net.intent.Intent;
 
 /**
@@ -48,4 +49,12 @@
      * @param intent intent to withdraw
      */
     void withdraw(Intent intent);
+
+    /**
+     * Withdraws intents by app Id.
+     *
+     * @param applicationId the Id of the application that created the intents
+     *                      to be removed
+     */
+    void removeIntentsByAppId(ApplicationId applicationId);
 }
diff --git a/apps/routing/src/main/java/org/onosproject/routing/impl/IntentSynchronizer.java b/apps/routing/src/main/java/org/onosproject/routing/impl/IntentSynchronizer.java
index 288c930..3b47256 100644
--- a/apps/routing/src/main/java/org/onosproject/routing/impl/IntentSynchronizer.java
+++ b/apps/routing/src/main/java/org/onosproject/routing/impl/IntentSynchronizer.java
@@ -143,6 +143,28 @@
     }
 
     @Override
+    public void removeIntentsByAppId(ApplicationId appId) {
+        if (!isElectedLeader) {
+            // Only leader will withdraw intents
+            return;
+        }
+
+        log.debug("Withdrawing intents for app {}...",
+                  appId);
+
+        intents.entrySet()
+                .stream()
+                .filter(intent -> intent.getValue().appId().equals(appId))
+                .forEach(intent -> {
+                    log.debug("Intent Synchronizer withdrawing intent: {}",
+                              intent);
+                    intentService.withdraw(intent.getValue());
+                    intents.remove(intent.getKey(), intent.getValue());
+                    log.info("Tried to clean intents for app: {}", appId);
+                });
+    }
+
+    @Override
     public void submit(Intent intent) {
         synchronized (this) {
             intents.put(intent.key(), intent);
diff --git a/apps/sdnip/src/main/java/org/onosproject/sdnip/SdnIp.java b/apps/sdnip/src/main/java/org/onosproject/sdnip/SdnIp.java
index cd4be3d..3366d91 100644
--- a/apps/sdnip/src/main/java/org/onosproject/sdnip/SdnIp.java
+++ b/apps/sdnip/src/main/java/org/onosproject/sdnip/SdnIp.java
@@ -89,9 +89,9 @@
                                                        interfaceService);
         peerConnectivity.start();
 
-        // TODO fix removing intents
-        applicationService.registerDeactivateHook(appId,
-                intentSynchronizerAdmin::removeIntents);
+        applicationService.registerDeactivateHook(appId, () -> {
+            intentSynchronizer.removeIntentsByAppId(appId);
+        });
 
         log.info("SDN-IP started");
     }
diff --git a/apps/vpls/src/main/java/org/onosproject/vpls/Vpls.java b/apps/vpls/src/main/java/org/onosproject/vpls/Vpls.java
index 4898f91..2622bc8 100644
--- a/apps/vpls/src/main/java/org/onosproject/vpls/Vpls.java
+++ b/apps/vpls/src/main/java/org/onosproject/vpls/Vpls.java
@@ -92,8 +92,9 @@
                                               intentService,
                                               intentSynchronizer);
 
-        applicationService.registerDeactivateHook(appId,
-                                                  intentSynchronizerAdmin::removeIntents);
+        applicationService.registerDeactivateHook(appId, () -> {
+            intentSynchronizer.removeIntentsByAppId(appId);
+        });
 
         hostService.addListener(hostListener);
         interfaceService.addListener(interfaceListener);
diff --git a/apps/vpls/src/test/java/org/onosproject/vpls/VplsTest.java b/apps/vpls/src/test/java/org/onosproject/vpls/VplsTest.java
index 18d1d03..981ea9b 100644
--- a/apps/vpls/src/test/java/org/onosproject/vpls/VplsTest.java
+++ b/apps/vpls/src/test/java/org/onosproject/vpls/VplsTest.java
@@ -666,12 +666,14 @@
 
         @Override
         public void modifyPrimary(boolean isPrimary) {
-
         }
 
         @Override
         public void removeIntents() {
+        }
 
+        @Override
+        public void removeIntentsByAppId(ApplicationId applicationId) {
         }
     }