ClientInfo and newBrowserInfoPage have been added to Session though they are web related. IMO they belong into WebSession.
-Juergen On Sun, Aug 15, 2010 at 5:57 PM, <[email protected]> wrote: > 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); > + } > + } > } > > >
