package net.floodlightcontroller.core.types; import org.projectfloodlight.openflow.types.DatapathId; import org.projectfloodlight.openflow.types.OFPort; /** * Simple classes for defining a hop in a path. * * Class PathNode good for tracking hops in * an outer container that guarantees ordering * or for standalone use. It can also be useful * when lookup of specific nodes needs to be * faster than O(n)... lookup time dependent on * containing class. * * Inner class LinkedPathNode useful for chaining * LinkedPathNodes together. Note traversal will * always be O(n), since it's effectively a linked * list. * * @author rizard * */ public class PathNode { private DatapathId node; private OFPort in; private OFPort out; private int hopId; private PathNode() { } private PathNode(DatapathId node, OFPort in, OFPort out, int hopId) { this.node = node; this.in = in; this.out = out; this.hopId = hopId; } public static PathNode of(DatapathId node, OFPort in, OFPort out, int hopId) { return new PathNode(node, in, out, hopId); } public DatapathId getNode() { return node; } public OFPort getInPort() { return in; } public OFPort getOutPort() { return out; } public int getHopId() { return hopId; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + hopId; result = prime * result + ((in == null) ? 0 : in.hashCode()); result = prime * result + ((node == null) ? 0 : node.hashCode()); result = prime * result + ((out == null) ? 0 : out.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; PathNode other = (PathNode) obj; if (hopId != other.hopId) return false; if (in == null) { if (other.in != null) return false; } else if (!in.equals(other.in)) return false; if (node == null) { if (other.node != null) return false; } else if (!node.equals(other.node)) return false; if (out == null) { if (other.out != null) return false; } else if (!out.equals(other.out)) return false; return true; } @Override public String toString() { return "PathNode [node=" + node + ", in=" + in + ", out=" + out + ", hopId=" + hopId + "]"; } public static class LinkedPathNode extends PathNode { private LinkedPathNode prev; private LinkedPathNode next; private LinkedPathNode() { super(); } private LinkedPathNode(DatapathId node, OFPort in, OFPort out, int hopId, LinkedPathNode prev, LinkedPathNode next) { super(node, in, out, hopId); this.prev = prev; this.next = next; } public static LinkedPathNode of(DatapathId node, OFPort in, OFPort out, int hopId, LinkedPathNode prev, LinkedPathNode next) { return new LinkedPathNode(node, in, out, hopId, prev, next); } public static LinkedPathNode of(PathNode n, LinkedPathNode prev, LinkedPathNode next) { return new LinkedPathNode(n.node, n.in, n.out, n.hopId, prev, next); } public LinkedPathNode getPrevious() { return prev; } public LinkedPathNode getNext() { return next; } public boolean isStart() { if (prev == null && next != null) { return true; } return false; } public boolean isEnd() { if (prev != null && next == null) { return true; } return false; } @Override public int hashCode() { final int prime = 31; int result = super.hashCode(); result = prime * result + ((next == null) ? 0 : next.hashCode()); result = prime * result + ((prev == null) ? 0 : prev.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (!super.equals(obj)) return false; if (getClass() != obj.getClass()) return false; LinkedPathNode other = (LinkedPathNode) obj; if (next == null) { if (other.next != null) return false; } else if (!next.equals(other.next)) return false; if (prev == null) { if (other.prev != null) return false; } else if (!prev.equals(other.prev)) return false; return true; } @Override public String toString() { return "LinkedPathNode [prev=" + prev + ", " + super.toString() + ", next=" + next + "]"; } } }