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/isis.git
The following commit(s) were added to refs/heads/master by this push: new 7f91912 ISIS-1955: replaces render template for tickets by programmatic markup assembly 7f91912 is described below commit 7f919124e4f42a20d8b82e3ac8f2580a591e7916 Author: Andi Huber <ahu...@apache.org> AuthorDate: Mon May 28 11:53:40 2018 +0200 ISIS-1955: replaces render template for tickets by programmatic markup assembly also makes Ticket an interface Task-Url: https://issues.apache.org/jira/browse/ISIS-1955 --- .../error/{Ticket.java => SimpleTicket.java} | 70 +++++++++------------- .../apache/isis/applib/services/error/Ticket.java | 70 +++------------------- .../components/scalars/markup/MarkupComponent.java | 28 ++++++--- .../viewer/wicket/ui/errors/ExceptionModel.java | 4 +- .../wicket/ui/errors/ExceptionStackTracePanel.html | 8 +-- .../wicket/ui/errors/ExceptionStackTracePanel.java | 57 +++++++----------- 6 files changed, 79 insertions(+), 158 deletions(-) diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/error/Ticket.java b/core/applib/src/main/java/org/apache/isis/applib/services/error/SimpleTicket.java similarity index 68% copy from core/applib/src/main/java/org/apache/isis/applib/services/error/Ticket.java copy to core/applib/src/main/java/org/apache/isis/applib/services/error/SimpleTicket.java index dbbddd3..dc46358 100644 --- a/core/applib/src/main/java/org/apache/isis/applib/services/error/Ticket.java +++ b/core/applib/src/main/java/org/apache/isis/applib/services/error/SimpleTicket.java @@ -20,6 +20,8 @@ package org.apache.isis.applib.services.error; import java.io.Serializable; +import org.apache.isis.commons.internal.base._NullSafe; + /** * Response from the {@link ErrorReportingService}, containing information to show to the end-user. * @@ -31,7 +33,7 @@ import java.io.Serializable; * </ul> * </p> */ -public class Ticket implements Serializable { +public class SimpleTicket implements Ticket { private static final long serialVersionUID = 4900947111894407314L; @@ -41,16 +43,11 @@ public class Ticket implements Serializable { private final StackTracePolicy stackTracePolicy; private final String kittenUrl; - public enum StackTracePolicy { - SHOW, - HIDE - } - - public Ticket(final String reference, final String userMessage, final String details) { + public SimpleTicket(final String reference, final String userMessage, final String details) { this(reference, userMessage, details, StackTracePolicy.HIDE); } - public Ticket( + public SimpleTicket( final String reference, final String userMessage, final String details, @@ -58,7 +55,7 @@ public class Ticket implements Serializable { this(reference, userMessage, details, stackTracePolicy, null); } - public Ticket( + public SimpleTicket( final String reference, final String userMessage, final String details, @@ -66,7 +63,7 @@ public class Ticket implements Serializable { this(reference, userMessage, details, StackTracePolicy.HIDE, kittenUrl); } - public Ticket( + public SimpleTicket( final String reference, final String userMessage, final String details, @@ -79,49 +76,22 @@ public class Ticket implements Serializable { this.kittenUrl = kittenUrl; } - /** - * A unique identifier that the end-user can use to track any follow-up from this error. - * - * <p> - * For example, an implementation might automatically log an issue in a bug tracking system such as JIRA, in - * which case the {@link #getReference() reference} would be the JIRA issue number <tt>XXX-1234</tt>. - * </p> - */ + @Override public String getReference() { return reference; } - /** - * Message to display to the user. - * - * <p> - * Typically this message should be short, one line long. - * </p> - */ + @Override public String getUserMessage() { return userMessage; } - /** - * Optional additional details to show to the end-user. - * - * <p> - * For example, these might include text on how to recover from the error, or workarounds, or just further - * details on contacting the help desk if the issue is severe and requires immediate attention. - * </p> - */ + @Override public String getDetails() { return details; } - /** - * Whether the stack trace for the exception should be displayed or be hidden. - * - * <p> - * The default is to hide it on the basis that the reporting service will have reported the stack trace to - * the support team, meaning there's no need to expose this info to the end-user. - * </p> - */ + @Override public StackTracePolicy getStackTracePolicy() { return stackTracePolicy; } @@ -136,4 +106,22 @@ public class Ticket implements Serializable { public String getKittenUrl() { return kittenUrl; } + + @Override + public String getMarkup() { + + return + "<p>" + + " <h3>" + getDetails() + "</h3>" + + (_NullSafe.isEmpty(getKittenUrl()) ? "" : "<img src=\"" + getKittenUrl() + "\"></img>") + + "</p>" + + (_NullSafe.isEmpty(getReference()) ? "" : + "<p><h4>Please quote reference: <span>" + getReference() + "</span></h4></p>") + ; + + } + + + + } diff --git a/core/applib/src/main/java/org/apache/isis/applib/services/error/Ticket.java b/core/applib/src/main/java/org/apache/isis/applib/services/error/Ticket.java index dbbddd3..23f6c78 100644 --- a/core/applib/src/main/java/org/apache/isis/applib/services/error/Ticket.java +++ b/core/applib/src/main/java/org/apache/isis/applib/services/error/Ticket.java @@ -31,54 +31,13 @@ import java.io.Serializable; * </ul> * </p> */ -public class Ticket implements Serializable { - - private static final long serialVersionUID = 4900947111894407314L; - - private final String reference; - private final String userMessage; - private final String details; - private final StackTracePolicy stackTracePolicy; - private final String kittenUrl; +public interface Ticket extends Serializable { public enum StackTracePolicy { SHOW, HIDE } - public Ticket(final String reference, final String userMessage, final String details) { - this(reference, userMessage, details, StackTracePolicy.HIDE); - } - - public Ticket( - final String reference, - final String userMessage, - final String details, - final StackTracePolicy stackTracePolicy) { - this(reference, userMessage, details, stackTracePolicy, null); - } - - public Ticket( - final String reference, - final String userMessage, - final String details, - final String kittenUrl) { - this(reference, userMessage, details, StackTracePolicy.HIDE, kittenUrl); - } - - public Ticket( - final String reference, - final String userMessage, - final String details, - final StackTracePolicy stackTracePolicy, - final String kittenUrl) { - this.reference = reference; - this.userMessage = userMessage; - this.details = details; - this.stackTracePolicy = stackTracePolicy; - this.kittenUrl = kittenUrl; - } - /** * A unique identifier that the end-user can use to track any follow-up from this error. * @@ -87,9 +46,7 @@ public class Ticket implements Serializable { * which case the {@link #getReference() reference} would be the JIRA issue number <tt>XXX-1234</tt>. * </p> */ - public String getReference() { - return reference; - } + public String getReference(); /** * Message to display to the user. @@ -98,9 +55,7 @@ public class Ticket implements Serializable { * Typically this message should be short, one line long. * </p> */ - public String getUserMessage() { - return userMessage; - } + public String getUserMessage(); /** * Optional additional details to show to the end-user. @@ -110,9 +65,7 @@ public class Ticket implements Serializable { * details on contacting the help desk if the issue is severe and requires immediate attention. * </p> */ - public String getDetails() { - return details; - } + public String getDetails(); /** * Whether the stack trace for the exception should be displayed or be hidden. @@ -122,18 +75,11 @@ public class Ticket implements Serializable { * the support team, meaning there's no need to expose this info to the end-user. * </p> */ - public StackTracePolicy getStackTracePolicy() { - return stackTracePolicy; - } + public StackTracePolicy getStackTracePolicy(); + /** - * If specified, is the external URL of an image to display to the end user. - * - * <p> - * Not necessarily of a kitten, but something by way of an apology. - * </p> + * Returns a Html representation of this ticket. */ - public String getKittenUrl() { - return kittenUrl; - } + public String getMarkup(); } diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/markup/MarkupComponent.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/markup/MarkupComponent.java index 31ab585..0716d22 100644 --- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/markup/MarkupComponent.java +++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/markup/MarkupComponent.java @@ -37,8 +37,7 @@ public class MarkupComponent extends WebComponent { @Override public void onComponentTagBody(final MarkupStream markupStream, final ComponentTag openTag){ - final ObjectAdapter objAdapter = (ObjectAdapter) getDefaultModelObject(); - replaceComponentTagBody(markupStream, openTag, extractHtmlOrElse(objAdapter, "")); + replaceComponentTagBody(markupStream, openTag, extractHtmlOrElse(getDefaultModelObject(), "")); } @Override @@ -49,17 +48,28 @@ public class MarkupComponent extends WebComponent { // -- HELPER - private CharSequence extractHtmlOrElse(ObjectAdapter objAdapter, final String fallback) { + private CharSequence extractHtmlOrElse(Object modelObject, final String fallback) { - if(objAdapter==null || objAdapter.getObject()==null) + if(modelObject==null) { return fallback; + } - final Object value = objAdapter.getObject(); + if(modelObject instanceof ObjectAdapter) { + + final ObjectAdapter objAdapter = (ObjectAdapter) modelObject; + + if(objAdapter.getObject()==null) + return fallback; + + final Object value = objAdapter.getObject(); + + if(!(value instanceof Markup)) + return fallback; + + return ((Markup)value).asString(); + } - if(!(value instanceof Markup)) - return fallback; - - return ((Markup)value).asString(); + return modelObject.toString(); } } 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 3e14faa..561a514 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 @@ -28,6 +28,7 @@ import com.google.common.collect.Lists; import org.apache.isis.applib.NonRecoverableException; import org.apache.isis.applib.services.error.ErrorReportingService; import org.apache.isis.applib.services.error.Ticket; +import org.apache.isis.commons.internal.base._Casts; import org.apache.isis.core.metamodel.spec.feature.ObjectMember; import org.apache.isis.viewer.wicket.model.models.ModelAbstract; @@ -90,7 +91,7 @@ public class ExceptionModel extends ModelAbstract<List<StackTraceDetail>> { final List<Throwable> causalChain = Throwables.getCausalChain(ex); for (Throwable cause : causalChain) { if(exType.isAssignableFrom(cause.getClass())) { - return (T)cause; + return _Casts.uncheckedCast(cause); } } return null; @@ -162,7 +163,6 @@ public class ExceptionModel extends ModelAbstract<List<StackTraceDetail>> { 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); diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/errors/ExceptionStackTracePanel.html b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/errors/ExceptionStackTracePanel.html index 3b75912..37b27ea 100644 --- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/errors/ExceptionStackTracePanel.html +++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/errors/ExceptionStackTracePanel.html @@ -33,13 +33,7 @@ <span wicket:id="mainMessage">[main message text]</span> </h2> </div> - <div class="panel-body" wicket:id="ticketDetailsDiv"> - <h3 wicket:id="ticketDetails">[ticket details]</h3> - <img wicket:id="kittens"></img> - </div> - <div class="panel-body" wicket:id="ticketReferenceDiv"> - <h4>Please quote reference: <span wicket:id="ticketReference">[ticket reference]</span></h4> - </div> + <div class="panel-body" wicket:id="ticketMarkup">[ticket details]</div> <div class="panel-body"> <div class="form-group"> <button type="submit" wicket:id="continueButton" class="btn btn-primary">Continue</button> diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/errors/ExceptionStackTracePanel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/errors/ExceptionStackTracePanel.java index 2e5d1de..28b6df3 100644 --- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/errors/ExceptionStackTracePanel.java +++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/errors/ExceptionStackTracePanel.java @@ -19,6 +19,16 @@ package org.apache.isis.viewer.wicket.ui.errors; +import org.apache.isis.applib.services.error.Ticket; +import org.apache.isis.viewer.wicket.model.models.EntityModel; +import org.apache.isis.viewer.wicket.model.models.PageType; +import org.apache.isis.viewer.wicket.ui.components.scalars.markup.MarkupComponent; +import org.apache.isis.viewer.wicket.ui.components.widgets.breadcrumbs.BreadcrumbModel; +import org.apache.isis.viewer.wicket.ui.components.widgets.breadcrumbs.BreadcrumbModelProvider; +import org.apache.isis.viewer.wicket.ui.pages.PageClassRegistry; +import org.apache.isis.viewer.wicket.ui.pages.home.HomePage; +import org.apache.isis.viewer.wicket.ui.util.Components; +import org.apache.isis.viewer.wicket.ui.util.Links; import org.apache.wicket.AttributeModifier; import org.apache.wicket.MarkupContainer; import org.apache.wicket.Page; @@ -28,47 +38,33 @@ import org.apache.wicket.markup.head.JavaScriptReferenceHeaderItem; import org.apache.wicket.markup.html.WebComponent; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.basic.Label; -import org.apache.wicket.markup.html.basic.MultiLineLabel; import org.apache.wicket.markup.html.link.AbstractLink; import org.apache.wicket.markup.html.panel.Panel; import org.apache.wicket.model.Model; import org.apache.wicket.request.mapper.parameter.PageParameters; import org.apache.wicket.request.resource.JavaScriptResourceReference; -import org.apache.isis.applib.services.error.Ticket; -import org.apache.isis.viewer.wicket.model.models.EntityModel; -import org.apache.isis.viewer.wicket.model.models.PageType; -import org.apache.isis.viewer.wicket.ui.components.widgets.breadcrumbs.BreadcrumbModel; -import org.apache.isis.viewer.wicket.ui.components.widgets.breadcrumbs.BreadcrumbModelProvider; -import org.apache.isis.viewer.wicket.ui.pages.PageClassRegistry; -import org.apache.isis.viewer.wicket.ui.pages.home.HomePage; -import org.apache.isis.viewer.wicket.ui.util.Components; -import org.apache.isis.viewer.wicket.ui.util.Links; - public class ExceptionStackTracePanel extends Panel { private static final long serialVersionUID = 1L; private static final String ID_MAIN_MESSAGE = "mainMessage"; - private static final String ID_TICKET_DETAILS_DIV = "ticketDetailsDiv"; - private static final String ID_TICKET_DETAILS = "ticketDetails"; - - private static final String ID_TICKET_REFERENCE_DIV = "ticketReferenceDiv"; - private static final String ID_TICKET_REFERENCE = "ticketReference"; - 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 JavaScriptResourceReference DIV_TOGGLE_JS = new JavaScriptResourceReference(ExceptionStackTracePanel.class, "div-toggle.js"); - private static final String ID_KITTENS_IMAGE = "kittens"; public class ExternalImageUrl extends WebComponent { - public ExternalImageUrl(String id, String imageUrl) { + private static final long serialVersionUID = -3556235292216447710L; + + public ExternalImageUrl(String id, String imageUrl) { super(id); add(new AttributeModifier("src", new Model<>(imageUrl))); setVisible(!(imageUrl==null || imageUrl.equals(""))); @@ -96,25 +92,12 @@ public class ExceptionStackTracePanel extends Panel { // label.setEscapeModelStrings(false); add(label); - final String ticketDetail = ticket != null ? ticket.getDetails(): null; - if(ticketDetail == null) { - Components.permanentlyHide(this, ID_TICKET_DETAILS_DIV); - } else { - final WebMarkupContainer panel = new WebMarkupContainer(ID_TICKET_DETAILS_DIV); - final MultiLineLabel details = new MultiLineLabel(ID_TICKET_DETAILS, Model.of(ticketDetail)); - panel.add(details); - panel.add(new ExternalImageUrl(ID_KITTENS_IMAGE, ticket.getKittenUrl())); - add(panel); - } - - final String ticketReference = ticket != null ? ticket.getReference(): null; - if(ticketReference == null) { - Components.permanentlyHide(this, ID_TICKET_REFERENCE_DIV); + + final String ticketMarkup = ticket != null ? ticket.getMarkup(): null; + if(ticketMarkup == null) { + Components.permanentlyHide(this, ID_TICKET_MARKUP); } else { - final WebMarkupContainer panel = new WebMarkupContainer(ID_TICKET_REFERENCE_DIV); - final Label reference = new Label(ID_TICKET_REFERENCE, Model.of(ticketReference)); - panel.add(reference); - add(panel); + add(new MarkupComponent(ID_TICKET_MARKUP, Model.of(ticket.getMarkup()))); } final boolean suppressExceptionDetail = -- To stop receiving notification emails like this one, please contact ahu...@apache.org.