This is an automated email from the ASF dual-hosted git repository.
ahuber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/causeway.git
The following commit(s) were added to refs/heads/master by this push:
new f748a796c5 CAUSEWAY-3402: demo: fixes error page shows a 'null' link
f748a796c5 is described below
commit f748a796c5420dd0e8a2213e48780b488e31889f
Author: andi-huber <[email protected]>
AuthorDate: Thu Apr 13 16:01:41 2023 +0200
CAUSEWAY-3402: demo: fixes error page shows a 'null' link
---
.../causeway/commons/internal/base/_Strings.java | 28 ++++++++++++++++
.../core/errorreportingservice/EmailTicket.java | 25 ++++++++++----
.../viewer/wicket/ui/errors/ExceptionModel.java | 4 +--
.../wicket/ui/errors/ExceptionStackTracePanel.java | 39 +++++++++++++---------
4 files changed, 71 insertions(+), 25 deletions(-)
diff --git
a/commons/src/main/java/org/apache/causeway/commons/internal/base/_Strings.java
b/commons/src/main/java/org/apache/causeway/commons/internal/base/_Strings.java
index 3d478d4a9c..3515f520ef 100644
---
a/commons/src/main/java/org/apache/causeway/commons/internal/base/_Strings.java
+++
b/commons/src/main/java/org/apache/causeway/commons/internal/base/_Strings.java
@@ -24,8 +24,10 @@ import java.io.PrintStream;
import java.net.URI;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
+import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
@@ -37,6 +39,7 @@ import java.util.function.BiFunction;
import java.util.function.Consumer;
import java.util.function.Predicate;
import java.util.function.UnaryOperator;
+import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.IntStream;
import java.util.stream.Stream;
@@ -349,6 +352,31 @@ public final class _Strings {
return false;
}
+ // -- INTERPOLATION
+
+ /**
+ * String interpolation based on named parameters of pattern <pre>${key}
-> value</pre>
+ * @see
"https://www.baeldung.com/java-string-formatting-named-placeholders#2-creating-the-method"
+ */
+ public static String format(final String template, final Map<String,
Object> parameters) {
+ final StringBuilder newTemplate = new StringBuilder(template);
+ final List<Object> valueList = new ArrayList<>();
+ final Matcher matcher =
Pattern.compile("[$][{](\\w+)}").matcher(template);
+
+ while (matcher.find()) {
+ String key = matcher.group(1);
+
+ String paramName = "${" + key + "}";
+ int index = newTemplate.indexOf(paramName);
+ if (index != -1) {
+ newTemplate.replace(index, index + paramName.length(), "%s");
+ valueList.add(parameters.get(key));
+ }
+ }
+
+ return String.format(newTemplate.toString(), valueList.toArray());
+ }
+
// -- PREFIX/SUFFIX
/**
diff --git
a/examples/demo/domain/src/main/java/demoapp/dom/services/core/errorreportingservice/EmailTicket.java
b/examples/demo/domain/src/main/java/demoapp/dom/services/core/errorreportingservice/EmailTicket.java
index a48c7a6489..199991e092 100644
---
a/examples/demo/domain/src/main/java/demoapp/dom/services/core/errorreportingservice/EmailTicket.java
+++
b/examples/demo/domain/src/main/java/demoapp/dom/services/core/errorreportingservice/EmailTicket.java
@@ -20,16 +20,18 @@ package demoapp.dom.services.core.errorreportingservice;
import java.io.Serializable;
import java.util.List;
+import java.util.Map;
import java.util.stream.Collectors;
import org.apache.causeway.applib.services.error.ErrorDetails;
import org.apache.causeway.applib.services.error.ErrorReportingService;
import org.apache.causeway.applib.services.error.SimpleTicket;
-import org.apache.causeway.applib.services.error.Ticket.StackTracePolicy;
+import org.apache.causeway.commons.internal.base._Strings;
import static org.apache.causeway.commons.internal.base._NullSafe.stream;
import lombok.Builder;
+import lombok.val;
/**
* Response from the {@link ErrorReportingService}, containing information to
show to the end-user.
@@ -51,18 +53,27 @@ public class EmailTicket extends SimpleTicket {
private static final long serialVersionUID = -817872853109724987L;
+ @Builder.Default
private String linkName = "Email";
+ @Builder.Default
private String receiver = "no-one@nowhere";
+ @Builder.Default
private String subject = "[Module-Name] Unexpected Error (#ref)";
+ @Builder.Default
private String body = "empty body";
public String toHtmlLink() {
- return String.format("<a
href=\"mailto:%s?subject=%s&body=%s\">%s</a>",
- receiver,
- htmlEscape(subject),
- htmlEscape(body),
- linkName
- );
+
+ val messageProperties = Map.<String, Object>of(
+ "receiver", receiver,
+ "subject", htmlEscape(subject),
+ "body", htmlEscape(body),
+ "linkName", linkName);
+
+ return _Strings.format("<a href=\"mailto:${receiver}"
+ + "?subject=${subject}"
+ + "&body=${body}\">${linkName}</a>",
+ messageProperties);
}
// -- STACKTRACE FORMATTING
diff --git
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/errors/ExceptionModel.java
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/errors/ExceptionModel.java
index 247e5a3480..db2edc3c8a 100644
---
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/errors/ExceptionModel.java
+++
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/errors/ExceptionModel.java
@@ -127,8 +127,8 @@ public class ExceptionModel extends
ModelAbstract<List<StackTraceDetail>> {
private Ticket ticket;
- public Ticket getTicket() {
- return ticket;
+ public Optional<Ticket> getTicket() {
+ return Optional.ofNullable(ticket);
}
/**
diff --git
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/errors/ExceptionStackTracePanel.java
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/errors/ExceptionStackTracePanel.java
index fe67a363fd..3f8d6085f8 100644
---
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/errors/ExceptionStackTracePanel.java
+++
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/errors/ExceptionStackTracePanel.java
@@ -44,6 +44,8 @@ import org.apache.causeway.viewer.wicket.ui.util.Wkt;
import org.apache.causeway.viewer.wicket.ui.util.WktComponents;
import org.apache.causeway.viewer.wicket.ui.util.WktLinks;
+import lombok.val;
+
public class ExceptionStackTracePanel
extends PanelBase<List<StackTraceDetail>> {
@@ -78,29 +80,34 @@ extends PanelBase<List<StackTraceDetail>> {
public ExceptionStackTracePanel(
final PageClassRegistry pageClassRegistry,
- final String id, final ExceptionModel exceptionModel) {
+ final String id,
+ final ExceptionModel exceptionModel) {
+
super(id, exceptionModel);
- final Ticket ticket = exceptionModel.getTicket();
- final String mainMessage =
- ticket != null
- && ticket.getUserMessage() != null
- ? ticket.getUserMessage()
- : exceptionModel.getMainMessage();
+ val ticketIfAny = exceptionModel.getTicket();
+ val mainMessage = ticketIfAny
+ .map(Ticket::getUserMessage)
+ .orElseGet(exceptionModel::getMainMessage);
Wkt.labelAdd(this, ID_MAIN_MESSAGE, mainMessage);
- final String ticketMarkup = ticket != null ? ticket.getMarkup(): null;
- if(ticketMarkup == null) {
- WktComponents.permanentlyHide(this, ID_TICKET_MARKUP);
- } else {
- Wkt.markupAdd(this, ID_TICKET_MARKUP, ticket.getMarkup());
- }
+ ticketIfAny
+ .map(Ticket::getMarkup)
+ .ifPresentOrElse(ticketMarkup->{
+ Wkt.markupAdd(this, ID_TICKET_MARKUP, ticketMarkup);
+ }, ()->{
+ WktComponents.permanentlyHide(this, ID_TICKET_MARKUP);
+ });
final boolean suppressExceptionDetail =
- exceptionModel.isAuthorizationException() ||
- exceptionModel.isRecognized() ||
- (ticket != null && ticket.getStackTracePolicy() ==
Ticket.StackTracePolicy.HIDE);
+ exceptionModel.isAuthorizationException()
+ || exceptionModel.isRecognized()
+ || ticketIfAny
+ .map(Ticket::getStackTracePolicy)
+ .map(Ticket.StackTracePolicy.HIDE::equals)
+ .orElse(false);
+
if(suppressExceptionDetail) {
WktComponents.permanentlyHide(this, ID_EXCEPTION_DETAIL_DIV);
} else {