You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by iv...@apache.org on 2009/12/04 06:24:50 UTC

svn commit: r887067 - in /wicket/trunk/wicket/src: main/java/org/apache/wicket/ main/java/org/apache/wicket/ng/ main/java/org/apache/wicket/ng/markup/html/form/ main/java/org/apache/wicket/ng/markup/html/link/ main/java/org/apache/wicket/ng/mock/ main/...

Author: ivaynberg
Date: Fri Dec  4 05:24:46 2009
New Revision: 887067

URL: http://svn.apache.org/viewvc?rev=887067&view=rev
Log:
wip: wicket-ng merging

Removed:
    wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/DefaultPageFactory.java
    wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/component/PageFactory.java
    wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/response/
Modified:
    wicket/trunk/wicket/src/main/java/org/apache/wicket/IPageFactory.java
    wicket/trunk/wicket/src/main/java/org/apache/wicket/Response.java
    wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/Application.java
    wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/markup/html/form/Form.java
    wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/markup/html/link/Link.java
    wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/mock/MockWebResponse.java
    wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/protocol/http/WebApplication.java
    wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/protocol/http/WicketFilter.java
    wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/cycle/RequestCycle.java
    wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/cycle/RequestCycleContext.java
    wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/cycle/RequestHandlerStack.java
    wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/handler/impl/BufferedResponseRequestHandler.java
    wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/handler/impl/render/WebRenderPageRequestHandlerDelegate.java
    wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/mapper/BufferedResponseMapper.java
    wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/resource/Resource.java
    wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/BufferedWebResponse.java
    wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/WebResponse.java
    wicket/trunk/wicket/src/main/java/org/apache/wicket/response/ConsoleResponse.java
    wicket/trunk/wicket/src/main/java/org/apache/wicket/response/FileResponse.java
    wicket/trunk/wicket/src/main/java/org/apache/wicket/response/NullResponse.java
    wicket/trunk/wicket/src/main/java/org/apache/wicket/response/StringResponse.java
    wicket/trunk/wicket/src/main/java/org/apache/wicket/session/DefaultPageFactory.java
    wicket/trunk/wicket/src/test/java/org/apache/wicket/ng/request/cycle/RequestHandlerStackTest.java

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/IPageFactory.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/IPageFactory.java?rev=887067&r1=887066&r2=887067&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/IPageFactory.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/IPageFactory.java Fri Dec  4 05:24:46 2009
@@ -16,6 +16,10 @@
  */
 package org.apache.wicket;
 
+import org.apache.wicket.ng.WicketRuntimeException;
+import org.apache.wicket.ng.request.component.PageParametersNg;
+import org.apache.wicket.ng.request.component.RequestablePage;
+
 
 /**
  * A factory class that creates Pages. A Page can be created by Class, with or without a
@@ -31,6 +35,7 @@
  * @author Juergen Donnerstag
  * @author Jonathan Locke
  */
+// TODO WICKET-NG change Page to RequestablePage
 public interface IPageFactory
 {
 	/**
@@ -60,6 +65,26 @@
 	 * @return The new page
 	 * @throws WicketRuntimeException
 	 *             Thrown if the page cannot be constructed
+	 * @deprecated
 	 */
+	@Deprecated
 	<C extends Page> Page newPage(final Class<C> pageClass, final PageParameters parameters);
+
+	/**
+	 * Creates a new Page, passing PageParameters to the Page constructor if such a constructor
+	 * exists. If no such constructor exists and the parameters argument is null or empty, then any
+	 * available default constructor will be used.
+	 * 
+	 * @param <C>
+	 * 
+	 * @param pageClass
+	 *            The class of Page to create
+	 * @param parameters
+	 *            Any parameters to pass to the Page's constructor
+	 * @return The new page
+	 * @throws WicketRuntimeException
+	 *             Thrown if the page cannot be constructed
+	 */
+	<C extends Page> RequestablePage newPage(final Class<C> pageClass,
+		final PageParametersNg parameters);
 }

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/Response.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/Response.java?rev=887067&r1=887066&r2=887067&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/Response.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/Response.java Fri Dec  4 05:24:46 2009
@@ -239,6 +239,15 @@
 	public abstract void write(final CharSequence string);
 
 	/**
+	 * Writes the buffer to output.
+	 * 
+	 * @param array
+	 * @throws IllegalStateException
+	 *             if {@link #write(CharSequence)} has already been called on this instance
+	 */
+	public abstract void write(byte[] array);
+
+	/**
 	 * Writes the given strings to the Response subclass output destination.
 	 * 
 	 * @param string

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/Application.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/Application.java?rev=887067&r1=887066&r2=887067&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/Application.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/Application.java Fri Dec  4 05:24:46 2009
@@ -20,8 +20,10 @@
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
+import org.apache.wicket.IPageFactory;
 import org.apache.wicket.MetaDataKey;
 import org.apache.wicket.Page;
+import org.apache.wicket.Response;
 import org.apache.wicket.application.DefaultClassResolver;
 import org.apache.wicket.application.IClassResolver;
 import org.apache.wicket.ng.page.PageManager;
@@ -33,7 +35,6 @@
 import org.apache.wicket.ng.page.persistent.disk.DiskDataStore;
 import org.apache.wicket.ng.request.Request;
 import org.apache.wicket.ng.request.RequestMapper;
-import org.apache.wicket.ng.request.component.PageFactory;
 import org.apache.wicket.ng.request.component.PageParametersNg;
 import org.apache.wicket.ng.request.component.RequestablePage;
 import org.apache.wicket.ng.request.cycle.RequestCycle;
@@ -43,12 +44,12 @@
 import org.apache.wicket.ng.request.listener.RequestListenerInterface;
 import org.apache.wicket.ng.request.mapper.MapperContext;
 import org.apache.wicket.ng.request.mapper.ThreadsafeCompoundRequestMapper;
-import org.apache.wicket.ng.request.response.Response;
 import org.apache.wicket.ng.resource.ResourceReferenceRegistry;
 import org.apache.wicket.ng.session.SessionStore;
 import org.apache.wicket.ng.session.SessionStore.UnboundListener;
 import org.apache.wicket.ng.settings.ApplicationSettings;
 import org.apache.wicket.ng.settings.RequestCycleSettings;
+import org.apache.wicket.session.DefaultPageFactory;
 import org.apache.wicket.util.lang.Checks;
 
 /**
@@ -508,14 +509,14 @@
 		return resourceReferenceRegistry;
 	}
 
-	private PageFactory pageFactory;
+	private IPageFactory pageFactory;
 
 	/**
 	 * Override to create custom {@link PageFactory}
 	 * 
 	 * @return new {@link PageFactory} instance.
 	 */
-	protected PageFactory newPageFactory()
+	protected IPageFactory newPageFactory()
 	{
 		return new DefaultPageFactory();
 	}
