package net.sourceforge.javautil.developer.web.unit.mockserver.http;
import java.io.IOException;
import java.util.List;
import javax.servlet.Filter;
import javax.servlet.RequestDispatcher;
import javax.servlet.Servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import net.sourceforge.javautil.developer.web.unit.mockserver.MockFilterChain;
import net.sourceforge.javautil.developer.web.unit.mockserver.MockServletSetup;
/**
* A request dispatcher for HTTP requests.
*
* @author elponderador
* @author $Author$
* @version $Id$
*/
public class MockHttpRequestDispatcher implements RequestDispatcher {
private MockServletSetup servlet;
private String requestPath;
private ServletContext context;
private List<Filter> filters;
public MockHttpRequestDispatcher(ServletContext context, MockServletSetup servlet, List<Filter> filters, String requestPath) {
this.servlet = servlet;
this.requestPath = requestPath;
this.context = context;
this.filters = filters;
}
public void forward(ServletRequest request, ServletResponse response) throws ServletException, IOException {
if (response.isCommitted()) throw new IllegalStateException("Response already committed");
if (request instanceof HttpServletRequest && response instanceof HttpServletResponse) {
response.resetBuffer();
HttpServletRequest mrequest = ((HttpServletRequest) this.getRequest(request) );
new MockFilterChain(filters, servlet).doFilter(mrequest, response);
} else {
throw new IllegalArgumentException("Request/response type not supported: " + request + "/" + response);
}
}
public void include(ServletRequest request, ServletResponse response) throws ServletException, IOException {
if (request instanceof HttpServletRequest && response instanceof HttpServletResponse) {
MockHttpServletResponseInclude include = new MockHttpServletResponseInclude( (HttpServletResponse) response );
new MockFilterChain(filters, servlet).doFilter(request, include);
response.getOutputStream().write( include.getData() );
} else {
throw new IllegalArgumentException("Request/response type not supported: " + request + "/" + response);
}
}
/**
* @param request The original servlet request
* @return The refined request for Http dispatching
*/
private ServletRequest getRequest (ServletRequest request) {
if (request instanceof HttpServletRequest) {
return this.requestPath == null ? request : new MockHttpDispatchRequest( context, (HttpServletRequest) request, this.requestPath);
}
throw new IllegalArgumentException("Wrappers not supported for request type: " + request);
}
}