This is an automated email from the ASF dual-hosted git repository.
ahuber pushed a commit to branch v4
in repository https://gitbox.apache.org/repos/asf/causeway.git
The following commit(s) were added to refs/heads/v4 by this push:
new a5e350950d7 CAUSEWAY-3892: simplified Stacktrace Rendering
a5e350950d7 is described below
commit a5e350950d7a16a4a4c0ccc40c8d7199cd9405c5
Author: Andi Huber <[email protected]>
AuthorDate: Thu Aug 14 19:20:05 2025 +0200
CAUSEWAY-3892: simplified Stacktrace Rendering
---
.../applib/services/error/ErrorDetails.java | 20 ++--
.../{StackTraceDetail.java => ErrorFormatter.java} | 49 +++++-----
.../viewer/commons/model/error/ExceptionModel.java | 93 ++++++-------------
.../wicket/ui/errors/ExceptionStackTracePanel.css | 101 ---------------------
.../wicket/ui/errors/ExceptionStackTracePanel.html | 8 +-
.../wicket/ui/errors/ExceptionStackTracePanel.java | 46 +++++++---
.../wicket/ui/errors/StackTraceListView.java | 48 ----------
.../viewer/wicket/ui/pages/error/ErrorPage.css | 21 -----
.../viewer/wicket/ui/pages/error/ErrorPage.java | 9 --
9 files changed, 93 insertions(+), 302 deletions(-)
diff --git
a/api/applib/src/main/java/org/apache/causeway/applib/services/error/ErrorDetails.java
b/api/applib/src/main/java/org/apache/causeway/applib/services/error/ErrorDetails.java
index 092aa067914..59b99cbba09 100644
---
a/api/applib/src/main/java/org/apache/causeway/applib/services/error/ErrorDetails.java
+++
b/api/applib/src/main/java/org/apache/causeway/applib/services/error/ErrorDetails.java
@@ -20,50 +20,44 @@
import java.util.List;
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-
/**
* Details of the error (obtained from the thrown exception), passed as part
of the request to the
* {@link ErrorReportingService}.
* @implNote a class has been used here so that additional fields might be
added in the future.
- * @since 2.0 {@index}
+ * @since 2.0 revised for 4.0 {@index}
*/
-@Getter
-@AllArgsConstructor
-public class ErrorDetails {
-
+public record ErrorDetails(
/**
* The main message to be displayed to the end-user.
* <p>
* The service is responsible for translating this into the language of
the end-user (it can use
xref:refguide:applib-svc:LocaleProvider.adoc[`LocaleProvider`] if required).
*/
- private final String mainMessage;
+ String mainMessage,
/**
* Whether this message has already been recognized by an {@link
org.apache.causeway.applib.services.exceprecog.ExceptionRecognizer}
implementation.
* <p>
* Generally this converts potentially non-recoverable (fatal) exceptions
into recoverable exceptions (warnings) as well providing an alternative
mechanism for generating user-friendly error messages.
*/
- private final boolean recognized;
+ boolean recognized,
/**
* Whether the cause of the exception was due to a lack of privileges.
* <p>
* In such cases the UI restricts the information shown to the end-user,
to avoid leaking potentially sensitive information
*/
- private final boolean authorizationCause;
+ boolean authorizationCause,
/**
* The stack trace of the exception, including the trace of any exceptions
in the causal chain.
* <p>
* These technical details are hidden from the user and only shown for
non-recoverable exceptions.
*/
- private final List<String> stackTraceDetailListCombined;
+ List<String> stackTraceDetailListCombined,
/**
* The stack trace, broken out by exception cause.
*/
- private final List<List<String>> stackTraceDetailPerCause;
+ List<List<String>> stackTraceDetailPerCause) {
}
diff --git
a/viewers/commons/model/src/main/java/org/apache/causeway/viewer/commons/model/error/StackTraceDetail.java
b/viewers/commons/model/src/main/java/org/apache/causeway/viewer/commons/model/error/ErrorFormatter.java
similarity index 51%
rename from
viewers/commons/model/src/main/java/org/apache/causeway/viewer/commons/model/error/StackTraceDetail.java
rename to
viewers/commons/model/src/main/java/org/apache/causeway/viewer/commons/model/error/ErrorFormatter.java
index cc53c91ab84..a8eb080680d 100644
---
a/viewers/commons/model/src/main/java/org/apache/causeway/viewer/commons/model/error/StackTraceDetail.java
+++
b/viewers/commons/model/src/main/java/org/apache/causeway/viewer/commons/model/error/ErrorFormatter.java
@@ -18,30 +18,22 @@
*/
package org.apache.causeway.viewer.commons.model.error;
-import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Stream;
-public record StackTraceDetail(
- Type type,
- String line) implements Serializable {
+public interface ErrorFormatter {
- public enum Type {
- EXCEPTION_CLASS_NAME,
- EXCEPTION_MESSAGE,
- STACKTRACE_ELEMENT,
- LITERAL
+ default String formatClass(Class<? extends Throwable> errorClass) {
+ return errorClass.getName();
}
- public static StackTraceDetail exceptionClassName(final Throwable cause) {
- return new
StackTraceDetail(StackTraceDetail.Type.EXCEPTION_CLASS_NAME,
cause.getClass().getName());
+ default String formatMessage(String errorMessage) {
+ return errorMessage;
}
- public static StackTraceDetail exceptionMessage(final Throwable cause) {
- return new StackTraceDetail(StackTraceDetail.Type.EXCEPTION_MESSAGE,
cause.getMessage());
- }
-
- public static StackTraceDetail element(final StackTraceElement el) {
- var buf = new StringBuilder();
- buf.append(" ")
+ default String formatElement(StackTraceElement el) {
+ return new StringBuilder()
.append(el.getClassName())
.append("#")
.append(el.getMethodName())
@@ -49,17 +41,22 @@ public static StackTraceDetail element(final
StackTraceElement el) {
.append(el.getFileName())
.append(":")
.append(el.getLineNumber())
- .append(")\n");
-
- return new StackTraceDetail(StackTraceDetail.Type.STACKTRACE_ELEMENT,
buf.toString());
+ .append(")\n")
+ .toString();
}
- public static StackTraceDetail spacer() {
- return new StackTraceDetail(Type.LITERAL, "");
+ default List<String> chainJoiningLines() {
+ return List.of("", "caused By:", "");
}
- public static StackTraceDetail causedBy() {
- return new StackTraceDetail(Type.LITERAL, "Caused by:");
+ default List<String> toLines(Throwable cause) {
+ var lines = new ArrayList<String>();
+ lines.add(formatClass(cause.getClass()));
+ lines.add(formatMessage(cause.getMessage()));
+ Stream.of(cause.getStackTrace())
+ .map(this::formatElement)
+ .forEach(lines::add);
+ return lines;
}
-}
\ No newline at end of file
+}
diff --git
a/viewers/commons/model/src/main/java/org/apache/causeway/viewer/commons/model/error/ExceptionModel.java
b/viewers/commons/model/src/main/java/org/apache/causeway/viewer/commons/model/error/ExceptionModel.java
index f932d3d15b0..70209ff178f 100644
---
a/viewers/commons/model/src/main/java/org/apache/causeway/viewer/commons/model/error/ExceptionModel.java
+++
b/viewers/commons/model/src/main/java/org/apache/causeway/viewer/commons/model/error/ExceptionModel.java
@@ -19,9 +19,9 @@
package org.apache.causeway.viewer.commons.model.error;
import java.io.Serializable;
+import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
-import java.util.function.Function;
import org.apache.causeway.applib.exceptions.UnrecoverableException;
import org.apache.causeway.applib.services.error.ErrorDetails;
@@ -29,7 +29,6 @@
import org.apache.causeway.applib.services.error.Ticket;
import org.apache.causeway.applib.services.exceprecog.Recognition;
import org.apache.causeway.commons.internal.base._Casts;
-import org.apache.causeway.commons.internal.collections._Lists;
import org.apache.causeway.commons.internal.exceptions._Exceptions;
import org.apache.causeway.core.metamodel.context.MetaModelContext;
import org.apache.causeway.core.metamodel.spec.feature.ObjectMember;
@@ -43,8 +42,7 @@
public record ExceptionModel(
ExceptionType exceptionType,
String mainMessage,
- List<StackTraceDetail> stackTraceDetailList,
- List<List<StackTraceDetail>> stackTraceDetailLists) implements
Serializable {
+ List<Throwable> causalChain) implements Serializable {
private static final String MAIN_MESSAGE_IF_NOT_RECOGNIZED = "Sorry, an
unexpected error occurred.";
@@ -92,7 +90,7 @@ public static ExceptionModel create(
}
}
- return new ExceptionModel(exceptionType, mainMessage,
asStackTrace(ex), asStackTraces(ex));
+ return new ExceptionModel(exceptionType, mainMessage,
_Exceptions.getCausalChain(ex));
}
public boolean isRecognized() {
@@ -110,80 +108,43 @@ public boolean isAuthorizationException() {
return exceptionType==ExceptionType.AUTHORIZATION_EXCEPTION;
}
- public List<StackTraceDetail> getStackTrace() {
- return stackTraceDetailList;
+ public ErrorDetails asErrorDetails() {
+ return asErrorDetails(new ErrorFormatter() {});
}
- public List<List<StackTraceDetail>> getStackTraces() {
- return stackTraceDetailLists;
- }
-
- public ErrorDetails asErrorDetails(Function<StackTraceDetail, String>
formatter) {
- final boolean recognized = isRecognized();
- final boolean authorizationException = isAuthorizationException();
-
- final List<String> stackDetailList = stackTraceDetailList
- .stream()
- .map(formatter)
- .toList();
- final List<List<StackTraceDetail>> stackTraces = getStackTraces();
- final List<List<String>> stackDetailLists = _Lists.newArrayList();
- for (List<StackTraceDetail> trace : stackTraces) {
- stackDetailLists.add(trace.stream()
- .map(formatter)
+ public ErrorDetails asErrorDetails(ErrorFormatter formatter) {
+ return new ErrorDetails(
+ mainMessage,
+ isRecognized(),
+ isAuthorizationException(),
+ flatten(causalChain, formatter),
+ causalChain.stream()
+ .map(formatter::toLines)
.toList());
- }
-
- return new ErrorDetails(mainMessage, recognized,
authorizationException, stackDetailList, stackDetailLists);
}
// -- HELPER
- private static <T extends Exception> T causalChainOf(final Exception ex,
final Class<T> exType) {
- final List<Throwable> causalChain = _Exceptions.getCausalChain(ex);
- for (Throwable cause : causalChain) {
- if(exType.isAssignableFrom(cause.getClass())) {
- return _Casts.uncheckedCast(cause);
+ private List<String> flatten(List<Throwable> causalChain, ErrorFormatter
formatter) {
+ var lines = new ArrayList<String>();
+ int count = 0;
+ for(var throwable : causalChain) {
+ if(count>0) {
+ lines.addAll(formatter.chainJoiningLines());
}
+ lines.addAll(formatter.toLines(throwable));
+ count++;
}
- return null;
+ return lines;
}
- private static List<StackTraceDetail> asStackTrace(final Throwable ex) {
- List<StackTraceDetail> stackTrace = _Lists.newArrayList();
- List<Throwable> causalChain = _Exceptions.getCausalChain(ex);
- boolean firstTime = true;
- for(Throwable cause: causalChain) {
- if(!firstTime) {
- stackTrace.add(StackTraceDetail.spacer());
- stackTrace.add(StackTraceDetail.causedBy());
- stackTrace.add(StackTraceDetail.spacer());
- } else {
- firstTime = false;
+ private static <T extends Exception> T causalChainOf(final Exception ex,
final Class<T> exType) {
+ for (Throwable cause : _Exceptions.getCausalChain(ex)) {
+ if(exType.isAssignableFrom(cause.getClass())) {
+ return _Casts.uncheckedCast(cause);
}
- append(cause, stackTrace);
- }
- return stackTrace;
- }
-
- private static List<List<StackTraceDetail>> asStackTraces(final Throwable
ex) {
- List<List<StackTraceDetail>> stackTraces = _Lists.newArrayList();
-
- List<Throwable> causalChain = _Exceptions.getCausalChain(ex);
- for(Throwable cause: causalChain) {
- List<StackTraceDetail> stackTrace = _Lists.newArrayList();
- append(cause, stackTrace);
- stackTraces.add(stackTrace);
- }
- return stackTraces;
- }
-
- private static void append(final Throwable cause, final
List<StackTraceDetail> stackTrace) {
- stackTrace.add(StackTraceDetail.exceptionClassName(cause));
- stackTrace.add(StackTraceDetail.exceptionMessage(cause));
- for (StackTraceElement el : cause.getStackTrace()) {
- stackTrace.add(StackTraceDetail.element(el));
}
+ return null;
}
}
diff --git
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/errors/ExceptionStackTracePanel.css
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/errors/ExceptionStackTracePanel.css
deleted file mode 100644
index 521283c3199..00000000000
---
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/errors/ExceptionStackTracePanel.css
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
- .exceptionStackTracePanel .errorInfo {
- margin-left: 50px;
- margin-right: 50px;
- padding-top: 50px;
-}
-
-
-.exceptionStackTracePanel .mainMessage {
- background:#FFFFFF;
- border-radius:4px;
- -moz-border-radius:4px;
- -webkit-border-radius:4px;
- padding: 15px;
- display: block;
- text-align:center;
- font-size:1.2em;
-}
-
- .exceptionStackTracePanel .errorDetail {
- margin-top: 30px;
-}
-
-.exceptionStackTracePanel .heading {
- border-radius:4px;
- -moz-border-radius:4px;
- -webkit-border-radius:4px;
- background-color:#F0EFEA;
-
- display:block;
- font-style:normal !important;
-
- padding:1px 6px 1px 6px;
-}
-
-.exceptionStackTracePanel .heading span {
- display:block;
- font-style:normal !important;
- padding:3px 3px 3px 3px;
- font-size: 0.8em;
- font-weight:bold;
-}
-
-.exceptionStackTracePanel .heading:hover {
- background-color:#FFFFFF;
- cursor: pointer;
-}
-
-.exceptionStackTracePanel h3 {
- font-size: larger;
-}
-
-.exceptionStackTracePanel .exceptionMessage {
- margin-top: 30px;
-}
-
-.exceptionStackTracePanel .exceptionStackTrace .caused_by_label {
- margin-top: 30px;
- font-style:normal !important;
- font-size: 0.8em;
- font-weight:bold;
- color: #46423C;
-}
-
-.exceptionStackTracePanel .exceptionStackTrace .exception_class_name {
- margin-top: 15px;
- font-size: 1.2em;
- font-weight:bold;
- color: #46423C;
-}
-
-.exceptionStackTracePanel .exceptionStackTrace .exception_message {
- margin-top: 10px;
- margin-bottom: 10px;
- font-style: italic;
- font-size: 1.0em;
- color: #00477F;
-}
-
-.exceptionStackTracePanel .exceptionStackTrace .stacktrace_element{
- margin-left: 30px;
-}
-
\ No newline at end of file
diff --git
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/errors/ExceptionStackTracePanel.html
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/errors/ExceptionStackTracePanel.html
index 3d64fd42609..2c8fa4354ed 100644
---
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/errors/ExceptionStackTracePanel.html
+++
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/errors/ExceptionStackTracePanel.html
@@ -50,12 +50,8 @@ <h2 class="mainMessage">
</div>
<div class="content card-body">
<div class="exceptionStackTrace">
- <h3>Stack trace:</h3>
- <ul>
- <li wicket:id="stackTraceElement">
- <span
wicket:id="stackTraceElementLine">[stack trace element line]</span>
- </li>
- </ul>
+ <div wicket:id="stackTraceMarkup">
+ </div>
</div>
</div>
</div>
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 f754d61fbd3..dec85777403 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
@@ -18,8 +18,9 @@
*/
package org.apache.causeway.viewer.wicket.ui.errors;
+import java.util.stream.Stream;
+
import org.apache.wicket.AttributeModifier;
-import org.apache.wicket.MarkupContainer;
import org.apache.wicket.Page;
import org.apache.wicket.markup.ComponentTag;
import org.apache.wicket.markup.head.IHeaderResponse;
@@ -30,11 +31,12 @@
import org.apache.wicket.model.Model;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.request.resource.JavaScriptResourceReference;
+
import org.apache.causeway.applib.services.error.ErrorReportingService;
import org.apache.causeway.applib.services.error.Ticket;
+import org.apache.causeway.commons.functional.IndexedConsumer;
import org.apache.causeway.commons.functional.Try;
import org.apache.causeway.viewer.commons.model.error.ExceptionModel;
-import org.apache.causeway.viewer.commons.model.error.StackTraceDetail;
import org.apache.causeway.viewer.wicket.model.models.PageType;
import org.apache.causeway.viewer.wicket.model.models.UiObjectWkt;
import
org.apache.causeway.viewer.wicket.ui.components.widgets.breadcrumbs.BreadcrumbModel;
@@ -53,8 +55,7 @@ public class ExceptionStackTracePanel
private static final String ID_MAIN_MESSAGE = "mainMessage";
private static final String ID_EXCEPTION_DETAIL_DIV = "exceptionDetailDiv";
private static final String ID_TICKET_MARKUP = "ticketMarkup";
- private static final String ID_STACK_TRACE_ELEMENT = "stackTraceElement";
- private static final String ID_LINE = "stackTraceElementLine";
+ private static final String ID_STACKTRACE_MARKUP = "stackTraceMarkup";
private static final JavaScriptResourceReference DIV_TOGGLE_JS =
new JavaScriptResourceReference(ExceptionStackTracePanel.class,
"div-toggle.js");
@@ -85,7 +86,7 @@ public ExceptionStackTracePanel(
var ticketOptional = lookupService(ErrorReportingService.class)
.map(errorReportingService->
-
errorReportingService.reportError(exceptionModel.asErrorDetails(StackTraceDetail::line)));
+
errorReportingService.reportError(exceptionModel.asErrorDetails()));
var mainMessage = ticketOptional
.map(Ticket::getUserMessage)
@@ -111,18 +112,14 @@ public ExceptionStackTracePanel(
if(suppressExceptionDetail) {
WktComponents.permanentlyHide(this, ID_EXCEPTION_DETAIL_DIV);
} else {
- MarkupContainer container = new
WebMarkupContainer(ID_EXCEPTION_DETAIL_DIV) {
+ var container = Wkt.add(this, new
WebMarkupContainer(ID_EXCEPTION_DETAIL_DIV) {
private static final long serialVersionUID = 1L;
@Override
public void renderHead(final IHeaderResponse response) {
response.render(JavaScriptReferenceHeaderItem.forReference(DIV_TOGGLE_JS));
}
- };
- container.add(new StackTraceListView(
- ID_STACK_TRACE_ELEMENT,
- ExceptionStackTracePanel.ID_LINE,
- exceptionModel.getStackTrace()));
- add(container);
+ });
+ Wkt.markupAdd(container, ID_STACKTRACE_MARKUP,
convertToHtml(exceptionModel));
}
final BreadcrumbModelProvider session = (BreadcrumbModelProvider)
getSession();
@@ -147,4 +144,29 @@ public void renderHead(final IHeaderResponse response) {
add(link);
}
+ // -- HELPER
+
+ private static String convertToHtml(ExceptionModel exceptionModel) {
+ var html = new StringBuilder();
+ exceptionModel.causalChain().forEach(IndexedConsumer.zeroBased((i,
cause)->{
+ if(i>0) html.append("<hr>");
+ html.append("<div>%s<b>%s</b>: %s</div>".formatted(
+ i>0 ? "Caused by: " : "",
+ cause.getClass().getName(),
+
org.springframework.web.util.HtmlUtils.htmlEscape(cause.getMessage())));
+
+ Stream.of(cause.getStackTrace()).forEach(el->{
+ html.append("""
+ <div style="margin-left: 1rem">at %s#%s(%s:%d)</div>"""
+ .formatted(
+ el.getClassName(),
+ el.getMethodName(),
+ el.getFileName(),
+ el.getLineNumber()));
+ });
+
+ }));
+ return html.toString();
+ }
+
}
diff --git
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/errors/StackTraceListView.java
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/errors/StackTraceListView.java
deleted file mode 100644
index e29bbdf07fa..00000000000
---
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/errors/StackTraceListView.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.causeway.viewer.wicket.ui.errors;
-
-import java.util.List;
-
-import org.apache.wicket.behavior.AttributeAppender;
-import org.apache.wicket.markup.html.list.ListItem;
-import org.apache.wicket.markup.html.list.ListView;
-
-import org.apache.causeway.viewer.commons.model.error.StackTraceDetail;
-import org.apache.causeway.viewer.wicket.ui.util.Wkt;
-
-public final class StackTraceListView
-extends ListView<StackTraceDetail> {
-
- private static final long serialVersionUID = 1L;
- private final String idLine;
-
- public StackTraceListView(final String id, final String idLine,
- final
List<org.apache.causeway.viewer.commons.model.error.StackTraceDetail> list) {
- super(id, list);
- this.idLine = idLine;
- }
-
- @Override
- protected void populateItem(final ListItem<StackTraceDetail> item) {
- final StackTraceDetail detail = item.getModelObject();
- item.add(new AttributeAppender("class",
detail.type().name().toLowerCase()));
- Wkt.labelAdd(item, idLine, detail.line());
- }
-}
diff --git
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/pages/error/ErrorPage.css
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/pages/error/ErrorPage.css
deleted file mode 100644
index 5412494892a..00000000000
---
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/pages/error/ErrorPage.css
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-
-
diff --git
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/pages/error/ErrorPage.java
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/pages/error/ErrorPage.java
index 841e1908a62..0399e050f0e 100644
---
a/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/pages/error/ErrorPage.java
+++
b/viewers/wicket/ui/src/main/java/org/apache/causeway/viewer/wicket/ui/pages/error/ErrorPage.java
@@ -18,14 +18,10 @@
*/
package org.apache.causeway.viewer.wicket.ui.pages.error;
-import java.util.List;
-
import
org.apache.wicket.authroles.authorization.strategies.role.annotations.AuthorizeInstantiation;
import org.apache.causeway.applib.services.user.UserMemento;
-import org.apache.causeway.commons.internal.collections._Lists;
import org.apache.causeway.viewer.commons.model.error.ExceptionModel;
-import org.apache.causeway.viewer.commons.model.error.StackTraceDetail;
import org.apache.causeway.viewer.wicket.model.util.PageParameterUtils;
import org.apache.causeway.viewer.wicket.ui.errors.ExceptionStackTracePanel;
import org.apache.causeway.viewer.wicket.ui.pages.PageAbstract;
@@ -49,11 +45,6 @@ public ErrorPage(final ExceptionModel exceptionModel) {
var pageClassRegistry =
super.getServiceRegistry().lookupServiceElseFail(PageClassRegistry.class);
themeDiv.add(new ExceptionStackTracePanel(pageClassRegistry,
ID_EXCEPTION_STACK_TRACE, exceptionModel));
-
- }
-
- protected List<String> transform(final List<StackTraceDetail> stackTrace) {
- return _Lists.map(stackTrace, StackTraceDetail::line);
}
}