Merge pull request #19 from effy/RAMCloud

batch flow path set properties
diff --git a/src/main/java/net/onrc/onos/graph/DBOperation.java b/src/main/java/net/onrc/onos/graph/DBOperation.java
index ceb99c3..6e278d9 100644
--- a/src/main/java/net/onrc/onos/graph/DBOperation.java
+++ b/src/main/java/net/onrc/onos/graph/DBOperation.java
@@ -430,10 +430,21 @@
 	}
 
 	@Override
-	public void setFlowProperties(IFlowEntry flowEntry, Map<String, Object> map) {
+	public void setVertexProperties(Vertex vertex, Map<String, Object> map) {
 		log.debug("setProperties start: size {}", map.size());
-		RamCloudVertex v = (RamCloudVertex) flowEntry.asVertex();
+		RamCloudVertex v = (RamCloudVertex) vertex;
 		v.setProperties(map);
 		log.debug("setProperties end: size {}, id {}", map.size(), v.getId());
 	}
+
+	public String toString() {
+		StringBuilder sb = new StringBuilder();
+		for(ISwitchObject sw: getAllSwitches()) {
+			sb.append("sw: " + sw.getDPID() + "\n");
+			for(IPortObject port: sw.getPorts()) {
+				sb.append("  port: " + port.getPortId() + "\n");
+			}
+		}
+		return sb.toString();
+	}
 }
diff --git a/src/main/java/net/onrc/onos/graph/IDBOperation.java b/src/main/java/net/onrc/onos/graph/IDBOperation.java
index 3ca4284..d2e8109 100644
--- a/src/main/java/net/onrc/onos/graph/IDBOperation.java
+++ b/src/main/java/net/onrc/onos/graph/IDBOperation.java
@@ -2,6 +2,8 @@
 
 import java.util.Map;
 
+import com.tinkerpop.blueprints.Vertex;
+
 import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IDeviceObject;
 import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IFlowEntry;
 import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IFlowPath;
@@ -44,7 +46,7 @@
 	public Iterable<IFlowEntry> getAllFlowEntries();
 	public void removeFlowEntry(IFlowEntry flowEntry);
 
-	public void setFlowProperties(IFlowEntry flowEntry, Map<String, Object> map);
+	public void setVertexProperties(Vertex vertex, Map<String, Object> map);
 
 	public IDBConnection getDBConnection();
 	public void commit();
diff --git a/src/main/java/net/onrc/onos/ofcontroller/flowmanager/FlowDatabaseOperation.java b/src/main/java/net/onrc/onos/ofcontroller/flowmanager/FlowDatabaseOperation.java
index 1fc70ec..27521f9 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/flowmanager/FlowDatabaseOperation.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/flowmanager/FlowDatabaseOperation.java
@@ -128,12 +128,14 @@
 	if ( measureONOSFlowTimeProp ) {
 		startSettingFlowPathProps = System.nanoTime();
 	}
+
+	FlowPathProperty flowProp = new FlowPathProperty(dbHandler, flowObj);
+
 	//
 	// Set the Flow key:
 	// - flowId
 	//
-	flowObj.setFlowId(flowPath.flowId().toString());
-	flowObj.setType("flow");
+	flowProp.setFlowId(flowPath.flowId().toString());
 	if ( measureONOSFlowTimeProp ) {
 	    numPropsSet += 2;
 	}
@@ -161,101 +163,103 @@
 	// - flowPath.matchDstTcpUdpPort()
 	// - flowPath.flowEntryActions()
 	//
