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

Reply via email to