update NetworkGraph objects

- Use Object type instead of built-in
- Port number to Long

Change-Id: I30847b6cca801e58ca49dd9d1667cfd33a8ffb92
diff --git a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/AbstractNetworkGraph.java b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/AbstractNetworkGraph.java
index 3fa4ad9..71ef16e 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/AbstractNetworkGraph.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/AbstractNetworkGraph.java
@@ -15,82 +15,99 @@
 import org.slf4j.LoggerFactory;
 
 public class AbstractNetworkGraph implements NetworkGraph {
-    @SuppressWarnings("unused")
-    private static final Logger log = LoggerFactory
-	    .getLogger(AbstractNetworkGraph.class);
+	@SuppressWarnings("unused")
+	private static final Logger log = LoggerFactory.getLogger(AbstractNetworkGraph.class);
 
-    // DPID -> Switch
-    protected ConcurrentMap<Long, Switch> switches;
+	// DPID -> Switch
+	protected ConcurrentMap<Long, Switch> switches;
 
-    protected ConcurrentMap<InetAddress, Set<Device>> addr2Device;
-    protected ConcurrentMap<MACAddress, Set<Device>> mac2Device;
+	protected ConcurrentMap<InetAddress, Set<Device>> addr2Device;
+	protected ConcurrentMap<MACAddress, Set<Device>> mac2Device;
 
-    public AbstractNetworkGraph() {
-	// TODO: Does these object need to be stored in Concurrent Collection?
-	switches = new ConcurrentHashMap<>();
-	addr2Device = new ConcurrentHashMap<>();
-	mac2Device = new ConcurrentHashMap<>();
-    }
-
-    @Override
-    public Switch getSwitch(long dpid) {
-	// TODO Check if it is safe to directly return this Object.
-	return switches.get(dpid);
-    }
-
-    @Override
-    public Iterable<Switch> getSwitches() {
-	// TODO Check if it is safe to directly return this Object.
-	return Collections.unmodifiableCollection(switches.values());
-    }
-
-    @Override
-    public Iterable<Link> getLinks() {
-	List<Link> linklist = new LinkedList<>();
-
-	for (Switch sw : switches.values()) {
-	    Iterable<Link> links = sw.getLinks();
-	    for (Link l : links) {
-		linklist.add(l);
-	    }
+	public AbstractNetworkGraph() {
+		// TODO: Does these object need to be stored in Concurrent Collection?
+		switches = new ConcurrentHashMap<>();
+		addr2Device = new ConcurrentHashMap<>();
+		mac2Device = new ConcurrentHashMap<>();
 	}
-	return linklist;
-    }
 
-    @Override
-    public Iterable<Link> getLinksFromSwitch(long dpid) {
-	Switch sw = getSwitch(dpid);
-	if (sw == null) {
-	    return Collections.emptyList();
+	@Override
+	public Switch getSwitch(Long dpid) {
+		// TODO Check if it is safe to directly return this Object.
+		return switches.get(dpid);
 	}
-	Iterable<Link> links = sw.getLinks();
-	if (links instanceof Collection) {
-	    return Collections.unmodifiableCollection((Collection<Link>) links);
-	} else {
-	    List<Link> linklist = new LinkedList<>();
-	    for (Link l : links) {
-		linklist.add(l);
-	    }
-	    return linklist;
-	}
-    }
 
-    @Override
-    public Iterable<Device> getDeviceByIp(InetAddress ipAddress) {
-	Set<Device> devices = addr2Device.get(ipAddress);
-	if (devices == null) {
-	    return Collections.emptyList();
+	@Override
+	public Iterable<Switch> getSwitches() {
+		// TODO Check if it is safe to directly return this Object.
+		return Collections.unmodifiableCollection(switches.values());
 	}
-	return Collections.unmodifiableCollection(devices);
-    }
 
-    @Override
-    public Iterable<Device> getDeviceByMac(MACAddress address) {
-	Set<Device> devices = mac2Device.get(address);
-	if (devices == null) {
-	    return Collections.emptyList();
+	@Override
+	public Iterable<Link> getLinks() {
+		List<Link> linklist = new LinkedList<>();
+
+		for (Switch sw : switches.values()) {
+			Iterable<Link> links = sw.getOutgoingLinks();
+			for (Link l : links) {
+				linklist.add(l);
+			}
+		}
+		return linklist;
 	}
-	return Collections.unmodifiableCollection(devices);
-    }
 
+	@Override
+	public Iterable<Link> getOutgoingLinksFromSwitch(Long dpid) {
+		Switch sw = getSwitch(dpid);
+		if (sw == null) {
+			return Collections.emptyList();
+		}
+		Iterable<Link> links = sw.getOutgoingLinks();
+		if (links instanceof Collection) {
+			return Collections.unmodifiableCollection((Collection<Link>) links);
+		} else {
+			List<Link> linklist = new LinkedList<>();
+			for (Link l : links) {
+				linklist.add(l);
+			}
+			return linklist;
+		}
+	}
+	
+	@Override
+	public Iterable<Link> getIncomingLinksFromSwitch(Long dpid) {
+		Switch sw = getSwitch(dpid);
+		if (sw == null) {
+			return Collections.emptyList();
+		}
+		Iterable<Link> links = sw.getIncomingLinks();
+		if (links instanceof Collection) {
+			return Collections.unmodifiableCollection((Collection<Link>) links);
+		} else {
+			List<Link> linklist = new LinkedList<>();
+			for (Link l : links) {
+				linklist.add(l);
+			}
+			return linklist;
+		}
+	}
+
+
+	@Override
+	public Iterable<Device> getDeviceByIp(InetAddress ipAddress) {
+		Set<Device> devices = addr2Device.get(ipAddress);
+		if (devices == null) {
+			return Collections.emptyList();
+		}
+		return Collections.unmodifiableCollection(devices);
+	}
+
+	@Override
+	public Iterable<Device> getDeviceByMac(MACAddress address) {
+		Set<Device> devices = mac2Device.get(address);
+		if (devices == null) {
+			return Collections.emptyList();
+		}
+		return Collections.unmodifiableCollection(devices);
+	}
 }
diff --git a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/FloodlightToOnosMappers.java b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/FloodlightToOnosMappers.java
index 9bd8051..8139737 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/FloodlightToOnosMappers.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/FloodlightToOnosMappers.java
@@ -7,32 +7,24 @@
 public class FloodlightToOnosMappers {
 
 	public static Switch map(NetworkGraph graph, IOFSwitch sw) {
-		SwitchImpl onosSwitch = new SwitchImpl(graph);
-		onosSwitch.setDpid(sw.getId());
+		SwitchImpl onosSwitch = new SwitchImpl(graph, sw.getId());
 
 		for (OFPhysicalPort port : sw.getPorts()) {
-			onosSwitch.addPort(map(graph, port));
+			onosSwitch.addPort(map(graph, onosSwitch, port));
 		}
 
 		return onosSwitch;
 	}
 
-	public static Port map(NetworkGraph graph, OFPhysicalPort port) {
-		PortImpl onosPort = new PortImpl(graph);
-		onosPort.setPortNumber(port.getPortNumber());
+	public static Port map(NetworkGraph graph, SwitchImpl sw, OFPhysicalPort port) {
+		PortImpl onosPort = new PortImpl(graph, sw, new Long(port.getPortNumber()));
 		return onosPort;
 	}
 
 	public static Link map(NetworkGraph graph, net.floodlightcontroller.routing.Link link) {
-		LinkImpl onosLink = new LinkImpl(graph);
-
-		Switch srcSw = graph.getSwitch(link.getSrc());
-		onosLink.setSrcSwitch(srcSw);
-		onosLink.setSrcPort(srcSw.getPort(link.getSrcPort()));
-
-		Switch dstSw = graph.getSwitch(link.getDst());
-		onosLink.setDstSwitch(dstSw);
-		onosLink.setDstPort(dstSw.getPort(link.getDstPort()));
+		Port srcPort = graph.getSwitch(link.getSrc()).getPort(Long.valueOf(link.getSrcPort()));
+		Port dstPort = graph.getSwitch(link.getDst()).getPort(Long.valueOf(link.getDstPort()));
+		LinkImpl onosLink = new LinkImpl(graph, srcPort, dstPort);
 
 		return onosLink;
 
diff --git a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/Link.java b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/Link.java
index 0fc72f6..ef74f73 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/Link.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/Link.java
@@ -12,13 +12,17 @@
 	public Port getDestinationPort();
 	public Switch getSourceSwitch();
 	public Switch getDestinationSwitch();
-
+		
 	public long getLastSeenTime();
+
 	public int getCost();
+	public Double getCapacity();
 
 	// Not sure if we want to expose these northbound
-	public long getSourceSwitchDpid();
-	public short getSourcePortNumber();
-	public long getDestinationSwitchDpid();
-	public short getDestinationPortNumber();
+	// Toshi: I think these are unnecessary because we can get them
+	// Toshi: like "this.getSourcePort().getSwitch()" etc.
+	public Long getSourceSwitchDpid();
+	public Long getSourcePortNumber();
+	public Long getDestinationSwitchDpid();
+	public Long getDestinationPortNumber();
 }
diff --git a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/LinkImpl.java b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/LinkImpl.java
index c566eea..b1fc9b8 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/LinkImpl.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/LinkImpl.java
@@ -7,41 +7,50 @@
  * but this Object itself will not issue any read/write to the DataStore.
  */
 public class LinkImpl extends NetworkGraphObject implements Link {
+	protected Port srcPort;
+	protected Port dstPort;
 
-	private Switch srcSwitch;
-	private Port srcPort;
-	private Switch dstSwitch;
-	private Port dstPort;
+	protected static final Double DEFAULT_CAPACITY = Double.POSITIVE_INFINITY;
+	protected Double capacity = DEFAULT_CAPACITY;
 
-	private static final int DEFAULT_COST = 1;
-	private int cost = DEFAULT_COST;
+	protected static final int DEFAULT_COST = 1;
+	protected int cost = DEFAULT_COST;
 
-	public LinkImpl(NetworkGraph graph) {
+	public LinkImpl(NetworkGraph graph, Port srcPort, Port dstPort) {
 		super(graph);
+		this.srcPort = srcPort;
+		this.dstPort = dstPort;
+		setToPorts();
+	}
+
+	protected void setToPorts() {
+		((PortImpl)srcPort).setOutgoingLink(this);
+		((PortImpl)srcPort).setIncomingLink(this);		
+	}
+	
+	protected void unsetFromPorts() {
+		((PortImpl)srcPort).setOutgoingLink(null);
+		((PortImpl)srcPort).setIncomingLink(null);
 	}
 
 	@Override
 	public Port getSourcePort() {
-		// TODO Auto-generated method stub
-		return null;
+		return srcPort;
 	}
 
 	@Override
 	public Port getDestinationPort() {
-		// TODO Auto-generated method stub
-		return null;
+		return dstPort;
 	}
 
 	@Override
 	public Switch getSourceSwitch() {
-		// TODO Auto-generated method stub
-		return null;
+		return srcPort.getSwitch();
 	}
 
 	@Override
 	public Switch getDestinationSwitch() {
-		// TODO Auto-generated method stub
-		return null;
+		return dstPort.getSwitch();
 	}
 
 	@Override
@@ -60,44 +69,39 @@
 	}
 
 	@Override
-	public long getSourceSwitchDpid() {
-		return srcSwitch.getDpid();
-	}
-
-	public void setSrcSwitch(Switch srcSwitch) {
-	    // TODO null check
-		this.srcSwitch = srcSwitch;
+	public Long getSourceSwitchDpid() {
+		return srcPort.getSwitch().getDpid();
 	}
 
 	@Override
-	public short getSourcePortNumber() {
+	public Long getSourcePortNumber() {
 		return srcPort.getNumber();
 	}
 
-	public void setSrcPort(Port srcPort) {
-	    // TODO null check
-		this.srcPort = srcPort;
+	@Override
+	public Long getDestinationSwitchDpid() {
+		return dstPort.getSwitch().getDpid();
 	}
 
 	@Override
-	public long getDestinationSwitchDpid() {
-		return dstSwitch.getDpid();
-	}
-
-	public void setDstSwitch(Switch dstSwitch) {
-	    // TODO null check
-		this.dstSwitch = dstSwitch;
-	}
-
-	@Override
-	public short getDestinationPortNumber() {
+	public Long getDestinationPortNumber() {
 		return dstPort.getNumber();
 	}
 
-	public void setDstPort(Port dstPort) {
-	    // TODO null check
-		this.dstPort = dstPort;
+	@Override
+	public Double getCapacity() {
+		return capacity;
+	}
+	
+	@Override
+	public String toString() {
+		return String.format("%s --(cap:%f Mbps)--> %s",
+				getSourcePort().toString(),
+				getCapacity(),
+				getDestinationPort().toString());
 	}
 
-
+	public void setCapacity(Double capacity) {
+		this.capacity = capacity;
+	}
 }
diff --git a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/MutableNetworkGraph.java b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/MutableNetworkGraph.java
new file mode 100644
index 0000000..b617e47
--- /dev/null
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/MutableNetworkGraph.java
@@ -0,0 +1,110 @@
+package net.onrc.onos.ofcontroller.networkgraph;
+
+import java.net.InetAddress;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.LinkedList;
+
+import net.floodlightcontroller.util.MACAddress;
+
+/**
+ * @author Toshio Koide (t-koide@onlab.us)
+ */
+public class MutableNetworkGraph implements NetworkGraph {
+	protected HashMap<Long, SwitchImpl> switches;
+	
+	public MutableNetworkGraph() {
+		switches = new HashMap<Long, SwitchImpl>();
+	}
+
+	// Switch operations
+	
+	public Switch addSwitch(Long switchId) {
+		if (switches.containsKey(switchId)) {
+			return null; // should throw exception
+		}
+		SwitchImpl sw = new SwitchImpl(this, switchId);
+		switches.put(sw.getDpid(), sw);
+		return sw;
+		
+	}
+
+	@Override
+	public Switch getSwitch(Long dpid) {
+		return switches.get(dpid);
+	}
+	
+	@Override
+	public Iterable<? extends Switch> getSwitches() {
+		return switches.values();
+	}
+	
+	// Link operations
+	
+	public Link addLink(Long srcDpid, Long srcPortNo, Long dstDpid, Long dstPortNo) {
+		return new LinkImpl(
+				this,
+				getSwitch(srcDpid).getPort(srcPortNo),
+				getSwitch(dstDpid).getPort(dstPortNo));
+	}
+	
+	public Link[] addBidirectionalLinks(Long srcDpid, Long srcPortNo, Long dstDpid, Long dstPortNo) {
+		Link[] links = new Link[2];
+		links[0] = addLink(srcDpid, srcPortNo, dstDpid, dstPortNo);
+		links[1] = addLink(dstDpid, dstPortNo, srcDpid, srcPortNo);
+		
+		return links;
+	}
+	
+	@Override
+	public Collection<Link> getLinks() {
+		LinkedList<Link> links = new LinkedList<Link>();
+		for (Switch sw: switches.values()) {
+			for (Port port: sw.getPorts()) {
+				Link link = port.getOutgoingLink();
+				if (link != null) {
+					links.add(link);
+				}
+			}
+		}
+		return links;
+	}
+
+	@Override
+	public Iterable<Link> getOutgoingLinksFromSwitch(Long dpid) {
+		LinkedList<Link> links = new LinkedList<Link>();
+		for (Port port: getSwitch(dpid).getPorts()) {
+			Link link = port.getOutgoingLink();
+			if (link != null) {
+				links.add(link);
+			}
+		}
+		return links;
+	}
+
+	@Override
+	public Iterable<Link> getIncomingLinksFromSwitch(Long dpid) {
+		LinkedList<Link> links = new LinkedList<Link>();
+		for (Port port: getSwitch(dpid).getPorts()) {
+			Link link = port.getIncomingLink();
+			if (link != null) {
+				links.add(link);
+			}
+		}
+		return links;
+	}
+	
+	// Device operations
+
+	@Override
+	public Iterable<Device> getDeviceByIp(InetAddress ipAddress) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	@Override
+	public Iterable<Device> getDeviceByMac(MACAddress address) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraph.java b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraph.java
index 867ae98..1c4a390 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraph.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraph.java
@@ -11,11 +11,12 @@
  *
  */
 public interface NetworkGraph {
-	public Switch getSwitch(long dpid);
-	public Iterable<Switch> getSwitches();
+	public Switch getSwitch(Long dpid);
+	public Iterable<? extends Switch> getSwitches();
 	
-	public Iterable<Link> getLinks();
-	public Iterable<Link> getLinksFromSwitch(long dpid);
+	public Iterable<? extends Link> getLinks();
+	public Iterable<? extends Link> getOutgoingLinksFromSwitch(Long dpid); // Toshi: unnecessary
+	public Iterable<? extends Link> getIncomingLinksFromSwitch(Long dpid); // Toshi: unnecessary
 	
 	public Iterable<Device> getDeviceByIp(InetAddress ipAddress);
 	public Iterable<Device> getDeviceByMac(MACAddress address);
diff --git a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraphImpl.java b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraphImpl.java
index 0debb70..50fda95 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraphImpl.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraphImpl.java
@@ -116,8 +116,7 @@
 		sw.read();
 		// TODO SwitchImpl probably should have a constructor from
 		// RCSwitch
-		SwitchImpl memSw = new SwitchImpl(this);
-		memSw.setDpid(sw.getDpid());
+		SwitchImpl memSw = new SwitchImpl(this, sw.getDpid());
 
 		addSwitch(memSw);
 	    } catch (ObjectDoesntExistException e) {
@@ -130,16 +129,13 @@
 		p.read();
 
 		// TODO PortImpl probably should have a constructor from RCPort
-		PortImpl memPort = new PortImpl(this);
-		// FIXME remove shortValue()
-		memPort.setPortNumber(p.getNumber().shortValue());
 		Switch sw = this.getSwitch(p.getDpid());
 		if (sw == null) {
 		    log.error("Switch {} missing when adding Port {}",
 			    new Dpid(p.getDpid()), p);
 		    continue;
 		}
-		memPort.setSwitch(sw);
+		PortImpl memPort = new PortImpl(this, sw, p.getNumber());
 
 		addPort(memPort);
 	    } catch (ObjectDoesntExistException e) {
@@ -158,41 +154,38 @@
 	// }
 
 	for (RCLink l : RCLink.getAllLinks()) {
-	    try {
-		l.read();
+		try {
+			l.read();
 
-		LinkImpl memLink = new LinkImpl(this);
 
-		Switch srcSw = this.getSwitch(l.getSrc().dpid);
-		if (srcSw == null) {
-		    log.error("Switch {} missing when adding Link {}",
-			    new Dpid(l.getSrc().dpid), l);
-		    continue;
+			Switch srcSw = this.getSwitch(l.getSrc().dpid);
+			if (srcSw == null) {
+				log.error("Switch {} missing when adding Link {}",
+						new Dpid(l.getSrc().dpid), l);
+				continue;
+			}
+
+			Switch dstSw = this.getSwitch(l.getDst().dpid);
+			if (dstSw == null) {
+				log.error("Switch {} missing when adding Link {}",
+						new Dpid(l.getDst().dpid), l);
+				continue;
+			}
+
+			LinkImpl memLink = new LinkImpl(this,
+				srcSw.getPort(l.getSrc().number),
+				dstSw.getPort(l.getDst().number));
+
+			addLink(memLink);
+		} catch (ObjectDoesntExistException e) {
+			log.debug("Delete Link Failed", e);
 		}
-		memLink.setSrcSwitch(srcSw);
-		// FIXME remove shortValue()
-		memLink.setSrcPort(srcSw.getPort(l.getSrc().number.shortValue()));
-
-		Switch dstSw = this.getSwitch(l.getDst().dpid);
-		if (dstSw == null) {
-		    log.error("Switch {} missing when adding Link {}",
-			    new Dpid(l.getDst().dpid), l);
-		    continue;
-		}
-		memLink.setDstSwitch(dstSw);
-		// FIXME remove shortValue()
-		memLink.setDstPort(srcSw.getPort(l.getDst().number.shortValue()));
-
-		addLink(memLink);
-	    } catch (ObjectDoesntExistException e) {
-		log.debug("Delete Link Failed", e);
-	    }
 	}
     }
 
     // FIXME To be removed later this class should never read from DB.
-    public void readSwitchFromTopology(long dpid) {
-	SwitchImpl sw = new SwitchImpl(this);
+    public void readSwitchFromTopology(Long dpid) {
+	SwitchImpl sw = new SwitchImpl(this, dpid);
 
 	RCSwitch rcSwitch = new RCSwitch(dpid);
 	try {
@@ -202,8 +195,6 @@
 	    return;
 	}
 
-	sw.setDpid(rcSwitch.getDpid());
-
 	addSwitch(sw);
 
 	for (byte[] portId : rcSwitch.getAllPortIds()) {
@@ -211,13 +202,8 @@
 	    try {
 		rcPort.read();
 
-		PortImpl port = new PortImpl(this);
-		// port.setDpid(dpid);
+		PortImpl port = new PortImpl(this, sw, rcPort.getNumber());
 
-		// TODO why are port numbers long?
-		// port.setPortNumber((short)rcPort.getNumber());
-
-		port.setSwitch(sw);
 		sw.addPort(port);
 
 		addPort(port);
diff --git a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/Port.java b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/Port.java
index 453dd14..126bbab 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/Port.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/Port.java
@@ -10,11 +10,11 @@
  *
  */
 public interface Port {
-	public short getNumber();
-	public String getName();
-	public long getHardwareAddress();
+	public Long getNumber();
+	public Long getHardwareAddress();
 
 	public Switch getSwitch();
 
-	public Link getLink();
+	public Link getOutgoingLink();
+	public Link getIncomingLink();
 }
diff --git a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/PortImpl.java b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/PortImpl.java
index 2e1086c..97ee8b5 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/PortImpl.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/PortImpl.java
@@ -8,43 +8,26 @@
  */
 public class PortImpl extends NetworkGraphObject implements Port {
 
-	//private long dpid;
 	private Switch sw;
-	private short number;
+	private Long number;
+	protected Link outgoingLink;
+	protected Link incomingLink;
 
-	public PortImpl(NetworkGraph graph) {
+	public PortImpl(NetworkGraph graph, Switch parentSwitch, Long number) {
 		super(graph);
-	}
-
-	public void setPortNumber(short portNumber) {
-		number = portNumber;
+		this.sw = parentSwitch;
+		this.number = number;
 	}
 
 	@Override
-	public short getNumber() {
+	public Long getNumber() {
 		return number;
 	}
 
-	/*
-	public void setDpid(long dpid) {
-		this.dpid = dpid;
-	}
-
-	public long getDpid() {
-		return dpid;
-	}
-	*/
-
 	@Override
-	public String getName() {
+	public Long getHardwareAddress() {
 		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public long getHardwareAddress() {
-		// TODO Auto-generated method stub
-		return 0;
+		return 0L;
 	}
 
 	@Override
@@ -52,14 +35,28 @@
 		return sw;
 	}
 
-	public void setSwitch(Switch sw) {
-		this.sw = sw;
+	@Override
+	public Link getOutgoingLink() {
+		return outgoingLink;
 	}
 
 	@Override
-	public Link getLink() {
-		// TODO Auto-generated method stub
-		return null;
+	public Link getIncomingLink() {
+		return incomingLink;
 	}
 
+	public void setOutgoingLink(Link link) {
+		outgoingLink = link;
+	}
+
+	public void setIncomingLink(Link link) {
+		incomingLink = link;
+	}
+
+	@Override
+	public String toString() {
+		return String.format("%d:%d",
+				getSwitch().getDpid(),
+				getNumber());
+	}
 }
diff --git a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/Switch.java b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/Switch.java
index 7552399..95ab440 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/Switch.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/Switch.java
@@ -12,11 +12,11 @@
  *
  */
 public interface Switch {
-	public long getDpid();
+	public Long getDpid();
 
 	public Collection<Port> getPorts();
 
-	public Port getPort(short number);
+	public Port getPort(Long number);
 
 
 	// Flows
@@ -25,9 +25,10 @@
 	// Graph traversal API
 	public Iterable<Switch> getNeighbors();
 
-	public Iterable<Link> getLinks();
+	public Iterable<Link> getOutgoingLinks();
+	public Iterable<Link> getIncomingLinks();
 
-	public Link getLinkToNeighbor(long dpid);
+	public Link getLinkToNeighbor(Long dpid);
 
 	public Collection<Device> getDevices();
 }
diff --git a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/SwitchImpl.java b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/SwitchImpl.java
index 325718a..c1d1a1a 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/SwitchImpl.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/SwitchImpl.java
@@ -3,9 +3,8 @@
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
-import java.util.HashSet;
+import java.util.LinkedList;
 import java.util.Map;
-import java.util.Set;
 
 import net.onrc.onos.datastore.topology.RCPort;
 import net.onrc.onos.datastore.topology.RCSwitch;
@@ -21,17 +20,17 @@
  */
 public class SwitchImpl extends NetworkGraphObject implements Switch {
 
-	private long dpid;
-	private final Map<Short, Port> ports;
+	private Long dpid;
+	private final Map<Long, Port> ports;
 
-	public SwitchImpl(NetworkGraph graph) {
+	public SwitchImpl(NetworkGraph graph, Long dpid) {
 		super(graph);
-
-		ports = new HashMap<Short, Port>();
+		this.dpid = dpid;
+		ports = new HashMap<Long, Port>();
 	}
 
 	@Override
-	public long getDpid() {
+	public Long getDpid() {
 		return dpid;
 	}
 
@@ -41,7 +40,7 @@
 	}
 
 	@Override
-	public Port getPort(short number) {
+	public Port getPort(Long number) {
 		return ports.get(number);
 	}
 
@@ -58,8 +57,8 @@
 	}
 
 	@Override
-	public Link getLinkToNeighbor(long neighborDpid) {
-		for (Link link : graph.getLinksFromSwitch(dpid)) {
+	public Link getLinkToNeighbor(Long neighborDpid) {
+		for (Link link : graph.getOutgoingLinksFromSwitch(dpid)) {
 			if (link.getDestinationSwitch().getDpid() == neighborDpid) {
 				return link;
 			}
@@ -73,21 +72,14 @@
 		return null;
 	}
 
-	public void setDpid(long dpid) {
-		this.dpid = dpid;
-	}
-
 	public void addPort(Port port) {
 		this.ports.put(port.getNumber(), port);
 	}
-
-	@Override
-	public Iterable<Link> getLinks() {
-		Set<Link> links = new HashSet<>();
-		for( Port p : ports.values()) {
-		    links.add(p.getLink());
-		}
-		return links;
+	
+	public Port addPort(Long portNumber) {
+		PortImpl port = new PortImpl(graph, this, portNumber);
+		ports.put(port.getNumber(), port);
+		return port;
 	}
 
 	public void store() {
@@ -108,4 +100,28 @@
 		}
 
 	}
+
+	@Override
+	public Iterable<Link> getOutgoingLinks() {
+		LinkedList<Link> links = new LinkedList<Link>();
+		for (Port port: getPorts()) {
+			Link link = port.getOutgoingLink(); 
+			if (link != null) {
+				links.add(link);
+			}
+		}
+		return links;
+	}
+
+	@Override
+	public Iterable<Link> getIncomingLinks() {
+		LinkedList<Link> links = new LinkedList<Link>();
+		for (Port port: getPorts()) {
+			Link link = port.getIncomingLink(); 
+			if (link != null) {
+				links.add(link);
+			}
+		}
+		return links;
+	}
 }