@@ -525,7 +526,7 @@
 	 * 
 	 * @return
 	 */
-	public final PageFactory getPageFactory()
+	public final IPageFactory getPageFactory()
 	{
 		return pageFactory;
 	}
@@ -572,11 +573,11 @@
 		{
 			if (pageParameters == null)
 			{
-				return getPageFactory().newPage(pageClass);
+				return getPageFactory().newPage((Class<? extends Page>)pageClass);
 			}
 			else
 			{
-				return getPageFactory().newPage(pageClass, pageParameters);
+				return getPageFactory().newPage((Class<? extends Page>)pageClass, pageParameters);
 			}
 		}
 

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/markup/html/form/Form.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/markup/html/form/Form.java?rev=887067&r1=887066&r2=887067&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/markup/html/form/Form.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/markup/html/form/Form.java Fri Dec  4 05:24:46 2009
@@ -17,13 +17,13 @@
 package org.apache.wicket.ng.markup.html.form;
 
 import org.apache.wicket.Component;
+import org.apache.wicket.Response;
 import org.apache.wicket.ng.request.Request;
 import org.apache.wicket.ng.request.RequestHandler;
 import org.apache.wicket.ng.request.cycle.RequestCycle;
 import org.apache.wicket.ng.request.handler.PageAndComponentProvider;
 import org.apache.wicket.ng.request.handler.impl.BookmarkableListenerInterfaceRequestHandler;
 import org.apache.wicket.ng.request.handler.impl.ListenerInterfaceRequestHandler;
-import org.apache.wicket.ng.request.response.Response;
 
 public class Form extends Component implements IFormSubmitListener
 {

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/markup/html/link/Link.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/markup/html/link/Link.java?rev=887067&r1=887066&r2=887067&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/markup/html/link/Link.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/markup/html/link/Link.java Fri Dec  4 05:24:46 2009
@@ -18,12 +18,12 @@
 
 
 import org.apache.wicket.Component;
+import org.apache.wicket.Response;
 import org.apache.wicket.ng.request.RequestHandler;
 import org.apache.wicket.ng.request.cycle.RequestCycle;
 import org.apache.wicket.ng.request.handler.PageAndComponentProvider;
 import org.apache.wicket.ng.request.handler.impl.BookmarkableListenerInterfaceRequestHandler;
 import org.apache.wicket.ng.request.handler.impl.ListenerInterfaceRequestHandler;
-import org.apache.wicket.ng.request.response.Response;
 import org.apache.wicket.util.string.Strings;
 
 @SuppressWarnings("serial")

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/mock/MockWebResponse.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/mock/MockWebResponse.java?rev=887067&r1=887066&r2=887067&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/mock/MockWebResponse.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/mock/MockWebResponse.java Fri Dec  4 05:24:46 2009
@@ -18,6 +18,7 @@
 
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
+import java.io.OutputStream;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
@@ -28,10 +29,10 @@
 import javax.servlet.http.Cookie;
 
 import org.apache.wicket.ng.WicketRuntimeException;
-import org.apache.wicket.ng.request.response.WebResponse;
+import org.apache.wicket.protocol.http.WebResponse;
 
 /**
- * Mocked {@link WebResponse}.
+ * Mocked {@link WebResponse2}.
  * 
  * @author Matej Knopp
  */
@@ -70,7 +71,7 @@
 	private String redirectUrl;
 
 	@Override
-	public void sendRedirect(String url)
+	public void redirect(String url)
 	{
 		redirectUrl = url;
 	}
@@ -86,6 +87,7 @@
 	/**
 	 * @return <code>true</code> if redirect URL was set, <code>false</code> otherwise.
 	 */
+	@Override
 	public boolean isRedirect()
 	{
 		return redirectUrl != null;
@@ -205,9 +207,9 @@
 	}
 
 	@Override
-	public String encodeURL(String url)
+	public String encodeURL(CharSequence url)
 	{
-		return url;
+		return url.toString();
 	}
 
 	private StringBuilder textResponse;
@@ -269,4 +271,10 @@
 			return binaryResponse.toByteArray();
 		}
 	}
+
+	@Override
+	public OutputStream getOutputStream()
+	{
+		throw new UnsupportedOperationException();
+	}
 }

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/protocol/http/WebApplication.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/protocol/http/WebApplication.java?rev=887067&r1=887066&r2=887067&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/protocol/http/WebApplication.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/protocol/http/WebApplication.java Fri Dec  4 05:24:46 2009
@@ -28,9 +28,9 @@
 import org.apache.wicket.ng.request.handler.impl.render.RenderPageRequestHandlerDelegate;
 import org.apache.wicket.ng.request.handler.impl.render.WebRenderPageRequestHandlerDelegate;
 import org.apache.wicket.ng.request.mapper.SystemMapper;
-import org.apache.wicket.ng.request.response.BufferedWebResponse;
 import org.apache.wicket.ng.session.HttpSessionStore;
 import org.apache.wicket.ng.session.SessionStore;
