package org.batfish.datamodel.answers;
import java.util.SortedMap;
import java.util.SortedSet;
import java.util.TreeMap;
import java.util.TreeSet;
import org.batfish.datamodel.IpAccessList;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
public class AclLinesAnswerElement implements AnswerElement {
public static class AclReachabilityEntry
implements Comparable<AclReachabilityEntry> {
private static final String INDEX_VAR = "index";
private static final String NAME_VAR = "name";
private boolean _differentAction;
private Integer _earliestMoreGeneralLineIndex;
private String _earliestMoreGeneralLineName;
private final int _index;
private final String _name;
@JsonCreator
public AclReachabilityEntry(@JsonProperty(INDEX_VAR) int index,
@JsonProperty(NAME_VAR) String name) {
_index = index;
_name = name;
}
@Override
public int compareTo(AclReachabilityEntry rhs) {
return Integer.compare(_index, rhs._index);
}
@Override
public boolean equals(Object obj) {
return _index == ((AclReachabilityEntry) obj)._index;
}
public boolean getDifferentAction() {
return _differentAction;
}
public Integer getEarliestMoreGeneralLineIndex() {
return _earliestMoreGeneralLineIndex;
}
public String getEarliestMoreGeneralLineName() {
return _earliestMoreGeneralLineName;
}
public int getIndex() {
return _index;
}
public String getName() {
return _name;
}
@Override
public int hashCode() {
return _name.hashCode();
}
public String prettyPrint(String indent) {
StringBuilder sb = new StringBuilder();
sb.append(String.format("%s[index %d] %s\n", indent, _index, _name));
sb.append(String.format("%s Earliest covering line: [index %d] %s\n",
indent, _earliestMoreGeneralLineIndex,
_earliestMoreGeneralLineName));
sb.append(String.format("%s Is different action: %s\n", indent,
_differentAction));
return sb.toString();
}
public void setDifferentAction(boolean differentAction) {
_differentAction = differentAction;
}
public void setEarliestMoreGeneralLineIndex(
Integer earliestMoreGeneralLineIndex) {
_earliestMoreGeneralLineIndex = earliestMoreGeneralLineIndex;
}
public void setEarliestMoreGeneralLineName(
String earliestMoreGeneralLineName) {
_earliestMoreGeneralLineName = earliestMoreGeneralLineName;
}
}
private SortedMap<String, SortedMap<String, IpAccessList>> _acls;
private SortedMap<String, SortedMap<String, SortedSet<String>>> _equivalenceClasses;
private SortedMap<String, SortedMap<String, SortedSet<AclReachabilityEntry>>> _reachableLines;
private SortedMap<String, SortedMap<String, SortedSet<AclReachabilityEntry>>> _unreachableLines;
public AclLinesAnswerElement() {
_acls = new TreeMap<>();
_equivalenceClasses = new TreeMap<>();
_reachableLines = new TreeMap<>();
_unreachableLines = new TreeMap<>();
}
public void addEquivalenceClass(String aclName, String hostname,
SortedSet<String> eqClassNodes) {
SortedMap<String, SortedSet<String>> byRep = _equivalenceClasses
.get(aclName);
if (byRep == null) {
byRep = new TreeMap<>();
_equivalenceClasses.put(aclName, byRep);
}
byRep.put(hostname, eqClassNodes);
}
private void addLine(
SortedMap<String, SortedMap<String, SortedSet<AclReachabilityEntry>>> lines,
String hostname, IpAccessList ipAccessList,
AclReachabilityEntry entry) {
String aclName = ipAccessList.getName();
SortedMap<String, IpAccessList> aclsByHostname = _acls.get(hostname);
if (aclsByHostname == null) {
aclsByHostname = new TreeMap<>();
_acls.put(hostname, aclsByHostname);
}
if (!aclsByHostname.containsKey(aclName)) {
aclsByHostname.put(aclName, ipAccessList);
}
SortedMap<String, SortedSet<AclReachabilityEntry>> linesByHostname = lines
.get(hostname);
if (linesByHostname == null) {
linesByHostname = new TreeMap<>();
lines.put(hostname, linesByHostname);
}
SortedSet<AclReachabilityEntry> linesByAcl = linesByHostname.get(aclName);
if (linesByAcl == null) {
linesByAcl = new TreeSet<>();
linesByHostname.put(aclName, linesByAcl);
}
linesByAcl.add(entry);
}
public void addReachableLine(String hostname, IpAccessList ipAccessList,
AclReachabilityEntry entry) {
addLine(_reachableLines, hostname, ipAccessList, entry);
}
public void addUnreachableLine(String hostname, IpAccessList ipAccessList,
AclReachabilityEntry entry) {
addLine(_unreachableLines, hostname, ipAccessList, entry);
}
public SortedMap<String, SortedMap<String, IpAccessList>> getAcls() {
return _acls;
}
public SortedMap<String, SortedMap<String, SortedSet<String>>> getEquivalenceClasses() {
return _equivalenceClasses;
}
public SortedMap<String, SortedMap<String, SortedSet<AclReachabilityEntry>>> getReachableLines() {
return _reachableLines;
}
public SortedMap<String, SortedMap<String, SortedSet<AclReachabilityEntry>>> getUnreachableLines() {
return _unreachableLines;
}
@Override
public String prettyPrint() {
StringBuilder sb = new StringBuilder(
"Results for unreachable ACL lines\n");
// private SortedMap<String, SortedMap<String,
// SortedSet<AclReachabilityEntry>>> _unreachableLines;
for (String hostname : _unreachableLines.keySet()) {
for (String aclName : _unreachableLines.get(hostname).keySet()) {
sb.append("\n " + hostname + " :: " + aclName + "\n");
for (AclReachabilityEntry arEntry : _unreachableLines.get(hostname)
.get(aclName)) {
sb.append(arEntry.prettyPrint(" "));
}
}
}
return sb.toString();
}
public void setAcls(
SortedMap<String, SortedMap<String, IpAccessList>> acls) {
_acls = acls;
}
public void setEquivalenceClasses(
SortedMap<String, SortedMap<String, SortedSet<String>>> equivalenceClasses) {
_equivalenceClasses = equivalenceClasses;
}
public void setReachableLines(
SortedMap<String, SortedMap<String, SortedSet<AclReachabilityEntry>>> reachableLines) {
_reachableLines = reachableLines;
}
public void setUnreachableLines(
SortedMap<String, SortedMap<String, SortedSet<AclReachabilityEntry>>> unreachableLines) {
_unreachableLines = unreachableLines;
}
}