diff --git a/source/java/org/alfresco/web/app/servlet/AlfrescoFacesServlet.java b/source/java/org/alfresco/web/app/servlet/AlfrescoFacesServlet.java deleted file mode 100644 index a0cfba6b3c..0000000000 --- a/source/java/org/alfresco/web/app/servlet/AlfrescoFacesServlet.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (C) 2005 Alfresco, Inc. - * - * Licensed under the Mozilla Public License version 1.1 - * with a permitted attribution clause. You may obtain a - * copy of the License at - * - * http://www.alfresco.org/legal/license.txt - * - * 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.alfresco.web.app.servlet; - -import java.io.IOException; - -import javax.faces.webapp.FacesServlet; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.alfresco.web.app.Application; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -/** - * Wrapper around standard faces servlet to provide error handling - * - * @author gavinc - */ -public class AlfrescoFacesServlet extends FacesServlet -{ - private static Log logger = LogFactory.getLog(AlfrescoFacesServlet.class); - - /** - * @see javax.servlet.Servlet#service(javax.servlet.ServletRequest, javax.servlet.ServletResponse) - */ - public void service(ServletRequest request, ServletResponse response) - throws IOException, ServletException - { - try - { - super.service(request, response); - } - catch (Throwable error) - { - String returnPage = ((HttpServletRequest)request).getRequestURI(); - - Application.handleServletError(getServletConfig().getServletContext(), (HttpServletRequest)request, - (HttpServletResponse)response, error, logger, returnPage); - } - } -} diff --git a/source/java/org/alfresco/web/bean/ErrorBean.java b/source/java/org/alfresco/web/bean/ErrorBean.java index 6a387f2c36..8cf9b29244 100644 --- a/source/java/org/alfresco/web/bean/ErrorBean.java +++ b/source/java/org/alfresco/web/bean/ErrorBean.java @@ -58,11 +58,22 @@ public class ErrorBean } /** - * @param lastError The lastError to set. + * @param error The lastError to set. */ - public void setLastError(Throwable lastError) + public void setLastError(Throwable error) { - this.lastError = lastError; + // servlet exceptions hide the actual error within the rootCause + // variable, set the base error to that and throw away the + // ServletException wrapper + if (error instanceof ServletException && + ((ServletException)error).getRootCause() != null) + { + this.lastError = ((ServletException)error).getRootCause(); + } + else + { + this.lastError = error; + } } /** @@ -74,29 +85,17 @@ public class ErrorBean if (this.lastError != null) { - StringBuilder builder = null; - Throwable cause = null; - if (this.lastError instanceof ServletException && - ((ServletException)this.lastError).getRootCause() != null) - { - // servlet exception puts the actual error in root cause!! - Throwable actualError = ((ServletException)this.lastError).getRootCause(); - builder = new StringBuilder(actualError.toString()); - cause = actualError.getCause(); - } - else - { - builder = new StringBuilder(this.lastError.toString()); - cause = this.lastError.getCause(); - } + StringBuilder builder = new StringBuilder(this.lastError.toString());; + Throwable cause = this.lastError.getCause(); + // build up stack trace of all causes while (cause != null) { - builder.append("

caused by:
"); + builder.append("\ncaused by:\n"); builder.append(cause.toString()); if (cause instanceof ServletException && - ((ServletException)cause).getRootCause() != null) + ((ServletException)cause).getRootCause() != null) { cause = ((ServletException)cause).getRootCause(); } @@ -107,6 +106,11 @@ public class ErrorBean } message = builder.toString(); + + // format the message for HTML display + message = message.replaceAll("<", "<"); + message = message.replaceAll(">", ">"); + message = message.replaceAll("\n", "
"); } return message; @@ -119,18 +123,14 @@ public class ErrorBean { StringWriter stringWriter = new StringWriter(); PrintWriter writer = new PrintWriter(stringWriter); + this.lastError.printStackTrace(writer); - if (this.lastError instanceof ServletException && - ((ServletException)this.lastError).getRootCause() != null) - { - Throwable actualError = ((ServletException)this.lastError).getRootCause(); - actualError.printStackTrace(writer); - } - else - { - this.lastError.printStackTrace(writer); - } + // format the message for HTML display + String trace = stringWriter.toString(); + trace = trace.replaceAll("<", "<"); + trace = trace.replaceAll(">", ">"); + trace = trace.replaceAll("\n", "
"); - return stringWriter.toString().replaceAll("\r\n", "
"); + return trace; } } diff --git a/source/java/org/alfresco/web/ui/repo/tag/SystemErrorTag.java b/source/java/org/alfresco/web/ui/repo/tag/SystemErrorTag.java index 0efbc92ed8..b46d25f65f 100644 --- a/source/java/org/alfresco/web/ui/repo/tag/SystemErrorTag.java +++ b/source/java/org/alfresco/web/ui/repo/tag/SystemErrorTag.java @@ -39,6 +39,8 @@ import org.alfresco.web.bean.ErrorBean; */ public class SystemErrorTag extends TagSupport { + private static final long serialVersionUID = -7336055169875448199L; + private static final String MSG_RETURN_TO_APP = "return_to_application"; private static final String MSG_HIDE_DETAILS = "hide_details"; private static final String MSG_SHOW_DETAILS = "show_details"; @@ -126,6 +128,21 @@ public class SystemErrorTag extends TagSupport errorMessage = errorBean.getLastErrorMessage(); errorDetails = errorBean.getStackTrace(); } + else + { + // if we reach here the error was caught by the declaration in web.xml so + // pull all the information from the request and create the error bean + Throwable error = (Throwable)pageContext.getRequest().getAttribute("javax.servlet.error.exception"); + String uri = (String)pageContext.getRequest().getAttribute("javax.servlet.error.request_uri"); + + // create and store the ErrorBean + errorBean = new ErrorBean(); + pageContext.getSession().setAttribute(ErrorBean.ERROR_BEAN_NAME, errorBean); + errorBean.setLastError(error); + errorBean.setReturnPage(uri); + errorMessage = errorBean.getLastErrorMessage(); + errorDetails = errorBean.getStackTrace(); + } try { @@ -254,6 +271,11 @@ public class SystemErrorTag extends TagSupport { throw new JspException(ioe); } + finally + { + // clear out the error bean otherwise the next error could be hidden + pageContext.getSession().removeAttribute(ErrorBean.ERROR_BEAN_NAME); + } return SKIP_BODY; } diff --git a/source/web/WEB-INF/web.xml b/source/web/WEB-INF/web.xml index 79d3a24c2a..33800b0aa1 100644 --- a/source/web/WEB-INF/web.xml +++ b/source/web/WEB-INF/web.xml @@ -28,7 +28,7 @@ org.apache.myfaces.DETECT_JAVASCRIPT false This is an EXPERIMENTAL feature, so leave it off for now! - + @@ -187,7 +187,7 @@ Faces Servlet - org.alfresco.web.app.servlet.AlfrescoFacesServlet + javax.faces.webapp.FacesServlet 1 @@ -359,9 +359,9 @@ index.jsp - - http://java.sun.com/jsp/jstl/core - /WEB-INF/c.tld - + + 500 + /jsp/error.jsp +