package org.batfish.datamodel; import java.util.Map; import java.util.Set; import java.util.SortedMap; import java.util.SortedSet; import java.util.TreeMap; import java.util.TreeSet; import org.batfish.common.util.CommonUtil; import org.batfish.datamodel.answers.AnswerElement; import com.fasterxml.jackson.annotation.JsonIdentityReference; public class FlowHistory implements AnswerElement { private SortedSet<Flow> _flows; private SortedMap<String, Flow> _flowsByText; private SortedMap<String, SortedMap<String, SortedSet<FlowTrace>>> _traces; public FlowHistory() { _traces = new TreeMap<>(); _flows = new TreeSet<>(); _flowsByText = new TreeMap<>(); } public void addFlowTrace(Flow flow, String environment, FlowTrace trace) { Flow canonicalFlow = flow; String flowText = flow.toString(); if (_flows.contains(flow)) { canonicalFlow = _flowsByText.get(flowText); } _flows.add(canonicalFlow); _flowsByText.put(flowText, canonicalFlow); SortedMap<String, SortedSet<FlowTrace>> envTraceSetMap = _traces .get(flowText); if (envTraceSetMap == null) { envTraceSetMap = new TreeMap<>(); _traces.put(canonicalFlow.toString(), envTraceSetMap); } SortedSet<FlowTrace> traces = envTraceSetMap.get(environment); if (traces == null) { traces = new TreeSet<>(); envTraceSetMap.put(environment, traces); } traces.add(trace); } public Set<Flow> getFlows() { return _flows; } @JsonIdentityReference(alwaysAsId = true) public Map<String, Flow> getFlowsByText() { return _flowsByText; } public SortedMap<String, SortedMap<String, SortedSet<FlowTrace>>> getTraces() { return _traces; } @Override public String prettyPrint() { StringBuilder retString = new StringBuilder("\n"); for (String flowStr : _traces.keySet()) { Flow flow = _flowsByText.get(flowStr); retString.append(flow.prettyPrint("") + "\n"); for (String environment : _traces.get(flowStr).keySet()) { retString.append(" environment:" + environment + "\n"); for (FlowTrace trace : _traces.get(flowStr).get(environment)) { retString.append(trace.toString(" ") + "\n"); } } } return retString.toString(); } public void setFlows(SortedSet<Flow> flows) { _flows = flows; } public void setFlowsByText(SortedMap<String, Flow> flowsByText) { _flowsByText = flowsByText; } public void setTraces( SortedMap<String, SortedMap<String, SortedSet<FlowTrace>>> traces) { _traces = traces; } @Override public String toString() { StringBuilder sb = new StringBuilder(); for (Flow flow : _flows) { String flowString = flow.toString(); sb.append("Flow: " + flowString + "\n"); SortedMap<String, SortedSet<FlowTrace>> envTraceSetMap = _traces .get(flowString); for (String environmentName : envTraceSetMap.keySet()) { sb.append(" Environment: " + environmentName + "\n"); Set<FlowTrace> traces = envTraceSetMap.get(environmentName); int i = 0; for (FlowTrace trace : traces) { i++; sb.append(" Trace: " + i + "\n"); String rawTraceString = trace.toString(); String traceString = CommonUtil.getIndentedString(rawTraceString, 3); sb.append(traceString); } } } return sb.toString(); } }