package nl.uva.polyql.validation;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import nl.uva.polyql.ast.Form;
import nl.uva.polyql.ast.Question;
import nl.uva.polyql.ast.Rule;
import nl.uva.polyql.utils.Log;
public class Validator {
private final Form mForm;
private final ValidationErrors mErrors = new ValidationErrors();
public static Validator validate(final Form form) {
final Validator validator = new Validator(form);
validator.validateDuplicates();
validator.validateTypes();
return validator;
}
private Validator(final Form form) {
mForm = form;
}
private void validateDuplicates() {
final Set<String> ids = new HashSet<>();
final Set<String> labels = new HashSet<>();
for (final Question question : mForm.getQuestionsRecursively()) {
final String id = question.getId();
if (ids.contains(id)) {
mErrors.add(new DuplicateIdError(question, id));
} else {
ids.add(id);
}
final String label = question.getLabel();
if (labels.contains(label)) {
mErrors.add(new DuplicateLabelWarning(question, label));
} else {
labels.add(label);
}
}
}
private void validateTypes() {
for (final Rule rule : mForm.getRules()) {
mErrors.merge(rule.validate());
}
}
public List<ValidationError> getErrors() {
return mErrors.getErrors();
}
public boolean isFatal() {
return mErrors.isFatal();
}
public void print() {
for (final ValidationError error : mErrors.getErrors()) {
Log.e(error.toString());
}
}
}