package org.batfish.datamodel;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import java.util.SortedSet;
import java.util.TreeSet;
import org.batfish.datamodel.collections.EdgeSet;
import org.batfish.datamodel.collections.NodeInterfacePair;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonValue;
public class Topology implements Serializable {
private static final long serialVersionUID = 1L;
@JsonCreator
private static Topology jacksonCreateTopology(SortedSet<Edge> edges) {
return new Topology(new EdgeSet(edges));
}
private final EdgeSet _edges;
private final Map<NodeInterfacePair, EdgeSet> _interfaceEdges;
private final Map<String, EdgeSet> _nodeEdges;
public Topology(EdgeSet edges) {
_edges = edges;
_nodeEdges = new HashMap<>();
_interfaceEdges = new HashMap<>();
for (Edge edge : edges) {
String node1 = edge.getNode1();
String node2 = edge.getNode2();
NodeInterfacePair int1 = edge.getInterface1();
NodeInterfacePair int2 = edge.getInterface2();
EdgeSet node1Edges = _nodeEdges.get(node1);
if (node1Edges == null) {
node1Edges = new EdgeSet();
_nodeEdges.put(node1, node1Edges);
}
node1Edges.add(edge);
EdgeSet node2Edges = _nodeEdges.get(node2);
if (node2Edges == null) {
node2Edges = new EdgeSet();
_nodeEdges.put(node2, node2Edges);
}
node2Edges.add(edge);
EdgeSet interface1Edges = _interfaceEdges.get(int1);
if (interface1Edges == null) {
interface1Edges = new EdgeSet();
_interfaceEdges.put(int1, interface1Edges);
}
interface1Edges.add(edge);
EdgeSet interface2Edges = _interfaceEdges.get(int2);
if (interface2Edges == null) {
interface2Edges = new EdgeSet();
_interfaceEdges.put(int2, interface2Edges);
}
interface2Edges.add(edge);
}
}
@JsonIgnore
public EdgeSet getEdges() {
return _edges;
}
@JsonIgnore
public Map<NodeInterfacePair, EdgeSet> getInterfaceEdges() {
return _interfaceEdges;
}
@JsonIgnore
public Map<String, EdgeSet> getNodeEdges() {
return _nodeEdges;
}
public void removeEdge(Edge edge) {
_edges.remove(edge);
}
public void removeInterface(NodeInterfacePair iface) {
EdgeSet interfaceEdges = _interfaceEdges.get(iface);
if (interfaceEdges != null) {
_edges.removeAll(interfaceEdges);
}
}
public void removeNode(String hostname) {
EdgeSet nodeEdges = _nodeEdges.get(hostname);
if (nodeEdges != null) {
_edges.removeAll(nodeEdges);
}
}
@JsonValue
public SortedSet<Edge> sortedEdges() {
return new TreeSet<>(_edges);
}
}