001: package com.mockrunner.mock.web;
002:
003: import java.io.IOException;
004: import java.util.ArrayList;
005: import java.util.Collections;
006: import java.util.Iterator;
007: import java.util.List;
008:
009: import javax.servlet.Filter;
010: import javax.servlet.FilterChain;
011: import javax.servlet.Servlet;
012: import javax.servlet.ServletException;
013: import javax.servlet.ServletRequest;
014: import javax.servlet.ServletResponse;
015:
016: import com.mockrunner.base.NestedApplicationException;
017:
018: /**
019: * Mock implementation of <code>FilterChain</code>.
020: */
021: public class MockFilterChain implements FilterChain {
022: private List filters = new ArrayList();
023: private Servlet servlet;
024: private Iterator iterator;
025: private List requestList = new ArrayList();
026: private List responseList = new ArrayList();
027:
028: public void doFilter(ServletRequest request,
029: ServletResponse response) throws IOException,
030: ServletException {
031: requestList.add(request);
032: responseList.add(response);
033: if (null == iterator) {
034: iterator = filters.iterator();
035: }
036: if (iterator.hasNext()) {
037: Filter nextFilter = (Filter) iterator.next();
038: nextFilter.doFilter(request, response, this );
039: } else {
040: reset();
041: if (null == servlet)
042: return;
043: servlet.service(request, response);
044: }
045: }
046:
047: /**
048: * Resets the internal iterator of this chain.
049: */
050: public void reset() {
051: iterator = null;
052: }
053:
054: /**
055: * Adds a filter to the chain.
056: * @param filter the filter
057: */
058: public void addFilter(Filter filter) {
059: filters.add(filter);
060: }
061:
062: /**
063: * Adds a filter to the chain. The filter must implement
064: * <code>javax.servlet.Filter</code>.
065: * @param filterClass the filter class
066: * @throws IllegalArgumentException if the specified class does not implement
067: * <code>javax.servlet.Filter</code>
068: */
069: public void addFilter(Class filterClass) {
070: if (!Filter.class.isAssignableFrom(filterClass)) {
071: throw new IllegalArgumentException(
072: "filterClass must be an instance of javax.servlet.Filter");
073: }
074: try {
075: filters.add(filterClass.newInstance());
076: } catch (Exception exc) {
077: throw new NestedApplicationException(exc);
078: }
079: }
080:
081: /**
082: * Sets the servlet that is called at the end of the chain.
083: * @param servlet the servlet
084: */
085: public void setServlet(Servlet servlet) {
086: this .servlet = servlet;
087: }
088:
089: /**
090: * Clears all filters and sets the current servlet to <code>null</code>.
091: */
092: public void release() {
093: filters.clear();
094: setServlet(null);
095: reset();
096: }
097:
098: /**
099: * Returns the list of all request objects used to call
100: * {@link #doFilter} when iterating through the chain.
101: * @return the request list
102: */
103: public List getRequestList() {
104: return Collections.unmodifiableList(requestList);
105: }
106:
107: /**
108: * Returns the list of all response objects used to call
109: * {@link #doFilter} when iterating through the chain.
110: * @return the response list
111: */
112: public List getResponseList() {
113: return Collections.unmodifiableList(responseList);
114: }
115:
116: /**
117: * Returns the last request, usually the request that was
118: * used to call the final servlet. Returns <code>null</code>
119: * if no request is specified, e.g. if the chain wasn't called.
120: * Otherwise returns the last entry of the list returned by
121: * {@link #getRequestList}.
122: * @return the last request
123: */
124: public ServletRequest getLastRequest() {
125: if (requestList.isEmpty())
126: return null;
127: return (ServletRequest) requestList.get(requestList.size() - 1);
128: }
129:
130: /**
131: * Returns the last response, usually the response that was
132: * used to call the final servlet. Returns <code>null</code>
133: * if no response is specified, e.g. if the chain wasn't called.
134: * Otherwise returns the last entry of the list returned by
135: * {@link #getResponseList}.
136: * @return the last response
137: */
138: public ServletResponse getLastResponse() {
139: if (responseList.isEmpty())
140: return null;
141: return (ServletResponse) responseList
142: .get(responseList.size() - 1);
143: }
144: }
|