Author: knopp
Date: Tue Mar 31 11:20:57 2009
New Revision: 760398

URL: http://svn.apache.org/viewvc?rev=760398&view=rev
Log:
even more cool stuff

Added:
    
wicket/sandbox/knopp/experimental/wicket-ng/src/main/java/org/apache/wicket/PageFactory.java
   (contents, props changed)
      - copied, changed from r759532, 
wicket/sandbox/knopp/experimental/wicket-ng/src/main/java/org/apache/wicket/IPageFactory.java
    
wicket/sandbox/knopp/experimental/wicket-ng/src/main/java/org/apache/wicket/page/persistent/disk/
    
wicket/sandbox/knopp/experimental/wicket-ng/src/main/java/org/apache/wicket/request/encoder/BufferedResponseEncoder.java
   (with props)
    
wicket/sandbox/knopp/experimental/wicket-ng/src/main/java/org/apache/wicket/request/handler/impl/BufferedResponseRequestHandler.java
   (with props)
Removed:
    
wicket/sandbox/knopp/experimental/wicket-ng/src/main/java/org/apache/wicket/IPageFactory.java
Modified:
    
wicket/sandbox/knopp/experimental/wicket-ng-webapp/src/main/java/org/apache/wicket/ngwebapp/TestPage1.java
    
wicket/sandbox/knopp/experimental/wicket-ng/src/main/java/org/apache/wicket/DefaultPageFactory.java
    
wicket/sandbox/knopp/experimental/wicket-ng/src/main/java/org/apache/wicket/protocol/http/WebApplication.java
    
wicket/sandbox/knopp/experimental/wicket-ng/src/main/java/org/apache/wicket/request/RequestHandlerEncoderRegistry.java
    
wicket/sandbox/knopp/experimental/wicket-ng/src/main/java/org/apache/wicket/request/UrlRenderer.java
    
wicket/sandbox/knopp/experimental/wicket-ng/src/main/java/org/apache/wicket/request/handler/impl/ListenerInterfaceRequestHandler.java
    
wicket/sandbox/knopp/experimental/wicket-ng/src/main/java/org/apache/wicket/request/handler/impl/RenderPageRequestHandler.java
    
wicket/sandbox/knopp/experimental/wicket-ng/src/test/java/org/apache/wicket/request/UrlRendererTest.java

Modified: 
wicket/sandbox/knopp/experimental/wicket-ng-webapp/src/main/java/org/apache/wicket/ngwebapp/TestPage1.java
URL: 
http://svn.apache.org/viewvc/wicket/sandbox/knopp/experimental/wicket-ng-webapp/src/main/java/org/apache/wicket/ngwebapp/TestPage1.java?rev=760398&r1=760397&r2=760398&view=diff
==============================================================================
--- 
wicket/sandbox/knopp/experimental/wicket-ng-webapp/src/main/java/org/apache/wicket/ngwebapp/TestPage1.java
 (original)
+++ 
wicket/sandbox/knopp/experimental/wicket-ng-webapp/src/main/java/org/apache/wicket/ngwebapp/TestPage1.java
 Tue Mar 31 11:20:57 2009
@@ -21,8 +21,13 @@
                                getPageParameters().setIndexedParameter(0, 
"indexed1");
                                getPageParameters().setIndexedParameter(1, 
"indexed2");
                                getPageParameters().setIndexedParameter(2, 
"indexed3");
+                               
+                               // necessary on stateless page          
+                               if (getPage().isPageStateless())
+                                       
RequestCycle.get().setResponsePage(getPage());
                        }
                };
+               l1.setBookmarkable(true);
                l1.setLabel("Link 1 - Add Some Parameters");
                add(l1);
                
@@ -38,6 +43,10 @@
                                System.out.println("link 2 clicked");
                                getPageParameters().removeNamedParameter("p1");
                                getPageParameters().clearIndexedParameters();
