Push default forwarding objectives when device becomes available.

Change-Id: Ic3e54e99783ca1e01a984f86fdb754dcc7852c06
diff --git a/apps/cordfabric/src/main/java/org/onosproject/cordfabric/CordFabricManager.java b/apps/cordfabric/src/main/java/org/onosproject/cordfabric/CordFabricManager.java
index 723f35e..7c24144 100644
--- a/apps/cordfabric/src/main/java/org/onosproject/cordfabric/CordFabricManager.java
+++ b/apps/cordfabric/src/main/java/org/onosproject/cordfabric/CordFabricManager.java
@@ -32,6 +32,9 @@
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.PortNumber;
+import org.onosproject.net.device.DeviceEvent;
+import org.onosproject.net.device.DeviceListener;
+import org.onosproject.net.device.DeviceService;
 import org.onosproject.net.flow.DefaultTrafficSelector;
 import org.onosproject.net.flow.DefaultTrafficTreatment;
 import org.onosproject.net.flow.TrafficSelector;
@@ -70,34 +73,36 @@
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected FlowObjectiveService flowObjectiveService;
 
-    private static final int PRIORITY = 50000;
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected DeviceService deviceService;
 
-    private short openflowPort = 6633;
+    private InternalDeviceListener deviceListener = new InternalDeviceListener();
+
+    private static final int PRIORITY = 50000;
 
     private short radiusPort = 1812;
 
     private DeviceId fabricDeviceId = DeviceId.deviceId("of:5e3e486e73000187");
 
-    private ConnectPoint oltConnectPoint =
-            new ConnectPoint(fabricDeviceId, PortNumber.portNumber(2));
-    private ConnectPoint oltControllerConnectPoint =
-            new ConnectPoint(fabricDeviceId, PortNumber.portNumber(1));
-    private ConnectPoint radiusConnectPoint =
-            new ConnectPoint(fabricDeviceId, PortNumber.portNumber(5));
-
     private final Multimap<VlanId, ConnectPoint> vlans = HashMultimap.create();
 
     @Activate
     public void activate() {
         appId = coreService.registerApplication("org.onosproject.cordfabric");
 
-        setupDefaultFlows();
+        deviceService.addListener(deviceListener);
+
+        if (deviceService.isAvailable(fabricDeviceId)) {
+            setupDefaultFlows();
+        }
 
         log.info("Started");
     }
 
     @Deactivate
     public void deactivate() {
+        deviceService.removeListener(deviceListener);
+
         log.info("Stopped");
     }
 
@@ -112,8 +117,6 @@
                 .punt()
                 .build();
 
-
-
         ForwardingObjective ofToController = DefaultForwardingObjective.builder()
                 .fromApp(appId)
                 .makePermanent()
@@ -123,7 +126,6 @@
                 .withTreatment(forwardToController)
                 .add();
 
-
         flowObjectiveService.forward(fabricDeviceId, ofToController);
     }
 
@@ -223,4 +225,23 @@
             log.info("Flow objective operation failed: {}", objective);
         }
     }
+
+    /**
+     * Internal listener for device service events.
+     */
+    private class InternalDeviceListener implements DeviceListener {
+        @Override
+        public void event(DeviceEvent event) {
+            switch (event.type()) {
+            case DEVICE_ADDED:
+            case DEVICE_AVAILABILITY_CHANGED:
+                if (event.subject().id().equals(fabricDeviceId) &&
+                        deviceService.isAvailable(event.subject().id())) {
+                    setupDefaultFlows();
+                }
+            default:
+                break;
+            }
+        }
+    }
 }