+import org.apache.wicket.protocol.http.BufferedWebResponse;
 
 /**
  * 
@@ -40,82 +40,82 @@
 public abstract class WebApplication extends Application
 {
 
-    public WebApplication()
-    {
-        super();
-    }
-
-    @Override
-    protected void registerDefaultEncoders()
-    {
-        registerEncoder(new SystemMapper());
-    }
-
-    public void mount(RequestMapper encoder)
-    {
-        registerEncoder(encoder);
-    }
-
-    // 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();
-        return storedResponses.remove(key);
-    }
-
-    public void storeBufferedResponse(String sessionId, Url url, BufferedWebResponse response)
-    {
-        String key = sessionId + url.toString();
-        storedResponses.put(key, response);
-    }
-
-    @Override
-    protected SessionStore newSessionStore()
-    {
-        return new HttpSessionStore(this);
-    }
-
-    /**
-     * Gets the servlet context for this application. Use this to get references to absolute paths,
-     * global web.xml parameters (&lt;context-param&gt;), etc.
-     * 
-     * @return The servlet context for this application
-     */
-    public ServletContext getServletContext()
-    {
-        if (wicketFilter != null)
-        {
-            return wicketFilter.getFilterConfig().getServletContext();
-        }
-        throw new IllegalStateException("servletContext is not set yet. Any code in your"
-                + " Application object that uses the wicket filter instance should be put"
-                + " in the init() method instead of your constructor");
-    }
-
-    public void setWicketFilter(WicketFilter wicketFilter)
-    {
-        this.wicketFilter = wicketFilter;
-    }
-
-    private WicketFilter wicketFilter;
-
-    @Override
-    public RenderPageRequestHandlerDelegate getRenderPageRequestHandlerDelegate(
-            RenderPageRequestHandler renderPageRequestHandler)
-    {
-        return new WebRenderPageRequestHandlerDelegate(renderPageRequestHandler);
-    }
-
-    public static WebApplication get()
-    {
-        return (WebApplication)Application.get();
-    }
+	public WebApplication()
+	{
+		super();
+	}
+
+	@Override
+	protected void registerDefaultEncoders()
+	{
+		registerEncoder(new SystemMapper());
+	}
+
+	public void mount(RequestMapper encoder)
+	{
+		registerEncoder(encoder);
+	}
+
+	// TODO: Do this properly
+	private final 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();
+		return storedResponses.remove(key);
+	}
+
+	public void storeBufferedResponse(String sessionId, Url url, BufferedWebResponse response)
+	{
+		String key = sessionId + url.toString();
+		storedResponses.put(key, response);
+	}
+
+	@Override
+	protected SessionStore newSessionStore()
+	{
+		return new HttpSessionStore(this);
+	}
+
+	/**
+	 * Gets the servlet context for this application. Use this to get references to absolute paths,
+	 * global web.xml parameters (&lt;context-param&gt;), etc.
+	 * 
+	 * @return The servlet context for this application
+	 */
+	public ServletContext getServletContext()
+	{
+		if (wicketFilter != null)
+		{
+			return wicketFilter.getFilterConfig().getServletContext();
+		}
+		throw new IllegalStateException("servletContext is not set yet. Any code in your"
+			+ " Application object that uses the wicket filter instance should be put"
+			+ " in the init() method instead of your constructor");
+	}
+
+	public void setWicketFilter(WicketFilter wicketFilter)
+	{
+		this.wicketFilter = wicketFilter;
+	}
+
+	private WicketFilter wicketFilter;
+
+	@Override
+	public RenderPageRequestHandlerDelegate getRenderPageRequestHandlerDelegate(
+		RenderPageRequestHandler renderPageRequestHandler)
+	{
+		return new WebRenderPageRequestHandlerDelegate(renderPageRequestHandler);
+	}
+
+	public static WebApplication get()
+	{
+		return (WebApplication)Application.get();
+	}
 }

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/protocol/http/WicketFilter.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/protocol/http/WicketFilter.java?rev=887067&r1=887066&r2=887067&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/protocol/http/WicketFilter.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/protocol/http/WicketFilter.java Fri Dec  4 05:24:46 2009
@@ -33,7 +33,7 @@
 import org.apache.wicket.ng.ThreadContext;
 import org.apache.wicket.ng.WicketRuntimeException;
 import org.apache.wicket.ng.request.cycle.RequestCycle;
-import org.apache.wicket.ng.request.response.ServletWebResponse;
+import org.apache.wicket.protocol.http.WebResponse;
 import org.apache.wicket.protocol.http.WicketServlet;
 import org.apache.wicket.util.string.Strings;
 import org.slf4j.Logger;