+                               
+                               if (getPage().isPageStateless())
+                               // necessary on stateless page
+                                       
RequestCycle.get().setResponsePage(getPage());
                        }
                };
                l2.setLabel("Link 2 - Remove The Parameters   (this link is 
bookmarkable listener interface!)");
@@ -94,9 +103,19 @@
                add(l5);
        }
 
+       private boolean rendered = false;
+       
        @Override
        public void renderPage()
        {
                super.renderPage();
+               rendered = true;
+       }
+       
+       @Override
+       public boolean isPageStateless()
+       {
+               return false;
+//             return !rendered;
        }
 }

Modified: 
wicket/sandbox/knopp/experimental/wicket-ng/src/main/java/org/apache/wicket/DefaultPageFactory.java
URL: 
http://svn.apache.org/viewvc/wicket/sandbox/knopp/experimental/wicket-ng/src/main/java/org/apache/wicket/DefaultPageFactory.java?rev=760398&r1=760397&r2=760398&view=diff
==============================================================================
--- 
wicket/sandbox/knopp/experimental/wicket-ng/src/main/java/org/apache/wicket/DefaultPageFactory.java
 (original)
+++ 
wicket/sandbox/knopp/experimental/wicket-ng/src/main/java/org/apache/wicket/DefaultPageFactory.java
 Tue Mar 31 11:20:57 2009
@@ -26,19 +26,19 @@
 /**
  * A factory that constructs Pages.
  * 
- * @see 
org.apache.wicket.settings.ISessionSettings#setPageFactory(IPageFactory)
- * @see IPageFactory
+ * @see org.apache.wicket.settings.ISessionSettings#setPageFactory(PageFactory)
+ * @see PageFactory
  * 
  * @author Juergen Donnerstag
  * @author Jonathan Locke
  */
-public final class DefaultPageFactory implements IPageFactory
+public final class DefaultPageFactory implements PageFactory
 {
        /** Map of Constructors for Page subclasses */
        private final Map<Class<?>, Constructor<?>> constructorForClass = 
Generics.newConcurrentHashMap();
 
        /**
-        * @see IPageFactory#newPage(Class)
+        * @see PageFactory#newPage(Class)
         */
        public final <C extends IPage> Page newPage(final Class<C> pageClass)
        {
@@ -67,7 +67,7 @@
        }
 
        /**
-        * @see IPageFactory#newPage(Class, PageParameters)
+        * @see PageFactory#newPage(Class, PageParameters)
         */
        public final <C extends IPage> Page newPage(final Class<C> pageClass,
                final PageParameters parameters)
@@ -83,7 +83,7 @@
                }
 
                // Always try default constructor if one exists
-               return processPage(newPage(pageClass), null);
+               return processPage(newPage(pageClass), parameters);
        }
 
        /**

Copied: 
wicket/sandbox/knopp/experimental/wicket-ng/src/main/java/org/apache/wicket/PageFactory.java
 (from r759532, 
wicket/sandbox/knopp/experimental/wicket-ng/src/main/java/org/apache/wicket/IPageFactory.java)
URL: 
http://svn.apache.org/viewvc/wicket/sandbox/knopp/experimental/wicket-ng/src/main/java/org/apache/wicket/PageFactory.java?p2=wicket/sandbox/knopp/experimental/wicket-ng/src/main/java/org/apache/wicket/PageFactory.java&p1=wicket/sandbox/knopp/experimental/wicket-ng/src/main/java/org/apache/wicket/IPageFactory.java&r1=759532&r2=760398&rev=760398&view=diff
==============================================================================
--- 
wicket/sandbox/knopp/experimental/wicket-ng/src/main/java/org/apache/wicket/IPageFactory.java
 (original)
+++ 
wicket/sandbox/knopp/experimental/wicket-ng/src/main/java/org/apache/wicket/PageFactory.java
 Tue Mar 31 11:20:57 2009
@@ -32,7 +32,7 @@
  * @author Juergen Donnerstag
  * @author Jonathan Locke
  */
