Remove leftover Link, Device attachment on removePort()

Change-Id: I395e60d29ca33f558492e1fb9807cca053024e98
diff --git a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraphImpl.java b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraphImpl.java
index 0957be7..921907e 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraphImpl.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraphImpl.java
@@ -736,25 +736,38 @@
 		return;
 	    }
 
-	    // check if there is something referring to this Port
+	    // Remove Link and Device Attachment
+	    for (Device device : p.getDevices()) {
+		log.debug("Removing Device {} on Port {}", device, portEvt);
+		DeviceEvent devEvt = new DeviceEvent(device.getMacAddress());
+		devEvt.addAttachmentPoint(new SwitchPort(p.getSwitch().getDpid(), p.getNumber()));
 
-	    if (!p.getDevices().iterator().hasNext()) {
-		log.warn(
-			"Devices on Port {} should be removed prior to removing Port. Removing Port anyways",
-			portEvt);
-		// XXX Should we remove Device to Port relation?
+		// XXX calling removeDeviceEvent() may trigger duplicate event, once at prepare phase, second time here
+		// If event can be squashed, ignored etc. at receiver side it shouldn't be a problem, but if not
+		// need to re-visit
+
+		// calling Discovery API to wipe from DB, etc.
+		removeDeviceEvent(devEvt);
 	    }
-	    if (p.getIncomingLink() != null) {
-		log.warn(
-			"IncomingLinks on Port {} should be removed prior to removing Port. Removing Port anyways",
-			portEvt);
-		// XXX Should we remove Link?
+	    Set<Link> links = new HashSet<>();
+	    links.add(p.getOutgoingLink());
+	    links.add(p.getIncomingLink());
+	    ArrayList<LinkEvent> linksToRemove = new ArrayList<>();
+	    for (Link link : links) {
+		if (link == null) {
+		    continue;
+		}
+		log.debug("Removing Link {} on Port {}", link, portEvt);
+		LinkEvent linkEvent = new LinkEvent(link.getSourceSwitchDpid(), link.getSourcePortNumber(), link.getDestinationSwitchDpid(), link.getDestinationPortNumber());
+		linksToRemove.add(linkEvent);
 	    }
-	    if (p.getOutgoingLink() != null) {
-		log.warn(
-			"OutgoingLinks on Port {} should be removed prior to removing Port. Removing Port anyways",
-			portEvt);
-		// XXX Should we remove Link?
+	    for (LinkEvent linkEvent : linksToRemove) {
+		// XXX calling removeLinkEvent() may trigger duplicate event, once at prepare phase, second time here
+		// If event can be squashed, ignored etc. at receiver side it shouldn't be a problem, but if not
+		// need to re-visit
+
+		// calling Discovery API to wipe from DB, etc.
+		removeLinkEvent(linkEvent);
 	    }
 
 	    // remove Port from Switch