package hu.sztaki.ilab.longneck.process.constraint; import hu.sztaki.ilab.longneck.Record; import hu.sztaki.ilab.longneck.process.VariableSpace; import java.util.ArrayList; import java.util.List; /** * * @author Molnár Péter <molnarp@sztaki.mta.hu> */ public class When extends AbstractCompoundConstraint { /** Then branch with additional checks. */ private AndOperator then; /** Else branch with additional checks. */ private AndOperator elseBranch; public When() { then = new AndOperator(); elseBranch = new AndOperator(); } @Override public CheckResult check(Record record, VariableSpace scope) { List<CheckResult> results; boolean whenPasses = true; if (constraints != null) { // Prepare result variable results = new ArrayList<CheckResult>(constraints.size() + 1); // Check condition constraints for (Constraint c : constraints) { CheckResult res = c.check(record, scope); results.add(res); if (! res.isPassed()) { whenPasses = false; break; } } } else { results = new ArrayList<CheckResult>(1); } if (whenPasses) { // On success check then constraints CheckResult thenRes = then.check(record, scope); results.add(thenRes); if (! thenRes.isPassed()) { return new CheckResult(this, false, null, null, "Then branch has failed.", results); } } else { if (elseBranch.constraints != null) { CheckResult elseRes = elseBranch.check(record, scope); results.add(elseRes); if (!elseRes.isPassed()) { return new CheckResult(this, false, null, null, "Else branch has failed.", results); } } } return new CheckResult(this, true, null, null, null, results); } public void setThenConstraints(List<Constraint> thenConstraints) { then.setConstraints(thenConstraints); } public void setElseConstraints(List<Constraint> elseConstraints) { elseBranch.setConstraints(elseConstraints); } public List<Constraint> getThenConstraints() { return then.getConstraints(); } public List<Constraint> getElseConstraints() { return elseBranch.getConstraints(); } public AndOperator getElseBranch() { return elseBranch; } public void setElseBranch(AndOperator elseBranch) { this.elseBranch = elseBranch; } public AndOperator getThen() { return then; } public void setThen(AndOperator then) { this.then = then; } @Override public When clone() { When copy = (When) super.clone(); if (then != null) { copy.then = then.clone(); } if (elseBranch != null) { copy.elseBranch = elseBranch.clone(); } return copy; } }