Skip to content

Commit

Permalink
Merge pull request #434 from slovensko-digital/task431_branch
Browse files Browse the repository at this point in the history
#431 - Odchytiť exception pri spustení Autogramu
  • Loading branch information
celuchmarek authored May 24, 2024
2 parents df8e21a + cb54433 commit d595da6
Show file tree
Hide file tree
Showing 4 changed files with 86 additions and 51 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import digital.slovensko.autogram.core.errors.AutogramException;
import javafx.fxml.FXML;
import javafx.scene.Node;
import javafx.scene.control.Button;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

Expand All @@ -12,6 +13,9 @@ public class ErrorController implements SuppressedFocusController {
@FXML
VBox mainBox;

@FXML
private Button mainButton;

@FXML
ErrorSummaryComponentController errorSummaryComponentController; // this is {include fx:id} + "Controller"

Expand All @@ -31,4 +35,9 @@ public void onMainButtonAction() {
public Node getNodeForLoosingFocus() {
return mainBox;
}

public void setMainButtonText(String text) {
mainButton.setText(text);
}

}
16 changes: 1 addition & 15 deletions src/main/java/digital/slovensko/autogram/ui/gui/GUI.java
Original file line number Diff line number Diff line change
Expand Up @@ -175,21 +175,7 @@ public void enableSigningOnAllJobs() {

@Override
public void showError(AutogramException e) {
logger.debug("GUI showing error", e);
var controller = new ErrorController(e);
var root = GUIUtils.loadFXML(controller, "error-dialog.fxml");

var stage = new Stage();
stage.setTitle(e.getHeading());
stage.setScene(new Scene(root));

stage.sizeToScene();
stage.setResizable(false);
stage.initModality(Modality.APPLICATION_MODAL);

GUIUtils.suppressDefaultFocus(stage, controller);

stage.show();
GUIUtils.showError(e, "Pokračovať", false);
}

public void showPkcsEidWindowsDllError(AutogramException e) {
Expand Down
81 changes: 46 additions & 35 deletions src/main/java/digital/slovensko/autogram/ui/gui/GUIApp.java
Original file line number Diff line number Diff line change
@@ -1,63 +1,74 @@
package digital.slovensko.autogram.ui.gui;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;

import digital.slovensko.autogram.core.Autogram;
import digital.slovensko.autogram.core.DefaultDriverDetector;
import digital.slovensko.autogram.core.LaunchParameters;
import digital.slovensko.autogram.core.UserSettings;
import digital.slovensko.autogram.core.errors.UnrecognizedException;
import digital.slovensko.autogram.server.AutogramServer;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.scene.Scene;
import javafx.stage.Stage;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;

public class GUIApp extends Application {
private final ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1);
private final ExecutorService cachedExecutorService = Executors.newFixedThreadPool(8);

@Override
public void start(Stage windowStage) throws Exception {
var userSettings = UserSettings.load();
var ui = new GUI(getHostServices(), userSettings);
var autogram = new Autogram(ui, userSettings);

Platform.setImplicitExit(false);
autogram.checkForUpdate();
autogram.initializeSignatureValidator(scheduledExecutorService, cachedExecutorService, userSettings.getTrustedList());
AutogramServer server = null;
try {
var userSettings = UserSettings.load();

setUserAgentStylesheet(getClass().getResource("idsk.css").toExternalForm());
Platform.setImplicitExit(false);
setUserAgentStylesheet(getClass().getResource("idsk.css").toExternalForm());

var controller = new MainMenuController(autogram, userSettings);
var root = GUIUtils.loadFXML(controller, "main-menu.fxml");
final Autogram autogram;
autogram = new Autogram(new GUI(getHostServices(), userSettings), userSettings);
autogram.checkForUpdate();
autogram.initializeSignatureValidator(scheduledExecutorService, cachedExecutorService, userSettings.getTrustedList());

var scene = new Scene(root);
final var params = LaunchParameters.fromParameters(getParameters());
final var controller = new MainMenuController(autogram, userSettings);

var params = LaunchParameters.fromParameters(getParameters());
var server = new AutogramServer(autogram, params.getHost(), params.getPort(), params.isProtocolHttps(), cachedExecutorService);

if (userSettings.isServerEnabled()) {
server.start();
}

windowStage.setOnCloseRequest(event -> {
server = new AutogramServer(autogram, params.getHost(), params.getPort(), params.isProtocolHttps(), cachedExecutorService);
if (userSettings.isServerEnabled()) {
new Thread(server::stop).start();
server.start();
}

Platform.exit();
});

if (!params.isStandaloneMode())
GUIUtils.startIconified(windowStage);

GUIUtils.suppressDefaultFocus(windowStage, controller);
windowStage.setTitle("Autogram");
windowStage.setScene(scene);
windowStage.setResizable(false);
windowStage.show();
Thread thread = new Thread(server::stop);
windowStage.setOnCloseRequest(event -> {
if (userSettings.isServerEnabled()) {
thread.start();
}
Platform.exit();
});


if (!params.isStandaloneMode())
GUIUtils.startIconified(windowStage);

GUIUtils.suppressDefaultFocus(windowStage, controller);
windowStage.setTitle("Autogram");
windowStage.setScene(new Scene(GUIUtils.loadFXML(controller, "main-menu.fxml")));
windowStage.setResizable(false);
windowStage.show();
} catch (Exception e) {
//ak nastane chyba, zobrazíme chybové okno a ukončíme aplikáciu
final var serverFinal = server; //pomocná premenná, do lambda výrazu nižšie musí vstupovať finalna premenná
Platform.runLater(() -> {
GUIUtils.showError(new UnrecognizedException(e), "Ukončiť",true);
if (serverFinal != null) {
new Thread(serverFinal::stop).start();
}
Platform.exit();
});
}
}

@Override
Expand Down
31 changes: 30 additions & 1 deletion src/main/java/digital/slovensko/autogram/ui/gui/GUIUtils.java
Original file line number Diff line number Diff line change
@@ -1,17 +1,24 @@
package digital.slovensko.autogram.ui.gui;

import digital.slovensko.autogram.core.errors.AutogramException;
import digital.slovensko.autogram.util.OperatingSystem;
import javafx.application.Platform;
import javafx.fxml.FXMLLoader;
import javafx.scene.Node;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Modality;
import javafx.stage.Stage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;

public class GUIUtils {

private static Logger logger = LoggerFactory.getLogger(GUIUtils.class);
static Parent loadFXML(Object controller, String fxml) {
try {
var loader = new FXMLLoader();
Expand Down Expand Up @@ -63,7 +70,6 @@ public static void startIconified(Stage stage) {
}
}


public static String exceptionToString(Exception exception) {
var writer = new StringWriter();
var printWriter = new PrintWriter(writer);
Expand All @@ -80,4 +86,27 @@ public static void hackToForceRelayout(Stage stage) {
// This forces layout recalculation and fixes issue https://github.com/slovensko-digital/autogram/issues/172
w.setHeight(w.getHeight() - 1);
}

public static void showError(AutogramException e, String buttonText, boolean wait) {
logger.debug("GUI showing error", e);
var controller = new ErrorController(e);
var root = GUIUtils.loadFXML(controller, "error-dialog.fxml");
controller.setMainButtonText(buttonText);

var stage = new Stage();
stage.setTitle(e.getHeading());
stage.setScene(new Scene(root));

stage.sizeToScene();
stage.setResizable(false);
stage.initModality(Modality.APPLICATION_MODAL);

GUIUtils.suppressDefaultFocus(stage, controller);

if (wait) {
stage.showAndWait();
} else {
stage.show();
}
}
}

0 comments on commit d595da6

Please sign in to comment.