@@ -136,7 +136,7 @@
 			if (checkForTrailingSlash(httpServletRequest, httpServletResponse, filterPath))
 			{
 				ServletWebRequest req = new ServletWebRequest(httpServletRequest, filterPath);
-				ServletWebResponse resp = new ServletWebResponse(httpServletResponse);
+				WebResponse resp = new WebResponse(httpServletResponse);
 
 				RequestCycle requestCycle = webApplication.createRequestCycle(req, resp);
 

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/cycle/RequestCycle.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/cycle/RequestCycle.java?rev=887067&r1=887066&r2=887067&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/cycle/RequestCycle.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/cycle/RequestCycle.java Fri Dec  4 05:24:46 2009
@@ -21,6 +21,7 @@
 
 import org.apache.wicket.MetaDataEntry;
 import org.apache.wicket.MetaDataKey;
+import org.apache.wicket.Response;
 import org.apache.wicket.ng.ThreadContext;
 import org.apache.wicket.ng.request.Request;
 import org.apache.wicket.ng.request.RequestHandler;
@@ -31,7 +32,6 @@
 import org.apache.wicket.ng.request.handler.DefaultPageProvider;
 import org.apache.wicket.ng.request.handler.PageProvider;
 import org.apache.wicket.ng.request.handler.impl.RenderPageRequestHandler;
-import org.apache.wicket.ng.request.response.Response;
 import org.apache.wicket.util.lang.Checks;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/cycle/RequestCycleContext.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/cycle/RequestCycleContext.java?rev=887067&r1=887066&r2=887067&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/cycle/RequestCycleContext.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/cycle/RequestCycleContext.java Fri Dec  4 05:24:46 2009
@@ -16,9 +16,10 @@
  */
 package org.apache.wicket.ng.request.cycle;
 
+import org.apache.wicket.Response;
 import org.apache.wicket.ng.request.Request;
 import org.apache.wicket.ng.request.RequestMapper;
-import org.apache.wicket.ng.request.response.Response;
+
 
 /**
  * Represents the context for the request cycle. This class is mainly a grouping parameter for the

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/cycle/RequestHandlerStack.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/cycle/RequestHandlerStack.java?rev=887067&r1=887066&r2=887067&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/cycle/RequestHandlerStack.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/cycle/RequestHandlerStack.java Fri Dec  4 05:24:46 2009
@@ -20,8 +20,8 @@
 import java.util.LinkedList;
 import java.util.List;
 
+import org.apache.wicket.Response;
 import org.apache.wicket.ng.request.RequestHandler;
-import org.apache.wicket.ng.request.response.Response;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/handler/impl/BufferedResponseRequestHandler.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/handler/impl/BufferedResponseRequestHandler.java?rev=887067&r1=887066&r2=887067&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/handler/impl/BufferedResponseRequestHandler.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/handler/impl/BufferedResponseRequestHandler.java Fri Dec  4 05:24:46 2009
@@ -18,8 +18,8 @@
 
 import org.apache.wicket.ng.request.RequestHandler;
 import org.apache.wicket.ng.request.cycle.RequestCycle;
-import org.apache.wicket.ng.request.response.BufferedWebResponse;
-import org.apache.wicket.ng.request.response.WebResponse;
+import org.apache.wicket.protocol.http.BufferedWebResponse;
+import org.apache.wicket.protocol.http.WebResponse;
 
 /**
  * Handler that renders a {@link BufferedWebResponse}.

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/handler/impl/render/WebRenderPageRequestHandlerDelegate.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/handler/impl/render/WebRenderPageRequestHandlerDelegate.java?rev=887067&r1=887066&r2=887067&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/handler/impl/render/WebRenderPageRequestHandlerDelegate.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/handler/impl/render/WebRenderPageRequestHandlerDelegate.java Fri Dec  4 05:24:46 2009
@@ -16,6 +16,7 @@
  */
 package org.apache.wicket.ng.request.handler.impl.render;
 
+import org.apache.wicket.Response;
 import org.apache.wicket.ng.Application;
 import org.apache.wicket.ng.Session;
 import org.apache.wicket.ng.protocol.http.WebApplication;
@@ -24,10 +25,9 @@
 import org.apache.wicket.ng.request.cycle.RequestCycle;
 import org.apache.wicket.ng.request.handler.impl.RenderPageRequestHandler;
 import org.apache.wicket.ng.request.handler.impl.RenderPageRequestHandler.RedirectPolicy;
-import org.apache.wicket.ng.request.response.BufferedWebResponse;
-import org.apache.wicket.ng.request.response.Response;
-import org.apache.wicket.ng.request.response.WebResponse;
 import org.apache.wicket.ng.settings.RequestCycleSettings;
+import org.apache.wicket.protocol.http.BufferedWebResponse;
+import org.apache.wicket.protocol.http.WebResponse;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -114,9 +114,9 @@
 		BufferedWebResponse response = new BufferedWebResponse()
 		{
 			@Override
-			public String encodeURL(String url)
+			public String encodeURL(CharSequence url)
 			{
-				return originalResponse.encodeURL(url);
+				return originalResponse.encodeURL(url).toString();
 			}
 		};
 
@@ -141,7 +141,7 @@
 	{
 		WebResponse response = (WebResponse)requestCycle.getResponse();
 		String relativeUrl = requestCycle.getUrlRenderer().renderUrl(url);
-		response.sendRedirect(relativeUrl);
+		response.redirect(relativeUrl);
 	}
 
 	@Override

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/mapper/BufferedResponseMapper.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/mapper/BufferedResponseMapper.java?rev=887067&r1=887066&r2=887067&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/mapper/BufferedResponseMapper.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/mapper/BufferedResponseMapper.java Fri Dec  4 05:24:46 2009
@@ -24,7 +24,7 @@
 import org.apache.wicket.ng.request.Url;
 import org.apache.wicket.ng.request.cycle.RequestCycle;
 import org.apache.wicket.ng.request.handler.impl.BufferedResponseRequestHandler;
-import org.apache.wicket.ng.request.response.BufferedWebResponse;
+import org.apache.wicket.protocol.http.BufferedWebResponse;
 
 /**
  * Encoder that intercepts requests for which there is already stored buffer with rendered data.

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/resource/Resource.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/resource/Resource.java?rev=887067&r1=887066&r2=887067&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/resource/Resource.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/resource/Resource.java Fri Dec  4 05:24:46 2009
@@ -19,10 +19,10 @@
 import java.io.Serializable;
 import java.util.Locale;
 
+import org.apache.wicket.Response;
 import org.apache.wicket.ng.request.Request;
 import org.apache.wicket.ng.request.component.PageParametersNg;
 import org.apache.wicket.ng.request.handler.resource.ResourceRequestHandler;
-import org.apache.wicket.ng.request.response.Response;
 import org.apache.wicket.util.lang.Checks;
 
 /**

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/BufferedWebResponse.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/BufferedWebResponse.java?rev=887067&r1=887066&r2=887067&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/BufferedWebResponse.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/BufferedWebResponse.java Fri Dec  4 05:24:46 2009
@@ -16,9 +16,19 @@
  */
 package org.apache.wicket.protocol.http;
 
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.http.Cookie;
 import javax.servlet.http.HttpServletResponse;
 
 import org.apache.wicket.WicketRuntimeException;
+import org.apache.wicket.util.lang.Checks;
 import org.apache.wicket.util.string.AppendingStringBuffer;
 
 
@@ -29,112 +39,230 @@
  */
 public class BufferedWebResponse extends WebResponse
 {
-	/** URL to redirect to when response is flushed, if any */
-	private String redirectURL;
-
-	/** Buffer to hold page */
-	private AppendingStringBuffer buffer = new AppendingStringBuffer(4096);
-
 	/**
-	 * Constructor for testing harness.
+	 * Construct.
 	 */
-	BufferedWebResponse()
+	public BufferedWebResponse()
 	{
 	}
 
-	/**
-	 * Package private constructor.
-	 * 
-	 * @param httpServletResponse
-	 *            The servlet response object
-	 */
-	public BufferedWebResponse(final HttpServletResponse httpServletResponse)
+	public BufferedWebResponse(HttpServletResponse httpServletResponse)
 	{
 		super(httpServletResponse);
 	}
 
-	/**
-	 * Flushes the response buffer by doing a redirect or writing out the buffer. NOTE: The servlet
-	 * container will close the response output stream.
-	 */
+
+	private static class CookieEntry
+	{
+		Cookie cookie;
+		boolean add;
+	}
+
+	private final List<CookieEntry> cookieEntries = new ArrayList<CookieEntry>();
+
 	@Override
-	public void close()
+	public void addCookie(Cookie cookie)
 	{
-		// If a redirection was specified
-		if (redirectURL != null)
+		CookieEntry entry = new CookieEntry();
+		entry.cookie = cookie;
+		entry.add = true;
+		cookieEntries.add(entry);
+	}
+
+	@Override
+	public void clearCookie(Cookie cookie)
+	{
+		CookieEntry entry = new CookieEntry();
+		entry.cookie = cookie;
+		entry.add = false;
+		cookieEntries.add(entry);
+	}
+
+	private Long contentLength = null;
+
+	@Override
+	public void setContentLength(long length)
+	{
+		contentLength = length;
+	}
+
+	private String contentType = null;
+
+	@Override
+	public void setContentType(String mimeType)
+	{
+		contentType = mimeType;
+	}
+
+	private final Map<String, Long> dateHeaders = new HashMap<String, Long>();
+
+	@Override
+	public void setDateHeader(String name, long date)
+	{
+		dateHeaders.put(name, date);
+	}
+
+	private final Map<String, String> headers = new HashMap<String, String>();
+
+	@Override
+	public void setHeader(String name, String value)
+	{
+		headers.put(name, value);
+	}
+
+	private StringBuilder builder;
+	private ByteArrayOutputStream stream;
+
+	@Override
+	public void write(CharSequence sequence)
+	{
+		if (stream != null)
 		{
-			// actually redirect
-			super.redirect(redirectURL);
+			throw new IllegalStateException(
+				"Can't call write(CharSequence) after write(byte[]) has been called.");
 		}
-		else
+
+		if (builder == null)
 		{
-			// Write the buffer to the response stream
-			if (buffer.length() != 0)
-			{
-				super.write(buffer);
-			}
+			builder = new StringBuilder(4096);
 		}
+
+		builder.append(sequence);
 	}
 
-	/**
-	 * @see org.apache.wicket.Response#reset()
-	 */
 	@Override
-	public void reset()
+	public void write(byte[] array)
 	{
-		redirectURL = null;
-		buffer.clear();
+		if (builder != null)
+		{
+			throw new IllegalStateException(
+				"Can't call write(byte[]) after write(CharSequence) has been called.");
+		}
+		if (stream == null)
+		{
+			stream = new ByteArrayOutputStream(array.length);
+		}
+		try
+		{
+			stream.write(array);
+		}
+		catch (IOException e)
+		{
+			throw new WicketRuntimeException(e);
+		}
 	}
 
-	/**
-	 * Saves url to redirect to when buffered response is flushed. Implementations should encode the
-	 * URL to make sure cookie-less operation is supported in case clients forgot.
-	 * 
-	 * @param url
-	 *            The URL to redirect to
-	 */
+	private String redirectUrl = null;
+
 	@Override
-	public final void redirect(final String url)
+	public void redirect(String url)
 	{
-		if (redirectURL != null)
-		{
-			throw new WicketRuntimeException("Already redirecting to '" + redirectURL +
-				"'. Cannot redirect more than once");
-		}
-		// encode to make sure no caller forgot this
-		redirectURL = encodeURL(url).toString();
+		redirectUrl = url;
 	}
 
-	/**
-	 * Writes string to response output.
-	 * 
-	 * @param string
-	 *            The string to write
-	 */
+	private Integer statusCode = null;
+
 	@Override
-	public void write(final CharSequence string)
+	public void setStatus(int sc)
 	{
-		buffer.append(string);
+		statusCode = sc;
 	}
 
 	/**
-	 * THIS METHOD IS NOT PART OF THE WICKET PUBLIC API.
+	 * Writes the content of the buffer to the specified response. Also sets the properties and and
+	 * headers.
+	 * 
+	 * @param response
 	 */
-	public final void filter()
+	public void writeTo(final WebResponse response)
 	{
-		if (redirectURL == null && buffer.length() != 0)
+		Checks.argumentNotNull(response, "response");
+
+		for (CookieEntry e : cookieEntries)
 		{
-			buffer = filter(buffer);
+			if (e.add)
+			{
+				response.addCookie(e.cookie);
+			}
+			else
+			{
+				response.clearCookie(e.cookie);
+			}
+		}
+		if (contentLength != null)
+		{
+			response.setContentLength(contentLength);
+		}
+		if (contentType != null)
+		{
+			response.setContentType(contentType);
+		}
+		for (String s : dateHeaders.keySet())
+		{
+			response.setDateHeader(s, dateHeaders.get(s));
+		}
+		for (String s : headers.keySet())
+		{
+			response.setHeader(s, headers.get(s));
+		}
+		if (statusCode != null)
+		{
+			response.setStatus(statusCode);
+		}
+		if (redirectUrl != null)
+		{
+			response.redirect(redirectUrl);
+		}
+		if (builder != null)
+		{
+			response.write(builder);
+		}
+		else if (stream != null)
+		{
+			final boolean copied[] = { false };
+			try
+			{
+				// try to avoid copying the array
+				stream.writeTo(new OutputStream()
+				{
+					@Override
+					public void write(int b) throws IOException
+					{
+
+					}
+
+					@Override
+					public void write(byte[] b, int off, int len) throws IOException
+					{
+						if (off == 0 && len == b.length)
+						{
+							response.write(b);
+							copied[0] = true;
+						}
+					}
+				});
+			}
+			catch (IOException e1)
+			{
+				throw new WicketRuntimeException(e1);
+			}
+			if (copied[0] == false)
+			{
+				response.write(stream.toByteArray());
+			}
 		}
 	}
 
 	/**
-	 * 
-	 * @see java.lang.Object#toString()
+	 * THIS METHOD IS NOT PART OF THE WICKET PUBLIC API.
 	 */
-	@Override
-	public String toString()
+	public final void filter()
 	{
-		return buffer.toString();
+		if (redirectUrl == null && builder.length() != 0)
+		{ // TODO WICKET-NG clean up this conversion
+			builder = new StringBuilder(
+				filter(new AppendingStringBuffer(builder.toString())).toString());
+		}
 	}
+
 }

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/WebResponse.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/WebResponse.java?rev=887067&r1=887066&r2=887067&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/WebResponse.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/WebResponse.java Fri Dec  4 05:24:46 2009
@@ -184,7 +184,7 @@
 	 * @return True if this response is going to redirect the user agent
 	 */
 	@Override
-	public final boolean isRedirect()
+	public boolean isRedirect()
 	{
 		return redirect;
 	}
@@ -275,7 +275,7 @@
 	 *            The mime type
 	 */
 	@Override
-	public final void setContentType(final String mimeType)
+	public void setContentType(final String mimeType)
 	{
 		if (httpServletResponse != null)
 		{
@@ -330,6 +330,20 @@
 		}
 	}
 
+
+	@Override
+	public void write(byte[] array)
+	{
+		try
+		{
+			httpServletResponse.getOutputStream().write(array);
+		}
+		catch (IOException e)
+		{
+			throw new WicketRuntimeException(e);
+		}
+	}
+
 	/**
 	 * Writes string to response output.
 	 * 
@@ -432,6 +446,20 @@
 	}
 
 	/**
+	 * Convenience method for setting the content-disposition:in;ine header. This header is used if
+	 * the response should be shown embedded in browser window while having custom file name when
+	 * user saves the response. browser.
+	 * 
+	 * @param filename
+	 *            file name of the attachment
+	 */
+	public void setInlineHeader(String filename)
+	{
+		setHeader("Content-Disposition", "inline" +
+			((!Strings.isEmpty(filename)) ? ("; filename=\"" + filename + "\"") : ""));
+	}
+
+	/**
 	 * Is the request, which matches this response an ajax request.
 	 * 
 	 * @return True if the request is an ajax request.
@@ -451,4 +479,16 @@
 	{
 		this.ajax = ajax;
 	}
+
+	/**
+	 * Sets the status code for this response.
+	 * 
+	 * @param sc
+	 *            status code
+	 */
+	public void setStatus(int sc)
+	{
+		httpServletResponse.setStatus(sc);
+	}
+
 }

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/response/ConsoleResponse.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/response/ConsoleResponse.java?rev=887067&r1=887066&r2=887067&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/response/ConsoleResponse.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/response/ConsoleResponse.java Fri Dec  4 05:24:46 2009
@@ -63,4 +63,10 @@
 	{
 		return System.out;
 	}
