Merge branch 'master' into RAMCloud

Conflicts:
	conf/onos.properties
	src/main/java/net/onrc/onos/flow/FlowManagerImpl.java
	src/main/java/net/onrc/onos/graph/LocalTopologyEventListener.java
	src/main/java/net/onrc/onos/ofcontroller/bgproute/BgpRoute.java
	src/main/java/net/onrc/onos/ofcontroller/core/ILinkStorage.java
	src/main/java/net/onrc/onos/ofcontroller/core/ISwitchStorage.java
	src/main/java/net/onrc/onos/ofcontroller/core/internal/DeviceStorageImpl.java
	src/main/java/net/onrc/onos/ofcontroller/core/internal/LinkStorageImpl.java
	src/main/java/net/onrc/onos/ofcontroller/core/internal/SwitchStorageImpl.java
	src/main/java/net/onrc/onos/ofcontroller/floodlightlistener/NetworkGraphPublisher.java
	src/main/java/net/onrc/onos/ofcontroller/flowmanager/FlowManager.java
	src/main/java/net/onrc/onos/ofcontroller/topology/ShortestPath.java
	src/main/java/net/onrc/onos/ofcontroller/topology/web/RouteResource.java
	src/test/java/net/onrc/onos/ofcontroller/core/internal/SwitchStorageImplTest.java
	src/test/java/net/onrc/onos/ofcontroller/core/internal/SwitchStorageImplTestBB.java
	src/test/java/net/onrc/onos/ofcontroller/devicemanager/internal/DeviceStorageImplTest.java
	src/test/java/net/onrc/onos/ofcontroller/topology/TopologyManagerTest.java
diff --git a/src/main/java/net/onrc/onos/graph/GraphDBConnection.java b/src/main/java/net/onrc/onos/graph/GraphDBConnection.java
index f9f3b67..bf30297 100644
--- a/src/main/java/net/onrc/onos/graph/GraphDBConnection.java
+++ b/src/main/java/net/onrc/onos/graph/GraphDBConnection.java
@@ -29,7 +29,7 @@
 		}
 	}
 
-	protected static Logger log = LoggerFactory
+	protected final static Logger log = LoggerFactory
 			.getLogger(GraphDBConnection.class);
 	private static GraphDBConnection singleton = new GraphDBConnection();
 	private static TitanGraph graph;
@@ -81,15 +81,19 @@
 			if (!s.contains("switch_state")) {
 				graph.createKeyIndex("switch_state", Vertex.class);
 			}
+			if (!s.contains("ipv4_address")) {
+				graph.createKeyIndex("ipv4_address", Vertex.class);
+			}
 			graph.commit();
 			eg = new EventTransactionalGraph<TitanGraph>(graph);
 		}
 		return singleton;
 	}
 
-	/** 
+	/**
 	 * Get a FramedGraph instance of the graph.
 	 */
