modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/CoreGUI.gwt.xml | 11 -- modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/UserSessionManager.java | 22 ++-- modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleUploadDataStep.java | 3 modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/GWTServiceLookup.java | 21 +++- modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/ErrorHandler.java | 41 ++++++++- modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/message/Message.java | 45 ++++++---- modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/AbstractGWTServiceImpl.java | 30 +++++- modules/enterprise/gui/coregui/src/main/webapp/CoreGUI.css | 6 - 8 files changed, 133 insertions(+), 46 deletions(-)
New commits: commit 297cc733d3b5567a444131892c4766d6852fa80e Author: Joseph Marques joseph@redhat.com Date: Tue Oct 5 01:22:58 2010 -0400
add todos for future infrastructure work
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/GWTServiceLookup.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/GWTServiceLookup.java index a779117..d0760d2 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/GWTServiceLookup.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/GWTServiceLookup.java @@ -139,9 +139,15 @@ public class GWTServiceLookup {
public static class SessionRpcRequestBuilder extends RpcRequestBuilder {
+ private static int RPC_TIMEOUT = 10000; + @Override - protected void doFinish(RequestBuilder rb) { - super.doFinish(rb); + protected RequestBuilder doCreate(String serviceEntryPoint) { + RequestBuilder rb = super.doCreate(serviceEntryPoint); + + // TODO: alter callback handlers to capture timeout failure and retry (at least once) + // to add resilience to gwt service calls + rb.setTimeoutMillis(RPC_TIMEOUT);
// TODO Don't use the expensive determineName except in dev mode rb.setCallback(new MonitoringRequestCallback(determineName(), rb.getCallback())); @@ -155,6 +161,8 @@ public class GWTServiceLookup { .error("SessionRpcRequestBuilder constructed without a value for " + UserSessionManager.SESSION_NAME); } + + return rb; }
public String determineName() { diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/AbstractGWTServiceImpl.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/AbstractGWTServiceImpl.java index c9da68a..364140f 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/AbstractGWTServiceImpl.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/AbstractGWTServiceImpl.java @@ -19,6 +19,7 @@ package org.rhq.enterprise.gui.coregui.server.gwt;
import java.io.IOException; +import java.util.Enumeration;
import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; @@ -49,6 +50,9 @@ public abstract class AbstractGWTServiceImpl extends RemoteServiceServlet {
@Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + if (Log.isTraceEnabled()) { + printHeaders(req); + } String sid = req.getHeader(UserSessionManager.SESSION_NAME); if (sid != null) { SubjectManagerLocal subjectManager = LookupUtil.getSubjectManager(); @@ -62,8 +66,22 @@ public abstract class AbstractGWTServiceImpl extends RemoteServiceServlet { Log.error("Failed to validate request: sessionId missing, requestURL=" + req.getRequestURL()); }
+ // TODO: only execute this if the session lookup was successful, otherwise fail in some deterministic fashion + // alter callback handlers to capture expected failure and retry (at least once) + // to add resilience to gwt service calls long id = HibernatePerformanceMonitor.get().start(); super.service(req, resp); HibernatePerformanceMonitor.get().stop(id, "GWT Service Request"); } + + @SuppressWarnings("unchecked") + private void printHeaders(HttpServletRequest req) { + // TODO: figure out why SESSION_NAME header and other GWT-specific headers are missing occasionally + // seems to only happen on polling for recent alerts when there is no user activity for a few minutes + Enumeration<String> headerNames = req.getHeaderNames(); + Log.trace(req.getRequestURL().toString()); + while (headerNames.hasMoreElements()) { + Log.trace(" " + headerNames.nextElement()); + } + } }
commit 83c0317378f20d3a9aa1bf92bcf645a771a41e84 Author: Joseph Marques joseph@redhat.com Date: Mon Oct 4 23:29:01 2010 -0400
fix z-index so log_DivLogger can be used if developers so choose
diff --git a/modules/enterprise/gui/coregui/src/main/webapp/CoreGUI.css b/modules/enterprise/gui/coregui/src/main/webapp/CoreGUI.css index 85d1b83..54cc3a9 100644 --- a/modules/enterprise/gui/coregui/src/main/webapp/CoreGUI.css +++ b/modules/enterprise/gui/coregui/src/main/webapp/CoreGUI.css @@ -317,11 +317,9 @@ a:hover { -moz-box-sizing: border-box; overflow: hidden; cursor: auto; - z-index: 9999999; }
.gwtMenu, .gwt-MenuBarPopup, .gwt-MenuPopup { - z-index: 9999999; background-color: white; }
@@ -387,3 +385,7 @@ a:hover { background-color: #FF6666; /* slightly darker light red */ border-color: #EE1111; /* slightly darker medium red */ } + +.log-panel { + z-index: 9999999 !important; +}
commit 84ae15fae55dbaf217217cb4bb1c0edc58c4c907 Author: Joseph Marques joseph@redhat.com Date: Mon Oct 4 17:41:07 2010 -0400
better logging around request-response workflow and user session management
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/UserSessionManager.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/UserSessionManager.java index ecbd719..65faa6d 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/UserSessionManager.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/UserSessionManager.java @@ -56,7 +56,7 @@ import org.rhq.enterprise.gui.coregui.client.util.preferences.UserPreferences; public class UserSessionManager {
private static int SESSION_TIMEOUT = 29 * 60 * 1000; // 29 mins, just shorter than the 30-min web session timeout - private static int LOGOUT_DELAY = 15 * 1000; // wait 15 seconds for in-flight requests to complete before logout + private static int LOGOUT_DELAY = 5 * 1000; // wait 5 seconds for in-flight requests to complete before logout
public static final String SESSION_NAME = "RHQ_Sesssion"; private static Subject sessionSubject; @@ -88,7 +88,7 @@ public class UserSessionManager { try { b.setCallback(new RequestCallback() { public void onResponseReceived(final Request request, final Response response) { - com.allen_sauer.gwt.log.client.Log.info("response text = " + response.getText()); + Log.info("response text = " + response.getText()); String sessionIdString = response.getText(); if (sessionIdString != null && sessionIdString.length() > 0) {
@@ -96,20 +96,20 @@ public class UserSessionManager { final int subjectId = Integer.parseInt(parts[0]); final String sessionId = parts[1]; // not null final long lastAccess = Long.parseLong(parts[2]); - com.allen_sauer.gwt.log.client.Log.info("sessionAccess-subjectId: " + subjectId); - com.allen_sauer.gwt.log.client.Log.info("sessionAccess-sessionId: " + sessionId); - com.allen_sauer.gwt.log.client.Log.info("sessionAccess-lastAccess: " + lastAccess); + Log.info("sessionAccess-subjectId: " + subjectId); + Log.info("sessionAccess-sessionId: " + sessionId); + Log.info("sessionAccess-lastAccess: " + lastAccess);
String previousSessionId = getPreviousSessionId(); // may be null - com.allen_sauer.gwt.log.client.Log.info("sessionAccess-previousSessionId: " + previousSessionId); + Log.info("sessionAccess-previousSessionId: " + previousSessionId); if (previousSessionId == null || previousSessionId.equals(sessionId) == false) {
// persist sessionId if different from previously saved sessionId - com.allen_sauer.gwt.log.client.Log.info("sessionAccess-savingSessionId: " + sessionId); + Log.info("sessionAccess-savingSessionId: " + sessionId); saveSessionId(sessionId);
// new sessions get the full 29 minutes to expire - com.allen_sauer.gwt.log.client.Log.info("sessionAccess-schedulingSessionTimeout: " + SESSION_TIMEOUT); + Log.info("sessionAccess-schedulingSessionTimeout: " + SESSION_TIMEOUT); sessionTimer.schedule(SESSION_TIMEOUT); } else {
@@ -124,7 +124,7 @@ public class UserSessionManager { expiryMillis = SESSION_TIMEOUT; // guarantees maximum is 29 minutes }
- com.allen_sauer.gwt.log.client.Log.info("sessionAccess-reschedulingSessionTimeout: " + expiryMillis); + Log.info("sessionAccess-reschedulingSessionTimeout: " + expiryMillis); sessionTimer.schedule((int) expiryMillis); }
@@ -143,7 +143,7 @@ public class UserSessionManager { public void onFailure(Throwable caught) { CoreGUI.getErrorHandler().handleError( "UserSessionManager: Failed to load user's subject", caught); - com.allen_sauer.gwt.log.client.Log.info("Failed to load user's subject"); + Log.info("Failed to load user's subject"); new LoginView().showLoginDialog(); }
@@ -260,10 +260,12 @@ public class UserSessionManager {
public static String getSessionId() { if (sessionSubject == null) { + Log.error("UserSessionManager: sessionSubject is null"); return null; } Integer sessionId = sessionSubject.getSessionId(); if (sessionId == null) { + Log.error("UserSessionManager: sessionId is null"); return null; } return sessionId.toString(); diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/GWTServiceLookup.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/GWTServiceLookup.java index 4a9c639..a779117 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/GWTServiceLookup.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/gwt/GWTServiceLookup.java @@ -18,6 +18,7 @@ */ package org.rhq.enterprise.gui.coregui.client.gwt;
+import com.allen_sauer.gwt.log.client.Log; import com.google.gwt.http.client.RequestBuilder; import com.google.gwt.user.client.rpc.RpcRequestBuilder; import com.google.gwt.user.client.rpc.ServiceDefTarget; @@ -139,11 +140,6 @@ public class GWTServiceLookup { public static class SessionRpcRequestBuilder extends RpcRequestBuilder {
@Override - protected void doSetRequestData(RequestBuilder rb, String data) { - super.doSetRequestData(rb, data); // TODO: Implement this method. - } - - @Override protected void doFinish(RequestBuilder rb) { super.doFinish(rb);
@@ -152,7 +148,12 @@ public class GWTServiceLookup {
String sessionId = UserSessionManager.getSessionId(); if (sessionId != null) { + Log.info("SessionRpcRequestBuilder is adding sessionId to request: " + sessionId); rb.setHeader(UserSessionManager.SESSION_NAME, sessionId); + } else { + Log + .error("SessionRpcRequestBuilder constructed without a value for " + + UserSessionManager.SESSION_NAME); } }
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/AbstractGWTServiceImpl.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/AbstractGWTServiceImpl.java index ae1e85b..c9da68a 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/AbstractGWTServiceImpl.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/server/gwt/AbstractGWTServiceImpl.java @@ -24,6 +24,7 @@ import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;
+import com.allen_sauer.gwt.log.client.Log; import com.google.gwt.user.server.rpc.RemoteServiceServlet;
import org.rhq.core.domain.auth.Subject; @@ -34,9 +35,12 @@ import org.rhq.enterprise.server.util.LookupUtil;
/** * @author Greg Hinkle + * @author Joseph Marques */ public abstract class AbstractGWTServiceImpl extends RemoteServiceServlet {
+ private static final long serialVersionUID = 1L; + private ThreadLocal<Subject> sessionSubject = new ThreadLocal<Subject>();
protected Subject getSessionSubject() { @@ -46,20 +50,20 @@ public abstract class AbstractGWTServiceImpl extends RemoteServiceServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String sid = req.getHeader(UserSessionManager.SESSION_NAME); - Subject subject = null; if (sid != null) { SubjectManagerLocal subjectManager = LookupUtil.getSubjectManager(); try { - subject = subjectManager.getSubjectBySessionId(Integer.parseInt(sid)); + Subject subject = subjectManager.getSubjectBySessionId(Integer.parseInt(sid)); + sessionSubject.set(subject); } catch (Exception e) { - throw new RuntimeException("Failed to validate session", e); + Log.error("Failed to validate request: sessionId was '" + sid + "', requestURL=" + req.getRequestURL()); } + } else { + Log.error("Failed to validate request: sessionId missing, requestURL=" + req.getRequestURL()); } - sessionSubject.set(subject);
long id = HibernatePerformanceMonitor.get().start(); super.service(req, resp); HibernatePerformanceMonitor.get().stop(id, "GWT Service Request"); } - }
commit 34d44ee66ec927b1dbb1d96fc15de3250622e7e4 Author: Joseph Marques joseph@redhat.com Date: Mon Oct 4 14:07:42 2010 -0400
remove duplicate servlet definitions, alphabetize the rest
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/CoreGUI.gwt.xml b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/CoreGUI.gwt.xml index c486f1d..ecfac0b 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/CoreGUI.gwt.xml +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/CoreGUI.gwt.xml @@ -80,8 +80,11 @@ <servlet path="/AuthorizationGWTService" class="org.rhq.enterprise.gui.coregui.server.gwt.AuthorizationGWTServiceImpl"/> <servlet path="/AvailabilityGWTService" class="org.rhq.enterprise.gui.coregui.server.gwt.AvailabilityGWTServiceImpl"/> <servlet path="/BundleGWTService" class="org.rhq.enterprise.gui.coregui.server.gwt.BundleGWTServiceImpl"/> + <servlet path="/ClusterGWTService" class="org.rhq.enterprise.gui.coregui.server.gwt.ClusterGWTServiceImpl"/> <servlet path="/ConfigurationGwtService" class="org.rhq.enterprise.gui.coregui.server.gwt.ConfigurationGWTServiceImpl"/> <servlet path="/ContentGWTService" class="org.rhq.enterprise.gui.coregui.server.gwt.ContentGWTServiceImpl"/> + <servlet path="/DashboardGWTService" class="org.rhq.enterprise.gui.coregui.server.gwt.DashboardGWTServiceImpl"/> + <servlet path="/EventGWTService" class="org.rhq.enterprise.gui.coregui.server.gwt.EventGWTServiceImpl"/> <servlet path="/MeasurementDataGWTService" class="org.rhq.enterprise.gui.coregui.server.gwt.MeasurementDataGWTServiceImpl"/> <servlet path="/OperationGWTService" class="org.rhq.enterprise.gui.coregui.server.gwt.OperationGWTServiceImpl"/> <servlet path="/RemoteInstallGWTService" class="org.rhq.enterprise.gui.coregui.server.gwt.RemoteInstallGWTServiceImpl"/> @@ -95,11 +98,5 @@ <servlet path="/SubjectGWTService" class="org.rhq.enterprise.gui.coregui.server.gwt.SubjectGWTServiceImpl"/> <servlet path="/SystemGWTService" class="org.rhq.enterprise.gui.coregui.server.gwt.SystemGWTServiceImpl"/> <servlet path="/TagGWTService" class="org.rhq.enterprise.gui.coregui.server.gwt.TagGWTServiceImpl"/> - <servlet path="/RemoteInstallGWTService" class="org.rhq.enterprise.gui.coregui.server.gwt.RemoteInstallGWTServiceImpl"/> - <servlet path="/RepoGWTService" class="org.rhq.enterprise.gui.coregui.server.gwt.RepoGWTServiceImpl"/> - <servlet path="/ContentGWTService" class="org.rhq.enterprise.gui.coregui.server.gwt.ContentGWTServiceImpl"/> - <servlet path="/DashboardGWTService" class="org.rhq.enterprise.gui.coregui.server.gwt.DashboardGWTServiceImpl"/> - <servlet path="/EventGWTService" class="org.rhq.enterprise.gui.coregui.server.gwt.EventGWTServiceImpl"/> - <servlet path="/ClusterGWTService" class="org.rhq.enterprise.gui.coregui.server.gwt.ClusterGWTServiceImpl"/>
-</module> \ No newline at end of file +</module>
commit 01bb66ff5713c644f2f7bb4d46763a0866276eb5 Author: Joseph Marques joseph@redhat.com Date: Mon Oct 4 14:03:50 2010 -0400
show as much detail in the message center as possible
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleUploadDataStep.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleUploadDataStep.java index 34e343e..e62b908 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleUploadDataStep.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/bundle/create/BundleUploadDataStep.java @@ -204,8 +204,7 @@ public class BundleUploadDataStep extends AbstractWizardStep { uploadForm.addFormSubmitFailedHandler(new FormSubmitFailedHandler() { public void onFormSubmitFailed(FormSubmitFailedEvent event) { allFilesStatus.put(uploadForm.getName(), Boolean.FALSE); - CoreGUI.getMessageCenter().notify( - new Message("Failed to upload file", null, Message.Severity.Error)); + CoreGUI.getMessageCenter().notify(new Message("Failed to upload file", Message.Severity.Error)); } });
diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/ErrorHandler.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/ErrorHandler.java index 49bb67e..1b97a65 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/ErrorHandler.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/ErrorHandler.java @@ -18,11 +18,14 @@ */ package org.rhq.enterprise.gui.coregui.client.util;
+import java.util.ArrayList; + import org.rhq.enterprise.gui.coregui.client.CoreGUI; import org.rhq.enterprise.gui.coregui.client.util.message.Message;
/** * @author Greg Hinkle + * @author Joseph Marques */ public class ErrorHandler { public void handleError(String message) { @@ -30,7 +33,7 @@ public class ErrorHandler { }
public void handleError(String message, Throwable t) { - Message errorMessage = new Message(message, (t == null) ? null : t.toString(), Message.Severity.Fatal); + Message errorMessage = new Message(message, t, Message.Severity.Fatal); CoreGUI.getMessageCenter().notify(errorMessage);
if (t != null) { @@ -38,4 +41,40 @@ public class ErrorHandler { t.printStackTrace(); } } + + public static String getAllMessages(Throwable t) { + StringBuffer results = new StringBuffer(); + + if (t != null) { + String[] msgs = getAllMessagesArray(t); + results.append(msgs[0]); + + String indent = " "; + for (int i = 1; i < msgs.length; i++) { + results.append("\n").append(indent); + results.append(msgs[i]); + indent = indent + " "; + } + } else { + results.append(">> exception was null <<"); + } + + return results.toString(); + } + + public static String[] getAllMessagesArray(Throwable t) { + ArrayList<String> list = new ArrayList<String>(); + + if (t != null) { + list.add(t.getClass().getName() + ":" + t.getMessage()); + + while ((t.getCause() != null) && (t != t.getCause())) { + t = t.getCause(); + + list.add(t.getClass().getName() + ":" + t.getMessage()); + } + } + + return list.toArray(new String[list.size()]); + } } diff --git a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/message/Message.java b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/message/Message.java index 3a0b464..a9e94c2 100644 --- a/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/message/Message.java +++ b/modules/enterprise/gui/coregui/src/main/java/org/rhq/enterprise/gui/coregui/client/util/message/Message.java @@ -21,13 +21,14 @@ package org.rhq.enterprise.gui.coregui.client.util.message; import java.util.Date; import java.util.EnumSet;
+import org.rhq.enterprise.gui.coregui.client.util.ErrorHandler; + /** * A message to be displayed to the user in one or more places. * * @author Greg Hinkle * @author Ian Springer */ -@SuppressWarnings({"UnnecessarySemicolon"}) public class Message { protected String conciseMessage; protected String detailedMessage; @@ -36,21 +37,30 @@ public class Message { protected EnumSet<Option> options;
// TODO: Add Debug severity? - public enum Severity { Info, Warning, Error, Fatal }; - public enum Option { Transient, Sticky, BackgroundJobResult }; + public enum Severity { + Info, Warning, Error, Fatal + }; + + public enum Option { + Transient, Sticky, BackgroundJobResult + };
public Message(String conciseMessage) { - this(conciseMessage, (Severity)null); + this(conciseMessage, (Severity) null); }
public Message(String conciseMessage, Severity severity) { - this(conciseMessage, null, severity); + this(conciseMessage, (String) null, severity); }
public Message(String conciseMessage, String detailedMessage) { this(conciseMessage, detailedMessage, null); }
+ public Message(String conciseMessage, Throwable details) { + this(conciseMessage, details, null); + } + public Message(String conciseMessage, EnumSet<Option> options) { this(conciseMessage, null, options); } @@ -59,8 +69,16 @@ public class Message { this(conciseMessage, detailedMessage, severity, null); }
+ public Message(String conciseMessage, Throwable details, Severity severity) { + this(conciseMessage, details, severity, null); + } + public Message(String conciseMessage, Severity severity, EnumSet<Option> options) { - this(conciseMessage, null, severity, options); + this(conciseMessage, (String) null, severity, options); + } + + public Message(String conciseMessage, Throwable details, Severity severity, EnumSet<Option> options) { + this(conciseMessage, ErrorHandler.getAllMessages(details), severity, options); }
public Message(String conciseMessage, String detailedMessage, Severity severity, EnumSet<Option> options) { @@ -97,15 +115,14 @@ public class Message { public boolean isBackgroundJobResult() { return options.contains(Option.BackgroundJobResult); } - + @Override public String toString() { - return "Message{" + - "conciseMessage='" + this.conciseMessage + ''' + - ", detailedMessage='" + this.detailedMessage + ''' + - ", fired=" + this.fired + - ", severity=" + this.severity + - ", options=" + this.options + - '}'; + return "Message{" // + + "conciseMessage='" + this.conciseMessage + ''' // + + ", detailedMessage='" + this.detailedMessage + ''' // + + ", fired=" + this.fired // + + ", severity=" + this.severity // + + ", options=" + this.options + '}'; } }