package edu;
import edu.exceptions.ParseException;
import edu.gui.Observer;
import edu.gui.Renderer;
import edu.gui.components.CheckBox;
import edu.gui.components.NumberBox;
import edu.gui.components.TextBox;
import edu.parser.AntlrParser;
import edu.parser.QL.ParseTreeVisitor;
import edu.parser.QL.QLAntlrParser;
import edu.parser.QL.QuestionRetriever;
import edu.parser.QL.evaluator.Evaluator;
import edu.parser.QL.nodes.Form;
import edu.parser.QL.nodes.expression.QLIdentifier;
import edu.parser.QL.nodes.question.Question;
import edu.parser.QL.nodes.type.Text;
import edu.parser.QL.typechecker.TypeChecker;
import edu.parser.QLS.QLSAntlrParser;
import edu.parser.QLS.nodes.Stylesheet;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
* Created by Steven Kok on 24/02/2015.
*/
public class Main implements Observer {
public static final String PATH_TO_QL_INPUT_FILES = "src/test/resources/antlr/input/QL/";
public static final String PATH_TO_QLS_INPUT_FILES = "src/test/resources/antlr/input/QLS/";
private final AntlrParser qlParser;
private final AntlrParser qlsParser;
private final TypeChecker typeChecker;
private final Evaluator evaluator;
private final edu.parser.QLS.TypeChecker qlsTypeChecker;
private final Renderer renderer;
private final Form form;
private final Stylesheet stylesheet;
private List<Question> evaluatedQuestions;
public Main() {
qlParser = new QLAntlrParser();
qlsParser = new QLSAntlrParser();
typeChecker = new TypeChecker();
evaluator = new Evaluator();
qlsTypeChecker = new edu.parser.QLS.TypeChecker();
renderer = new Renderer(this);
form = parseQL();
typeChecker.visit(form);
stylesheet = parseQLS();
evaluatedQuestions = new ArrayList<>();
}
public static void main(String[] args) {
Main main = new Main();
main.start();
}
public void start() {
evaluateForm();
qlsTypeChecker.start(getAllFormQuestions(form), stylesheet);
renderer.render(evaluatedQuestions, stylesheet);
}
public void reRender() {
evaluateForm();
qlsTypeChecker.start(getAllFormQuestions(form), stylesheet);
renderer.reRender(evaluatedQuestions, stylesheet);
}
private void evaluateForm() {
evaluatedQuestions.clear();
evaluatedQuestions = evaluator.evaluate(form);
}
private Stylesheet parseQLS() {
try {
return qlsParser.parse(PATH_TO_QLS_INPUT_FILES + "QLS_gui", new edu.parser.QLS.ParseTreeVisitor(), Stylesheet.class);
} catch (IOException e) {
throw new ParseException(e);
}
}
private Form parseQL() {
try {
return qlParser.parse(PATH_TO_QL_INPUT_FILES + "QL_gui", new ParseTreeVisitor(), Form.class);
} catch (IOException e) {
throw new ParseException(e);
}
}
private static List<Question> getAllFormQuestions(Form form) {
QuestionRetriever questionRetriever = new QuestionRetriever();
return questionRetriever.retrieveQuestions(form);
}
@Override
public void update(TextBox textBox) {
Question question = getEvaluatedQuestion(textBox.getIdentifier());
question.setValue(new Text(textBox.getText()));
reRender();
}
@Override
public void update(CheckBox checkBox) {
Question question = getEvaluatedQuestion(checkBox.getIdentifier());
question.setState(checkBox.isSelected());
reRender();
}
@Override
public void update(NumberBox numberBox) {
Question question = getEvaluatedQuestion(numberBox.getIdentifier());
question.setValue(new Text(numberBox.getText()));
reRender();
}
public Question getEvaluatedQuestion(QLIdentifier QLIdentifier) {
List<Question> question = evaluatedQuestions.stream()
.filter(q -> q.getQLIdentifier().equals(QLIdentifier))
.collect(Collectors.toList());
if (question.isEmpty()) {
throw new IllegalArgumentException("cannot find question with identifier: " + QLIdentifier);
} else if (question.size() > 1) {
throw new IllegalArgumentException("UpdatedQuestions has duplicate items for identifier: " + QLIdentifier);
} else {
return question.get(0);
}
}
}