package org.batfish.grammar.juniper;
import java.util.ArrayList;
import java.util.List;
import org.batfish.grammar.juniper.JuniperParser.*;
public class JuniperFlattener extends JuniperParserBaseListener {
private List<String> _currentBracketedWords;
private List<String> _currentStatement;
private String _flattenedConfigurationText;
private final String _header;
private StatementContext _inactiveStatement;
private boolean _inBrackets;
private List<String> _setStatements;
private List<List<String>> _stack;
public JuniperFlattener(String header) {
_header = header;
_stack = new ArrayList<>();
_setStatements = new ArrayList<>();
}
@Override
public void enterBracketed_clause(Bracketed_clauseContext ctx) {
if (_inactiveStatement == null) {
_currentBracketedWords = new ArrayList<>();
_inBrackets = true;
}
}
@Override
public void enterStatement(StatementContext ctx) {
if (_inactiveStatement == null) {
if (ctx.INACTIVE() != null) {
_inactiveStatement = ctx;
}
else {
_currentStatement = new ArrayList<>();
_stack.add(_currentStatement);
}
}
}
@Override
public void exitBracketed_clause(Bracketed_clauseContext ctx) {
if (_inactiveStatement == null) {
_inBrackets = false;
}
}
@Override
public void exitJuniper_configuration(Juniper_configurationContext ctx) {
StringBuilder sb = new StringBuilder();
sb.append(_header);
for (String setStatement : _setStatements) {
sb.append(setStatement + "\n");
}
_flattenedConfigurationText = sb.toString();
}
@Override
public void exitStatement(StatementContext ctx) {
if (_inactiveStatement == null) {
_stack.remove(_stack.size() - 1);
}
else if (_inactiveStatement == ctx) {
_inactiveStatement = null;
}
}
@Override
public void exitTerminator(TerminatorContext ctx) {
if (_inactiveStatement == null) {
StringBuilder sb = new StringBuilder();
sb.append("set");
for (List<String> prefix : _stack) {
for (String word : prefix) {
sb.append(" " + word);
}
}
String setStatementBase = sb.toString();
if (_currentBracketedWords != null) {
for (String bracketedWord : _currentBracketedWords) {
String setStatement = setStatementBase + " " + bracketedWord;
_setStatements.add(setStatement);
}
_currentBracketedWords = null;
}
else {
_setStatements.add(setStatementBase);
}
}
}
@Override
public void exitWord(WordContext ctx) {
if (_inactiveStatement == null) {
String word = ctx.getText();
if (_inBrackets) {
_currentBracketedWords.add(word);
}
else {
_currentStatement.add(word);
}
}
}
public String getFlattenedConfigurationText() {
return _flattenedConfigurationText;
}
}