Update example code

Change-Id: I5dfd62bc9603ea8eb1ea173507d6f8d2da20465f
diff --git a/src/main/java/net/onrc/onos/datastore/RCObject.java b/src/main/java/net/onrc/onos/datastore/RCObject.java
index 100cbd9..23a2139 100644
--- a/src/main/java/net/onrc/onos/datastore/RCObject.java
+++ b/src/main/java/net/onrc/onos/datastore/RCObject.java
@@ -367,6 +367,10 @@
 	public OPS getOp() {
 	    return op;
 	}
+
+	public STATUS getStatus() {
+	    return status;
+	}
     }
 
     public static boolean multiWrite(Collection<WriteOp> objects) {
diff --git a/src/main/java/net/onrc/onos/datastore/topology/RCDevice.java b/src/main/java/net/onrc/onos/datastore/topology/RCDevice.java
index 08fe458..a431490 100644
--- a/src/main/java/net/onrc/onos/datastore/topology/RCDevice.java
+++ b/src/main/java/net/onrc/onos/datastore/topology/RCDevice.java
@@ -57,6 +57,27 @@
 	        .array();
     }
 
+    public static StringBuilder keysToSB(Collection<byte[]> keys) {
+	StringBuilder sb = new StringBuilder();
+	sb.append("[");
+	boolean hasWritten = false;
+	for (byte[] key : keys) {
+	    if (hasWritten) {
+		sb.append(", ");
+	    }
+	    sb.append(keyToString(key));
+	    hasWritten = true;
+	}
+	sb.append("]");
+	return sb;
+    }
+
+    public static String keyToString(byte[] key) {
+	// For debug log
+	byte[] mac = getMacFromKey(key);
+	return "D" + ByteArrayUtil.toHexStringBuffer(mac, ":");
+    }
+
     public static byte[] getMacFromKey(byte[] key) {
 	ByteBuffer keyBuf = ByteBuffer.wrap(key);
 	if (keyBuf.getChar() != 'D') {
diff --git a/src/main/java/net/onrc/onos/datastore/topology/RCLink.java b/src/main/java/net/onrc/onos/datastore/topology/RCLink.java
index eec6a10..caf446d 100644
--- a/src/main/java/net/onrc/onos/datastore/topology/RCLink.java
+++ b/src/main/java/net/onrc/onos/datastore/topology/RCLink.java
@@ -1,10 +1,12 @@
 package net.onrc.onos.datastore.topology;
 
 import java.nio.ByteBuffer;
+import java.util.Collection;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Map;
 
+import org.openflow.util.HexString;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -84,6 +86,28 @@
 	        .put(RCPort.getPortID(dst_dpid, dst_port_no)).array();
     }
 
+    public static StringBuilder keysToSB(Collection<byte[]> keys) {
+	StringBuilder sb = new StringBuilder();
+	sb.append("[");
+	boolean hasWritten = false;
+	for (byte[] key : keys) {
+	    if (hasWritten) {
+		sb.append(", ");
+	    }
+	    sb.append(keyToString(key));
+	    hasWritten = true;
+	}
+	sb.append("]");
+	return sb;
+    }
+
+    public static String keyToString(byte[] key) {
+	// For debug log
+	long[] tuple = getLinkTupleFromKey(key);
+	return "L" + "S" + HexString.toHexString(tuple[0]) + "P" + tuple[1]
+	        + "S" + HexString.toHexString(tuple[2]) + "P" + tuple[3];
+    }
+
     public static long[] getLinkTupleFromKey(byte[] key) {
 	return getLinkTupleFromKey(ByteBuffer.wrap(key));
     }
diff --git a/src/main/java/net/onrc/onos/datastore/topology/RCPort.java b/src/main/java/net/onrc/onos/datastore/topology/RCPort.java
index 1bbb3eb..b1f3bef 100644
--- a/src/main/java/net/onrc/onos/datastore/topology/RCPort.java
+++ b/src/main/java/net/onrc/onos/datastore/topology/RCPort.java
@@ -10,6 +10,7 @@
 import java.util.Set;
 import java.util.TreeSet;
 
+import org.openflow.util.HexString;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -81,6 +82,27 @@
 	        .putChar('P').putLong(number).array();
     }
 