-	flowObj.setInstallerId(flowPath.installerId().toString());
-	flowObj.setFlowPathType(flowPath.flowPathType().toString());
-	flowObj.setFlowPathUserState(flowPath.flowPathUserState().toString());
-	flowObj.setFlowPathFlags(flowPath.flowPathFlags().flags());
-	flowObj.setIdleTimeout(flowPath.idleTimeout());
-	flowObj.setHardTimeout(flowPath.hardTimeout());
-	flowObj.setSrcSwitch(flowPath.dataPath().srcPort().dpid().toString());
-	flowObj.setSrcPort(flowPath.dataPath().srcPort().port().value());
-	flowObj.setDstSwitch(flowPath.dataPath().dstPort().dpid().toString());
-	flowObj.setDstPort(flowPath.dataPath().dstPort().port().value());
+	flowProp.setInstallerId(flowPath.installerId().toString());
+	flowProp.setFlowPathType(flowPath.flowPathType().toString());
+	flowProp.setFlowPathUserState(flowPath.flowPathUserState().toString());
+	flowProp.setFlowPathFlags(flowPath.flowPathFlags().flags());
+	flowProp.setIdleTimeout(flowPath.idleTimeout());
+	flowProp.setHardTimeout(flowPath.hardTimeout());
+	flowProp.setSrcSwitch(flowPath.dataPath().srcPort().dpid().toString());
+	flowProp.setSrcPort(flowPath.dataPath().srcPort().port().value());
+	flowProp.setDstSwitch(flowPath.dataPath().dstPort().dpid().toString());
+	flowProp.setDstPort(flowPath.dataPath().dstPort().port().value());
 	if ( measureONOSFlowTimeProp ) {
 	    numPropsSet += 10;
 	}
 
 	if (flowPath.flowEntryMatch().matchSrcMac()) {
-	    flowObj.setMatchSrcMac(flowPath.flowEntryMatch().srcMac().toString());
+	    flowProp.setMatchSrcMac(flowPath.flowEntryMatch().srcMac().toString());
 		if ( measureONOSFlowTimeProp ) {
 		    ++numPropsSet;
 		}
 	}
 	if (flowPath.flowEntryMatch().matchDstMac()) {
-	    flowObj.setMatchDstMac(flowPath.flowEntryMatch().dstMac().toString());
+	    flowProp.setMatchDstMac(flowPath.flowEntryMatch().dstMac().toString());
 		if ( measureONOSFlowTimeProp ) {
 		    ++numPropsSet;
 		}
 	}
 	if (flowPath.flowEntryMatch().matchEthernetFrameType()) {
-	    flowObj.setMatchEthernetFrameType(flowPath.flowEntryMatch().ethernetFrameType());
+	    flowProp.setMatchEthernetFrameType(flowPath.flowEntryMatch().ethernetFrameType());
 		if ( measureONOSFlowTimeProp ) {
 		    ++numPropsSet;
 		}
 	}
 	if (flowPath.flowEntryMatch().matchVlanId()) {
-	    flowObj.setMatchVlanId(flowPath.flowEntryMatch().vlanId());
+	    flowProp.setMatchVlanId(flowPath.flowEntryMatch().vlanId());
 		if ( measureONOSFlowTimeProp ) {
 		    ++numPropsSet;
 		}
 	}
 	if (flowPath.flowEntryMatch().matchVlanPriority()) {
-	    flowObj.setMatchVlanPriority(flowPath.flowEntryMatch().vlanPriority());
+	    flowProp.setMatchVlanPriority(flowPath.flowEntryMatch().vlanPriority());
 		if ( measureONOSFlowTimeProp ) {
 		    ++numPropsSet;
 		}
 	}
 	if (flowPath.flowEntryMatch().matchSrcIPv4Net()) {
-	    flowObj.setMatchSrcIPv4Net(flowPath.flowEntryMatch().srcIPv4Net().toString());
+	    flowProp.setMatchSrcIPv4Net(flowPath.flowEntryMatch().srcIPv4Net().toString());
 		if ( measureONOSFlowTimeProp ) {
 		    ++numPropsSet;
 		}
 	}
 	if (flowPath.flowEntryMatch().matchDstIPv4Net()) {
-	    flowObj.setMatchDstIPv4Net(flowPath.flowEntryMatch().dstIPv4Net().toString());
+	    flowProp.setMatchDstIPv4Net(flowPath.flowEntryMatch().dstIPv4Net().toString());
 		if ( measureONOSFlowTimeProp ) {
 		    ++numPropsSet;
 		}
 	}
 	if (flowPath.flowEntryMatch().matchIpProto()) {
-	    flowObj.setMatchIpProto(flowPath.flowEntryMatch().ipProto());
+	    flowProp.setMatchIpProto(flowPath.flowEntryMatch().ipProto());
 		if ( measureONOSFlowTimeProp ) {
 		    ++numPropsSet;
 		}
 	}
 	if (flowPath.flowEntryMatch().matchIpToS()) {
-	    flowObj.setMatchIpToS(flowPath.flowEntryMatch().ipToS());
+	    flowProp.setMatchIpToS(flowPath.flowEntryMatch().ipToS());
 		if ( measureONOSFlowTimeProp ) {
 		    ++numPropsSet;
 		}
 	}
 	if (flowPath.flowEntryMatch().matchSrcTcpUdpPort()) {
-	    flowObj.setMatchSrcTcpUdpPort(flowPath.flowEntryMatch().srcTcpUdpPort());
+	    flowProp.setMatchSrcTcpUdpPort(flowPath.flowEntryMatch().srcTcpUdpPort());
 		if ( measureONOSFlowTimeProp ) {
 		    ++numPropsSet;
 		}
 	}
 	if (flowPath.flowEntryMatch().matchDstTcpUdpPort()) {
-	    flowObj.setMatchDstTcpUdpPort(flowPath.flowEntryMatch().dstTcpUdpPort());
+	    flowProp.setMatchDstTcpUdpPort(flowPath.flowEntryMatch().dstTcpUdpPort());
 		if ( measureONOSFlowTimeProp ) {
 		    ++numPropsSet;
 		}
 	}
 	if (! flowPath.flowEntryActions().actions().isEmpty()) {
-	    flowObj.setActions(flowPath.flowEntryActions().toString());
+	    flowProp.setActions(flowPath.flowEntryActions().toString());
 		if ( measureONOSFlowTimeProp ) {
 		    ++numPropsSet;
 		}
 	}
