You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by iv...@apache.org on 2011/03/27 22:36:11 UTC
svn commit: r1086031 - in /wicket/trunk:
wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/
wicket-core/src/main/java/org/apache/wicket/request/handler/render/
wicket-request/src/main/java/org/apache/wicket/request/http/
Author: ivaynberg
Date: Sun Mar 27 20:36:10 2011
New Revision: 1086031
URL: http://svn.apache.org/viewvc?rev=1086031&view=rev
Log:
handle servlet forwards when handling error pages mapped to wicket pages using <error-page> web.xml element
Issue: WICKET-3551
Added:
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/ErrorAttributes.java (with props)
Modified:
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/handler/render/WebPageRenderer.java
wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/http/WebRequest.java
Added: wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/ErrorAttributes.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/ErrorAttributes.java?rev=1086031&view=auto
==============================================================================
--- wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/ErrorAttributes.java (added)
+++ wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/ErrorAttributes.java Sun Mar 27 20:36:10 2011
@@ -0,0 +1,163 @@
+/*
+ * 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.wicket.protocol.http.servlet;
+
+import javax.servlet.ServletRequest;
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.wicket.util.lang.Args;
+import org.apache.wicket.util.string.Strings;
+
+/**
+ * Represents additional error parameters present in a {@link ServletRequest} when the servlet
+ * container is handling an error or a forward to an error page mapped by {@code error-page} element
+ * in {@code web.xml}.
+ *
+ * See documentation for the following request attributes for the values stored in this object:
+ * <ul>
+ * <li>javax.servlet.error.status_code</li>
+ * <li>javax.servlet.error.message</li>
+ * <li>javax.servlet.error.request_uri</li>
+ * <li>javax.servlet.error.servlet_name</li>
+ * <li>javax.servlet.error.exception_type</li>
+ * <li>javax.servlet.error.exception</li>
+ * </ul>
+ *
+ * @author igor
+ */
+public class ErrorAttributes
+{
+ // javax.servlet.error.status_code
+ private final Integer statusCode;
+ // javax.servlet.error.message
+ private final String message;
+ // javax.servlet.error.request_uri
+ private final String requestUri;
+ // javax.servlet.error.servlet_name
+ private final String servletName;
+ // javax.servlet.error.exception_type
+ private final Class<? extends Throwable> exceptionType;
+ // javax.servlet.error.exception
+ private final Throwable exception;
+
+ /**
+ * Constructor
+ *
+ * @param statusCode
+ * @param message
+ * @param requestUri
+ * @param servletName
+ * @param exceptionType
+ * @param exception
+ */
+ private ErrorAttributes(Integer statusCode, String message, String requestUri,
+ String servletName, Class<? extends Throwable> exceptionType, Throwable exception)
+ {
+ this.statusCode = statusCode;
+ this.message = message;
+ this.requestUri = requestUri;
+ this.servletName = servletName;
+ this.exceptionType = exceptionType;
+ this.exception = exception;
+ }
+
+ /**
+ * Gets statusCode.
+ *
+ * @return statusCode
+ */
+ public Integer getStatusCode()
+ {
+ return statusCode;
+ }
+
+ /**
+ * Gets message.
+ *
+ * @return message
+ */
+ public String getMessage()
+ {
+ return message;
+ }
+
+ /**
+ * Gets requestUri.
+ *
+ * @return requestUri
+ */
+ public String getRequestUri()
+ {
+ return requestUri;
+ }
+
+ /**
+ * Gets servletName.
+ *
+ * @return servletName
+ */
+ public String getServletName()
+ {
+ return servletName;
+ }
+
+ /**
+ * Gets exceptionType.
+ *
+ * @return exceptionType
+ */
+ public Class<? extends Throwable> getExceptionType()
+ {
+ return exceptionType;
+ }
+
+ /**
+ * Gets exception.
+ *
+ * @return exception
+ */
+ public Throwable getException()
+ {
+ return exception;
+ }
+
+ /**
+ * Factory for creating instances of this class.
+ *
+ * @param request
+ * @return instance of request contains error attributes or {@code null} if it does not.
+ */
+ public static ErrorAttributes of(HttpServletRequest request)
+ {
+ Args.notNull(request, "request");
+ Integer code = (Integer)request.getAttribute("javax.servlet.error.status_code");
+ String message = (String)request.getAttribute("javax.servlet.error.message");
+ String uri = (String)request.getAttribute("javax.servlet.error.request_uri");
+ String servlet = (String)request.getAttribute("javax.servlet.error.servlet_name");
+ @SuppressWarnings("unchecked")
+ Class<? extends Throwable> type = (Class<? extends Throwable>)request.getAttribute("javax.servlet.error.exception_type");
+ Throwable ex = (Throwable)request.getAttribute("javax.servlet.error.exception");
+
+ if (!Strings.isEmpty(uri) || code != null || ex != null)
+ {
+ return new ErrorAttributes(code, message, uri, servlet, type, ex);
+ }
+ return null;
+ }
+
+
+}
Propchange: wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/ErrorAttributes.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified: wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java?rev=1086031&r1=1086030&r2=1086031&view=diff
==============================================================================
--- wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java (original)
+++ wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java Sun Mar 27 20:36:10 2011
@@ -53,6 +53,7 @@ import org.slf4j.LoggerFactory;
*
* @author Matej Knopp
* @author Juergen Donnerstag
+ * @author Igor Vaynberg
*/
public class ServletWebRequest extends WebRequest
{
@@ -62,6 +63,8 @@ public class ServletWebRequest extends W
private final String filterPrefix;
+ private final ErrorAttributes errorAttributes;
+
/**
* Construct.
*
@@ -98,6 +101,8 @@ public class ServletWebRequest extends W
{
this.url = getUrl(httpServletRequest, filterPrefix);
}
+
+ errorAttributes = ErrorAttributes.of(httpServletRequest);
}
/**
@@ -112,13 +117,17 @@ public class ServletWebRequest extends W
* the base url is wicket/bookmarkable/com.foo.Page
*
* <pre>
- * wicket / bookmarkab
+ *
* @see org.apache.wicket.request.Request#getClientUrl()
*/
@Override
public Url getClientUrl()
{
- if (!isAjax())
+ if (errorAttributes != null && !Strings.isEmpty(errorAttributes.getRequestUri()))
+ {
+ return setParameters(Url.parse(errorAttributes.getRequestUri(), getCharset()));
+ }
+ else if (!isAjax())
{
return getUrl(httpServletRequest, filterPrefix);
}
@@ -418,4 +427,10 @@ public class ServletWebRequest extends W
{
return UrlUtils.normalizePath(filterPrefix);
}
+
+ @Override
+ public boolean shouldPreserveClientUrl()
+ {
+ return errorAttributes != null && !Strings.isEmpty(errorAttributes.getRequestUri());
+ }
}
Modified: wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/handler/render/WebPageRenderer.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/handler/render/WebPageRenderer.java?rev=1086031&r1=1086030&r2=1086031&view=diff
==============================================================================
--- wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/handler/render/WebPageRenderer.java (original)
+++ wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/handler/render/WebPageRenderer.java Sun Mar 27 20:36:10 2011
@@ -196,6 +196,8 @@ public class WebPageRenderer extends Pag
boolean isAjax = isAjax(requestCycle);
+ boolean shouldPreserveClientUrl = ((WebRequest)requestCycle.getRequest()).shouldPreserveClientUrl();
+
if (bufferedResponse != null)
{
logger.warn("The Buffered response should be handled by BufferedResponseRequestHandler");
@@ -209,12 +211,13 @@ public class WebPageRenderer extends Pag
(targetUrl.equals(currentUrl) && !getPageProvider().isNewPageInstance() && !getPage().isPageStateless()) //
|| (targetUrl.equals(currentUrl) && isRedirectToRender()) //
) //
- ) //
+ || shouldPreserveClientUrl) //
{
// if the policy is never to redirect
// or one pass render mode is on
// or the targetUrl matches current url and the page is not stateless
// or the targetUrl matches current url, page is stateless but it's redirect-to-render
+ // or the request determines that the current url should be preserved
// just render the page
BufferedWebResponse response = renderPage(currentUrl, requestCycle);
if (response != null)
Modified: wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/http/WebRequest.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/http/WebRequest.java?rev=1086031&r1=1086030&r2=1086031&view=diff
==============================================================================
--- wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/http/WebRequest.java (original)
+++ wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/http/WebRequest.java Sun Mar 27 20:36:10 2011
@@ -126,6 +126,23 @@ public abstract class WebRequest extends
}
/**
+ * Signals whether or not request processing should preserve the current client url - in other
+ * words, handle this request without redirecting. By default, this method returns {@code false}
+ * .
+ *
+ * For example, this method can be used to preserve the url that caused a 404 in the browser if
+ * Wicket is also responsible for rendering the 404 page. If this method returns the default
+ * value of {@code false} then Wicket will redirect to the bookmarkable url of the error page,
+ * instead of preserving the url that caused the 404 in the browser.
+ *
+ * @return {@code true} if current client url should be preserved
+ */
+ public boolean shouldPreserveClientUrl()
+ {
+ return false;
+ }
+
+ /**
* Returns request with specified URL and same POST parameters as this request.
*
* @param url
@@ -196,6 +213,12 @@ public abstract class WebRequest extends
{
return WebRequest.this.getContainerRequest();
}
+
+ @Override
+ public boolean shouldPreserveClientUrl()
+ {
+ return WebRequest.this.shouldPreserveClientUrl();
+ }
};
}