-public interface IPageFactory
+public interface PageFactory
 {
        /**
         * Creates a new page using a page class.

Propchange: 
wicket/sandbox/knopp/experimental/wicket-ng/src/main/java/org/apache/wicket/PageFactory.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: 
wicket/sandbox/knopp/experimental/wicket-ng/src/main/java/org/apache/wicket/protocol/http/WebApplication.java
URL: 
http://svn.apache.org/viewvc/wicket/sandbox/knopp/experimental/wicket-ng/src/main/java/org/apache/wicket/protocol/http/WebApplication.java?rev=760398&r1=760397&r2=760398&view=diff
==============================================================================
--- 
wicket/sandbox/knopp/experimental/wicket-ng/src/main/java/org/apache/wicket/protocol/http/WebApplication.java
 (original)
+++ 
wicket/sandbox/knopp/experimental/wicket-ng/src/main/java/org/apache/wicket/protocol/http/WebApplication.java
 Tue Mar 31 11:20:57 2009
@@ -22,7 +22,7 @@
 import org.apache.wicket.Application;
 import org.apache.wicket.DefaultPageFactory;
 import org.apache.wicket.IPage;
-import org.apache.wicket.IPageFactory;
+import org.apache.wicket.PageFactory;
 import org.apache.wicket.Page;
 import org.apache.wicket.PageParameters;
 import org.apache.wicket.RequestCycle;
@@ -33,6 +33,7 @@
 import org.apache.wicket.request.RequestHandlerEncoderRegistry;
 import org.apache.wicket.request.Url;
 import org.apache.wicket.request.encoder.BookmarkableEncoder;
+import org.apache.wicket.request.encoder.BufferedResponseEncoder;
 import org.apache.wicket.request.encoder.EncoderContext;
 import org.apache.wicket.request.encoder.PageInstanceEncoder;
 import org.apache.wicket.request.encoder.ResourceReferenceEncoder;
@@ -56,6 +57,7 @@
                mount(new PageInstanceEncoder());
                mount(new BookmarkableEncoder());
                mount(new ResourceReferenceEncoder());
+               mount(new BufferedResponseEncoder());
        }
        
 
@@ -199,9 +201,9 @@
                return resourceReferenceRegistry;
        }
 
-       private IPageFactory pageFactory = new DefaultPageFactory();
+       private PageFactory pageFactory = new DefaultPageFactory();
 
-       public IPageFactory getPageFactory()
+       public PageFactory getPageFactory()
        {
                return pageFactory;
        }
@@ -216,6 +218,12 @@
        // TODO: Do this properly
        private Map<String, BufferedWebResponse> storedResponses = new 
ConcurrentHashMap<String, BufferedWebResponse>();
 
+       public boolean hasBufferedResponse(String sessionId, Url url)
+       {
+               String key = sessionId + url.toString();
+               return storedResponses.containsKey(key);
+       }
+       
        public BufferedWebResponse getAndRemoveBufferedResponse(String 
sessionId, Url url)
        {
                String key = sessionId + url.toString();

Modified: 
wicket/sandbox/knopp/experimental/wicket-ng/src/main/java/org/apache/wicket/request/RequestHandlerEncoderRegistry.java
URL: 
http://svn.apache.org/viewvc/wicket/sandbox/knopp/experimental/wicket-ng/src/main/java/org/apache/wicket/request/RequestHandlerEncoderRegistry.java?rev=760398&r1=760397&r2=760398&view=diff
==============================================================================
--- 
wicket/sandbox/knopp/experimental/wicket-ng/src/main/java/org/apache/wicket/request/RequestHandlerEncoderRegistry.java
 (original)
+++ 
wicket/sandbox/knopp/experimental/wicket-ng/src/main/java/org/apache/wicket/request/RequestHandlerEncoderRegistry.java
 Tue Mar 31 11:20:57 2009
@@ -16,6 +16,9 @@
  */
 package org.apache.wicket.request;
 
+import java.security.spec.ECField;
+import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 import java.util.concurrent.CopyOnWriteArrayList;
 
@@ -50,11 +53,41 @@
        {
                encoders.remove(encoder);
        }
+       
+       private static class EncoderWithSegmentsCount implements 
Comparable<EncoderWithSegmentsCount>
+       {
+               private final RequestHandlerEncoder encoder;
+               private final int segmentsCount;
+               
+               public EncoderWithSegmentsCount(RequestHandlerEncoder encoder, 
int segmentsCount)
+               {
+                       this.encoder = encoder;
+                       this.segmentsCount = segmentsCount;                     
+               }
+               
+               public int compareTo(EncoderWithSegmentsCount o)
+               {
+                       return o.segmentsCount - this.segmentsCount;
+               }
+               
+               public RequestHandlerEncoder getEncoder()
+               {
+                       return encoder;
+               }
+               
+               public int getSegmentsCount()
+               {
+                       return segmentsCount;
+               }
+       };
 
        /**
         * Searches the registered {...@link RequestHandlerEncoder}s to find 
one that can decode the
-        * {...@link Request}. Each registered {...@link RequestHandlerEncoder} 
is asked to decode the
-        * {...@link Request}. The encoder with highest matching segments count 
that can decode the
+        * {...@link Request}. Each registered {...@link RequestHandlerEncoder} 
is asked to provide the
+        * matching segments count. Then the encoders are asked to decode the 
request in order
+        * depending on the provided segments count.
+        * <p>
+        * The encoder with highest matching segments count that can decode the
         * request is returned.
         * 
         * @param request
@@ -63,44 +96,25 @@
         */
        public RequestHandler decode(Request request)
        {
-               // last found RequestHandler with highest matching segments 
count
-               RequestHandler last = null;
-               int maxMatchingSegmentsCount = -1;
-
+               List<EncoderWithSegmentsCount> list = new 
ArrayList<EncoderWithSegmentsCount>(encoders.size());
+               
                for (RequestHandlerEncoder encoder : encoders)
                {
-                       // no handler has been found yet
-                       if (last == null)
-                       {
-                               // try to get the handler immediately, at this 
point we don't care for matching
-                               // segments count
-                               last = encoder.decode(request);
-                               if (last != null)
-                               {
-                                       // found one - get the matching 
segments count so that it can be compared
-                                       // to other encoders found later
-                                       maxMatchingSegmentsCount = 
encoder.getMachingSegmentsCount(request);
-                               }
-                       }
-                       else
+                       list.add(new EncoderWithSegmentsCount(encoder, 
encoder.getMachingSegmentsCount(request)));
+               }
+
+               Collections.sort(list);
+
+               for (EncoderWithSegmentsCount encoder : list)
+               {
+                       RequestHandler handler = 
encoder.getEncoder().decode(request);
+                       if (handler != null)
                        {
-                               // we already have a handler, try to find out 
if this one has bigger matching
-                               // segments count
-                               int count = 
encoder.getMachingSegmentsCount(request);
-                               if (count > maxMatchingSegmentsCount)
-                               {
-                                       // seems so
-                                       RequestHandler handler = 
encoder.decode(request);
-                                       if (handler != null)
-                                       {
-                                               // replace the last one
-                                               last = handler;
-                                               maxMatchingSegmentsCount = 
count;
-                                       }
-                               }
+                               return handler;
                        }
                }
-               return last;
+               
+               return null;
        }
 
        /**

Modified: 
wicket/sandbox/knopp/experimental/wicket-ng/src/main/java/org/apache/wicket/request/UrlRenderer.java
URL: 
http://svn.apache.org/viewvc/wicket/sandbox/knopp/experimental/wicket-ng/src/main/java/org/apache/wicket/request/UrlRenderer.java?rev=760398&r1=760397&r2=760398&view=diff
==============================================================================
--- 
wicket/sandbox/knopp/experimental/wicket-ng/src/main/java/org/apache/wicket/request/UrlRenderer.java
 (original)
+++ 
wicket/sandbox/knopp/experimental/wicket-ng/src/main/java/org/apache/wicket/request/UrlRenderer.java
 Tue Mar 31 11:20:57 2009
@@ -113,7 +113,7 @@
                        }
                        
                        // we want the new URL to have at least one segment 
(other than possible ../)
-                       if (urlSegments.isEmpty() && last != null)
+                       if (last != null && (urlSegments.isEmpty() || 
baseUrlSegments.size() == common))
                        {
                                --common;
                                urlSegments.add(0, last);

Added: 
wicket/sandbox/knopp/experimental/wicket-ng/src/main/java/org/apache/wicket/request/encoder/BufferedResponseEncoder.java
URL: 
http://svn.apache.org/viewvc/wicket/sandbox/knopp/experimental/wicket-ng/src/main/java/org/apache/wicket/request/encoder/BufferedResponseEncoder.java?rev=760398&view=auto
==============================================================================
--- 
wicket/sandbox/knopp/experimental/wicket-ng/src/main/java/org/apache/wicket/request/encoder/BufferedResponseEncoder.java
 (added)
+++ 
wicket/sandbox/knopp/experimental/wicket-ng/src/main/java/org/apache/wicket/request/encoder/BufferedResponseEncoder.java
 Tue Mar 31 11:20:57 2009
@@ -0,0 +1,91 @@
+package org.apache.wicket.request.encoder;
+
+import org.apache.wicket.RequestCycle;
+import org.apache.wicket.protocol.http.WebApplication;
+import org.apache.wicket.request.RequestHandler;
+import org.apache.wicket.request.RequestHandlerEncoder;
+import org.apache.wicket.request.Url;
+import org.apache.wicket.request.handler.impl.BufferedResponseRequestHandler;
+import org.apache.wicket.request.request.Request;
+import org.apache.wicket.request.response.BufferedWebResponse;
+
+/**
+ * Encoder that intercepts requests for which there is already stored buffer 
with rendered data.
+ * 
+ * @author Matej Knopp
+ */
+public class BufferedResponseEncoder implements RequestHandlerEncoder
+{
+
+       public BufferedResponseEncoder()
+       {
+       }
+
+       protected String getSessionId()
+       {
+               // TODO - get current session id
+               return "";
+       }
+
+       protected boolean hasBufferedResponse(Url url)
+       {
+               return WebApplication.get().hasBufferedResponse(getSessionId(), 
url);
+       }
+
+       protected BufferedWebResponse getAndRemoveBufferedResponse(Url url)
+       {
+               return 
WebApplication.get().getAndRemoveBufferedResponse(getSessionId(), url);
+       }
+       
+       private Request getRequest(Request original)
+       {
+               // The buffers are stored under "real" URL which can be 
different
+               // than the URL handlers get due to global URL 
pre/postprocessing
+               // (i.e. prepending URL with language segment).
+               // Because of that we need find out the real URL from request 
cycle
+               
+               if (RequestCycle.get() != null)
+               {
+                       return RequestCycle.get().getRequest();
+               }
+               else
+               {
+                       return original;
+               }
+       }
+       
+       public RequestHandler decode(Request request)
+       {               
+               request = getRequest(request);
+               
+               BufferedWebResponse response = 
getAndRemoveBufferedResponse(request.getUrl());
+               if (response != null)
+               {
+                       return new BufferedResponseRequestHandler(response);
+               }
+               else
+               {
+                       return null;
+               }
+       }
+
+       public Url encode(RequestHandler requestHandler)
+       {
+               return null;
+       }
+
+       public int getMachingSegmentsCount(Request request)
+       {
+               request = getRequest(request);
+               
+               if (hasBufferedResponse(request.getUrl()))
+               {
+                       return Integer.MAX_VALUE;
+               }
+               else
+               {
+                       return 0;
+               }
+       }
+
+}

Propchange: 
wicket/sandbox/knopp/experimental/wicket-ng/src/main/java/org/apache/wicket/request/encoder/BufferedResponseEncoder.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: 
wicket/sandbox/knopp/experimental/wicket-ng/src/main/java/org/apache/wicket/request/handler/impl/BufferedResponseRequestHandler.java
URL: 
http://svn.apache.org/viewvc/wicket/sandbox/knopp/experimental/wicket-ng/src/main/java/org/apache/wicket/request/handler/impl/BufferedResponseRequestHandler.java?rev=760398&view=auto
==============================================================================
--- 
wicket/sandbox/knopp/experimental/wicket-ng/src/main/java/org/apache/wicket/request/handler/impl/BufferedResponseRequestHandler.java
 (added)
+++ 
wicket/sandbox/knopp/experimental/wicket-ng/src/main/java/org/apache/wicket/request/handler/impl/BufferedResponseRequestHandler.java
 Tue Mar 31 11:20:57 2009
@@ -0,0 +1,27 @@
+package org.apache.wicket.request.handler.impl;
+
+import org.apache.wicket.RequestCycle;
+import org.apache.wicket.request.RequestHandler;
+import org.apache.wicket.request.response.BufferedWebResponse;
+import org.apache.wicket.request.response.WebResponse;
+
+public class BufferedResponseRequestHandler implements RequestHandler
+{
+       private final BufferedWebResponse bufferedWebResponse;
+       
+       public BufferedResponseRequestHandler(BufferedWebResponse 
bufferedWebResponse)
+       {
+               this.bufferedWebResponse = bufferedWebResponse;
+       }
+       
+       public void detach(RequestCycle requestCycle)
+       {
+
+       }
+
+       public void respond(RequestCycle requestCycle)
+       {
+               bufferedWebResponse.writeTo((WebResponse) 
requestCycle.getResponse());
+       }
+
+}

Propchange: 
wicket/sandbox/knopp/experimental/wicket-ng/src/main/java/org/apache/wicket/request/handler/impl/BufferedResponseRequestHandler.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: 
wicket/sandbox/knopp/experimental/wicket-ng/src/main/java/org/apache/wicket/request/handler/impl/ListenerInterfaceRequestHandler.java
URL: 
http://svn.apache.org/viewvc/wicket/sandbox/knopp/experimental/wicket-ng/src/main/java/org/apache/wicket/request/handler/impl/ListenerInterfaceRequestHandler.java?rev=760398&r1=760397&r2=760398&view=diff
==============================================================================
--- 
wicket/sandbox/knopp/experimental/wicket-ng/src/main/java/org/apache/wicket/request/handler/impl/ListenerInterfaceRequestHandler.java
 (original)
+++ 
wicket/sandbox/knopp/experimental/wicket-ng/src/main/java/org/apache/wicket/request/handler/impl/ListenerInterfaceRequestHandler.java
 Tue Mar 31 11:20:57 2009
@@ -25,6 +25,7 @@
 import org.apache.wicket.behavior.IBehavior;
 import org.apache.wicket.request.handler.ComponentRequestHandler;
 import org.apache.wicket.request.handler.PageRequestHandler;
+import 
org.apache.wicket.request.handler.impl.RenderPageRequestHandler.RedirectPolicy;
 
 /**
  * Request handler that invokes the listener interface on component and 
renders page afterwards.
@@ -146,7 +147,8 @@
                                }
 
                        }
-                       requestCycle.replaceCurrentRequestHandler(new 
RenderPageRequestHandler(this.page));
+                       RedirectPolicy policy = page.isPageStateless() ? 
RedirectPolicy.NEVER_REDIRECT : RedirectPolicy.AUTO_REDIRECT;
+                       requestCycle.replaceCurrentRequestHandler(new 
RenderPageRequestHandler(this.page, policy));
                }
                else
                {

Modified: 
wicket/sandbox/knopp/experimental/wicket-ng/src/main/java/org/apache/wicket/request/handler/impl/RenderPageRequestHandler.java
URL: 
http://svn.apache.org/viewvc/wicket/sandbox/knopp/experimental/wicket-ng/src/main/java/org/apache/wicket/request/handler/impl/RenderPageRequestHandler.java?rev=760398&r1=760397&r2=760398&view=diff
==============================================================================
--- 
wicket/sandbox/knopp/experimental/wicket-ng/src/main/java/org/apache/wicket/request/handler/impl/RenderPageRequestHandler.java
 (original)
+++ 
wicket/sandbox/knopp/experimental/wicket-ng/src/main/java/org/apache/wicket/request/handler/impl/RenderPageRequestHandler.java
 Tue Mar 31 11:20:57 2009
@@ -28,6 +28,8 @@
 import org.apache.wicket.request.response.Response;
 import org.apache.wicket.request.response.WebResponse;
 import org.apache.wicket.settings.RequestCycleSettings;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * {...@link RequestHandler} that renders page instance. Depending on the 
<code>redirectPolicy</code>
@@ -64,7 +66,7 @@
                 * met:
                 * <ul>
                 * <li>current request URL is different than page URL
-                * <li>page is not stateless
+                * <li>page is not stateless or (page is stateless and but 
session is not temporary)
                 * <li>render strategy is either REDIRECT_TO_BUFFER or 
REDIRECT_TO_RENDER</li>
                 */
                AUTO_REDIRECT
@@ -140,16 +142,26 @@
                page.renderPage();
        }
 