+	@Override
 	public FramedGraph<TitanGraph> getFramedGraph() {
 		if (isValid()) {
 			FramedGraph<TitanGraph> fg = new FramedGraph<TitanGraph>(graph);
@@ -115,6 +119,7 @@
 	/**
 	 * Add LocalGraphChangedLister for the graph.
 	 */
+	@Override
 	public void addEventListener(final LocalGraphChangedListener listener) {
 		EventTransactionalGraph<TitanGraph> eg = this.getEventGraph();
 		eg.addListener(listener);
@@ -124,38 +129,49 @@
 	/**
 	 * Return whether this connection is valid.
 	 */
+	@Override
 	public Boolean isValid() {
-		return (graph != null || graph.isOpen());
+		return (graph != null && graph.isOpen());
 	}
 
 	/**
 	 * Commit changes for the graph operations.
+	 * @throws Exception 
 	 */
+	@Override
 	public void commit() {
-		try {
+//		// Should not catch exception here! 
+//		try {
 			graph.commit();
-		}
-		catch (Exception e) {
-			log.error("{}", e.toString());
-		}
+//		}
+//		catch (Exception e) {
+//			log.error("{}", e.toString());
+//		}
 	}
 
 	/**
 	 * Rollback changes for the graph operations.
 	 */
+	@Override
 	public void rollback() {
-		try {
+		// Should not catch exception here! 
+//		try {
 			graph.rollback();
-		}
-		catch (Exception e) {
-			log.error("{}", e.toString());
-		}
+//		}
+//		catch (Exception e) {
+//			log.error("{}", e.toString());
+//		}
 	}
 
 	/**
 	 * Close this database connection.
 	 */
+	@Override
 	public void close() {
-		commit();
+		try {
+			commit();
+		} catch (Exception e) {
+			log.error("{}", e.toString());
+		}
 	}
 }
diff --git a/src/main/java/net/onrc/onos/graph/GraphDBOperation.java b/src/main/java/net/onrc/onos/graph/GraphDBOperation.java
index f1e9b46..bfd9046 100644
--- a/src/main/java/net/onrc/onos/graph/GraphDBOperation.java
+++ b/src/main/java/net/onrc/onos/graph/GraphDBOperation.java
@@ -1,11 +1,14 @@
 package net.onrc.onos.graph;
 
 import java.util.ArrayList;
+import java.util.Iterator;
 import java.util.List;
 
+import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IBaseObject;
 import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IDeviceObject;
 import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IFlowEntry;
 import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IFlowPath;
+import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IIpv4Address;
 import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IPortObject;
 import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.ISwitchObject;
 import net.onrc.onos.ofcontroller.core.ISwitchStorage.SwitchState;
@@ -225,6 +228,49 @@
 		FramedGraph<TitanGraph> fg = conn.getFramedGraph();	
 		if (fg != null) fg.removeVertex(dev.asVertex());		
 	}
+	
+	public IIpv4Address newIpv4Address() {
+		return newVertex("ipv4Address", IIpv4Address.class);
+	}
+	
+	private <T extends IBaseObject> T newVertex(String type, Class<T> vertexType) {
+		FramedGraph<TitanGraph> fg = conn.getFramedGraph();
+		T newVertex = fg.addVertex(null, vertexType);
+		if (newVertex != null) {
+			newVertex.setType(type);
+		}
+		return newVertex;
+	}
+	
+	public IIpv4Address searchIpv4Address(int intIpv4Address) {
+		return searchForVertex("ipv4_address", intIpv4Address, IIpv4Address.class);
+	}
+	
+	private <T> T searchForVertex(String propertyName, Object propertyValue, Class<T> vertexType) {
+		FramedGraph<TitanGraph> fg = conn.getFramedGraph();
+		if (fg != null) {
+			Iterator<T> it = 
+					fg.getVertices(propertyName, propertyValue, vertexType).iterator();
+			if (it.hasNext()) {
+				return it.next();
+			}
+		}
+		return null;
+	}
+	
+	public IIpv4Address ensureIpv4Address(int intIpv4Address) {
+		IIpv4Address ipv4Vertex = searchIpv4Address(intIpv4Address);
+		if (ipv4Vertex == null) {
+			ipv4Vertex = newIpv4Address();
+			ipv4Vertex.setIpv4Address(intIpv4Address);
+		}
+		return ipv4Vertex;
+	}
+	
+	public void removeIpv4Address(IIpv4Address ipv4Address) {
+		FramedGraph<TitanGraph> fg = conn.getFramedGraph();
+		fg.removeVertex(ipv4Address.asVertex());
+	}
 
 	/**
 	 * Create and return a flow path object.
diff --git a/src/main/java/net/onrc/onos/graph/LocalTopologyEventListener.java b/src/main/java/net/onrc/onos/graph/LocalTopologyEventListener.java
index fc8a196..7014e23 100644
--- a/src/main/java/net/onrc/onos/graph/LocalTopologyEventListener.java
+++ b/src/main/java/net/onrc/onos/graph/LocalTopologyEventListener.java
@@ -15,98 +15,99 @@
 import java.util.Map;
 
 public class LocalTopologyEventListener implements LocalGraphChangedListener {
+	
+	protected final static Logger log = LoggerFactory.getLogger(LocalTopologyEventListener.class);
+	protected static DBConnection conn;
+	
+	public LocalTopologyEventListener(DBConnection conn) {
+		LocalTopologyEventListener.conn = conn;		
+	}
 
-    protected static Logger log = LoggerFactory.getLogger(LocalTopologyEventListener.class);
-    protected static DBConnection conn;
+	@Override
+	public void edgeAdded(Edge arg0) {
+		// TODO Auto-generated method stub
+		// Convert this Event into NetMapEvent (LinkAdded, FlowEntryEnabled, HostAttached, PortEnabled)
+	}
 
-    public LocalTopologyEventListener(DBConnection conn) {
-        LocalTopologyEventListener.conn = conn;
-    }
 
-    @Override
-    public void edgeAdded(Edge arg0) {
-        // TODO Auto-generated method stub
-        // Convert this Event into NetMapEvent (LinkAdded, FlowEntryEnabled, HostAttached, PortEnabled)
-    }
+	@Override
+	public void edgePropertyRemoved(Edge arg0, String arg1, Object arg2) {
+		// TODO Auto-generated method stub
+		// Currently not needed
 
-    @Override
-    public void edgePropertyRemoved(Edge arg0, String arg1, Object arg2) {
-        // TODO Auto-generated method stub
-        // Currently not needed
-    }
+	}
 
-    public void edgeRemoved(Edge e) {
-        Edge edge; 
-        if (e instanceof com.tinkerpop.blueprints.impls.ramcloud.RamCloudEdge) {
-            edge = (RamCloudEdge) e;
-        } else {
-            edge = (TitanEdge) e;
-        }
-        // TODO Auto-generated method stub
-        // Fire NetMapEvents (LinkRemoved, FlowEntryRemoved, HostRemoved, PortRemoved)
-        // TitanEdge edge = (TitanEdge) e;
-        log.debug("TopologyEvents: Received edge removed event: {}", edge.toString());
-        String label = edge.getLabel();
-        if (label.equals("link")) {
-            Vertex v = edge.getVertex(Direction.IN);
-            IPortObject src_port = (IPortObject)conn.getFramedGraph().frame(v, IPortObject.class);
-            v = edge.getVertex(Direction.OUT);
-            IPortObject dest_port = (IPortObject)conn.getFramedGraph().frame(v, IPortObject.class);
+	public void edgeRemoved(Edge e) {
+		// TODO Auto-generated method stub
+		// Fire NetMapEvents (LinkRemoved, FlowEntryRemoved, HostRemoved, PortRemoved)
+		TitanEdge edge = (TitanEdge) e;
+		log.debug("TopologyEvents: Received edge removed event: {}",edge.toString());
+		String label = edge.getLabel();
+		if (label.equals("link")) {
+			Vertex v = edge.getVertex(Direction.IN);
+			IPortObject src_port = (IPortObject) conn.getFramedGraph().frame(v, IPortObject.class);
+			v = edge.getVertex(Direction.OUT);
+			IPortObject dest_port = (IPortObject) conn.getFramedGraph().frame(v, IPortObject.class);
 
-            log.debug("TopologyEvents: link broken {}", new Object[]{src_port.getSwitch().getDPID(),
-                src_port.getNumber(),
-                dest_port.getSwitch().getDPID(),
-                dest_port.getNumber()});
-            IFlowManager manager = new FlowManagerImpl();
-            // TODO: Find the flows and add to reconcile queue
-            manager.reconcileFlows(src_port);
-        }
-    }
+			log.debug("TopologyEvents: link broken {}", new Object []{src_port.getSwitch().getDPID(),
+																src_port.getNumber(),
+																dest_port.getSwitch().getDPID(),
+																dest_port.getNumber()});
+			IFlowManager manager = new FlowManagerImpl();
+			// TODO: Find the flows and add to reconcile queue
+			manager.reconcileFlows(src_port);
+		}
+	}
 
-    @Override
-    public void vertexAdded(Vertex arg0) {
-        // TODO Auto-generated method stub
-    }
+	@Override
+	public void vertexAdded(Vertex arg0) {
+		// TODO Auto-generated method stub
 
-    @Override
-    public void vertexPropertyRemoved(Vertex arg0, String arg1, Object arg2) {
-        // TODO Auto-generated method stub
-    }
+	}
 
-    public void vertexRemoved(Vertex vertex) {
-        // TODO Auto-generated method stub
-        // Generate NetMapEvents 
-        String type = (String) vertex.getProperty("type");
-        log.debug("TopologyEvents: Received vertex removed event: {}", vertex.toString());
-        if (type.equals("port")) {
-            // port is removed...lets fire reconcile here directly for now
+	@Override
+	public void vertexPropertyRemoved(Vertex arg0, String arg1, Object arg2) {
+		// TODO Auto-generated method stub
 
-            IPortObject src_port = (IPortObject)conn.getFramedGraph().frame(vertex, IPortObject.class);
-            log.debug("TopologyEvents: Port removed: {}:{}", src_port.getSwitch().getDPID(), src_port.getNumber());
-            IFlowManager manager = new FlowManagerImpl();
-            manager.reconcileFlows(src_port);
-        }
-    }
+	}
 
-    @Override
-    public void edgePropertyChanged(Edge arg0, String arg1, Object arg2,
-            Object arg3) {
-        // TODO Auto-generated method stub
-    }
+	public void vertexRemoved(Vertex vertex) {
+		// TODO Auto-generated method stub
+		// Generate NetMapEvents 
+		String type = (String) vertex.getProperty("type");
+		log.debug("TopologyEvents: Received vertex removed event: {}",vertex.toString());
+		if (type.equals("port")) {
+			// port is removed...lets fire reconcile here directly for now
+			
+			IPortObject src_port = (IPortObject) conn.getFramedGraph().frame(vertex, IPortObject.class);
+			log.debug("TopologyEvents: Port removed: {}:{}",src_port.getSwitch().getDPID(),src_port.getNumber());
+			IFlowManager manager = new FlowManagerImpl();
+			manager.reconcileFlows(src_port);			
+		}
+	}
 
-    @Override
-    public void vertexPropertyChanged(Vertex arg0, String arg1, Object arg2,
-            Object arg3) {
-        // TODO Auto-generated method stub
-    }
 
-    @Override
-    public void vertexRemoved(Vertex vertex, Map<String, Object> props) {
-        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
-    }
+	@Override
+	public void edgePropertyChanged(Edge arg0, String arg1, Object arg2,
+			Object arg3) {
+		// TODO Auto-generated method stub
+		
+	}
 
-    @Override
-    public void edgeRemoved(Edge edge, Map<String, Object> props) {
-        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
-    }
+	@Override
+	public void vertexPropertyChanged(Vertex arg0, String arg1, Object arg2,
+			Object arg3) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public void vertexRemoved(Vertex vertex, Map<String, Object> props) {
+		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+	}
+
+	@Override
+	public void edgeRemoved(Edge edge, Map<String, Object> props) {
+		throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+	}
 }