package org.fugazi.qls;
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.type_checker.QLTypeChecker;
import org.fugazi.ql.type_checker.issue.ASTIssuePrinter;
import org.fugazi.qls.ast.DefaultStyleHandler;
import org.fugazi.qls.ast.QLSASTBuilder;
import org.fugazi.qls.ast.stylesheet.StyleSheet;
import org.fugazi.qls.ast.stylesheet.stylesheet_data.QLSStyleSheetDataStorage;
import org.fugazi.qls.gui.StyledGUIBuilder;
import org.fugazi.qls.type_checker.QLSTypeChecker;
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 QLSApplication {
public static final String QL_FILE_EXTENSION = "ql";
public static final String QLS_FILE_EXTENSION = "qls";
public static QLSApplication run(
String _qlFileName, String _qlsFileName)
throws IOException, IllegalArgumentException
{
return new QLSApplication(_qlFileName, _qlsFileName);
}
private QLSApplication(String _qlFileName, String _qlsFileName)
throws IOException, IllegalArgumentException
{
if (!this.isFileExists(_qlFileName) || !this.isFileExists(_qlsFileName)) {
throw new IOException();
}
if (!this.isTheRightExtension(_qlFileName, QL_FILE_EXTENSION)
|| !this.isTheRightExtension(_qlsFileName, QLS_FILE_EXTENSION))
{
throw new IllegalArgumentException();
}
InputStream qlInputStream = new FileInputStream(_qlFileName);
Form qlForm = this.buildForm(qlInputStream);
QLFormDataStorage formDataStorage = new QLFormDataStorage(qlForm);
boolean isFormTypesCorrect = performFormTypeChecking(qlForm, formDataStorage);
if (!isFormTypesCorrect) {
System.err.println("Form is not type correct. Cannot evaluate and render. Please fix the errors.");
System.exit(-1);
}
InputStream qlsInputStream = new FileInputStream(_qlsFileName);
StyleSheet styleSheet = this.buildStyleSheet(qlsInputStream, formDataStorage);
QLSStyleSheetDataStorage styleSheetData = new QLSStyleSheetDataStorage(styleSheet);
boolean isStyleSheetTypesCorrect = this.performStyleSheetTypeChecking(styleSheetData, formDataStorage);
if (!isStyleSheetTypesCorrect) {
System.err.println("Stylesheet is not type correct. Cannot evaluate and render. Please fix the errors.");
System.exit(-1);
}
this.renderUI(qlForm, styleSheetData);
}
/**
* 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 - QLS Helper Functions.
*/
private void renderUI(Form _form, QLSStyleSheetDataStorage _styleSheetData) {
GUIBuilder guiBuilder = new StyledGUIBuilder(_form, _styleSheetData);
guiBuilder.renderUI();
}
private Form buildForm(InputStream _inputStream) throws IOException {
QLASTBuilder qlAstBuilder = new QLASTBuilder(_inputStream);
return qlAstBuilder.buildForm();
}
private StyleSheet buildStyleSheet(
InputStream _inputStream, QLFormDataStorage _formDataStorage) throws IOException
{
QLSASTBuilder qlsAstBuilder = new QLSASTBuilder(_inputStream);
StyleSheet styleSheet = qlsAstBuilder.buildStyleSheet();
DefaultStyleHandler.applyStylesToStyleSheet(_formDataStorage, styleSheet);
return styleSheet;
}
private boolean performFormTypeChecking(Form _form, QLFormDataStorage _formDataStorage) {
QLTypeChecker qLTypeChecker = new QLTypeChecker(_form, _formDataStorage);
boolean isFormTypesCorrect = qLTypeChecker.checkForm();
ASTIssuePrinter printer = new ASTIssuePrinter();
printer.displayWarningsAndErrors(
qLTypeChecker.getErrors(), qLTypeChecker.getWarnings()
);
return isFormTypesCorrect;
}
private boolean performStyleSheetTypeChecking(QLSStyleSheetDataStorage _styleSheetData, QLFormDataStorage _formDataStorage) {
QLSTypeChecker qLSTypeChecker = new QLSTypeChecker(_styleSheetData, _formDataStorage);
boolean isQLSFormTypesCorrect = qLSTypeChecker.checkStylesheet();
ASTIssuePrinter printer = new ASTIssuePrinter();
printer.displayWarningsAndErrors(
qLSTypeChecker.getErrors(), qLSTypeChecker.getWarnings()
);
return isQLSFormTypesCorrect;
}
}