+
+	@Override
+	public void write(byte[] array)
+	{
+		throw new UnsupportedOperationException();
+	}
 }

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/response/FileResponse.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/response/FileResponse.java?rev=887067&r1=887066&r2=887067&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/response/FileResponse.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/response/FileResponse.java Fri Dec  4 05:24:46 2009
@@ -125,4 +125,17 @@
 		}
 		return printWriter;
 	}
+
+	@Override
+	public void write(byte[] array)
+	{
+		try
+		{
+			out.write(array);
+		}
+		catch (IOException e)
+		{
+			throw new WicketRuntimeException("Unable to write to file " + file, e);
+		}
+	}
 }

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/response/NullResponse.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/response/NullResponse.java?rev=887067&r1=887066&r2=887067&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/response/NullResponse.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/response/NullResponse.java Fri Dec  4 05:24:46 2009
@@ -70,4 +70,9 @@
 			}
 		};
 	}
+
+	@Override
+	public void write(byte[] array)
+	{
+	}
 }

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/response/StringResponse.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/response/StringResponse.java?rev=887067&r1=887066&r2=887067&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/response/StringResponse.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/response/StringResponse.java Fri Dec  4 05:24:46 2009
@@ -86,4 +86,10 @@
 	{
 		throw new UnsupportedOperationException("Cannot get output stream on StringResponse");
 	}
