Refactoring datastore package

Preparation to make datastore replacable
- Extract datastore interfaces
- Add multi Read/Write/Remove
- Add a method to walk over RCTable
- Refactor serialize/deserialize RCObject
- Localize dependency to JRAMCloud
  - Separate RAMCloud specific code into ramcloud package
  - Remove dependency to RAMCloud exception classes
  - Remove RC prefix from non RAMCloud specific code
- Cosmetics and update sample/test code

- reflect Naoki's comment
- more cosmetic fixes
  - reordered OPERATION enums

- removed no longer used code
- follow pmd, etc. where easily possible

Change-Id: I6f9153d705600447acf48a64f713c654c9f26713
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 a3ab24a..30b2f73 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraphDatastore.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraphDatastore.java
@@ -4,12 +4,14 @@
 import java.util.List;
 import java.util.Collection;
 
-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.RCPort;
-import net.onrc.onos.datastore.topology.RCPort.STATUS;
-import net.onrc.onos.datastore.topology.RCSwitch;
+import net.onrc.onos.datastore.DataStoreClient;
+import net.onrc.onos.datastore.IKVClient;
+import net.onrc.onos.datastore.topology.KVLink;
+import net.onrc.onos.datastore.topology.KVPort;
+import net.onrc.onos.datastore.topology.KVPort.STATUS;
+import net.onrc.onos.datastore.topology.KVSwitch;
+import net.onrc.onos.datastore.utils.KVObject;
+import net.onrc.onos.datastore.utils.KVObject.WriteOp;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -45,22 +47,24 @@
 		log.debug("Adding switch {}", sw);
 		ArrayList<WriteOp> groupOp = new ArrayList<>();
 
-		RCSwitch rcSwitch = new RCSwitch(sw.getDpid());
-		rcSwitch.setStatus(RCSwitch.STATUS.ACTIVE);
+		KVSwitch rcSwitch = new KVSwitch(sw.getDpid());
+		rcSwitch.setStatus(KVSwitch.STATUS.ACTIVE);
+
+		IKVClient client = DataStoreClient.getClient();
 
 		// XXX Is ForceCreating Switch on DB OK here?
 		// If ForceCreating, who ever is calling this method needs
 		// to assure that DPID is unique cluster-wide, etc.
-		groupOp.add(WriteOp.ForceCreate(rcSwitch));
+		groupOp.add(rcSwitch.forceCreateOp(client));
 
 		for (PortEvent portEvent : portEvents) {
-			RCPort rcPort = new RCPort(sw.getDpid(), portEvent.getNumber());
-			rcPort.setStatus(RCPort.STATUS.ACTIVE);
+			KVPort rcPort = new KVPort(sw.getDpid(), portEvent.getNumber());
+			rcPort.setStatus(KVPort.STATUS.ACTIVE);
 
-			groupOp.add(WriteOp.ForceCreate(rcPort));
+			groupOp.add(rcPort.forceCreateOp(client));
 		}
 
