package org.fugazi.ql;
import org.fugazi.ql.ast.QLASTBuilder;
import org.fugazi.ql.ast.form.Form;
import org.fugazi.ql.ast.form.form_data.QLFormDataStorage;
import org.fugazi.ql.gui.GUIBuilder;
import org.fugazi.ql.gui.UIFormManager;
import org.fugazi.ql.gui.ui_element.UIForm;
import org.fugazi.ql.gui.widgets.WidgetsFactory;
import org.fugazi.ql.type_checker.QLTypeChecker;
import org.fugazi.ql.type_checker.issue.ASTIssuePrinter;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
public class QLApplication {
public static final String QL_FILE_EXTENSION = "ql";
public static QLApplication run(String _qlFileName) throws IOException, IllegalArgumentException {
return new QLApplication(_qlFileName);
}
private QLApplication(String _qlFileName) throws IOException, IllegalArgumentException {
if (!this.isFileExists(_qlFileName)) {
throw new IOException();
}
if (!this.isTheRightExtension(_qlFileName, QL_FILE_EXTENSION)) {
throw new IllegalArgumentException();
}
InputStream qlInputStream = new FileInputStream(_qlFileName);
Form qlForm = this.buildForm(qlInputStream);
boolean isFormTypesCorrect = performTypeChecking(qlForm);
if (!isFormTypesCorrect) {
System.err.println("Form is not type correct. Cannot evaluate and render. Please fix the errors.");
System.exit(-1);
}
this.renderUI(qlForm);
}
/**
* File management.
*/
private boolean isFileExists(String _filename) {
Path path = Paths.get(_filename);
return Files.exists(path);
}
private boolean isTheRightExtension(String _filename, String _extension) {
String fileExtension = _filename.substring(_filename.lastIndexOf(".") + 1, _filename.length());
return fileExtension.equals(_extension);
}
/**
* QL Helper Functions.
*/
private void renderUI(Form _form) {
GUIBuilder guiBuilder = new GUIBuilder(
_form,
new WidgetsFactory(),
new UIFormManager(
new UIForm(_form.getName())
)
);
guiBuilder.renderUI();
}
private Form buildForm(InputStream _inputStream) throws IOException {
QLASTBuilder qlAstBuilder = new QLASTBuilder(_inputStream);
return qlAstBuilder.buildForm();
}
private boolean performTypeChecking(Form _form) {
QLFormDataStorage formDataStorage = new QLFormDataStorage(_form);
QLTypeChecker qLTypeChecker = new QLTypeChecker(_form, formDataStorage);
boolean isFormTypesCorrect = qLTypeChecker.checkForm();
ASTIssuePrinter printer = new ASTIssuePrinter();
printer.displayWarningsAndErrors(
qLTypeChecker.getErrors(), qLTypeChecker.getWarnings()
);
return isFormTypesCorrect;
}
}