You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by mg...@apache.org on 2010/08/15 17:57:41 UTC

svn commit: r985696 - in /wicket/trunk: wicket-examples/src/main/java/org/apache/wicket/examples/hellobrowser/ wicket-request/src/main/java/org/apache/wicket/request/ wicket/src/main/java/org/apache/wicket/ wicket/src/main/java/org/apache/wicket/protoc...

Author: mgrigorov
Date: Sun Aug 15 15:57:41 2010
New Revision: 985696

URL: http://svn.apache.org/viewvc?rev=985696&view=rev
Log:
Bring browser snooper back in shape.

While here fix a bug in UrlRenderer#renderContextPathRelativeUrl() for urls starting with '/'.


Modified:
    wicket/trunk/wicket-examples/src/main/java/org/apache/wicket/examples/hellobrowser/HelloBrowser.java
    wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/Url.java
    wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/UrlRenderer.java
    wicket/trunk/wicket/src/main/java/org/apache/wicket/Session.java
    wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/WebSession.java
    wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java
    wicket/trunk/wicket/src/main/java/org/apache/wicket/request/cycle/RequestCycle.java
    wicket/trunk/wicket/src/test/java/org/apache/wicket/request/cycle/UrlRendererTest.java

Modified: wicket/trunk/wicket-examples/src/main/java/org/apache/wicket/examples/hellobrowser/HelloBrowser.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-examples/src/main/java/org/apache/wicket/examples/hellobrowser/HelloBrowser.java?rev=985696&r1=985695&r2=985696&view=diff
==============================================================================
--- wicket/trunk/wicket-examples/src/main/java/org/apache/wicket/examples/hellobrowser/HelloBrowser.java (original)
+++ wicket/trunk/wicket-examples/src/main/java/org/apache/wicket/examples/hellobrowser/HelloBrowser.java Sun Aug 15 15:57:41 2010
@@ -21,6 +21,7 @@ import java.util.Calendar;
 import java.util.Locale;
 import java.util.TimeZone;
 
+import org.apache.wicket.Session;
 import org.apache.wicket.examples.WicketExamplePage;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.basic.MultiLineLabel;
@@ -53,7 +54,7 @@ public class HelloBrowser extends Wicket
 		// don't use a property model here or anything else that is resolved
 		// during rendering, as changing the request target during rendering
 		// is not allowed.
-		final ClientProperties properties = ((WebClientInfo)getRequestCycle().getClientInfo()).getProperties();
+		final ClientProperties properties = ((WebClientInfo)Session.get().getClientInfo()).getProperties();
 
 		add(new MultiLineLabel("clientinfo", properties.toString()));
 

Modified: wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/Url.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/Url.java?rev=985696&r1=985695&r2=985696&view=diff
==============================================================================
--- wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/Url.java (original)
+++ wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/Url.java Sun Aug 15 15:57:41 2010
@@ -111,6 +111,7 @@ public final class Url implements Serial
 	 * Parses the given URL string.
 	 * 
 	 * @param url
+	 * @param charset
 	 * @return Url object
 	 */
 	public static Url parse(String url, Charset charset)
@@ -471,6 +472,7 @@ public final class Url implements Serial
 	/**
 	 * @see java.lang.Object#toString()
 	 */
