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