You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2017/12/15 17:36:30 UTC

[isis] 04/04: ISIS-1796: extends the error details

This is an automated email from the ASF dual-hosted git repository.

danhaywood pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git

commit 5fd91143d1e69bdb772742e27de3e130815552ad
Author: Dan Haywood <da...@haywood-associates.co.uk>
AuthorDate: Fri Dec 15 17:33:32 2017 +0000

    ISIS-1796: extends the error details
---
 .../isis/applib/services/error/ErrorDetails.java   | 25 +++++++++++++++----
 .../viewer/wicket/ui/errors/ExceptionModel.java    | 28 ++++++++++++++++++----
 .../viewer/wicket/ui/pages/error/ErrorPage.java    | 24 +++++++++++++------
 3 files changed, 61 insertions(+), 16 deletions(-)

diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/error/ErrorDetails.java b/core/applib/src/main/java/org/apache/isis/applib/services/error/ErrorDetails.java
index 2ce4211..9acfcc3 100644
--- a/core/applib/src/main/java/org/apache/isis/applib/services/error/ErrorDetails.java
+++ b/core/applib/src/main/java/org/apache/isis/applib/services/error/ErrorDetails.java
@@ -33,17 +33,20 @@ public class ErrorDetails {
     private final String mainMessage;
     private final boolean recognized;
     private final boolean authorizationCause;
-    private final List<String> stackTraceDetailList;
+    private final List<String> stackTraceDetailListCombined;
+    private final List<List<String>> stackDetailListPerCause;
 
     public ErrorDetails(
             final String mainMessage,
             final boolean recognized,
             final boolean authorizationCause,
-            final List<String> stackTraceDetailList) {
+            final List<String> stackTraceDetailListCombined,
+            final List<List<String>> stackDetailListPerCause) {
         this.mainMessage = mainMessage;
         this.recognized = recognized;
         this.authorizationCause = authorizationCause;
-        this.stackTraceDetailList = stackTraceDetailList;
+        this.stackTraceDetailListCombined = stackTraceDetailListCombined;
+        this.stackDetailListPerCause = stackDetailListPerCause;
     }
 
     public String getMainMessage() {
@@ -58,8 +61,22 @@ public class ErrorDetails {
         return authorizationCause;
     }
 
+    /**
+     * @deprecated  - renamed to {@link #getStackTraceDetailCombined()}.
+     */
+    @Deprecated
     public List<String> getStackTraceDetailList() {
-        return stackTraceDetailList;
+        return stackTraceDetailListCombined;
     }
 
+    public List<String> getStackTraceDetailCombined() {
+        return stackTraceDetailListCombined;
+    }
+
+    /**
+     * One per exception cause.
+     */
+    public List<List<String>> getStackTraceDetailPerCause() {
+        return stackDetailListPerCause;
+    }
 }
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/errors/ExceptionModel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/errors/ExceptionModel.java
index e4e620f..3e14faa 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/errors/ExceptionModel.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/errors/ExceptionModel.java
@@ -38,6 +38,7 @@ public class ExceptionModel extends ModelAbstract<List<StackTraceDetail>> {
     private static final String MAIN_MESSAGE_IF_NOT_RECOGNIZED = "Sorry, an unexpected error occurred.";
     
     private List<StackTraceDetail> stackTraceDetailList;
+    private List<List<StackTraceDetail>> stackTraceDetailLists;
     private boolean recognized;
     private boolean authorizationCause;
 
@@ -75,6 +76,7 @@ public class ExceptionModel extends ModelAbstract<List<StackTraceDetail>> {
             }
         }
         stackTraceDetailList = asStackTrace(ex);
+        stackTraceDetailLists = asStackTraces(ex);
     }
 
 
@@ -135,6 +137,9 @@ public class ExceptionModel extends ModelAbstract<List<StackTraceDetail>> {
     public List<StackTraceDetail> getStackTrace() {
         return stackTraceDetailList;
     }
+    public List<List<StackTraceDetail>> getStackTraces() {
+        return stackTraceDetailLists;
+    }
 
     private static List<StackTraceDetail> asStackTrace(Throwable ex) {
         List<StackTraceDetail> stackTrace = Lists.newArrayList();
@@ -148,15 +153,28 @@ public class ExceptionModel extends ModelAbstract<List<StackTraceDetail>> {
             } else {
                 firstTime = false;
             }
-            stackTrace.add(StackTraceDetail.exceptionClassName(cause));
-            stackTrace.add(StackTraceDetail.exceptionMessage(cause));
-            addStackTraceElements(cause, stackTrace);
+            append(cause, stackTrace);
         }
         return stackTrace;
     }
 
-    private static void addStackTraceElements(Throwable ex, List<StackTraceDetail> stackTrace) {
-        for (StackTraceElement el : ex.getStackTrace()) {
+    private static List<List<StackTraceDetail>> asStackTraces(Throwable ex) {
+        List<List<StackTraceDetail>> stackTraces = Lists.newArrayList();
+
+        List<Throwable> causalChain = Throwables.getCausalChain(ex);
+        boolean firstTime = true;
+        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));
         }
     }
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/error/ErrorPage.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/error/ErrorPage.java
index 6824c8b..e5c2973 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/error/ErrorPage.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/error/ErrorPage.java
@@ -62,14 +62,16 @@ public class ErrorPage extends PageAbstract {
             final boolean authorizationException = exceptionModel.isAuthorizationException();
 
             final List<StackTraceDetail> stackTrace = exceptionModel.getStackTrace();
-            final List<String> stackDetails = Lists.transform(stackTrace, new Function<StackTraceDetail, String>() {
-                @Nullable @Override public String apply(final StackTraceDetail stackTraceDetail) {
-                    return stackTraceDetail.getLine();
-                }
-            });
+            final List<String> stackDetailList = transform(stackTrace);
 
-            final ErrorDetails errorDetails = new ErrorDetails(mainMessage, recognized, authorizationException,
-                    stackDetails);
+            final List<List<StackTraceDetail>> stackTraces = exceptionModel.getStackTraces();
+            final List<List<String>> stackDetailLists = Lists.newArrayList();
+            for (List<StackTraceDetail> trace : stackTraces) {
+                stackDetailLists.add(transform(trace));
+            }
+
+            final ErrorDetails errorDetails =
+                    new ErrorDetails(mainMessage, recognized, authorizationException, stackDetailList, stackDetailLists);
 
             final Ticket ticket = errorReportingService.reportError(errorDetails);
 
@@ -83,4 +85,12 @@ public class ErrorPage extends PageAbstract {
 
     }
 
+    protected List<String> transform(final List<StackTraceDetail> stackTrace) {
+        return Lists.transform(stackTrace, new Function<StackTraceDetail, String>() {
+                    @Nullable @Override public String apply(final StackTraceDetail stackTraceDetail) {
+                        return stackTraceDetail.getLine();
+                    }
+                });
+    }
+
 }

-- 
To stop receiving notification emails like this one, please contact
"commits@isis.apache.org" <co...@isis.apache.org>.