Added cleanup thread to RCNetworkGraphPublisher

Change-Id: I5c663b146d68f8bb8634ecd4e74953026da79c13
diff --git a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraph.java b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraph.java
index 9040fe7..eff5952 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraph.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraph.java
@@ -12,13 +12,13 @@
  */
 public interface NetworkGraph {
 	public Switch getSwitch(Long dpid);
-	public Iterable<? extends Switch> getSwitches();
+	public Iterable<Switch> getSwitches();
 
 	// TODO Not sure about the use-case of this method? Remove if not used at the end.
-	public Iterable<? extends Link> getLinks();
+	public Iterable<Link> getLinks();
 	// XXX next 2 method can be removed. getSwitch(dpid).getOutgoingLinks() is equivalent
-	public Iterable<? extends Link> getOutgoingLinksFromSwitch(Long dpid); // Toshi: unnecessary
-	public Iterable<? extends Link> getIncomingLinksFromSwitch(Long dpid); // Toshi: unnecessary
+	public Iterable<Link> getOutgoingLinksFromSwitch(Long dpid); // Toshi: unnecessary
+	public Iterable<Link> getIncomingLinksFromSwitch(Long dpid); // Toshi: unnecessary
 
 	public Iterable<Device> getDeviceByIp(InetAddress ipAddress);
 	public Device getDeviceByMac(MACAddress address);
diff --git a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraphDatastore.java b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraphDatastore.java
index 52a6ab7..a3069c3 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraphDatastore.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraphDatastore.java
@@ -5,6 +5,7 @@
 
 import net.onrc.onos.datastore.RCObject;
 import net.onrc.onos.datastore.RCObject.WriteOp;
+import net.onrc.onos.datastore.topology.RCLink;
 import net.onrc.onos.datastore.topology.RCSwitch;
 
 import org.slf4j.Logger;
@@ -61,21 +62,17 @@
 //			groupOp.add(WriteOp.ForceCreate(rcPort));
 //		}
 
-		boolean failed = RCObject.multiWrite( groupOp );
+		boolean failed = RCObject.multiWrite(groupOp);
 
-		if ( failed ) {
+		if (failed) {
 		    log.error("Adding Switch {} and its ports failed.", sw.getDpid());
-		    for ( WriteOp op : groupOp ) {
+		    for (WriteOp op : groupOp) {
 			log.debug("Operation:{} for {} - Result:{}", op.getOp(), op.getObject(), op.getStatus() );
 
 			// If we changed the operation from ForceCreate to
 			// Conditional operation (Create/Update) then we should retry here.
 		    }
 		}
-		else {
-			// Publish event to the in-memory cache
-//			graph.addSwitch(sw);
-		}
 
 	}
 
@@ -163,80 +160,81 @@
 //		}
 	}
 
-	public void addLink(LinkEvent link) {
-		log.debug("Adding link {}", link);
-//		RCLink rcLink = new RCLink(link.getSourceSwitchDpid(), (long)link.getSourcePortNumber(),
-//				link.getDestinationSwitchDpid(), (long)link.getDestinationPortNumber());
-//
-//		RCPort rcSrcPort = new RCPort(link.getSourceSwitchDpid(), (long)link.getSourcePortNumber());
-//		RCPort rcDstPort = new RCPort(link.getDestinationSwitchDpid(), (long)link.getDestinationPortNumber());
-//
-//		for (int i = 0; i < NUM_RETRIES; i++) {
-//			try {
-//				rcSrcPort.read();
-//				rcDstPort.read();
-//				rcLink.create();
-//			} catch (ObjectDoesntExistException e) {
-//				// port doesn't exist
-//				log.error("Add link failed {}", link, e);
-//				return;
-//			} catch (ObjectExistsException e) {
-//				log.debug("Link already exists {}", link);
-//				return;
-//			}
-//
-//			rcSrcPort.addLinkId(rcLink.getId());
-//			rcDstPort.addLinkId(rcLink.getId());
-//
-//			rcLink.setStatus(RCLink.STATUS.ACTIVE);
-//
-//			try {
-//				rcLink.update();
-//				rcSrcPort.update();
-//				rcDstPort.update();
-//				break;
-//			} catch (ObjectDoesntExistException | WrongVersionException e) {
-//				log.debug(" ", e);
-//				// retry
-//			}
-//		}
-//
-//		// Publish event to in-memory cache
-//		graph.putLink(link);
+	public void addLink(LinkEvent linkEvent) {
+		log.debug("Adding link {}", linkEvent);
+		
+		RCLink rcLink = new RCLink(linkEvent.getSrc().getDpid(), linkEvent.getSrc().getNumber(),
+				linkEvent.getDst().getDpid(), linkEvent.getDst().getNumber());
+
+		//RCPort rcSrcPort = new RCPort(link.getSrc().getDpid(), link.getSrc().getNumber());
+		//RCPort rcDstPort = new RCPort(link.getDst().getDpid(), link.getDst().getNumber());
+
+		for (int i = 0; i < NUM_RETRIES; i++) {
+			try {
+				//rcSrcPort.read();
+				//rcDstPort.read();
+				rcLink.create();
+			//} catch (ObjectDoesntExistException e) {
+				// port doesn't exist
+				//log.error("Add link failed {}", link, e);
+				//return;
+			} catch (ObjectExistsException e) {
+				log.debug("Link already exists {}", linkEvent);
+				return;
+			}
+
+			//rcSrcPort.addLinkId(rcLink.getId());
+			//rcDstPort.addLinkId(rcLink.getId());
+
+			rcLink.setStatus(RCLink.STATUS.ACTIVE);
+
+			try {
+				rcLink.update();
+				//rcSrcPort.update();
+				//rcDstPort.update();
+				break;
+			} catch (ObjectDoesntExistException | WrongVersionException e) {
+				log.debug(" ", e);
+				// retry
+			}
+		}
+
+		// Publish event to in-memory cache
+		graph.putLink(linkEvent);
 	}
 
-	public void removeLink(LinkEvent link) {
-		log.debug("Removing link {}", link);
-//		RCLink rcLink = new RCLink(link.getSourceSwitchDpid(), (long)link.getSourcePortNumber(),
-//				link.getDestinationSwitchDpid(), (long)link.getDestinationPortNumber());
-//
-//		RCPort rcSrcPort = new RCPort(link.getSourceSwitchDpid(), (long)link.getSourcePortNumber());
-//		RCPort rcDstPort = new RCPort(link.getDestinationSwitchDpid(), (long)link.getDestinationPortNumber());
-//
-//		for (int i = 0; i < NUM_RETRIES; i++) {
-//			try {
-//				rcSrcPort.read();
-//				rcDstPort.read();
-//				rcLink.read();
-//			} catch (ObjectDoesntExistException e) {
-//				log.error("Remove link failed {}", link, e);
-//				return;
-//			}
-//
-//			rcSrcPort.removeLinkId(rcLink.getId());
-//			rcDstPort.removeLinkId(rcLink.getId());
-//
-//			try {
-//				rcSrcPort.update();
-//				rcDstPort.update();
-//				rcLink.delete();
-//			} catch (ObjectDoesntExistException e) {
-//				log.error("Remove link failed {}", link, e);
-//				return;
-//			} catch (WrongVersionException e) {
-//				// retry
-//			}
-//		}
+	public void removeLink(LinkEvent linkEvent) {
+		log.debug("Removing link {}", linkEvent);
+		RCLink rcLink = new RCLink(linkEvent.getSrc().getDpid(), linkEvent.getSrc().getNumber(),
+				linkEvent.getDst().getDpid(), linkEvent.getDst().getNumber());
+
+		//RCPort rcSrcPort = new RCPort(link.getSourceSwitchDpid(), (long)link.getSourcePortNumber());
+		//RCPort rcDstPort = new RCPort(link.getDestinationSwitchDpid(), (long)link.getDestinationPortNumber());
+
+		for (int i = 0; i < NUM_RETRIES; i++) {
+			try {
+				//rcSrcPort.read();
+				//rcDstPort.read();
+				rcLink.read();
+			} catch (ObjectDoesntExistException e) {
+				log.error("Remove link failed {}", linkEvent, e);
+				return;
+			}
+
+			//rcSrcPort.removeLinkId(rcLink.getId());
+			//rcDstPort.removeLinkId(rcLink.getId());
+
+			try {
+				//rcSrcPort.update();
+				//rcDstPort.update();
+				rcLink.delete();
+			} catch (ObjectDoesntExistException e) {
+				log.error("Remove link failed {}", linkEvent, e);
+				return;
+			} catch (WrongVersionException e) {
+				// retry
+			}
+		}
 	}
 
 	public void updateDevice(DeviceEvent device) {
diff --git a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/SwitchImpl.java b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/SwitchImpl.java
index a8c824d..874bf37 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/SwitchImpl.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/SwitchImpl.java
@@ -1,10 +1,12 @@
 package net.onrc.onos.ofcontroller.networkgraph;
 
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.LinkedList;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
@@ -71,8 +73,17 @@
 
 	@Override
 	public Collection<Device> getDevices() {
-		// TODO Auto-generated method stub
-		return null;
+		// TODO Should switch also store a list of attached devices to avoid
+		// calculating this every time?
+		List<Device> devices = new ArrayList<Device>();
+		
+		for (Port port : ports.values()) {
+			for (Device device : port.getDevices()) {
+				devices.add(device);
+			}
+		}
+		
+		return devices;
 	}
 
 	public void addPort(Port port) {
diff --git a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/serializers/LinkSerializer.java b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/serializers/LinkSerializer.java
index 7708bf1..bb13c75 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/serializers/LinkSerializer.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/serializers/LinkSerializer.java
@@ -27,7 +27,7 @@
 				link.getSourcePort().getNumber());
 		jsonGenerator.writeStringField("dst-switch", 
 				HexString.toHexString(link.getDestinationSwitch().getDpid()));
-		jsonGenerator.writeNumberField("src-port", 
+		jsonGenerator.writeNumberField("dst-port", 
 				link.getDestinationPort().getNumber());
 		jsonGenerator.writeEndObject();
 	}