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();
+			}
 		};
 	}