[Falcon] Componentize IntentSynchronizer and SdnIpFib.

Change-Id: Ic384ce00572ae1e4bbf94b4de814cea3499d3828
diff --git a/apps/sdnip/src/main/java/org/onosproject/sdnip/SdnIpFib.java b/apps/sdnip/src/main/java/org/onosproject/sdnip/SdnIpFib.java
index 9113e01..ac9baab 100644
--- a/apps/sdnip/src/main/java/org/onosproject/sdnip/SdnIpFib.java
+++ b/apps/sdnip/src/main/java/org/onosproject/sdnip/SdnIpFib.java
@@ -17,12 +17,18 @@
 package org.onosproject.sdnip;
 
 import com.google.common.collect.ImmutableList;
+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.onlab.packet.Ethernet;
 import org.onlab.packet.IpAddress;
 import org.onlab.packet.IpPrefix;
 import org.onlab.packet.MacAddress;
 import org.onlab.packet.VlanId;
 import org.onosproject.core.ApplicationId;
+import org.onosproject.core.CoreService;
 import org.onosproject.incubator.net.intf.Interface;
 import org.onosproject.incubator.net.intf.InterfaceService;
 import org.onosproject.net.ConnectPoint;
@@ -37,6 +43,7 @@
 import org.onosproject.routing.FibListener;
 import org.onosproject.routing.FibUpdate;
 import org.onosproject.routing.IntentSynchronizationService;
+import org.onosproject.routing.RoutingService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -51,40 +58,49 @@
 /**
  * FIB component of SDN-IP.
  */
-public class SdnIpFib implements FibListener {
+@Component(immediate = true)
+public class SdnIpFib {
     private Logger log = LoggerFactory.getLogger(getClass());
 
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected InterfaceService interfaceService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected IntentSynchronizationService intentSynchronizer;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected CoreService coreService;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected RoutingService routingService;
+
+    private final InternalFibListener fibListener = new InternalFibListener();
+
     private static final int PRIORITY_OFFSET = 100;
     private static final int PRIORITY_MULTIPLIER = 5;
     protected static final ImmutableList<Constraint> CONSTRAINTS
             = ImmutableList.of(new PartialFailureConstraint());
 
-    private final Map<IpPrefix, MultiPointToSinglePointIntent> routeIntents;
+    private final Map<IpPrefix, MultiPointToSinglePointIntent> routeIntents
+            = new ConcurrentHashMap<>();
 
-    private final ApplicationId appId;
-    private final InterfaceService interfaceService;
-    private final IntentSynchronizationService intentSynchronizer;
+    private ApplicationId appId;
 
-    /**
-     * Class constructor.
-     *
-     * @param appId application ID to use when generating intents
-     * @param interfaceService interface service
-     * @param intentSynchronizer intent synchronizer
-     */
-    public SdnIpFib(ApplicationId appId, InterfaceService interfaceService,
-                    IntentSynchronizationService intentSynchronizer) {
-        routeIntents = new ConcurrentHashMap<>();
+    @Activate
+    public void activate() {
+        appId = coreService.getAppId(SdnIp.SDN_IP_APP);
 
-        this.appId = appId;
-        this.interfaceService = interfaceService;
-        this.intentSynchronizer = intentSynchronizer;
+        routingService.addFibListener(fibListener);
+        routingService.start();
     }
 
+    @Deactivate
+    public void deactivate() {
+        // TODO remove listener
+        routingService.stop();
+    }
 
-    @Override
-    public void update(Collection<FibUpdate> updates,
-                       Collection<FibUpdate> withdraws) {
+    private void update(Collection<FibUpdate> updates, Collection<FibUpdate> withdraws) {
         int submitCount = 0, withdrawCount = 0;
         //
         // NOTE: Semantically, we MUST withdraw existing intents before
@@ -224,4 +240,11 @@
                 .build();
     }
 
+    private class InternalFibListener implements FibListener {
+        @Override
+        public void update(Collection<FibUpdate> updates, Collection<FibUpdate> withdraws) {
+            SdnIpFib.this.update(updates, withdraws);
+        }
+    }
+
 }