package org.batfish.datamodel.collections;
import java.util.Set;
import java.util.SortedMap;
import java.util.SortedSet;
import java.util.TreeMap;
import java.util.TreeSet;
import com.fasterxml.jackson.annotation.JsonCreator;
public class NamedStructureEquivalenceSets<T> {
private SortedMap<String, SortedSet<NamedStructureEquivalenceSet<T>>> _sameNamedStructures;
private String _structureClassName;
@JsonCreator
public NamedStructureEquivalenceSets() {
this("");
}
public NamedStructureEquivalenceSets(String structureClassName) {
_structureClassName = structureClassName;
_sameNamedStructures = new TreeMap<>();
}
public void add(String node, String name, T namedStructure) {
if (!_sameNamedStructures.containsKey(name)) {
_sameNamedStructures.put(name,
new TreeSet<NamedStructureEquivalenceSet<T>>());
}
SortedSet<NamedStructureEquivalenceSet<T>> equiClasses = _sameNamedStructures
.get(name);
for (NamedStructureEquivalenceSet<T> equiClass : equiClasses) {
if (equiClass.compareStructure(namedStructure)) {
equiClass.getNodes().add(node);
return;
}
}
equiClasses.add(new NamedStructureEquivalenceSet<>(node, namedStructure));
}
/**
* Remove structures with only one equivalence class, since they indicate
* nothing of note
*/
public void clean() {
Set<String> structureNames = new TreeSet<>(_sameNamedStructures.keySet());
for (String structureName : structureNames) {
if (_sameNamedStructures.get(structureName).size() == 1) {
_sameNamedStructures.remove(structureName);
}
}
}
public SortedMap<String, SortedSet<NamedStructureEquivalenceSet<T>>> getSameNamedStructures() {
return _sameNamedStructures;
}
public String getStructureClassName() {
return _structureClassName;
}
public String prettyPrint(String indent) {
StringBuilder sb = new StringBuilder();
for (String name : _sameNamedStructures.keySet()) {
sb.append(indent + name + "\n");
for (NamedStructureEquivalenceSet<T> set : _sameNamedStructures
.get(name)) {
sb.append(set.prettyPrint(indent + indent));
}
}
return sb.toString();
}
public void setSameNamedStructures(
SortedMap<String, SortedSet<NamedStructureEquivalenceSet<T>>> sameNamedStructures) {
_sameNamedStructures = sameNamedStructures;
}
public void setStructureClassName(String structureClassName) {
_structureClassName = structureClassName;
}
public int size() {
return _sameNamedStructures.size();
}
}