package org.fugazi.ql.ast.form.form_data;
import org.fugazi.ql.ast.expression.literal.ID;
import org.fugazi.ql.ast.form.Form;
import org.fugazi.ql.ast.form.form_data.visitor.ComputedQuestionsVisitor;
import org.fugazi.ql.ast.form.form_data.visitor.IdTypeVisitor;
import org.fugazi.ql.ast.form.form_data.visitor.IfStatementsVisitor;
import org.fugazi.ql.ast.form.form_data.visitor.QuestionsVisitor;
import org.fugazi.ql.ast.statement.ComputedQuestion;
import org.fugazi.ql.ast.statement.IfStatement;
import org.fugazi.ql.ast.statement.Question;
import org.fugazi.ql.ast.type.Type;
import org.fugazi.ql.ast.type.UndefinedType;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
public class QLFormDataStorage {
private final Form form;
private final QuestionsVisitor questionsVisitor;
private final ComputedQuestionsVisitor computedQuestionsVisitor;
private final IfStatementsVisitor ifStatementsVisitor;
private final IdTypeVisitor idTypeVisitor;
public QLFormDataStorage(Form _form) {
this.form = _form;
this.questionsVisitor = new QuestionsVisitor(this.form);
this.computedQuestionsVisitor = new ComputedQuestionsVisitor(this.form);
this.ifStatementsVisitor = new IfStatementsVisitor(this.form);
this.idTypeVisitor = new IdTypeVisitor(this.form);
}
/**
* =====================
* Public exposed getters
* =====================
*/
public List<Question> getQuestions() {
List<Question> questions = new ArrayList<>();
Iterator<Question> iterator = this.questionsVisitor.getQuestions();
// convert back to list
// this way internal lists will not be modified by clients
iterator.forEachRemaining(questions::add);
return questions;
}
public List<ComputedQuestion> getComputedQuestions() {
List<ComputedQuestion> computedQuestions = new ArrayList<>();
Iterator<ComputedQuestion> iterator = this.computedQuestionsVisitor.getComputedQuestions();
// convert back to list
// this way internal lists will not be modified by clients
iterator.forEachRemaining(computedQuestions::add);
return computedQuestions;
}
public List<Question> getAllQuestions() {
List<Question> allQuestions = this.getQuestions();
List<ComputedQuestion> computedQuestions = this.getComputedQuestions();
allQuestions.addAll(computedQuestions);
return allQuestions;
}
public Question getQuestionById(String _idName) {
List<Question> questions = this.getAllQuestions();
for (Question question : questions) {
if (question.getIdName().equals(_idName)) {
return question;
}
}
return null;
}
public List<IfStatement> getIfStatements() {
return this.ifStatementsVisitor.getIfStatement();
}
public HashMap<String, Type> getallQuestionTypes() {
HashMap<String, Type> questionTypes = this.questionsVisitor.getQuestionTypes();
HashMap<String, Type> computedQuestionTypes = this.computedQuestionsVisitor.getComputedQuestionTypes();
questionTypes.putAll(computedQuestionTypes);
return questionTypes;
}
public HashMap<String, Type> getIdTypes() {
return this.idTypeVisitor.getIdTypes();
}
public Type getIdType(ID _id) {
String idName = _id.getName();
HashMap<String, Type> idTypes = this.getIdTypes();
Type idType = idTypes.get(idName);
if (idType == null) {
idType = new UndefinedType();
}
return idType;
}
}