enable batching wirte of FlowPath vertex properties
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 c14d00c..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;
@@ -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;
     }
 }