I agree for BrowserInfoPage! Will move it to WebSession. Not sure about ClientInfo ... WebSession returns the specialization WebClientInfo
On Sun, Aug 15, 2010 at 8:43 PM, Juergen Donnerstag < [email protected]> wrote: > 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); > > + } > > + } > > } > > > > > > >
