Implementation of ProtoBuf serialization for RamCloud

Change-Id: Iec55de72a0f3e2c9473cbaf4bf7c78fdad5e96f0
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 9ce8857..79daa66 100644
--- a/src/main/java/net/onrc/onos/datastore/topology/RCLink.java
+++ b/src/main/java/net/onrc/onos/datastore/topology/RCLink.java
@@ -11,8 +11,11 @@
 import org.slf4j.LoggerFactory;
 
 import com.esotericsoftware.kryo.Kryo;
+import com.google.protobuf.ByteString;
+import com.google.protobuf.InvalidProtocolBufferException;
 
 import edu.stanford.ramcloud.JRamCloud;
+import net.onrc.onos.datastore.RCProtos.LinkProperty;
 import net.onrc.onos.datastore.RCObject;
 import net.onrc.onos.datastore.RCTable;
 import net.onrc.onos.ofcontroller.networkgraph.LinkEvent;
@@ -186,7 +189,6 @@
 
     public void setStatus(STATUS status) {
 	this.status = status;
-	getObjectMap().put(PROP_STATUS, status);
     }
 
     public SwitchPort getSrc() {
@@ -205,20 +207,39 @@
     public void serializeAndSetValue() {
 	Map<Object, Object> map = getObjectMap();
 
-	map.put(PROP_SRC_SW_ID, src.getSwitchID());
-	map.put(PROP_SRC_PORT_ID, src.getPortID());
-	map.put(PROP_DST_SW_ID, dst.getSwitchID());
-	map.put(PROP_DST_PORT_ID, dst.getPortID());
-
-	serializeAndSetValue(linkKryo.get(), map);
+	LinkProperty.Builder link = LinkProperty.newBuilder();
+	link.setSrcSwId(ByteString.copyFrom(src.getSwitchID()));
+	link.setSrcPortId(ByteString.copyFrom(src.getPortID()));
+	link.setDstSwId(ByteString.copyFrom(dst.getSwitchID()));
+	link.setDstPortId(ByteString.copyFrom(dst.getPortID()));
+	link.setStatus(status.ordinal());
+	
+	if (!map.isEmpty()) {
+	    serializeAndSetValue(linkKryo.get(), map);
+	    link.setValue(ByteString.copyFrom(this.getSerializedValue()));
+	}
+	
+	this.value = link.build().toByteArray();
     }
 
     @Override
     public Map<Object, Object> deserializeObjectFromValue() {
-	Map<Object, Object> map = deserializeObjectFromValue(linkKryo.get());
-
-	this.status = (STATUS) map.get(PROP_STATUS);
-	return map;
+	LinkProperty link = null;
+	Map<Object, Object> map = null;
+	try {
+	    link = LinkProperty.parseFrom(this.value);
+	    this.value = link.getValue().toByteArray();
+	    if (this.value.length >= 1) {
+		map = deserializeObjectFromValue(linkKryo.get());
+	    } else {
+		map = new HashMap<>();
+	    }
+	    this.status = STATUS.values()[link.getStatus()];
+	    return map;
+	} catch (InvalidProtocolBufferException e) {
+	    log.error("{" + toString() + "}: Read Link: ", e);
+	    return null;
+	}	
     }
 
     @Override