+
+	@Override
+	public void write(byte[] array)
+	{
+		throw new UnsupportedOperationException();
+	}
 }

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/session/DefaultPageFactory.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/session/DefaultPageFactory.java?rev=887067&r1=887066&r2=887067&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/session/DefaultPageFactory.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/session/DefaultPageFactory.java Fri Dec  4 05:24:46 2009
@@ -27,6 +27,8 @@
 import org.apache.wicket.WicketRuntimeException;
 import org.apache.wicket.authorization.AuthorizationException;
 import org.apache.wicket.markup.MarkupException;
+import org.apache.wicket.ng.request.component.PageParametersNg;
+import org.apache.wicket.ng.request.component.RequestablePage;
 import org.apache.wicket.util.lang.Generics;
 
 
@@ -71,7 +73,9 @@
 
 	/**
 	 * @see IPageFactory#newPage(Class, PageParameters)
+	 * @deprecated
 	 */
+	@Deprecated
 	public final <C extends Page> Page newPage(final Class<C> pageClass, PageParameters parameters)
 	{
 		// If no parameters are provided, try the default constructor first, than the PageParameter
@@ -179,7 +183,7 @@
 	 *             argument.
 	 */
 	private final Page createPage(final Constructor<? extends Page> constructor,
-		final PageParameters argument)
+		final Object argument)
 	{
 		try
 		{
@@ -219,8 +223,7 @@
 	 * @param argument
 	 * @return description
 	 */
-	private String createDescription(Constructor<? extends Page> constructor,
-		PageParameters argument)
+	private String createDescription(Constructor<? extends Page> constructor, Object argument)
 	{
 		if (argument != null)
 		{
@@ -232,4 +235,33 @@
 			return "Can't instantiate page using constructor " + constructor;
 		}
 	}
+
+	public <C extends Page> RequestablePage newPage(Class<C> pageClass, PageParametersNg parameters)
+	{
+		// If no parameters are provided, try the default constructor first, than the PageParameter
+		// constructor with empty parameter list.
+		if (parameters == null)
+		{
+			return newPage(pageClass);
+		}
+
+		// If parameters not null, than try to get constructor that takes PageParameters
+		Constructor<? extends Page> constructor = constructor(pageClass, PageParameters.class);
+		if (constructor != null)
+		{
+			// return new Page(parameters)
+			return createPage(constructor, parameters);
+		}
+
+		// No constructor with PageParameters found. Try default constructor.
+		constructor = constructor(pageClass);
+		if (constructor != null)
+		{
+			// return new Page()
+			return createPage(constructor, null);
+		}
+
+		throw new WicketRuntimeException("Unable to create page from " + pageClass +
+			". Class does neither have a constructor with PageParameter nor a default constructor");
+	}
 }
\ No newline at end of file

Modified: wicket/trunk/wicket/src/test/java/org/apache/wicket/ng/request/cycle/RequestHandlerStackTest.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/test/java/org/apache/wicket/ng/request/cycle/RequestHandlerStackTest.java?rev=887067&r1=887066&r2=887067&view=diff
==============================================================================
--- wicket/trunk/wicket/src/test/java/org/apache/wicket/ng/request/cycle/RequestHandlerStackTest.java (original)
+++ wicket/trunk/wicket/src/test/java/org/apache/wicket/ng/request/cycle/RequestHandlerStackTest.java Fri Dec  4 05:24:46 2009
@@ -16,10 +16,12 @@
  */
 package org.apache.wicket.ng.request.cycle;
 
+import java.io.OutputStream;
+
 import junit.framework.TestCase;
 
+import org.apache.wicket.Response;
 import org.apache.wicket.ng.request.RequestHandler;
-import org.apache.wicket.ng.request.response.Response;
 
 /**
  * 
@@ -28,338 +30,344 @@
 public class RequestHandlerStackTest extends TestCase
 {
 
-    /**
-     * Construct.
-     */
-    public RequestHandlerStackTest()
-    {
-    }
-
-    private Response newResponse()
-    {
-        return new Response()
-        {
-            @Override
-            public void write(byte[] array)
-            {
-            }
-
-            @Override
-            public void write(CharSequence sequence)
-            {
-            }
-
-            @Override
-            public String encodeURL(String url)
-            {
-                return null;
-            }
-        };
-    }
-
-    private RequestHandlerStack newStack(Response response)
-    {
-        return new RequestHandlerStack(response)
-        {
-            @Override
-            protected RequestCycle getRequestCycle()
-            {
-                return null;
-            }
-        };
-    }
-
-    private boolean testFlag1;
-    private boolean testFlag2;
-    private boolean testFlag3;
-    private boolean testFlag4;
-
-    private boolean detachedFlag1;
-    private boolean detachedFlag2;
-    private boolean detachedFlag3;
-    private boolean detachedFlag4;
-
-    private void initFlags()
-    {
-        testFlag1 = true;
-        testFlag2 = true;
-        testFlag3 = true;
-        testFlag4 = true;
-
-        detachedFlag1 = false;
-        detachedFlag2 = false;
-        detachedFlag3 = false;
-        detachedFlag4 = false;
-    }
+	/**
+	 * Construct.
+	 */
+	public RequestHandlerStackTest()
+	{
+	}
+
+	private Response newResponse()
+	{
+		return new Response()
+		{
+			@Override
+			public void write(byte[] array)
+			{
+			}
+
+			@Override
+			public void write(CharSequence sequence)
+			{
+			}
+
+			@Override
+			public CharSequence encodeURL(final CharSequence url)
+			{
+				return null;
+			}
+
+			@Override
+			public OutputStream getOutputStream()
+			{
+				return null;
+			}
+		};
+	}
+
+	private RequestHandlerStack newStack(Response response)
+	{
+		return new RequestHandlerStack(response)
+		{
+			@Override
+			protected RequestCycle getRequestCycle()
+			{
+				return null;
+			}
+		};
+	}
+
+	private boolean testFlag1;
+	private boolean testFlag2;
+	private boolean testFlag3;
+	private boolean testFlag4;
+
+	private boolean detachedFlag1;
+	private boolean detachedFlag2;
+	private boolean detachedFlag3;
+	private boolean detachedFlag4;
+
+	private void initFlags()
+	{
+		testFlag1 = true;
+		testFlag2 = true;
+		testFlag3 = true;
+		testFlag4 = true;
+
+		detachedFlag1 = false;
+		detachedFlag2 = false;
+		detachedFlag3 = false;
+		detachedFlag4 = false;
+	}
 
-    /**
+	/**
 	 * 
 	 */
-    public void test1()
-    {
-        initFlags();
-
-        final Response originalResponse = newResponse();
-
-        final RequestHandlerStack stack = newStack(originalResponse);
-
-        final RequestHandler handler3 = new RequestHandler()
-        {
-            public void respond(RequestCycle requestCycle)
-            {
-                testFlag3 = false;
-            }
-
-            public void detach(RequestCycle requestCycle)
-            {
-                detachedFlag3 = true;
-            }
-        };
-
-        final RequestHandler handler2 = new RequestHandler()
-        {
-            public void respond(RequestCycle requestCycle)
-            {
-                testFlag2 = false;
-
-                stack.replaceCurrentRequestHandler(handler3);
-
-                // this code must not be executed
-                testFlag2 = true;
-            }
-
-            public void detach(RequestCycle requestCycle)
-            {
-                detachedFlag2 = true;
-            }
-        };
-
-        final RequestHandler handler1 = new RequestHandler()
-        {
-            public void respond(RequestCycle requestCycle)
-            {
-                testFlag1 = false;
-
-                Response resp = newResponse();
-                stack.setResponse(resp);
-                stack.executeRequestHandler(handler2);
-                assertEquals(stack.getResponse(), resp);
-
-                // this code must be executed
-                testFlag1 = true;
-            }
-
-            public void detach(RequestCycle requestCycle)
-            {
-                detachedFlag1 = true;
-            }
-        };
-
-        stack.executeRequestHandler(handler1);
-
-        assertEquals(stack.getResponse(), originalResponse);
-
-        stack.detach();
-
-        assertTrue(testFlag1);
-        assertFalse(testFlag2);
-        assertFalse(testFlag3);
-
-        assertTrue(detachedFlag1);
-        assertTrue(detachedFlag2);
-        assertTrue(detachedFlag3);
-    }
+	public void test1()
+	{
+		initFlags();
+
+		final Response originalResponse = newResponse();
+
+		final RequestHandlerStack stack = newStack(originalResponse);
+
+		final RequestHandler handler3 = new RequestHandler()
+		{
+			public void respond(RequestCycle requestCycle)
+			{
+				testFlag3 = false;
+			}
+
+			public void detach(RequestCycle requestCycle)
+			{
+				detachedFlag3 = true;
+			}
+		};
+
+		final RequestHandler handler2 = new RequestHandler()
+		{
+			public void respond(RequestCycle requestCycle)
+			{
+				testFlag2 = false;
+
+				stack.replaceCurrentRequestHandler(handler3);
+
+				// this code must not be executed
+				testFlag2 = true;
+			}
+
+			public void detach(RequestCycle requestCycle)
+			{
+				detachedFlag2 = true;
+			}
+		};
+
+		final RequestHandler handler1 = new RequestHandler()
+		{
+			public void respond(RequestCycle requestCycle)
+			{
+				testFlag1 = false;
+
+				Response resp = newResponse();
+				stack.setResponse(resp);
+				stack.executeRequestHandler(handler2);
+				assertEquals(stack.getResponse(), resp);
+
+				// this code must be executed
+				testFlag1 = true;
+			}
+
+			public void detach(RequestCycle requestCycle)
+			{
+				detachedFlag1 = true;
+			}
+		};
+
+		stack.executeRequestHandler(handler1);
+
+		assertEquals(stack.getResponse(), originalResponse);
+
+		stack.detach();
+
+		assertTrue(testFlag1);
+		assertFalse(testFlag2);
+		assertFalse(testFlag3);
+
+		assertTrue(detachedFlag1);
+		assertTrue(detachedFlag2);
+		assertTrue(detachedFlag3);
+	}
 
-    /**
+	/**
 	 * 
 	 */
-    public void test2()
-    {
-        initFlags();
-
-        final Response originalResponse = newResponse();
-        final RequestHandlerStack stack = newStack(originalResponse);
-
-        final RequestHandler handler4 = new RequestHandler()
-        {
-            public void respond(RequestCycle requestCycle)
-            {
-                testFlag4 = false;
-
-                assertEquals(stack.getResponse(), originalResponse);
-
-                stack.setResponse(newResponse());
-            }
-
-            public void detach(RequestCycle requestCycle)
-            {
-                detachedFlag4 = true;
-            }
-        };
-
-        final RequestHandler handler3 = new RequestHandler()
-        {
-            public void respond(RequestCycle requestCycle)
-            {
-                testFlag3 = false;
-                stack.setResponse(newResponse());
-                stack.replaceAllRequestHandlers(handler4);
-                // code must not be reached
-                testFlag3 = true;
-            }
-
-            public void detach(RequestCycle requestCycle)
-            {
-                detachedFlag3 = true;
-            }
-        };
-
-        final RequestHandler handler2 = new RequestHandler()
-        {
-            public void respond(RequestCycle requestCycle)
-            {
-                testFlag2 = false;
-                stack.setResponse(newResponse());
-                stack.executeRequestHandler(handler3);
-                // code must not be reached
-                testFlag2 = true;
-            }
-
-            public void detach(RequestCycle requestCycle)
-            {
-                detachedFlag2 = true;
-            }
-        };
-
-        RequestHandler handler1 = new RequestHandler()
-        {
-            public void respond(RequestCycle requestCycle)
-            {
-                testFlag1 = false;
-                stack.setResponse(newResponse());
-                stack.executeRequestHandler(handler2);
-
-                // code must not be reached
-                testFlag1 = true;
-            }
-
-            public void detach(RequestCycle requestCycle)
-            {
-                detachedFlag1 = true;
-            }
-        };
-
-        stack.executeRequestHandler(handler1);
-
-        assertEquals(stack.getResponse(), originalResponse);
-
-        stack.detach();
-
-        assertFalse(testFlag1);
-        assertFalse(testFlag2);
-        assertFalse(testFlag3);
-        assertFalse(testFlag4);
-
-        assertTrue(detachedFlag1);
-        assertTrue(detachedFlag2);
-        assertTrue(detachedFlag3);
-        assertTrue(detachedFlag4);
-    }
-    
-    
-    /**
+	public void test2()
+	{
+		initFlags();
+
+		final Response originalResponse = newResponse();
+		final RequestHandlerStack stack = newStack(originalResponse);
+
+		final RequestHandler handler4 = new RequestHandler()
+		{
+			public void respond(RequestCycle requestCycle)
+			{
+				testFlag4 = false;
+
+				assertEquals(stack.getResponse(), originalResponse);
+
+				stack.setResponse(newResponse());
+			}
+
+			public void detach(RequestCycle requestCycle)
+			{
+				detachedFlag4 = true;
+			}
+		};
+
+		final RequestHandler handler3 = new RequestHandler()
+		{
+			public void respond(RequestCycle requestCycle)
+			{
+				testFlag3 = false;
+				stack.setResponse(newResponse());
+				stack.replaceAllRequestHandlers(handler4);
+				// code must not be reached
+				testFlag3 = true;
+			}
+
+			public void detach(RequestCycle requestCycle)
+			{
+				detachedFlag3 = true;
+			}
+		};
+
+		final RequestHandler handler2 = new RequestHandler()
+		{
+			public void respond(RequestCycle requestCycle)
+			{
+				testFlag2 = false;
+				stack.setResponse(newResponse());
+				stack.executeRequestHandler(handler3);
+				// code must not be reached
+				testFlag2 = true;
+			}
+
+			public void detach(RequestCycle requestCycle)
+			{
+				detachedFlag2 = true;
+			}
+		};
+
+		RequestHandler handler1 = new RequestHandler()
+		{
+			public void respond(RequestCycle requestCycle)
+			{
+				testFlag1 = false;
+				stack.setResponse(newResponse());
+				stack.executeRequestHandler(handler2);
+
+				// code must not be reached
+				testFlag1 = true;
+			}
+
+			public void detach(RequestCycle requestCycle)
+			{
+				detachedFlag1 = true;
+			}
+		};
+
+		stack.executeRequestHandler(handler1);
+
+		assertEquals(stack.getResponse(), originalResponse);
+
+		stack.detach();
+
+		assertFalse(testFlag1);
+		assertFalse(testFlag2);
+		assertFalse(testFlag3);
+		assertFalse(testFlag4);
+
+		assertTrue(detachedFlag1);
+		assertTrue(detachedFlag2);
+		assertTrue(detachedFlag3);
+		assertTrue(detachedFlag4);
+	}
+
+
+	/**
 	 * 
 	 */
-    public void test3()
-    {
-        initFlags();
-
-        final Response originalResponse = newResponse();
-        final RequestHandlerStack stack = newStack(originalResponse);
-
-        final RequestHandler handler4 = new RequestHandler()
-        {
-            public void respond(RequestCycle requestCycle)
-            {
-                testFlag4 = true;
-
-                stack.setResponse(newResponse());
-            }
-
-            public void detach(RequestCycle requestCycle)
-            {
-                detachedFlag4 = true;
-            }
-        };
-
-        final RequestHandler handler3 = new RequestHandler()
-        {
-            public void respond(RequestCycle requestCycle)
-            {
-                testFlag3 = false;
-                stack.scheduleRequestHandlerAfterCurrent(handler4);
-
-                // make sure that handler4's respond method is fired after this one ends
-                testFlag4 = false;
-                
-                
-                // code must be be reached
-                testFlag3 = true;
-            }
-
-            public void detach(RequestCycle requestCycle)
-            {
-                detachedFlag3 = true;
-            }
-        };
-
-        final RequestHandler handler2 = new RequestHandler()
-        {
-            public void respond(RequestCycle requestCycle)
-            {
-                testFlag2 = false;
-                stack.executeRequestHandler(handler3);
-                // code must be reached
-                testFlag2 = true;
-            }
-
-            public void detach(RequestCycle requestCycle)
-            {
-                detachedFlag2 = true;
-            }
-        };
-
-        RequestHandler handler1 = new RequestHandler()
-        {
-            public void respond(RequestCycle requestCycle)
-            {
-                testFlag1 = false;
-                stack.executeRequestHandler(handler2);
-
-                // code must be reached
-                testFlag1 = true;
-            }
-
-            public void detach(RequestCycle requestCycle)
-            {
-                detachedFlag1 = true;
-            }
-        };
-
-        stack.executeRequestHandler(handler1);
-
-        assertEquals(stack.getResponse(), originalResponse);
-
-        stack.detach();
-
-        assertTrue(testFlag1);
-        assertTrue(testFlag2);
-        assertTrue(testFlag3);
-        assertTrue(testFlag4);
-
-        assertTrue(detachedFlag1);
-        assertTrue(detachedFlag2);
-        assertTrue(detachedFlag3);
-        assertTrue(detachedFlag4);
-    }
+	public void test3()
+	{
+		initFlags();
+
+		final Response originalResponse = newResponse();
+		final RequestHandlerStack stack = newStack(originalResponse);
+
+		final RequestHandler handler4 = new RequestHandler()
+		{
+			public void respond(RequestCycle requestCycle)
+			{
+				testFlag4 = true;
+
+				stack.setResponse(newResponse());
+			}
+
+			public void detach(RequestCycle requestCycle)
+			{
+				detachedFlag4 = true;
+			}
+		};
+
+		final RequestHandler handler3 = new RequestHandler()
+		{
+			public void respond(RequestCycle requestCycle)
+			{
+				testFlag3 = false;
+				stack.scheduleRequestHandlerAfterCurrent(handler4);
+
+				// make sure that handler4's respond method is fired after this one ends
+				testFlag4 = false;
+
+
+				// code must be be reached
+				testFlag3 = true;
+			}
+
+			public void detach(RequestCycle requestCycle)
+			{
+				detachedFlag3 = true;
+			}
+		};
+
+		final RequestHandler handler2 = new RequestHandler()
+		{
+			public void respond(RequestCycle requestCycle)
+			{
+				testFlag2 = false;
+				stack.executeRequestHandler(handler3);
+				// code must be reached
+				testFlag2 = true;
+			}
+
+			public void detach(RequestCycle requestCycle)
+			{
+				detachedFlag2 = true;
+			}
+		};
+
+		RequestHandler handler1 = new RequestHandler()
+		{
+			public void respond(RequestCycle requestCycle)
+			{
+				testFlag1 = false;
+				stack.executeRequestHandler(handler2);
+
+				// code must be reached
+				testFlag1 = true;
+			}
+
+			public void detach(RequestCycle requestCycle)
+			{
+				detachedFlag1 = true;
+			}
+		};
+
+		stack.executeRequestHandler(handler1);
+
+		assertEquals(stack.getResponse(), originalResponse);
+
+		stack.detach();
+
+		assertTrue(testFlag1);
+		assertTrue(testFlag2);
+		assertTrue(testFlag3);
+		assertTrue(testFlag4);
+
+		assertTrue(detachedFlag1);
+		assertTrue(detachedFlag2);
+		assertTrue(detachedFlag3);
+		assertTrue(detachedFlag4);
+	}
 }