Squashed commit of the following:

commit e9604083c5374bf5eac889e82cf54bb0b22ef763
Author: Naoki Shiota <n-shiota@onlab.us>
Date:   Wed Oct 23 11:51:00 2013 -0700

    Refactored NetworkGraphPublisher and related modules to be ready for implementing event notification.
diff --git a/src/main/java/net/onrc/onos/ofcontroller/core/internal/LinkStorageImpl.java b/src/main/java/net/onrc/onos/ofcontroller/core/internal/LinkStorageImpl.java
index 753563e..da34c22 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/core/internal/LinkStorageImpl.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/core/internal/LinkStorageImpl.java
@@ -14,7 +14,6 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.thinkaurelius.titan.core.TitanException;
 import com.tinkerpop.blueprints.Vertex;
 import com.tinkerpop.pipes.PipeFunction;
 import com.tinkerpop.pipes.transform.PathPipe;
@@ -25,7 +24,7 @@
 public class LinkStorageImpl implements ILinkStorage {
 	
 	protected static Logger log = LoggerFactory.getLogger(LinkStorageImpl.class);
-	protected GraphDBOperation dbop;
+	protected GraphDBOperation op;
 
 	
 	/**
@@ -34,37 +33,105 @@
 	 */
 	@Override
 	public void init(String conf) {
-		this.dbop = new GraphDBOperation(conf);
+		this.op = new GraphDBOperation(conf);
 	}
 
+	// Method designing policy:
+	//  op.commit() and op.rollback() MUST called in public (first-class) methods.
+	//  A first-class method MUST NOT call other first-class method.
+	//  Routine process should be implemented in private method.
+	//  A private method MUST NOT call commit or rollback.
+
+	
 	/**
-	 * Update a record in the LinkStorage in a way provided by op.
+	 * Update a record in the LinkStorage in a way provided by dmop.
 	 * @param link Record of a link to be updated.
-	 * @param op Operation to be done.
+	 * @param linkinfo Meta-information of a link to be updated.
+	 * @param dmop Operation to be done.
 	 */
 	@Override
-	public void update(Link link, LinkInfo linkinfo, DM_OPERATION op) {
-		switch (op) {
+	public boolean update(Link link, LinkInfo linkinfo, DM_OPERATION dmop) {
+		boolean success = false;
+		
+		switch (dmop) {
 		case CREATE:
 		case INSERT:
-			addLinkImpl(link,op);
+			if (link != null) {
+				try {
+					if (addLinkImpl(link)) {
+						op.commit();
+						success = true;
+					}
+				} catch (Exception e) {
+					op.rollback();
+					e.printStackTrace();
+		        	log.error("LinkStorageImpl:update {} link:{} failed", dmop, link);
+				}
+			}
 			break;
 		case UPDATE:
-			if (linkinfo != null) {
-				setLinkInfo(link, linkinfo);
-			} else {
-				deleteLinkInfo(link);
+			if (link != null && linkinfo != null) {
+				try {
+					if (setLinkInfoImpl(link, linkinfo)) {
+						op.commit();
+						success = true;
+					}
+				} catch (Exception e) {
+					op.rollback();
+					e.printStackTrace();
+		        	log.error("LinkStorageImpl:update {} link:{} failed", dmop, link);
+				}
 			}
 			break;
 		case DELETE:
-			deleteLink(link);
+			if (link != null) {
+				try {
+					if (deleteLinkImpl(link)) {
+						op.commit();
+						success = true;
+		            	log.debug("LinkStorageImpl:update {} link:{} succeeded", dmop, link);
+		            } else {
+						op.rollback();
+		            	log.debug("LinkStorageImpl:update {} link:{} failed", dmop, link);
+					}
+				} catch (Exception e) {
+					op.rollback();
+					e.printStackTrace();
+					log.error("LinkStorageImpl:update {} link:{} failed", dmop, link);
+				}
+			}
 			break;
 		}
+		
+		return success;
 	}
 
 	@Override
-	public void addLink(Link link) {
-		addLinkImpl(link, DM_OPERATION.INSERT);
+	public boolean addLink(Link link) {
+		return addLink(link, null);
+	}
+
+	@Override
+	public boolean addLink(Link link, LinkInfo linfo) {
+		boolean success = false;
+		
+		try {
+			if (addLinkImpl(link)) {
+				// Set LinkInfo only if linfo is non-null.
+				if (linfo != null && (! setLinkInfoImpl(link, linfo))) {
+					op.rollback();
+				}
+				op.commit();
+				success = true;
+			} else {
+				op.rollback();
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+			log.error("LinkStorageImpl:addLink link:{} linfo:{} failed", link, linfo);
+		}
+		
+		return success;
 	}
 	
 	/**
@@ -73,143 +140,82 @@
 	 * @param op Operation to be done.
 	 */
 	@Override
-	public void addLinks(List<Link> links) {
+	public boolean addLinks(List<Link> links) {
+		boolean success = false;
+		
 		for (Link lt: links) {
-			addLinkImpl(lt, DM_OPERATION.INSERT);
+			if (! addLinkImpl(lt)) {
+				return false;
+			}
 		}
+		
+		try {
+			op.commit();
+			success = true;
+		} catch (Exception e) {
+			e.printStackTrace();
+			log.error("LinkStorageImpl:addLinks link:s{} failed", links);
+		}
+		
+		return success;
 	}
 
 	/**
-		 * Delete a record in the LinkStorage.
-		 * @param lt Record to be deleted.
-		 */
-		@Override
-		public void deleteLink(Link lt) {
-			IPortObject vportSrc = null, vportDst = null;
-			
-			log.debug("deleteLink(): {}", lt);
-			
-	        try {
-	            // get source port vertex
-	         	String dpid = HexString.toHexString(lt.getSrc());
-	         	short port = lt.getSrcPort();
-	         	vportSrc = dbop.searchPort(dpid, port);
-	            
-	            // get dst port vertex
-	         	dpid = HexString.toHexString(lt.getDst());
-	         	port = lt.getDstPort();
-	         	vportDst = dbop.searchPort(dpid, port);
-	     		// FIXME: This needs to remove all edges
-	         	
-	         	if (vportSrc != null && vportDst != null) {
-	         		vportSrc.removeLink(vportDst);
-	        		dbop.commit();
-	            	log.debug("deleteLink(): deleted edges src {} dst {}", new Object[]{
-	            			lt, vportSrc, vportDst});
-	            	
-	        		// TODO publish DELETE_LINK event here
-	            } else {
-	            	log.error("deleteLink(): failed invalid vertices {} src {} dst {}", new Object[]{lt, vportSrc, vportDst});
-	            	dbop.rollback();
-	            }
-	         	
-	        } catch (TitanException e) {
-	            /*
-	             * retry till we succeed?
-	             */
-	        	log.error("deleteLink(): titan exception {} {}", new Object[]{lt, e.toString()});
-	        	dbop.rollback();
-	        	e.printStackTrace();
-	        }
-		}
+	 * Delete a record in the LinkStorage.
+	 * @param lt Record to be deleted.
+	 */
+	@Override
+	public boolean deleteLink(Link lt) {
+		boolean success = false;
+		
+		log.debug("LinkStorageImpl:deleteLink(): {}", lt);
+		
+        try {
+         	if (deleteLinkImpl(lt)) {
+        		op.commit();
+        		success = true;
+            	log.debug("LinkStorageImpl:deleteLink(): deleted edges {}", lt);
+            } else {
+            	op.rollback();
+            	log.error("LinkStorageImpl:deleteLink(): failed invalid vertices {}", lt);
+            }
+        } catch (Exception e) {
+        	op.rollback();
+        	log.error("LinkStorageImpl:deleteLink(): failed {} {}",
+        			new Object[]{lt, e.toString()});
+        	e.printStackTrace();
+        }
+        
+        return success;
+	}
 
 	/**
 	 * Delete multiple records in LinkStorage.
 	 * @param links List of records to be deleted.
 	 */
 	@Override
-	public void deleteLinks(List<Link> links) {
-		for (Link lt : links) {
-			deleteLink(lt);
+	public boolean deleteLinks(List<Link> links) {
+		boolean success = false;
+		
+		try {
+			for (Link lt : links) {
+				if (! deleteLinkImpl(lt)) {
+					op.rollback();
+					return false;
+				}
+			}
+			op.commit();
+			success = true;
+		} catch (Exception e) {
+        	op.rollback();
+			e.printStackTrace();
+        	log.error("LinkStorageImpl:deleteLinks failed invalid vertices {}", links);
 		}
-	}
-
-	/**
-	 * Update a record of link with meta-information in the LinkStorage in a way provided by op.
-	 * @param link Record of a link to update.
-	 * @param linkinfo Meta-information of a link to be updated.
-	 * @param op Operation to be done.
-	 */
-	private void setLinkInfo(Link link, LinkInfo linkinfo) {
-		// TODO implement this
 		
-		// TODO publish UPDATE_LINK event here
-	}
-	
-	private void deleteLinkInfo(Link link) {
-		// TODO implement this
-		
-		// TODO publish UPDATE_LINK event here
+		return success;
 	}
 
 	/**
-	 * Perform INSERT/CREATE/UPDATE operation to update the LinkStorage.
-	 * @param lt Record of a link to be updated.
-	 * @param linkinfo Meta-information of a link to be updated.
-	 * @param op Operation to be done. (only INSERT/CREATE/UPDATE is acceptable)
-	 */
-	private void addLinkImpl(Link lt, DM_OPERATION op) {
-		IPortObject vportSrc = null, vportDst = null;
-	
-		log.trace("updateLink(): op {} {}", new Object[]{op, lt});
-		
-        try {
-            // get source port vertex
-        	String dpid = HexString.toHexString(lt.getSrc());
-        	short port = lt.getSrcPort();
-        	vportSrc = dbop.searchPort(dpid, port);
-            
-            // get dest port vertex
-            dpid = HexString.toHexString(lt.getDst());
-            port = lt.getDstPort();
-            vportDst = dbop.searchPort(dpid, port);
-                        
-            if (vportSrc != null && vportDst != null) {
-            	// check if the link exists
-            	
-            	Iterable<IPortObject> currPorts = vportSrc.getLinkedPorts();
-            	List<IPortObject> currLinks = new ArrayList<IPortObject>();
-            	for (IPortObject V : currPorts) {
-            		currLinks.add(V);
-            	}
-
-            	if (currLinks.contains(vportDst)) {
-            		if (op.equals(DM_OPERATION.INSERT) || op.equals(DM_OPERATION.CREATE)) {
-            			log.debug("addOrUpdateLink(): failed link exists {} {} src {} dst {}", 
-            					new Object[]{op, lt, vportSrc, vportDst});
-            		}
-            	} else {
-            		vportSrc.setLinkPort(vportDst);
-
-            		dbop.commit();
-            		log.debug("updateLink(): link added {} {} src {} dst {}", new Object[]{op, lt, vportSrc, vportDst});
-            		
-            		// TODO publish ADD_LINK event here
-            	}
-            } else {
-            	log.error("updateLink(): failed invalid vertices {} {} src {} dst {}", new Object[]{op, lt, vportSrc, vportDst});
-            	dbop.rollback();
-            }
-        } catch (TitanException e) {
-            /*
-             * retry till we succeed?
-             */
-        	e.printStackTrace();
-        	log.error("updateLink(): titan exception {} {} {}", new Object[]{op, lt, e.toString()});
-        }
-	}
-	
-	/**
 	 * Get list of all links connected to the port specified by given DPID and port number.
 	 * @param dpid DPID of desired port.
 	 * @param port Port number of desired port.
@@ -219,7 +225,7 @@
 	public List<Link> getLinks(Long dpid, short port) {
     	List<Link> links = new ArrayList<Link>();
     	
-    	IPortObject srcPort = dbop.searchPort(HexString.toHexString(dpid), port);
+    	IPortObject srcPort = op.searchPort(HexString.toHexString(dpid), port);
     	ISwitchObject srcSw = srcPort.getSwitch();
     	
     	if(srcSw != null && srcPort != null) {
@@ -243,12 +249,27 @@
 	 * @param port Port number of desired port.
 	 */
 	@Override
-	public void deleteLinksOnPort(Long dpid, short port) {
-		List<Link> linksToDelete = getLinks(dpid, port);
+	public boolean deleteLinksOnPort(Long dpid, short port) {
+		boolean success = false;
 		
-		for(Link l : linksToDelete) {
-			deleteLink(l);
+		List<Link> linksToDelete = getLinks(dpid, port);
+		try {
+			for(Link l : linksToDelete) {
+				if (! deleteLinkImpl(l)) {
+					op.rollback();
+					log.error("LinkStorageImpl:deleteLinksOnPort dpid:{} port:{} failed", dpid, port);
+					return false;
+				}
+			}
+			op.commit();
+			success = true;
+		} catch (Exception e) {
+        	op.rollback();
+			e.printStackTrace();
+        	log.error("LinkStorageImpl:deleteLinksOnPort dpid:{} port:{} failed", dpid, port);
 		}
+		
+		return success;
 	}
 
 	/**
@@ -260,7 +281,7 @@
 	public List<Link> getLinks(String dpid) {
 		List<Link> links = new ArrayList<Link>();
 
-		ISwitchObject srcSw = dbop.searchSwitch(dpid);
+		ISwitchObject srcSw = op.searchSwitch(dpid);
 		
 		if(srcSw != null) {
 			for(IPortObject srcPort : srcSw.getPorts()) {
@@ -285,7 +306,7 @@
 	 * @return List of active links. Empty list if no port was found.
 	 */
 	public List<Link> getActiveLinks() {
-		Iterable<ISwitchObject> switches = dbop.getActiveSwitches();
+		Iterable<ISwitchObject> switches = op.getActiveSwitches();
 
 		List<Link> links = new ArrayList<Link>(); 
 		
@@ -329,6 +350,79 @@
 //		graph.shutdown();		
 	}
 
+	/**
+	 * Update a record of link with meta-information in the LinkStorage.
+	 * @param link Record of a link to update.
+	 * @param linkinfo Meta-information of a link to be updated.
+	 */
+	private boolean setLinkInfoImpl(Link link, LinkInfo linkinfo) {
+		// TODO implement this
+		
+		return false;
+	}
+
+	private boolean addLinkImpl(Link lt) {
+		boolean success = false;
+		
+		IPortObject vportSrc = null, vportDst = null;
+		
+		// get source port vertex
+		String dpid = HexString.toHexString(lt.getSrc());
+		short port = lt.getSrcPort();
+		vportSrc = op.searchPort(dpid, port);
+		
+		// get dest port vertex
+		dpid = HexString.toHexString(lt.getDst());
+		port = lt.getDstPort();
+		vportDst = op.searchPort(dpid, port);
+		            
+		if (vportSrc != null && vportDst != null) {
+			IPortObject portExist = null;
+			// check if the link exists
+			for (IPortObject V : vportSrc.getLinkedPorts()) {
+				if (V.equals(vportDst)) {
+					portExist = V;
+					break;
+				}
+			}
+		
+			if (portExist == null) {
+				vportSrc.setLinkPort(vportDst);
+				success = true;
+			} else {
+				log.debug("LinkStorageImpl:addLinkImpl failed link exists {} {} src {} dst {}", 
+						new Object[]{op, lt, vportSrc, vportDst});
+			}
+		}
+		
+		return success;
+	}
+
+	private boolean deleteLinkImpl(Link lt) {
+		boolean success = false;
+		IPortObject vportSrc = null, vportDst = null;
+	
+	    // get source port vertex
+	 	String dpid = HexString.toHexString(lt.getSrc());
+	 	short port = lt.getSrcPort();
+	 	vportSrc = op.searchPort(dpid, port);
+	    
+	    // get dst port vertex
+	 	dpid = HexString.toHexString(lt.getDst());
+	 	port = lt.getDstPort();
+	 	vportDst = op.searchPort(dpid, port);
+	 	
+		// FIXME: This needs to remove all edges
+	 	if (vportSrc != null && vportDst != null) {
+	 		vportSrc.removeLink(vportDst);
+	    	log.debug("deleteLinkImpl(): deleted edges src {} dst {}", new Object[]{
+	    			lt, vportSrc, vportDst});
+	    	success = true;
+	    }
+	    
+	 	return success;
+	}
+
 	// TODO should be moved to TopoLinkServiceImpl (never used in this class)
 	static class ExtractLink implements PipeFunction<PathPipe<Vertex>, Link> {