+       protected String getSessionId()
+       {
+               // TODO - get current session id
+               return "";
+       }
+
+       protected boolean isSessionTemporary()
+       {
+               // TODO - determine if current session is temporary
+               return true;
+       }
+
        protected BufferedWebResponse getAndRemoveBufferedResponse(Url url)
        {
-               // TODO: SessionId
-               return WebApplication.get().getAndRemoveBufferedResponse("", 
url);
+               return 
WebApplication.get().getAndRemoveBufferedResponse(getSessionId(), url);
        }
 
        protected void storeBufferedResponse(Url url, BufferedWebResponse 
response)
        {
-               // TODO: SessionId
-               WebApplication.get().storeBufferedResponse("", url, response);
+               WebApplication.get().storeBufferedResponse(getSessionId(), url, 
response);
        }
 
        /**
@@ -209,20 +221,39 @@
 
                if (bufferedResponse != null)
                {
+                       logger.warn("The Buffered response should be handled by 
BufferedResponseRequestHandler");
                        // if there is saved response for this URL render it
                        bufferedResponse.writeTo((WebResponse) 
requestCycle.getResponse());
                }
-               else if (redirectPolicy == RedirectPolicy.NEVER_REDIRECT || 
isOnePassRender() || targetUrl.equals(currentUrl)
-                               || (isRedirectToRender() && 
page.isPageStateless()))
+               else if (redirectPolicy == RedirectPolicy.NEVER_REDIRECT || 
isOnePassRender() // 
+                               || (targetUrl.equals(currentUrl) && 
!page.isPageStateless()) //
+                               || (targetUrl.equals(currentUrl) && 
isRedirectToRender() && page.isPageStateless()))
                {
                        // if the policy is never to redirect
                        // or one pass render mode is on
-                       // or the targetUrl matches current url
+                       // or the targetUrl matches current url and the page is 
not stateless
+                       // or the targetUrl matches current url, page is 
stateless but it's redirect-to-render
                        // just render the page
                        renderPage();
                }
-               else if (redirectPolicy == RedirectPolicy.ALWAYS_REDIRECT || 
isRedirectToRender())
+               else if (!targetUrl.equals(currentUrl) //
+                               && (redirectPolicy == 
RedirectPolicy.ALWAYS_REDIRECT || isRedirectToRender()))
                {
+                       // if target URL is different
+                       // and render policy is always-redirect or it's 
redirect-to-render
+                       redirectTo(targetUrl, requestCycle);
+               }
+               else if (!targetUrl.equals(currentUrl) //
+                               && isSessionTemporary() && 
page.isPageStateless())              
+               {
+                       // if target URL is different and session is temporary 
and page is stateless
+                       // this is  special case when page is stateless but 
there is no session so we can't render it to buffer
+                       
+                       // note: if we had session here we would render the 
page to buffer and then redirect to URL generated 
+                       // *after* page has been rendered (the statelessness 
may change during request). this would save one redirect
+                       // because now we have to render to URL generated 
*before* page is rendered, render the page, get URL
+                       // after render and if the URL is different (meaning 
page is not stateless), save the buffer and redirect again
+                       // (which is pretty much what the next step does)
                        redirectTo(targetUrl, requestCycle);
                }
                else if (isRedirectToBuffer())
@@ -243,6 +274,7 @@
                                response = renderPage(targetUrl2, requestCycle);
                        }
 
+                       // if page is still stateless after render
                        if (page.isPageStateless() && 
!enableRedirectForStatelessPage())
                        {
                                // we don't want the redirect to happen for 
stateless page
@@ -261,7 +293,7 @@
 
                                redirectTo(targetUrl2, requestCycle);
                        }
-               } 
+               }
                else
                {
                        throw new IllegalStateException("Unknown 
RenderStrategy.");
@@ -290,4 +322,6 @@
        {
                return page.getPageParameters();
        }
+
+       private static Logger logger = 
LoggerFactory.getLogger(RenderPageRequestHandler.class);
 }

Modified: 
wicket/sandbox/knopp/experimental/wicket-ng/src/test/java/org/apache/wicket/request/UrlRendererTest.java
URL: 
http://svn.apache.org/viewvc/wicket/sandbox/knopp/experimental/wicket-ng/src/test/java/org/apache/wicket/request/UrlRendererTest.java?rev=760398&r1=760397&r2=760398&view=diff
==============================================================================
--- 
wicket/sandbox/knopp/experimental/wicket-ng/src/test/java/org/apache/wicket/request/UrlRendererTest.java
 (original)
+++ 
wicket/sandbox/knopp/experimental/wicket-ng/src/test/java/org/apache/wicket/request/UrlRendererTest.java
 Tue Mar 31 11:20:57 2009
@@ -33,6 +33,7 @@
        {
                UrlRenderer r1 = new UrlRenderer(Url.parse("foo/bar/baz?a=b"));
                assertEquals("xyz?x=y", 
r1.renderUrl(Url.parse("foo/bar/xyz?x=y")));
+               assertEquals("baz/xyz?x=y", 
r1.renderUrl(Url.parse("foo/bar/baz/xyz?x=y")));
                assertEquals("../aaa/xyz?x=y", 
r1.renderUrl(Url.parse("foo/aaa/xyz?x=y")));
                assertEquals("../../bbb/aaa/xyz?x=y", 
r1.renderUrl(Url.parse("bbb/aaa/xyz?x=y")));
        }
@@ -82,4 +83,13 @@
                UrlRenderer r1 = new 
UrlRenderer(Url.parse("MyTestPage/indexed1/indexed2/indexed3?10-27.ILinkListener-l2&p1=v1"));
                assertEquals("../../../MyTestPage?10", 
r1.renderUrl(Url.parse("MyTestPage?10")));
        }
+       
+       /**
+        * 
+        */
+       public void test8()
+       {
+               UrlRenderer r1 = new 
UrlRenderer(Url.parse("en/first-test-page?16-1.ILinkListener-l1"));
+               
assertEquals("first-test-page/indexed1/indexed2/indexed3?p1=v1", 
r1.renderUrl(Url.parse("en/first-test-page/indexed1/indexed2/indexed3?p1=v1")));
+       }
 }


Reply via email to