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