package edu.uva.softwarecons.evaluator;
import edu.uva.softwarecons.model.Form;
import edu.uva.softwarecons.model.question.BasicQuestion;
import edu.uva.softwarecons.model.question.ComputedQuestion;
import edu.uva.softwarecons.model.question.ElseQuestion;
import edu.uva.softwarecons.model.question.IfQuestion;
import edu.uva.softwarecons.model.question.Question;
import edu.uva.softwarecons.model.value.BooleanValue;
import edu.uva.softwarecons.ui.question.QuestionHBox;
import edu.uva.softwarecons.visitor.form.FormElementVisitor;
import java.util.HashMap;
/**
* Falconlabs
*
* @author Santiago Carrillo
* Date: 3/16/14
*/
public class QuestionEvalVisitor
implements FormElementVisitor
{
private boolean displayQuestion;
private HashMap<String, QuestionHBox> questions = new HashMap<String, QuestionHBox>();
private final ExpressionEvaluator expressionEvaluator;
public QuestionEvalVisitor( boolean displayQuestion, HashMap<String, QuestionHBox> questions,
ExpressionEvaluator expressionEvaluator )
{
this.displayQuestion = displayQuestion;
this.questions = questions;
this.expressionEvaluator = expressionEvaluator;
}
@Override
public void visitForm( Form form )
{
}
@Override
public void visitComputedQuestion( ComputedQuestion question )
{
questions.get( question.getId() ).setVisible( displayQuestion );
questions.get( question.getId() ).
updateValue( question.getExpression().accept( expressionEvaluator ) );
}
@Override
public void visitQuestion( BasicQuestion question )
{
questions.get( question.getId() ).setVisible( displayQuestion );
}
@Override
public void visitIfQuestion( IfQuestion question )
{
boolean display = ( (BooleanValue) question.getExpression().accept( expressionEvaluator ) ).getValue();
for ( Question q : question.getQuestions() )
{
q.accept( new QuestionEvalVisitor( displayQuestion && display, questions, expressionEvaluator ) );
}
if ( null != question.getElseQuestion() )
{
question.getElseQuestion().accept(
new QuestionEvalVisitor( !( displayQuestion && display ), questions, expressionEvaluator ) );
}
}
@Override
public void visitElseQuestion( ElseQuestion question )
{
for ( Question q : question.getQuestions() )
{
q.accept( this );
}
}
}