Package net.sourceforge.javautil.developer.web.unit.mockserver.http

Source Code of net.sourceforge.javautil.developer.web.unit.mockserver.http.MockHttpRequestDispatcher

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

}
TOP

Related Classes of net.sourceforge.javautil.developer.web.unit.mockserver.http.MockHttpRequestDispatcher

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.