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 {

Reply via email to