package org.batfish.vendor;
import java.io.Serializable;
import java.util.Set;
import java.util.SortedMap;
import java.util.SortedSet;
import java.util.TreeMap;
import java.util.TreeSet;
import org.batfish.common.VendorConversionException;
import org.batfish.common.Warnings;
import org.batfish.datamodel.answers.ConvertConfigurationAnswerElement;
import org.batfish.datamodel.collections.RoleSet;
import org.batfish.datamodel.Configuration;
import org.batfish.datamodel.ConfigurationFormat;
import org.batfish.datamodel.GenericConfigObject;
import com.fasterxml.jackson.annotation.JsonIgnore;
public abstract class VendorConfiguration
implements Serializable, GenericConfigObject {
/**
*
*/
private static final long serialVersionUID = 1L;
private transient ConvertConfigurationAnswerElement _answerElement;
protected String _filename;
protected final SortedMap<StructureType, SortedMap<String, SortedSet<Integer>>> _structureDefinitions;
protected final SortedMap<StructureType, SortedMap<String, SortedMap<StructureUsage, SortedSet<Integer>>>> _structureReferences;
private transient boolean _unrecognized;
protected transient Warnings _w;
public VendorConfiguration() {
_structureDefinitions = new TreeMap<>();
_structureReferences = new TreeMap<>();
}
public void defineStructure(StructureType type, String name, int line) {
SortedMap<String, SortedSet<Integer>> byName = _structureDefinitions
.get(type);
if (byName == null) {
byName = new TreeMap<>();
_structureDefinitions.put(type, byName);
}
SortedSet<Integer> lines = byName.get(name);
if (lines == null) {
lines = new TreeSet<>();
byName.put(name, lines);
}
lines.add(line);
}
@JsonIgnore
public final ConvertConfigurationAnswerElement getAnswerElement() {
return _answerElement;
}
public abstract String getHostname();
public abstract RoleSet getRoles();
public abstract Set<String> getUnimplementedFeatures();
public boolean getUnrecognized() {
return _unrecognized;
}
@JsonIgnore
public final Warnings getWarnings() {
return _w;
}
public void referenceStructure(StructureType type, String name,
StructureUsage usage, int line) {
SortedMap<String, SortedMap<StructureUsage, SortedSet<Integer>>> byName = _structureReferences
.get(type);
if (byName == null) {
byName = new TreeMap<>();
_structureReferences.put(type, byName);
}
SortedMap<StructureUsage, SortedSet<Integer>> byUsage = byName.get(name);
if (byUsage == null) {
byUsage = new TreeMap<>();
byName.put(name, byUsage);
}
SortedSet<Integer> lines = byUsage.get(usage);
if (lines == null) {
lines = new TreeSet<>();
byUsage.put(usage, lines);
}
lines.add(line);
}
public final void setAnswerElement(
ConvertConfigurationAnswerElement answerElement) {
_answerElement = answerElement;
}
public void setFilename(String filename) {
_filename = filename;
}
public abstract void setHostname(String hostname);
public abstract void setRoles(RoleSet roles);
public void setUnrecognized(boolean unrecognized) {
_unrecognized = unrecognized;
}
public abstract void setVendor(ConfigurationFormat format);
public final void setWarnings(Warnings warnings) {
_w = warnings;
}
public abstract Configuration toVendorIndependentConfiguration()
throws VendorConversionException;
public void undefined(StructureType structureType, String name,
StructureUsage usage, int line) {
String hostname = getHostname();
String type = structureType.getDescription();
String usageStr = usage.getDescription();
SortedMap<String, SortedMap<String, SortedMap<String, SortedSet<Integer>>>> byType = _answerElement
.getUndefinedReferences().get(hostname);
if (byType == null) {
byType = new TreeMap<>();
_answerElement.getUndefinedReferences().put(hostname, byType);
}
SortedMap<String, SortedMap<String, SortedSet<Integer>>> byName = byType
.get(type);
if (byName == null) {
byName = new TreeMap<>();
byType.put(type, byName);
}
SortedMap<String, SortedSet<Integer>> byUsage = byName.get(name);
if (byUsage == null) {
byUsage = new TreeMap<>();
byName.put(name, byUsage);
}
SortedSet<Integer> lines = byUsage.get(usageStr);
if (lines == null) {
lines = new TreeSet<>();
byUsage.put(usageStr, lines);
}
lines.add(line);
}
public void unused(StructureType structureType, String name, int line) {
String hostname = getHostname();
String type = structureType.getDescription();
SortedMap<String, SortedMap<String, SortedSet<Integer>>> byType = _answerElement
.getUnusedStructures().get(hostname);
if (byType == null) {
byType = new TreeMap<>();
_answerElement.getUnusedStructures().put(hostname, byType);
}
SortedMap<String, SortedSet<Integer>> byName = byType.get(type);
if (byName == null) {
byName = new TreeMap<>();
byType.put(type, byName);
}
SortedSet<Integer> lines = byName.get(name);
if (lines == null) {
lines = new TreeSet<>();
byName.put(name, lines);
}
lines.add(line);
}
}