+    public static StringBuilder keysToSB(Collection<byte[]> keys) {
+	StringBuilder sb = new StringBuilder();
+	sb.append("[");
+	boolean hasWritten = false;
+	for (byte[] key : keys) {
+	    if (hasWritten) {
+		sb.append(", ");
+	    }
+	    sb.append(keyToString(key));
+	    hasWritten = true;
+	}
+	sb.append("]");
+	return sb;
+    }
+
+    public static String keyToString(byte[] key) {
+	// For debug log
+	long[] pair = getPortPairFromKey(key);
+	return "S" + HexString.toHexString(pair[0]) + "P" + pair[1];
+    }
+
     public static long[] getPortPairFromKey(byte[] key) {
 	return getPortPairFromKey(ByteBuffer.wrap(key));
 
diff --git a/src/main/java/net/onrc/onos/datastore/topology/RCSwitch.java b/src/main/java/net/onrc/onos/datastore/topology/RCSwitch.java
index 6858e68..2b4fb07 100644
--- a/src/main/java/net/onrc/onos/datastore/topology/RCSwitch.java
+++ b/src/main/java/net/onrc/onos/datastore/topology/RCSwitch.java
@@ -14,6 +14,7 @@
 import net.onrc.onos.datastore.RCTable;
 import net.onrc.onos.datastore.utils.ByteArrayComparator;
 
+import org.openflow.util.HexString;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -76,6 +77,26 @@
 	        .array();
     }
 
+    public static StringBuilder keysToSB(Collection<byte[]> keys) {
+	StringBuilder sb = new StringBuilder();
+	sb.append("[");
+	boolean hasWritten = false;
+	for (byte[] key : keys) {
+	    if (hasWritten) {
+		sb.append(", ");
+	    }
+	    sb.append(keyToString(key));
+	    hasWritten = true;
+	}
+	sb.append("]");
+	return sb;
+    }
+
+    public static String keyToString(byte[] key) {
+	// For debug log
+	return "S" + HexString.toHexString(getDpidFromKey(key));
+    }
+
     public static long getDpidFromKey(byte[] key) {
 	return getDpidFromKey(ByteBuffer.wrap(key));
     }
@@ -326,7 +347,8 @@
 	sw1.addPortId(sw1p2.getId());
 	try {
 	    sw1.update();
-	    log.debug("Update {} - {}", sw1, sw1.getAllPortIds());
+	    log.debug("Update {} - {}", sw1,
+		    RCPort.keysToSB(sw1.getAllPortIds()));
 	} catch (ObjectDoesntExistException | WrongVersionException e) {
 	    log.error("Switch update failed", e);
 	}
@@ -364,11 +386,17 @@
 	d2.addPortId(sw2p2.getId());
 	sw2p2.addDeviceId(d2.getId());
 
