[Falcon] Componentize IntentSynchronizer and SdnIpFib.

Change-Id: Ic384ce00572ae1e4bbf94b4de814cea3499d3828
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 ace888d..d0a5c22 100644
--- a/apps/sdnip/src/main/java/org/onosproject/sdnip/SdnIp.java
+++ b/apps/sdnip/src/main/java/org/onosproject/sdnip/SdnIp.java
@@ -15,136 +15,79 @@
  */
 package org.onosproject.sdnip;
 
-import static org.slf4j.LoggerFactory.getLogger;
-
-import java.util.Objects;
-
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Deactivate;
 import org.apache.felix.scr.annotations.Reference;
 import org.apache.felix.scr.annotations.ReferenceCardinality;
-import org.apache.felix.scr.annotations.Service;
 import org.onosproject.app.ApplicationService;
-import org.onosproject.cluster.ClusterService;
-import org.onosproject.cluster.ControllerNode;
-import org.onosproject.cluster.LeadershipEvent;
-import org.onosproject.cluster.LeadershipEventListener;
-import org.onosproject.cluster.LeadershipService;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
 import org.onosproject.incubator.net.intf.InterfaceService;
 import org.onosproject.net.config.NetworkConfigService;
-import org.onosproject.net.host.HostService;
-import org.onosproject.net.intent.IntentService;
+import org.onosproject.routing.IntentSynchronizationAdminService;
 import org.onosproject.routing.IntentSynchronizationService;
 import org.onosproject.routing.RoutingService;
-import org.onosproject.routing.SdnIpService;
-import org.onosproject.routing.config.RoutingConfigurationService;
 import org.slf4j.Logger;
 
+import static org.slf4j.LoggerFactory.getLogger;
+
 /**
  * Component for the SDN-IP peering application.
  */
 @Component(immediate = true)
-@Service
-public class SdnIp implements SdnIpService {
+public class SdnIp {
 
-    private static final String SDN_IP_APP = "org.onosproject.sdnip";
+    public static final String SDN_IP_APP = "org.onosproject.sdnip";
     private final Logger log = getLogger(getClass());
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected CoreService coreService;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected IntentService intentService;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected ApplicationService applicationService;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected HostService hostService;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected ClusterService clusterService;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected LeadershipService leadershipService;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected RoutingService routingService;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected RoutingConfigurationService config;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected NetworkConfigService networkConfigService;
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected InterfaceService interfaceService;
 
-    private IntentSynchronizer intentSynchronizer;
-    private PeerConnectivityManager peerConnectivity;
-    private SdnIpFib fib;
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected IntentSynchronizationService intentSynchronizer;
 
-    private LeadershipEventListener leadershipEventListener =
-            new InnerLeadershipEventListener();
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected IntentSynchronizationAdminService intentSynchronizerAdmin;
+
+    private PeerConnectivityManager peerConnectivity;
+
     private ApplicationId appId;
-    private ControllerNode localControllerNode;
 
     @Activate
     protected void activate() {
-        log.info("SDN-IP started");
-
         appId = coreService.registerApplication(SDN_IP_APP);
 
-        localControllerNode = clusterService.getLocalNode();
-
-        intentSynchronizer = new IntentSynchronizer(appId, intentService);
-        intentSynchronizer.start();
-
         peerConnectivity = new PeerConnectivityManager(appId,
                                                        intentSynchronizer,
                                                        networkConfigService,
-                coreService.getAppId(RoutingService.ROUTER_APP_ID),
+                coreService.registerApplication(RoutingService.ROUTER_APP_ID),
                                                        interfaceService);
         peerConnectivity.start();
 
-        fib = new SdnIpFib(appId, interfaceService, intentSynchronizer);
-
-        routingService.addFibListener(fib);
-        routingService.start();
-
-        leadershipService.addListener(leadershipEventListener);
-        leadershipService.runForLeadership(appId.name());
-
+        // TODO fix removing intents
         applicationService.registerDeactivateHook(appId,
-                intentSynchronizer::removeIntents);
+                intentSynchronizerAdmin::removeIntents);
 
+        log.info("SDN-IP started");
     }
 
     @Deactivate
     protected void deactivate() {
-        routingService.stop();
         peerConnectivity.stop();
-        intentSynchronizer.stop();
-
-        leadershipService.withdraw(appId.name());
-        leadershipService.removeListener(leadershipEventListener);
 
         log.info("SDN-IP Stopped");
     }
 
-    @Override
-    public void modifyPrimary(boolean isPrimary) {
-        intentSynchronizer.leaderChanged(isPrimary);
-    }
-
-    @Override
-    public IntentSynchronizationService getIntentSynchronizationService() {
-        return intentSynchronizer;
-    }
-
     /**
      * Converts DPIDs of the form xx:xx:xx:xx:xx:xx:xx to OpenFlow provider
      * device URIs.
@@ -156,38 +99,5 @@
         return "of:" + dpid.replace(":", "");
     }
 
-    /**
-     * A listener for Leadership Events.
-     */
-    private class InnerLeadershipEventListener
-        implements LeadershipEventListener {
 
-        @Override
-        public void event(LeadershipEvent event) {
-            log.debug("Leadership Event: time = {} type = {} event = {}",
-                      event.time(), event.type(), event);
-
-            if (!event.subject().topic().equals(appId.name())) {
-                return;         // Not our topic: ignore
-            }
-            if (!Objects.equals(event.subject().leader(), localControllerNode.id())) {
-                return;         // The event is not about this instance: ignore
-            }
-
-            switch (event.type()) {
-            case LEADER_ELECTED:
-                log.info("SDN-IP Leader Elected");
-                intentSynchronizer.leaderChanged(true);
-                break;
-            case LEADER_BOOTED:
-                log.info("SDN-IP Leader Lost Election");
-                intentSynchronizer.leaderChanged(false);
-                break;
-            case LEADER_REELECTED:
-                break;
-            default:
-                break;
-            }
-        }
-    }
 }