-	flowObj.setDataPathSummary(flowPath.dataPath().dataPathSummary());
+	flowProp.setDataPathSummary(flowPath.dataPath().dataPathSummary());
 	if ( measureONOSFlowTimeProp ) {
 	    ++numPropsSet;
 	}
 
 	if (found)
-	    flowObj.setFlowPathUserState("FP_USER_MODIFY");
+	    flowProp.setFlowPathUserState("FP_USER_MODIFY");
 	else
-	    flowObj.setFlowPathUserState("FP_USER_ADD");
+	    flowProp.setFlowPathUserState("FP_USER_ADD");
+
+	flowProp.commitProperties();
 
 	if ( measureONOSFlowTimeProp ) {
 	    ++numPropsSet;
@@ -421,7 +425,7 @@
 	    startSetProperties = System.nanoTime();
 	}
 
-	FlowProperty flowProp = new FlowProperty(dbHandler, flowEntryObj);
+	FlowEntryProperty flowProp = new FlowEntryProperty(dbHandler, flowEntryObj);
 
 	//
 	// Set the Flow Entry key:
@@ -852,6 +856,7 @@
 	//
 	// Extract the Flow state
 	//
+    log.info("extractFlowPath: start");
 	String flowIdStr = flowObj.getFlowId();
 	String installerIdStr = flowObj.getInstallerId();
 	String flowPathType = flowObj.getFlowPathType();
@@ -875,7 +880,8 @@
 	    (srcPortShort == null) ||
 	    (dstSwitchStr == null) ||
 	    (dstPortShort == null)) {
-	    // TODO: A work-around, becauuse of some bogus database objects
+	    // TODO: A work-around, because of some bogus database objects
+	    log.error("extractFlowPath: wrong properties");
 	    return null;
 	}
 
@@ -954,6 +960,7 @@
 	    flowPath.dataPath().flowEntries().add(flowEntry);
 	}
 
+    log.info("extractFlowPath: end");
 	return flowPath;
     }
 
@@ -964,9 +971,12 @@
      * @return the extracted Flow Entry State.
      */
     public static FlowEntry extractFlowEntry(IFlowEntry flowEntryObj) {
+	log.info("extractFlowEntry: start");
 	IFlowPath flowObj = flowEntryObj.getFlow();
-	if (flowObj == null)
+	if (flowObj == null) {
+		log.error("extractFlowEntry: no flowPath exists");
 	    return null;
+	}
 
 	String flowIdStr = flowObj.getFlowId();
 	//
@@ -985,6 +995,7 @@
 	    (userState == null) ||
 	    (switchState == null)) {
 	    // TODO: A work-around, because of some bogus database objects
+		log.error("extractFlowEntry: wrong properties");
 	    return null;
 	}
 
@@ -1050,6 +1061,7 @@
 	//
 	// TODO: Take care of FlowEntryErrorState.
 	//
+	log.info("extractFlowEntry: end");
 	return flowEntry;
     }
 }
diff --git a/src/main/java/net/onrc/onos/ofcontroller/flowmanager/FlowProperty.java b/src/main/java/net/onrc/onos/ofcontroller/flowmanager/FlowEntryProperty.java
similarity index 95%
rename from src/main/java/net/onrc/onos/ofcontroller/flowmanager/FlowProperty.java
rename to src/main/java/net/onrc/onos/ofcontroller/flowmanager/FlowEntryProperty.java
index ccc1124..7b17aaa 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/flowmanager/FlowProperty.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/flowmanager/FlowEntryProperty.java
@@ -6,12 +6,12 @@
 import net.onrc.onos.graph.DBOperation;
 import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IFlowEntry;
 