+	@Override
 	public String toString()
 	{
 		return toString(getCharset());

Modified: wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/UrlRenderer.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/UrlRenderer.java?rev=985696&r1=985695&r2=985696&view=diff
==============================================================================
--- wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/UrlRenderer.java (original)
+++ wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/UrlRenderer.java Sun Aug 15 15:57:41 2010
@@ -141,8 +141,15 @@ public class UrlRenderer
 	 * @param request
 	 * @return relative URL
 	 */
-	public String renderContextPathRelativeUrl(final String url, final Request request)
+	public String renderContextPathRelativeUrl(String url, final Request request)
 	{
+		Checks.argumentNotNull(url, "url");
+
+		if (url.startsWith("/"))
+		{
+			url = url.substring(1);
+		}
+
 		PrependingStringBuffer buffer = new PrependingStringBuffer(url);
 		for (int i = 0; i < baseUrl.getSegments().size() - 1; ++i)
 		{

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/Session.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/Session.java?rev=985696&r1=985695&r2=985696&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/Session.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/Session.java Sun Aug 15 15:57:41 2010
@@ -28,6 +28,8 @@ import org.apache.wicket.application.ICl
 import org.apache.wicket.authorization.IAuthorizationStrategy;
 import org.apache.wicket.feedback.FeedbackMessage;
 import org.apache.wicket.feedback.FeedbackMessages;
+import org.apache.wicket.markup.html.WebPage;
+import org.apache.wicket.markup.html.pages.BrowserInfoPage;
 import org.apache.wicket.page.IPageManager;
 import org.apache.wicket.request.ClientInfo;
 import org.apache.wicket.request.Request;
@@ -155,7 +157,7 @@ public abstract class Session implements
 	 * Cached instance of agent info which is typically designated by calling
 	 * {@link RequestCycle#newClientInfo()}.
 	 */
-	private ClientInfo clientInfo;
+	protected ClientInfo clientInfo;
 
 	/** True if session state has been changed */
 	private transient boolean dirty = false;
@@ -320,14 +322,18 @@ public abstract class Session implements
 	 * 
 	 * @return the client info object based on this request
 	 */
-	public ClientInfo getClientInfo()
-	{
-		if (clientInfo == null)
-		{
-			clientInfo = RequestCycle.get().newClientInfo();
-		}
-		return clientInfo;
-	}
+	public abstract ClientInfo getClientInfo();
+
+	/**
+	 * Override this method if you want to use a custom page for gathering the client's browser
+	 * information.<br/>
+	 * The easiest way is just to extend {@link BrowserInfoPage} and provide your own markup file
+	 * 
+	 * @param url
+	 *            the url to redirect to when the browser info is handled
+	 * @return the {@link WebPage} which should be used while gathering browser info
+	 */
+	public abstract Page newBrowserInfoPage(String url);
 
 	/**
 	 * Gets feedback messages stored in session

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/WebSession.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/WebSession.java?rev=985696&r1=985695&r2=985696&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/WebSession.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/WebSession.java Sun Aug 15 15:57:41 2010
@@ -19,10 +19,17 @@ package org.apache.wicket.protocol.http;
 import java.util.List;
 
 import org.apache.wicket.Application;
+import org.apache.wicket.MetaDataKey;
+import org.apache.wicket.Page;
+import org.apache.wicket.RestartResponseException;
 import org.apache.wicket.Session;
 import org.apache.wicket.WicketRuntimeException;
 import org.apache.wicket.feedback.FeedbackMessage;
 import org.apache.wicket.feedback.IFeedbackMessageFilter;
+import org.apache.wicket.markup.html.WebPage;
+import org.apache.wicket.markup.html.pages.BrowserInfoPage;
+import org.apache.wicket.protocol.http.request.WebClientInfo;
+import org.apache.wicket.request.IRequestHandler;
 import org.apache.wicket.request.Request;
 import org.apache.wicket.request.cycle.RequestCycle;
 import org.apache.wicket.request.http.WebRequest;
@@ -70,6 +77,11 @@ public class WebSession extends Session
 		}
 	};
 
+	private static final MetaDataKey<Boolean> BROWSER_WAS_POLLED_KEY = new MetaDataKey<Boolean>()
+	{
+		private static final long serialVersionUID = 1L;
+	};
+
 	/**
 	 * Constructor. Note that {@link RequestCycle} is not available until this constructor returns.
 	 * 
@@ -166,4 +178,49 @@ public class WebSession extends Session
 		throw new WicketRuntimeException(
 			"You must subclass WebSession and implement your own authentication method for all Wicket applications using authentication.");
 	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public WebClientInfo getClientInfo()
+	{
+		if (clientInfo == null)
+		{
+			RequestCycle requestCycle = RequestCycle.get();
+
+			if (getApplication().getRequestCycleSettings().getGatherExtendedBrowserInfo())
+			{
+				if (getMetaData(BROWSER_WAS_POLLED_KEY) == null)
+				{
+					// we haven't done the redirect yet; record that we will be
+					// doing that now and redirect
+					setMetaData(BROWSER_WAS_POLLED_KEY, Boolean.TRUE);
+					Request request = requestCycle.getRequest();
+
+					IRequestHandler activeRequestHandler = requestCycle.getActiveRequestHandler();
+					String url = requestCycle.urlFor(activeRequestHandler).toString();
+					String relativeUrl = requestCycle.getUrlRenderer()
+						.renderContextPathRelativeUrl(url, request);
+					Page browserInfoPage = newBrowserInfoPage(relativeUrl);
+					throw new RestartResponseException(browserInfoPage);
+				}
+				// if we get here, the redirect already has been done; clear
+				// the meta data entry; we don't need it any longer is the client
+				// info object will be cached too
+				setMetaData(BROWSER_WAS_POLLED_KEY, (Boolean)null);
+			}
+			clientInfo = new WebClientInfo(requestCycle);
+		}
+		return (WebClientInfo)clientInfo;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public WebPage newBrowserInfoPage(String url)
+	{
+		return new BrowserInfoPage(url);
+	}
 }
\ No newline at end of file

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java?rev=985696&r1=985695&r2=985696&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java Sun Aug 15 15:57:41 2010
@@ -91,12 +91,17 @@ public class ServletWebRequest extends W
 		Checks.argumentNotNull(httpServletRequest, "httpServletRequest");
 		Checks.argumentNotNull(filterPrefix, "filterPrefix");
 
+		this.httpServletRequest = httpServletRequest;
+		this.filterPrefix = filterPrefix;
+
 		if (url != null)
+		{
 			this.url = url;
+		}
 		else
+		{
 			this.url = getUrl(httpServletRequest, filterPrefix);
-		this.httpServletRequest = httpServletRequest;
-		this.filterPrefix = filterPrefix;
+		}
 	}
 
 	private Url getUrl(HttpServletRequest request, String filterPrefix)

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/request/cycle/RequestCycle.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/request/cycle/RequestCycle.java?rev=985696&r1=985695&r2=985696&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/request/cycle/RequestCycle.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/request/cycle/RequestCycle.java Sun Aug 15 15:57:41 2010
@@ -24,8 +24,6 @@ import org.apache.wicket.MetaDataKey;
 import org.apache.wicket.Page;
 import org.apache.wicket.Session;
 import org.apache.wicket.ThreadContext;
-import org.apache.wicket.protocol.http.request.WebClientInfo;
-import org.apache.wicket.request.ClientInfo;
 import org.apache.wicket.request.IExceptionMapper;
 import org.apache.wicket.request.IRequestCycle;
 import org.apache.wicket.request.IRequestHandler;
@@ -563,26 +561,6 @@ public class RequestCycle extends Reques
 			RenderPageRequestHandler.RedirectPolicy.AUTO_REDIRECT));
 	}
 
-
-	/**
-	 * Creates a new agent info object based on this request. Typically, this method is called once
-	 * by the session and the returned object will be cached in the session after that call; we can
-	 * expect the client to stay the same for the whole session, and implementations of
-	 * {@link #newClientInfo()} might be relatively expensive.
-	 * 
-	 * @return the agent info object based on this request
-	 */
-	// TODO WICKET-NG Get this out of here!
-	public ClientInfo newClientInfo()
-	{
-		return new WebClientInfo(this);
-	}
-
-	public ClientInfo getClientInfo()
-	{
-		return newClientInfo();
-	}
-
 	public boolean isCleanupFeedbackMessagesOnDetach()
 	{
 		return cleanupFeedbackMessagesOnDetach;

Modified: wicket/trunk/wicket/src/test/java/org/apache/wicket/request/cycle/UrlRendererTest.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/test/java/org/apache/wicket/request/cycle/UrlRendererTest.java?rev=985696&r1=985695&r2=985696&view=diff
==============================================================================
--- wicket/trunk/wicket/src/test/java/org/apache/wicket/request/cycle/UrlRendererTest.java (original)
+++ wicket/trunk/wicket/src/test/java/org/apache/wicket/request/cycle/UrlRendererTest.java Sun Aug 15 15:57:41 2010
@@ -16,10 +16,14 @@
  */
 package org.apache.wicket.request.cycle;
 
+import javax.servlet.http.HttpServletRequest;
+
 import junit.framework.TestCase;
 
+import org.apache.wicket.protocol.http.servlet.ServletWebRequest;
 import org.apache.wicket.request.Url;
 import org.apache.wicket.request.UrlRenderer;
+import org.mockito.Mockito;
 
 /**
  * @author MAtej Knopp
@@ -104,4 +108,33 @@ public class UrlRendererTest extends Tes
 		assertEquals("../../../q/c/d/e", r1.renderUrl(Url.parse("a/q/c/d/e")));
 	}
 
+	/**
+	 * 
+	 */
+	public void test10()
+	{
+		UrlRenderer r1 = new UrlRenderer(Url.parse("a/b/q/d/e"));
+
+		HttpServletRequest httpRequest = Mockito.mock(HttpServletRequest.class);
+		Mockito.when(httpRequest.getCharacterEncoding()).thenReturn("UTF-8");
+		Mockito.when(httpRequest.getContextPath()).thenReturn("/contextPath");
+		Mockito.when(httpRequest.getRequestURI()).thenReturn("/contextPath/filterPath/anything");
+
+		ServletWebRequest request = new ServletWebRequest(httpRequest, "filterPath/");
+
+		assertEquals("../../../../../", r1.renderContextPathRelativeUrl("", request));
+		assertEquals("../../../../../", r1.renderContextPathRelativeUrl("/", request));
+		assertEquals("../../../../../f", r1.renderContextPathRelativeUrl("/f", request));
+		assertEquals("../../../../../../f", r1.renderContextPathRelativeUrl("../f", request));
+
+		try
+		{
+			r1.renderContextPathRelativeUrl(null, request);
+			fail("Null 'url' is not allowed!");
+		}
+		catch (IllegalArgumentException iax)
+		{
+			assertTrue(true);
+		}
+	}
 }