Renamed networkgraph package to topology.
Moved NetworkGraphPublisher into new topology package.

net.onrc.onos.ofcontroller.networkgraph.* => net.onrc.onos.core.topology.*
net.onrc.onos.ofcontroller.floodlightlistener.NetworkGraphPublisher => net.onrc.onos.core.topology.NetworkGraphPublisher

Change-Id: I8b156d0fcbba520fee61e92ab659bb02cfa704ac
diff --git a/src/main/java/net/onrc/onos/core/topology/web/DatastoreLinksResource.java b/src/main/java/net/onrc/onos/core/topology/web/DatastoreLinksResource.java
new file mode 100644
index 0000000..4837055
--- /dev/null
+++ b/src/main/java/net/onrc/onos/core/topology/web/DatastoreLinksResource.java
@@ -0,0 +1,14 @@
+package net.onrc.onos.core.topology.web;
+
+import net.onrc.onos.core.datastore.topology.KVLink;
+
+import org.restlet.resource.Get;
+import org.restlet.resource.ServerResource;
+
+public class DatastoreLinksResource extends ServerResource {
+
+	@Get("json")
+	public Iterable<KVLink> retrieve() {
+		return KVLink.getAllLinks();
+	}
+}
diff --git a/src/main/java/net/onrc/onos/core/topology/web/DatastorePortsResource.java b/src/main/java/net/onrc/onos/core/topology/web/DatastorePortsResource.java
new file mode 100644
index 0000000..46eaf1a
--- /dev/null
+++ b/src/main/java/net/onrc/onos/core/topology/web/DatastorePortsResource.java
@@ -0,0 +1,14 @@
+package net.onrc.onos.core.topology.web;
+
+import net.onrc.onos.core.datastore.topology.KVPort;
+
+import org.restlet.resource.Get;
+import org.restlet.resource.ServerResource;
+
+public class DatastorePortsResource extends ServerResource {
+
+	@Get("json")
+	public Iterable<KVPort> retrieve() {
+		return KVPort.getAllPorts();
+	}
+}
diff --git a/src/main/java/net/onrc/onos/core/topology/web/DatastoreSwitchesResource.java b/src/main/java/net/onrc/onos/core/topology/web/DatastoreSwitchesResource.java
new file mode 100644
index 0000000..fe2cfcd
--- /dev/null
+++ b/src/main/java/net/onrc/onos/core/topology/web/DatastoreSwitchesResource.java
@@ -0,0 +1,15 @@
+package net.onrc.onos.core.topology.web;
+
+import net.onrc.onos.core.datastore.topology.KVSwitch;
+
+import org.restlet.resource.Get;
+import org.restlet.resource.ServerResource;
+
+public class DatastoreSwitchesResource extends ServerResource {
+	
+	@Get("json")
+	public Iterable<KVSwitch> retrieve() {
+		return KVSwitch.getAllSwitches();
+	}
+
+}
diff --git a/src/main/java/net/onrc/onos/core/topology/web/NetworkGraphLinksResource.java b/src/main/java/net/onrc/onos/core/topology/web/NetworkGraphLinksResource.java
new file mode 100644
index 0000000..5886aa5
--- /dev/null
+++ b/src/main/java/net/onrc/onos/core/topology/web/NetworkGraphLinksResource.java
@@ -0,0 +1,43 @@
+package net.onrc.onos.core.topology.web;
+
+import java.io.IOException;
+
+import net.onrc.onos.core.topology.INetworkGraphService;
+import net.onrc.onos.core.topology.NetworkGraph;
+import net.onrc.onos.core.topology.serializers.LinkSerializer;
+
+import org.codehaus.jackson.Version;
+import org.codehaus.jackson.map.ObjectMapper;
+import org.codehaus.jackson.map.module.SimpleModule;
+import org.restlet.resource.Get;
+import org.restlet.resource.ServerResource;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class NetworkGraphLinksResource extends ServerResource {
+	
+	private static final Logger log = LoggerFactory.getLogger(NetworkGraphLinksResource.class);
+
+	@Get("json")
+	public String retrieve() {
+		INetworkGraphService networkGraphService = (INetworkGraphService) getContext().getAttributes().
+				get(INetworkGraphService.class.getCanonicalName());
+		
+		NetworkGraph graph = networkGraphService.getNetworkGraph();
+
+		ObjectMapper mapper = new ObjectMapper();
+		SimpleModule module = new SimpleModule("module", new Version(1, 0, 0, null));
+		module.addSerializer(new LinkSerializer());
+		mapper.registerModule(module);
+		
+		try {
+			graph.acquireReadLock();
+			return mapper.writeValueAsString(graph.getLinks());
+		} catch (IOException e) {
+			log.error("Error writing link list to JSON", e);
+			return "";
+		} finally {
+		    graph.releaseReadLock();
+		}
+	}
+}
diff --git a/src/main/java/net/onrc/onos/core/topology/web/NetworkGraphShortestPathResource.java b/src/main/java/net/onrc/onos/core/topology/web/NetworkGraphShortestPathResource.java
new file mode 100644
index 0000000..1d4164b
--- /dev/null
+++ b/src/main/java/net/onrc/onos/core/topology/web/NetworkGraphShortestPathResource.java
@@ -0,0 +1,81 @@
+package net.onrc.onos.core.topology.web;
+
+import java.io.IOException;
+import java.util.LinkedList;
+import java.util.List;
+
+import net.onrc.onos.core.intent.ConstrainedBFSTree;
+import net.onrc.onos.core.topology.INetworkGraphService;
+import net.onrc.onos.core.topology.Link;
+import net.onrc.onos.core.topology.LinkEvent;
+import net.onrc.onos.core.topology.NetworkGraph;
+import net.onrc.onos.core.topology.Path;
+import net.onrc.onos.core.topology.Switch;
+import net.onrc.onos.core.topology.serializers.LinkSerializer;
+import net.onrc.onos.core.util.Dpid;
+
+import org.codehaus.jackson.Version;
+import org.codehaus.jackson.map.ObjectMapper;
+import org.codehaus.jackson.map.module.SimpleModule;
+import org.restlet.resource.Get;
+import org.restlet.resource.ServerResource;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class NetworkGraphShortestPathResource extends ServerResource {
+
+    private static final Logger log = LoggerFactory.getLogger(NetworkGraphShortestPathResource.class);
+
+    @Get("json")
+    public String retrieve() {
+	INetworkGraphService networkGraphService =
+	    (INetworkGraphService)getContext().getAttributes().
+	    get(INetworkGraphService.class.getCanonicalName());
+
+	NetworkGraph graph = networkGraphService.getNetworkGraph();
+
+	ObjectMapper mapper = new ObjectMapper();
+	SimpleModule module = new SimpleModule("module", new Version(1, 0, 0, null));
+	module.addSerializer(new LinkSerializer());
+	mapper.registerModule(module);
+
+	//
+	// Fetch the attributes
+	//
+	String srcDpidStr = (String)getRequestAttributes().get("src-dpid");
+	String dstDpidStr = (String)getRequestAttributes().get("dst-dpid");
+	Dpid srcDpid = new Dpid(srcDpidStr);
+	Dpid dstDpid = new Dpid(dstDpidStr);
+	log.debug("Getting Shortest Path {}--{}", srcDpidStr, dstDpidStr);
+
+	//
+	// Do the Shortest Path computation and return the result: list of
+	// links.
+	//
+	try {
+	    graph.acquireReadLock();
+	    Switch srcSwitch = graph.getSwitch(srcDpid.value());
+	    Switch dstSwitch = graph.getSwitch(dstDpid.value());
+	    if ((srcSwitch == null) || (dstSwitch == null))
+		return "";
+	    ConstrainedBFSTree bfsTree = new ConstrainedBFSTree(srcSwitch);
+	    Path path = bfsTree.getPath(dstSwitch);
+	    List<Link> links = new LinkedList<>();
+	    for (LinkEvent linkEvent : path) {
+		Link link = graph.getLink(linkEvent.getSrc().getDpid(),
+					  linkEvent.getSrc().getNumber(),
+					  linkEvent.getDst().getDpid(),
+					  linkEvent.getDst().getNumber());
+		if (link == null)
+		    return "";
+		links.add(link);
+	    }
+	    return mapper.writeValueAsString(links);
+	} catch (IOException e) {
+	    log.error("Error writing Shortest Path to JSON", e);
+	    return "";
+	} finally {
+	    graph.releaseReadLock();
+	}
+    }
+}
diff --git a/src/main/java/net/onrc/onos/core/topology/web/NetworkGraphSwitchesResource.java b/src/main/java/net/onrc/onos/core/topology/web/NetworkGraphSwitchesResource.java
new file mode 100644
index 0000000..059771f
--- /dev/null
+++ b/src/main/java/net/onrc/onos/core/topology/web/NetworkGraphSwitchesResource.java
@@ -0,0 +1,45 @@
+package net.onrc.onos.core.topology.web;
+
+import java.io.IOException;
+
+import net.onrc.onos.core.topology.INetworkGraphService;
+import net.onrc.onos.core.topology.NetworkGraph;
+import net.onrc.onos.core.topology.serializers.PortSerializer;
+import net.onrc.onos.core.topology.serializers.SwitchSerializer;
+
+import org.codehaus.jackson.Version;
+import org.codehaus.jackson.map.ObjectMapper;
+import org.codehaus.jackson.map.module.SimpleModule;
+import org.restlet.resource.Get;
+import org.restlet.resource.ServerResource;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class NetworkGraphSwitchesResource extends ServerResource {
+	
+	private static final Logger log = LoggerFactory.getLogger(NetworkGraphSwitchesResource.class);
+
+	@Get("json")
+	public String retrieve() {
+		INetworkGraphService networkGraphService = (INetworkGraphService) getContext().getAttributes().
+				get(INetworkGraphService.class.getCanonicalName());
+		
+		NetworkGraph graph = networkGraphService.getNetworkGraph();
+		
+		ObjectMapper mapper = new ObjectMapper();
+		SimpleModule module = new SimpleModule("module", new Version(1, 0, 0, null));
+		module.addSerializer(new SwitchSerializer());
+		module.addSerializer(new PortSerializer());
+		mapper.registerModule(module);
+		
+		try {
+			graph.acquireReadLock();
+			return mapper.writeValueAsString(graph.getSwitches());
+		} catch (IOException e) {
+			log.error("Error writing switch list to JSON", e);
+			return "";
+		} finally {
+			graph.releaseReadLock();
+		}
+	}
+}
diff --git a/src/main/java/net/onrc/onos/core/topology/web/NetworkGraphWebRoutable.java b/src/main/java/net/onrc/onos/core/topology/web/NetworkGraphWebRoutable.java
new file mode 100644
index 0000000..51bb3f5
--- /dev/null
+++ b/src/main/java/net/onrc/onos/core/topology/web/NetworkGraphWebRoutable.java
@@ -0,0 +1,40 @@
+package net.onrc.onos.core.topology.web;
+
+import org.restlet.Context;
+import org.restlet.Restlet;
+import org.restlet.routing.Router;
+
+import net.floodlightcontroller.restserver.RestletRoutable;
+
+public class NetworkGraphWebRoutable implements RestletRoutable {
+
+	@Override
+	public Restlet getRestlet(Context context) {
+		Router router = new Router(context);
+		// leaving old path there for compatibility
+		router.attach("/rc/switches/json", DatastoreSwitchesResource.class);
+		router.attach("/rc/links/json", DatastoreLinksResource.class);
+		router.attach("/rc/ports/json", DatastorePortsResource.class);
+
+                // debug API to dump datastore content
+                router.attach("/ds/switches/json", DatastoreSwitchesResource.class);
+                router.attach("/ds/links/json", DatastoreLinksResource.class);
+                router.attach("/ds/ports/json", DatastorePortsResource.class);
+
+		router.attach("/ng/switches/json", NetworkGraphSwitchesResource.class);
+		router.attach("/ng/links/json", NetworkGraphLinksResource.class);
+		router.attach("/ng/shortest-path/{src-dpid}/{dst-dpid}/json", NetworkGraphShortestPathResource.class);
+		
+		// Old URLs for compatibility
+		router.attach("/topology/switches/json", NetworkGraphSwitchesResource.class);
+		router.attach("/topology/links/json", NetworkGraphLinksResource.class);
+		
+		return router;
+	}
+
+	@Override
+	public String basePath() {
+		return "/wm/onos";
+	}
+
+}