-	boolean failed = RCObject.multiWrite(Arrays.asList(
+	// XXX Collection created by Arrays.asList needs to be stored, so that
+	// which operation failed
+	Collection<WriteOp> groupOp = Arrays.asList(
 	        RCObject.WriteOp.Create(sw2), RCObject.WriteOp.Create(sw2p1),
-	        RCObject.WriteOp.Create(sw2p2), RCObject.WriteOp.Create(d2)));
+	        RCObject.WriteOp.Create(sw2p2), RCObject.WriteOp.Create(d2));
+	boolean failed = RCObject.multiWrite(groupOp);
 	if (failed) {
-	    log.error("One of Switch/Port/Device creation failed");
+	    log.error("Some of Switch/Port/Device creation failed");
+	    for ( WriteOp op : groupOp ) {
+		log.debug("{} - Result:{}", op.getObject(), op.getStatus() );
+	    }
 	} else {
 	    log.debug("Create {} Version:{}", sw2, sw2.getVersion());
 	    log.debug("Create {} Version:{}", sw2p1, sw2p1.getVersion());
@@ -426,16 +454,16 @@
 	    try {
 		port.read();
 		assert (port.getDpid() == 0x1L);
-		log.debug("{} - LinkIDs:{} DeviceIDs:{}",
-		        port, port.getAllLinkIds(),
-		        port.getAllDeviceIds());
+		log.debug("{} - LinkIDs:{} DeviceIDs:{}", port,
+		        RCLink.keysToSB(port.getAllLinkIds()),
+		        RCDevice.keysToSB(port.getAllDeviceIds()));
 
 		for (byte[] deviceId : port.getAllDeviceIds()) {
 		    RCDevice device = RCDevice.createFromKey(deviceId);
 		    try {
 			device.read();
 			log.debug("{} - PortIDs:{}", device,
-			        device.getAllPortIds());
+			        RCPort.keysToSB(device.getAllPortIds()));
 		    } catch (ObjectDoesntExistException e) {
 			log.error("Reading Device failed", e);
 		    }
@@ -472,16 +500,16 @@
 	    try {
 		port.read();
 		assert (port.getDpid() == 0x2L);
-		log.debug("{} - LinkIDs:{} DeviceIDs:{}",
-		        port, port.getAllLinkIds(),
-		        port.getAllDeviceIds());
+		log.debug("{} - LinkIDs:{} DeviceIDs:{}", port,
+		        RCLink.keysToSB(port.getAllLinkIds()),
+		        RCDevice.keysToSB(port.getAllDeviceIds()));
 
 		for (byte[] deviceId : port.getAllDeviceIds()) {
 		    RCDevice device = RCDevice.createFromKey(deviceId);
 		    try {
 			device.read();
 			log.debug("{} - PortIDs:{}", device,
-			        device.getAllPortIds());
+			        RCPort.keysToSB(device.getAllPortIds()));
 		    } catch (ObjectDoesntExistException e) {
 			log.error("Reading Device failed", e);
 		    }
@@ -509,72 +537,40 @@
     private static void topology_delete() {
 	log.debug("topology_delete start.");
 
-	// TODO implement get all kind of API
-	RCSwitch sw1 = new RCSwitch(0x1L);
-	RCPort sw1p1 = new RCPort(0x1L, 1L);
-	RCPort sw1p2 = new RCPort(0x1L, 2L);
-	RCDevice d1 = new RCDevice(new byte[] { 0, 1, 2, 3, 4, 5, 6 });
-	RCLink l1 = new RCLink(0x1L, 2L, 0x2L, 1L);
-	RCSwitch sw2 = new RCSwitch(0x2L);
-	RCPort sw2p1 = new RCPort(0x2L, 1L);
-	RCPort sw2p2 = new RCPort(0x2L, 2L);
-	RCDevice d2 = new RCDevice(new byte[] { 6, 5, 4, 3, 2, 1, 0 });
-
-	try {
-	    sw1.read();
-	    sw1.delete();
-	} catch (ObjectDoesntExistException | WrongVersionException e) {
-	    log.debug("Delete Switch Failed", e);
-	}
-	try {
-	    sw1p1.read();
-	    sw1p1.delete();
-	} catch (ObjectDoesntExistException | WrongVersionException e) {
-	    log.debug("Delete Port Failed", e);
-	}
-	try {
-	    sw1p2.read();
-	    sw1p2.delete();
-	} catch (ObjectDoesntExistException | WrongVersionException e) {
-	    log.debug("Delete Port Failed", e);
-	}
-	try {
-	    d1.read();
-	    d1.delete();
-	} catch (ObjectDoesntExistException | WrongVersionException e) {
-	    log.debug("Delete Device Failed", e);
+	for (RCSwitch sw : RCSwitch.getAllSwitches()) {
+	    try {
+		sw.read();
+		sw.delete();
+	    } catch (ObjectDoesntExistException | WrongVersionException e) {
+		log.debug("Delete Switch Failed", e);
+	    }
 	}
 
-	try {
-	    l1.read();
-	    l1.delete();
-	} catch (ObjectDoesntExistException | WrongVersionException e) {
-	    log.debug("Delete Link Failed", e);
+	for (RCPort p : RCPort.getAllPorts()) {
+	    try {
+		p.read();
+		p.delete();
+	    } catch (ObjectDoesntExistException | WrongVersionException e) {
+		log.debug("Delete Port Failed", e);
+	    }
 	}
 
-	try {
-	    sw2.read();
-	    sw2.delete();
-	} catch (ObjectDoesntExistException | WrongVersionException e) {
-	    log.debug("Delete Switch Failed", e);
+	for (RCDevice d : RCDevice.getAllDevices()) {
+	    try {
+		d.read();
+		d.delete();
+	    } catch (ObjectDoesntExistException | WrongVersionException e) {
+		log.debug("Delete Device Failed", e);
+	    }
 	}
-	try {
-	    sw2p1.read();
-	    sw2p1.delete();
-	} catch (ObjectDoesntExistException | WrongVersionException e) {
-	    log.debug("Delete Port Failed", e);
-	}
-	try {
-	    sw2p2.read();
-	    sw2p2.delete();
-	} catch (ObjectDoesntExistException | WrongVersionException e) {
-	    log.debug("Delete Port Failed", e);
-	}
-	try {
-	    d2.read();
-	    d2.delete();
-	} catch (ObjectDoesntExistException | WrongVersionException e) {
-	    log.debug("Delete Device Failed", e);
+
+	for (RCLink l : RCLink.getAllLinks()) {
+	    try {
+		l.read();
+		l.delete();
+	    } catch (ObjectDoesntExistException | WrongVersionException e) {
+		log.debug("Delete Link Failed", e);
+	    }
 	}
 
 	log.debug("topology_delete end.");