Skip to content

Commit

Permalink
Simplify the error handling on the simple login app
Browse files Browse the repository at this point in the history
  • Loading branch information
besidev committed Dec 15, 2023
1 parent 5577659 commit bb659cd
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 48 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
import one.jpro.platform.auth.core.AuthAPI;
import one.jpro.platform.auth.core.authentication.User;
import one.jpro.platform.auth.core.oauth2.OAuth2Credentials;
import one.jpro.platform.auth.example.showcase.LoginApp;
import one.jpro.platform.auth.example.simple.page.ErrorPage;
import one.jpro.platform.auth.example.simple.page.LoginPage;
import one.jpro.platform.auth.example.simple.page.SignedInPage;
Expand All @@ -26,6 +25,7 @@
import java.util.Optional;

import static one.jpro.platform.routing.RouteUtils.getNode;
import static one.jpro.platform.routing.RouteUtils.viewFromNode;

/**
* The {@link SimpleApp} class extends {@link RouteApp} to create a JavaFX application
Expand Down Expand Up @@ -60,7 +60,7 @@ public Route createRoute() {
Optional.ofNullable(CupertinoLight.class.getResource(new CupertinoLight().getUserAgentStylesheet()))
.map(URL::toExternalForm)
.ifPresent(getScene()::setUserAgentStylesheet);
getScene().getStylesheets().add(LoginApp.class
getScene().getStylesheets().add(one.jpro.platform.auth.example.showcase.LoginApp.class
.getResource("/one/jpro/platform/auth/example/css/login.css").toExternalForm());

final var googleAuthProvider = AuthAPI.googleAuth()
Expand All @@ -75,15 +75,11 @@ public Route createRoute() {
return Route.empty()
.and(getNode("/", (r) -> new LoginPage(this, googleAuthProvider, googleCredentials)))
.and(getNode("/user/signed-in", (r) -> new SignedInPage(this, googleAuthProvider)))
.and(getNode("/auth/error", (r) -> new ErrorPage(this)))
.filter(DevFilter.create())
.filter(AuthFilters.oauth2(googleAuthProvider, googleCredentials, user -> {
setUser(user);
return FXFuture.unit(new Redirect("/user/signed-in"));
}, error -> {
setError(error);
return FXFuture.unit(new Redirect("/auth/error"));
}));
}, error -> FXFuture.unit(viewFromNode(new ErrorPage(error)))));
}

public ObservableMap<String, String> getSession() {
Expand Down Expand Up @@ -126,27 +122,4 @@ public final ObjectProperty<User> userProperty() {
}
return userProperty;
}

// Error property
private ObjectProperty<Throwable> errorProperty;

public final Throwable getError() {
return errorProperty == null ? null : errorProperty.get();
}

public final void setError(Throwable value) {
errorProperty().set(value);
}

/**
* The error property contains the last error that occurred.
*
* @return the error property
*/
public final ObjectProperty<Throwable> errorProperty() {
if (errorProperty == null) {
errorProperty = new SimpleObjectProperty<>(this, "error");
}
return errorProperty;
}
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,9 @@
package one.jpro.platform.auth.example.simple.page;

import javafx.beans.binding.Bindings;
import javafx.scene.control.Label;
import javafx.scene.control.TextArea;
import javafx.scene.layout.Priority;
import javafx.scene.layout.VBox;
import one.jpro.platform.auth.example.simple.SimpleApp;

import java.io.PrintWriter;
import java.io.StringWriter;
Expand All @@ -17,36 +15,30 @@
*/
public class ErrorPage extends Page {

public ErrorPage(SimpleApp app) {
public ErrorPage(Throwable throwable) {
final var headerLabel = new Label("Something unexpected happen:");
headerLabel.getStyleClass().add("header-label");

final var errorLabel = new Label();
errorLabel.setWrapText(true);
errorLabel.getStyleClass().add("error-label");
errorLabel.textProperty().bind(Bindings.createStringBinding(() -> {
final Throwable throwable = app.getError();
return throwable == null ? "" : throwable.getMessage();
}, app.errorProperty()));
errorLabel.setText(throwable == null ? "" : throwable.getMessage());

final var errorTextArea = new TextArea();
errorTextArea.getStyleClass().add("error-text-area");
VBox.setVgrow(errorTextArea, Priority.ALWAYS);
errorTextArea.textProperty().bind(Bindings.createStringBinding(() -> {
final Throwable throwable = app.getError();
if (throwable == null) {
return "";
} else {
final StringWriter sw = new StringWriter();
final PrintWriter pw = new PrintWriter(sw);
throwable.printStackTrace(pw);
return sw.toString();
}
}, app.errorProperty()));
errorTextArea.setText((throwable == null) ? "" : printStackTrace(throwable));

final var pane = new VBox(headerLabel, errorLabel, errorTextArea);
pane.getStyleClass().add("error-pane");

getChildren().add(pane);
}

private String printStackTrace(Throwable throwable) {
final StringWriter sw = new StringWriter();
final PrintWriter pw = new PrintWriter(sw);
throwable.printStackTrace(pw);
return sw.toString();
}
}

0 comments on commit bb659cd

Please sign in to comment.