-		boolean failed = RCObject.multiWrite(groupOp);
+		boolean failed = KVObject.multiWrite(groupOp);
 
 		if (failed) {
 		    log.error("Adding Switch {} and its ports failed.", sw.getDpid());
@@ -84,21 +88,23 @@
 	public boolean deactivateSwitch(SwitchEvent sw,
 					Collection<PortEvent> portEvents) {
 		log.debug("Deactivating switch {}", sw);
-		RCSwitch rcSwitch = new RCSwitch(sw.getDpid());
+		KVSwitch rcSwitch = new KVSwitch(sw.getDpid());
+
+		IKVClient client = DataStoreClient.getClient();
 
 		List<WriteOp> groupOp = new ArrayList<>();
-		rcSwitch.setStatus(RCSwitch.STATUS.INACTIVE);
+		rcSwitch.setStatus(KVSwitch.STATUS.INACTIVE);
 
-		groupOp.add(WriteOp.ForceCreate(rcSwitch));
+		groupOp.add(rcSwitch.forceCreateOp(client));
 
 		for (PortEvent portEvent : portEvents) {
-			RCPort rcPort = new RCPort(sw.getDpid(), portEvent.getNumber());
-			rcPort.setStatus(RCPort.STATUS.INACTIVE);
+			KVPort rcPort = new KVPort(sw.getDpid(), portEvent.getNumber());
+			rcPort.setStatus(KVPort.STATUS.INACTIVE);
 
-			groupOp.add(WriteOp.ForceCreate(rcPort));
+			groupOp.add(rcPort.forceCreateOp(client));
 		}
 
-		boolean failed = RCObject.multiWrite(groupOp);
+		boolean failed = KVObject.multiWrite(groupOp);
 
 		return !failed;
 	}
@@ -112,10 +118,10 @@
 	public boolean addPort(PortEvent port) {
 		log.debug("Adding port {}", port);
 
-		RCPort rcPort = new RCPort(port.getDpid(), port.getNumber());
-		rcPort.setStatus(RCPort.STATUS.ACTIVE);
+		KVPort rcPort = new KVPort(port.getDpid(), port.getNumber());
+		rcPort.setStatus(KVPort.STATUS.ACTIVE);
 		rcPort.forceCreate();
-		// TODO add description into RCPort
+		// TODO add description into KVPort
 		//rcPort.setDescription(port.getDescription());
 
 		return true;
@@ -130,7 +136,7 @@
 	public boolean deactivatePort(PortEvent port) {
 		log.debug("Deactivating port {}", port);
 
-		RCPort rcPort = new RCPort(port.getDpid(), port.getNumber());
+		KVPort rcPort = new KVPort(port.getDpid(), port.getNumber());
 		rcPort.setStatus(STATUS.INACTIVE);
 
 		rcPort.forceCreate();
@@ -147,7 +153,7 @@
 	public boolean addLink(LinkEvent link) {
 		log.debug("Adding link {}", link);
 
-		RCLink rcLink = new RCLink(link.getSrc().getDpid(),
+		KVLink rcLink = new KVLink(link.getSrc().getDpid(),
 					   link.getSrc().getNumber(),
 					   link.getDst().getDpid(),
 					   link.getDst().getNumber());
@@ -157,7 +163,7 @@
 		// so we can force write here
 		//
 		// TODO: We need to check for errors
-		rcLink.setStatus(RCLink.STATUS.ACTIVE);
+		rcLink.setStatus(KVLink.STATUS.ACTIVE);
 		rcLink.forceCreate();
 
 		return true;					// Success
@@ -166,7 +172,7 @@
 	public boolean removeLink(LinkEvent linkEvent) {
 		log.debug("Removing link {}", linkEvent);
 
-		RCLink rcLink = new RCLink(linkEvent.getSrc().getDpid(), linkEvent.getSrc().getNumber(),
+		KVLink rcLink = new KVLink(linkEvent.getSrc().getDpid(), linkEvent.getSrc().getNumber(),
 				linkEvent.getDst().getDpid(), linkEvent.getDst().getNumber());
 		rcLink.forceDelete();
 
diff --git a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/TopologyManager.java b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/TopologyManager.java
index 3f3af2d..a323726 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/TopologyManager.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/TopologyManager.java
@@ -17,9 +17,9 @@
 import net.onrc.onos.datagrid.IDatagridService;
 import net.onrc.onos.datagrid.IEventChannel;
 import net.onrc.onos.datagrid.IEventChannelListener;
-import net.onrc.onos.datastore.topology.RCLink;
-import net.onrc.onos.datastore.topology.RCPort;
-import net.onrc.onos.datastore.topology.RCSwitch;
+import net.onrc.onos.datastore.topology.KVLink;
+import net.onrc.onos.datastore.topology.KVPort;
+import net.onrc.onos.datastore.topology.KVSwitch;
 import net.onrc.onos.ofcontroller.networkgraph.PortEvent.SwitchPort;
 import net.onrc.onos.ofcontroller.util.EventEntry;
 import net.onrc.onos.registry.controller.IControllerRegistryService;
@@ -1141,8 +1141,8 @@
 	// how we initially subscribe to replication events
 
 	// Add all active switches
-	for (RCSwitch sw : RCSwitch.getAllSwitches()) {
-	    if (sw.getStatus() != RCSwitch.STATUS.ACTIVE) {
+	for (KVSwitch sw : KVSwitch.getAllSwitches()) {
+	    if (sw.getStatus() != KVSwitch.STATUS.ACTIVE) {
 		continue;
 	    }
 
@@ -1155,8 +1155,8 @@
 	}
 
 	// Add all active ports
-	for (RCPort p : RCPort.getAllPorts()) {
-	    if (p.getStatus() != RCPort.STATUS.ACTIVE) {
+	for (KVPort p : KVPort.getAllPorts()) {
+	    if (p.getStatus() != KVPort.STATUS.ACTIVE) {
 		continue;
 	    }
 
@@ -1169,14 +1169,14 @@
 	}
 
 	// TODO Is Device going to be in DB? If so, read from DB.
-	//	for (RCDevice d : RCDevice.getAllDevices()) {
+	//	for (KVDevice d : KVDevice.getAllDevices()) {
 	//	    DeviceEvent devEvent = new DeviceEvent( MACAddress.valueOf(d.getMac()) );
 	//	    for (byte[] portId : d.getAllPortIds() ) {
-	//		devEvent.addAttachmentPoint( new SwitchPort( RCPort.getDpidFromKey(portId), RCPort.getNumberFromKey(portId) ));
+	//		devEvent.addAttachmentPoint( new SwitchPort( KVPort.getDpidFromKey(portId), KVPort.getNumberFromKey(portId) ));
 	//	    }
 	//	}
 
-	for (RCLink l : RCLink.getAllLinks()) {
+	for (KVLink l : KVLink.getAllLinks()) {
 	    LinkEvent linkEvent = new LinkEvent(l.getSrc().dpid,
 						l.getSrc().number,
 						l.getDst().dpid,
diff --git a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/web/RamcloudLinksResource.java b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/web/RamcloudLinksResource.java
index abd1831..ad5059c 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/web/RamcloudLinksResource.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/web/RamcloudLinksResource.java
@@ -1,6 +1,6 @@
 package net.onrc.onos.ofcontroller.networkgraph.web;
 
-import net.onrc.onos.datastore.topology.RCLink;
+import net.onrc.onos.datastore.topology.KVLink;
 
 import org.restlet.resource.Get;
 import org.restlet.resource.ServerResource;
@@ -8,7 +8,7 @@
 public class RamcloudLinksResource extends ServerResource {
 
 	@Get("json")
-	public Iterable<RCLink> retrieve() {
-		return RCLink.getAllLinks();
+	public Iterable<KVLink> retrieve() {
+		return KVLink.getAllLinks();
 	}
 }
diff --git a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/web/RamcloudPortsResource.java b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/web/RamcloudPortsResource.java
index b2f88dd..bac73b3 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/web/RamcloudPortsResource.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/web/RamcloudPortsResource.java
@@ -1,6 +1,6 @@
 package net.onrc.onos.ofcontroller.networkgraph.web;
 
-import net.onrc.onos.datastore.topology.RCPort;
+import net.onrc.onos.datastore.topology.KVPort;
 
 import org.restlet.resource.Get;
 import org.restlet.resource.ServerResource;
@@ -8,7 +8,7 @@
 public class RamcloudPortsResource extends ServerResource {
 
 	@Get("json")
-	public Iterable<RCPort> retrieve() {
-		return RCPort.getAllPorts();
+	public Iterable<KVPort> retrieve() {
+		return KVPort.getAllPorts();
 	}
 }
diff --git a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/web/RamcloudSwitchesResource.java b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/web/RamcloudSwitchesResource.java
index e8998b0..b8a8fe6 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/web/RamcloudSwitchesResource.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/web/RamcloudSwitchesResource.java
@@ -1,6 +1,6 @@
 package net.onrc.onos.ofcontroller.networkgraph.web;
 
-import net.onrc.onos.datastore.topology.RCSwitch;
+import net.onrc.onos.datastore.topology.KVSwitch;
 
 import org.restlet.resource.Get;
 import org.restlet.resource.ServerResource;
@@ -8,8 +8,8 @@
 public class RamcloudSwitchesResource extends ServerResource {
 	
 	@Get("json")
-	public Iterable<RCSwitch> retrieve() {
-		return RCSwitch.getAllSwitches();
+	public Iterable<KVSwitch> retrieve() {
+		return KVSwitch.getAllSwitches();
 	}
 
 }