package org.batfish.datamodel.routing_policy.statement;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.batfish.datamodel.routing_policy.Environment;
import org.batfish.datamodel.routing_policy.Result;
import org.batfish.datamodel.routing_policy.expr.BooleanExpr;
import org.batfish.datamodel.routing_policy.expr.BooleanExprs;
import com.fasterxml.jackson.annotation.JsonCreator;
public class If extends Statement {
/**
*
*/
private static final long serialVersionUID = 1L;
private List<Statement> _falseStatements;
private BooleanExpr _guard;
private List<Statement> _trueStatements;
@JsonCreator
public If() {
_falseStatements = new ArrayList<>();
_trueStatements = new ArrayList<>();
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
If other = (If) obj;
if (_falseStatements == null) {
if (other._falseStatements != null) {
return false;
}
}
else if (!_falseStatements.equals(other._falseStatements)) {
return false;
}
if (_guard == null) {
if (other._guard != null) {
return false;
}
}
else if (!_guard.equals(other._guard)) {
return false;
}
if (_trueStatements == null) {
if (other._trueStatements != null) {
return false;
}
}
else if (!_trueStatements.equals(other._trueStatements)) {
return false;
}
return true;
}
@Override
public Result execute(Environment environment) {
Result exprResult = _guard.evaluate(environment);
if (exprResult.getExit()) {
return exprResult;
}
boolean guardVal = exprResult.getBooleanValue();
List<Statement> toExecute = guardVal ? _trueStatements : _falseStatements;
for (Statement statement : toExecute) {
Result result = statement.execute(environment);
if (result.getExit() || result.getReturn()) {
return result;
}
}
Result fallThroughResult = new Result();
fallThroughResult.setFallThrough(true);
return fallThroughResult;
}
public List<Statement> getFalseStatements() {
return _falseStatements;
}
public BooleanExpr getGuard() {
return _guard;
}
public List<Statement> getTrueStatements() {
return _trueStatements;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result
+ ((_falseStatements == null) ? 0 : _falseStatements.hashCode());
result = prime * result + ((_guard == null) ? 0 : _guard.hashCode());
result = prime * result
+ ((_trueStatements == null) ? 0 : _trueStatements.hashCode());
return result;
}
public void setFalseStatements(List<Statement> falseStatements) {
_falseStatements = falseStatements;
}
public void setGuard(BooleanExpr guard) {
_guard = guard;
}
public void setTrueStatements(List<Statement> trueStatements) {
_trueStatements = trueStatements;
}
@Override
public List<Statement> simplify() {
List<Statement> simpleTrueStatements = new ArrayList<>();
List<Statement> simpleFalseStatements = new ArrayList<>();
BooleanExpr simpleGuard = _guard.simplify();
for (Statement trueStatement : _trueStatements) {
simpleTrueStatements.addAll(trueStatement.simplify());
}
for (Statement falseStatement : _falseStatements) {
simpleFalseStatements.addAll(falseStatement.simplify());
}
if (simpleGuard.equals(BooleanExprs.True.toStaticBooleanExpr())) {
return simpleTrueStatements;
}
else if (simpleGuard.equals(BooleanExprs.False.toStaticBooleanExpr())) {
return simpleFalseStatements;
}
else if (simpleTrueStatements.size() == 0
&& simpleFalseStatements.size() == 0) {
return Collections.<Statement> emptyList();
}
else {
If simple = new If();
simple.setGuard(simpleGuard);
simple.setTrueStatements(simpleTrueStatements);
simple.setFalseStatements(simpleFalseStatements);
simple.setComment(getComment());
return Collections.singletonList(simple);
}
}
}