-public class FlowProperty {
+public class FlowEntryProperty {
     private Map<String, Object> map = new HashMap<>();
     private DBOperation dbhandler;
     private IFlowEntry flowEntry;
     
-    public FlowProperty(DBOperation dbHandler, IFlowEntry flowEntry) {
+    public FlowEntryProperty(DBOperation dbHandler, IFlowEntry flowEntry) {
         this.dbhandler = dbHandler;
         this.flowEntry = flowEntry;
     }
@@ -145,6 +145,6 @@
      * @param dbhandler
      */
     public void commitProperties() {
-        dbhandler.setFlowProperties(flowEntry ,map);
+        dbhandler.setVertexProperties(flowEntry.asVertex() ,map);
     }
 }
diff --git a/src/main/java/net/onrc/onos/ofcontroller/flowmanager/FlowPathProperty.java b/src/main/java/net/onrc/onos/ofcontroller/flowmanager/FlowPathProperty.java
new file mode 100644
index 0000000..c6a2b98
--- /dev/null
+++ b/src/main/java/net/onrc/onos/ofcontroller/flowmanager/FlowPathProperty.java
@@ -0,0 +1,126 @@
+package net.onrc.onos.ofcontroller.flowmanager;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import net.onrc.onos.graph.DBOperation;
+import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IFlowPath;
+
+public class FlowPathProperty {
+	private Map<String, Object> map = new HashMap<>();
+	private DBOperation dbhandler;
+	private IFlowPath flowPath;
+
+	public FlowPathProperty(DBOperation dbHandler, IFlowPath flowPath) {
+		this.dbhandler = dbHandler;
+		this.flowPath = flowPath;
+	}
+
+	public void setType(String typeStr) {
+		map.put("type", typeStr);
+	}
+
+	public void setFlowId(String flowId) {
+		map.put("flow_id", flowId);
+	}
+
+	public void setInstallerId(String installerId) {
+		map.put("installer_id", installerId);
+	}
+
+	public void setFlowPathType(String flowPathType) {
+		map.put("flow_path_type", flowPathType);
+	}
+
+	public void setFlowPathUserState(String userState) {
+		map.put("user_state", userState);
+	}
+
+	public void setFlowPathFlags(Long flowPathFlags) {
+		map.put("flow_path_flags", flowPathFlags);
+	}
+
+	public void setIdleTimeout(Integer idleTimeout) {
+		map.put("idle_timeout", idleTimeout);
+	}
+
+	public void setHardTimeout(Integer hardTimeout) {
+		map.put("hard_timeout", hardTimeout);
+	}
+
+	public void setSrcSwitch(String srcSwitch) {
+		map.put("src_switch", srcSwitch);
+	}
+
+	public void setSrcPort(Short srcPort) {
+		map.put("src_port", srcPort);
+	}
+
+	public void setDstSwitch(String dstSwitch) {
+		map.put("dst_switch", dstSwitch);
+	}
+
+	public void setDstPort(Short dstPort) {
+		map.put("dst_port", dstPort);
+	}
+
+	public void setDataPathSummary(String dataPathSummary) {
+		map.put("data_path_summary", dataPathSummary);
+	}
+
+	public void setMatchSrcMac(String matchSrcMac) {
+		map.put("matchSrcMac", matchSrcMac);
+	}
+
+	public void setMatchDstMac(String matchDstMac) {
+		map.put("matchDstMac", matchDstMac);
+	}
+
+	public void setMatchEthernetFrameType(Short matchEthernetFrameType) {
+		map.put("matchEthernetFrameType", matchEthernetFrameType);
+	}
+
+	public void setMatchVlanId(Short matchVlanId) {
+		map.put("matchVlanId", matchVlanId);
+	}
+
+	public void setMatchVlanPriority(Byte matchVlanPriority) {
+		map.put("matchVlanPriority", matchVlanPriority);
+	}
+
+	public void setMatchSrcIPv4Net(String matchSrcIPv4Net) {
+		map.put("matchSrcIPv4Net", matchSrcIPv4Net);
+	}
+
+	public void setMatchDstIPv4Net(String matchDstIPv4Net) {
+		map.put("matchDstIPv4Net", matchDstIPv4Net);
+	}
+
+	public void setMatchIpProto(Byte matchIpProto) {
+		map.put("matchIpProto", matchIpProto);
+	}
+
+	public void setMatchIpToS(Byte matchIpToS) {
+		map.put("matchIpToS", matchIpToS);
+	}
+
+	public void setMatchSrcTcpUdpPort(Short matchSrcTcpUdpPort) {
+		map.put("matchSrcTcpUdpPort", matchSrcTcpUdpPort);
+	}
+
+	public void setMatchDstTcpUdpPort(Short matchDstTcpUdpPort) {
+		map.put("matchDstTcpUdpPort", matchDstTcpUdpPort);
+	}
+
+	public void setActions(String actionsStr) {
+		map.put("actions", actionsStr);
+	}
+    
+    /**
+     *
+     * @param dbhandler
+     */
+    public void commitProperties() {
+        dbhandler.setVertexProperties(flowPath.asVertex() ,map);
+    }
+}