vmassol
Fri, 07 Sep 2001 08:54:57 -0700
vmassol 01/09/07 09:15:22
Added: cactus/src/sample/servlet23/org/apache/commons/cactus/sample
SampleFilter.java TestSampleFilter.java
cactus/src/sample/servlet23/org/apache/commons/cactus/sample/util
FilterServletOutputStream.java
GenericResponseWrapper.java
Log:
added example for unit testing a servlet filter
Revision Changes Path
1.1
jakarta-commons/cactus/src/sample/servlet23/org/apache/commons/cactus/sample/SampleFilter.java
Index: SampleFilter.java
===================================================================
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 1999 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "The Jakarta Project", "Cactus", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact [EMAIL PROTECTED]
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package org.apache.commons.cactus.sample;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import org.apache.commons.cactus.sample.util.*;
/**
* Sample filter that implements some very simple business logic. The goal is
* to provide some functional tests for Cactus and examples for Cactus users.
* This filter simply adds a header and a footer to the returned HTML.
*
* @author <a href="mailto:[EMAIL PROTECTED]">Vincent Massol</a>
*
* @version $Id: SampleFilter.java,v 1.1 2001/09/07 16:15:22 vmassol Exp $
*/
public class SampleFilter implements Filter
{
/**
* We need to save the filter config as the Fitler API does not offer
* a means to get the filter config ... except in the <code>init()</code>
*/
private FilterConfig config;
/**
* Filter initialisation. Called by the servlet engine during the life
* cycle of the filter.
*
* @param theConfig the filter config
*/
public void init(FilterConfig theConfig) throws ServletException
{
this.config = theConfig;
}
/**
* Perform the filter function. Called by the container upon a request
* matching the filter pattern defined in <code>web.xml</code>.
*
* @param theRequest the incmoing HTTP request
* @param theResponse the returned HTTP response
* @param theChain the chain of filters extracted from the definition
* given in <code>web.xml</code> by the container.
*/
public void doFilter(ServletRequest theRequest,
ServletResponse theResponse, FilterChain theChain)
throws IOException, ServletException
{
OutputStream out = theResponse.getOutputStream();
addHeader(out);
// Create a wrapper of the response so that we can later write to
// the response (add the footer). If we did not do this, we would
// get an error saying that the response has already been
// committed.
GenericResponseWrapper wrapper =
new GenericResponseWrapper((HttpServletResponse)theResponse);
theChain.doFilter(theRequest, wrapper);
out.write(wrapper.getData());
addFooter(out);
out.close();
}
/**
* Write the header to the output stream. The header text is extracted
* from a filter initialisation parameter (defined in
* <code>web.xml</code>). Don't write anything if no parameter is defined.
*
* @param theOutput the output stream
*/
protected void addHeader(OutputStream theOutputStream)
throws IOException
{
String header = this.config.getInitParameter("header");
if (header != null) {
theOutputStream.write(header.getBytes());
}
}
/**
* Write the footer to the output stream. The footer text is extracted
* from a filter initialisation parameter (defined in
* <code>web.xml</code>). Don't write anything if no parameter is defined.
*
* @param theOutput the output stream
*/
protected void addFooter(OutputStream theOutputStream)
throws IOException
{
String footer = this.config.getInitParameter("footer");
if (footer != null) {
theOutputStream.write(footer.getBytes());
}
}
/**
* Filter un-initialisation. Called by the servlet engine during the life
* cycle of the filter.
*/
public void destroy()
{
}
}
1.1
jakarta-commons/cactus/src/sample/servlet23/org/apache/commons/cactus/sample/TestSampleFilter.java
Index: TestSampleFilter.java
===================================================================
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 1999 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "The Jakarta Project", "Cactus", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact [EMAIL PROTECTED]
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package org.apache.commons.cactus.sample;
import java.util.*;
import java.text.*;
import java.net.*;
import java.io.*;
import javax.servlet.*;
import junit.framework.*;
import org.apache.commons.cactus.*;
import org.apache.commons.cactus.util.*;
/**
* Tests of the <code>SampleFilter</code> filter class.
*
* @author <a href="mailto:[EMAIL PROTECTED]">Vincent Massol</a>
*
* @version $Id: TestSampleFilter.java,v 1.1 2001/09/07 16:15:22 vmassol Exp $
*/
public class TestSampleFilter extends FilterTestCase
{
/**
* Defines the testcase name for JUnit.
*
* @param theName the testcase's name.
*/
public TestSampleFilter(String theName)
{
super(theName);
}
/**
* Start the tests.
*
* @param theArgs the arguments. Not used
*/
public static void main(String[] theArgs)
{
junit.ui.TestRunner.main(new String[] {
TestSampleFilter.class.getName()});
}
/**
* @return a test suite (<code>TestSuite</code>) that includes all methods
* starting with "test"
*/
public static Test suite()
{
// All methods starting with "test" will be executed in the test suite.
return new TestSuite(TestSampleFilter.class);
}
//-------------------------------------------------------------------------
/**
* Test that adding a header to the output stream is working fine when
* a header parameter is defined.
*/
public void testAddHeaderParamOK() throws ServletException, IOException
{
SampleFilter filter = new SampleFilter();
config.setInitParameter("header", "<h1>header</h1>");
filter.init(config);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
filter.addHeader(baos);
assertEquals("<h1>header</h1>", baos.toString());
}
//-------------------------------------------------------------------------
/**
* Test that adding a header to the output stream is working fine
* (i.e. nothing gets written) when no header parameter is defined.
*/
public void testAddHeaderParamNotDefined() throws ServletException,
IOException
{
SampleFilter filter = new SampleFilter();
filter.init(config);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
filter.addHeader(baos);
assertEquals("", baos.toString());
}
//-------------------------------------------------------------------------
/**
* Test that adding a footer to the output stream is working fine when
* a footer parameter is defined.
*/
public void testAddFooterParamOK() throws ServletException, IOException
{
SampleFilter filter = new SampleFilter();
config.setInitParameter("footer", "<h1>footer</h1>");
filter.init(config);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
filter.addFooter(baos);
assertEquals("<h1>footer</h1>", baos.toString());
}
//-------------------------------------------------------------------------
/**
* Test that adding a footer to the output stream is working fine
* (i.e. nothing gets written) when no footer parameter is defined.
*/
public void testAddFooterParamNotDefined() throws ServletException,
IOException
{
SampleFilter filter = new SampleFilter();
filter.init(config);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
filter.addFooter(baos);
assertEquals("", baos.toString());
}
//-------------------------------------------------------------------------
/**
* Test that the filter does correctly add a header and footer to
* any requets it is serving.
*/
public void testDoFilterOK() throws ServletException, IOException
{
SampleFilter filter = new SampleFilter();
config.setInitParameter("header", "<h1>header</h1>");
config.setInitParameter("footer", "<h1>footer</h1>");
filter.init(config);
filterChain.setMockFilterChain(new FilterChain() {
public void doFilter(ServletRequest theRequest,
ServletResponse theResponse) throws IOException, ServletException
{
PrintWriter writer = theResponse.getWriter();
writer.print("<p>some content</p>");
writer.close();
}
});
filter.doFilter(request, response, filterChain);
}
/**
* Test that the filter does correctly add a header and footer to
* any requets it is serving.
*
* @param theResponse the response from the server side.
*/
public void endDoFilterOK(WebResponse theResponse)
{
assertEquals("<h1>header</h1><p>some content</p><h1>footer</h1>",
theResponse.getText());
}
}
1.1
jakarta-commons/cactus/src/sample/servlet23/org/apache/commons/cactus/sample/util/FilterServletOutputStream.java
Index: FilterServletOutputStream.java
===================================================================
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 1999 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "The Jakarta Project", "Cactus", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact [EMAIL PROTECTED]
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package org.apache.commons.cactus.sample.util;
import javax.servlet.*;
import java.io.*;
/**
* Helper class to help write filters that manipulates the output stream. This
* is because normally, the <code>ServletOutputStream</code> cannot be
* modified after a resource has committed it.
*
* Note: This code was adapted from the Filter tutorial found
* {@link <a href="http://www.orionserver.com/tutorials/filters/lesson3/">
* here</a>}
*
* @author <a href="mailto:[EMAIL PROTECTED]">Vincent Massol</a>
*
* @version $Id: FilterServletOutputStream.java,v 1.1 2001/09/07 16:15:22 vmassol
Exp $
*
* @see GenericResponseWrapper
*/
public class FilterServletOutputStream extends ServletOutputStream
{
/**
* The stream where all the data will get written to
*/
private DataOutputStream stream;
/**
* Constructor.
*
* @param theOutput the output stream that we wrap in a
* <code>DataOutputStream</code> in order to hold the data
*/
public FilterServletOutputStream(OutputStream theOutput)
{
stream = new DataOutputStream(theOutput);
}
// Overriden methods from ServletOutputStream ----------------------------
public void write(int b) throws IOException
{
stream.write(b);
}
public void write(byte[] b) throws IOException
{
stream.write(b);
}
public void write(byte[] b, int off, int len) throws IOException
{
stream.write(b, off, len);
}
}
1.1
jakarta-commons/cactus/src/sample/servlet23/org/apache/commons/cactus/sample/util/GenericResponseWrapper.java
Index: GenericResponseWrapper.java
===================================================================
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 1999 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "The Jakarta Project", "Cactus", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact [EMAIL PROTECTED]
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package org.apache.commons.cactus.sample.util;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
/**
* Wrapper around a <code>HttpServletResponse</code> that we use to easily
* write filters that manipulate the output stream. Indeed, we cannot pass
* the output stream of our filter direectly to the next filter in the chain
* because then we won't be able to write to it (the response will have been
* committed). Instead, we pass this wrapper class and then copy its data
* to our filter output stream.
*
* Note: This code was adapted from the Filter tutorial found
* {@link <a href="http://www.orionserver.com/tutorials/filters/lesson3/">
* here</a>}
*
* @author <a href="mailto:[EMAIL PROTECTED]">Vincent Massol</a>
*
* @version $Id: GenericResponseWrapper.java,v 1.1 2001/09/07 16:15:22 vmassol Exp $
*
* @see FilterServletOutputStream
*/
public class GenericResponseWrapper extends HttpServletResponseWrapper
{
/**
* Holder for the output data
*/
private ByteArrayOutputStream output;
/**
* Save the content length so that we can query it at a later time
* (otherwise it would not be possible as
* <code>HttpServletResponseWrapper</code> does not have a method to get
* the content length).
*/
private int contentLength;
/**
* Save the content type so that we can query it at a later time
* (otherwise it would not be possible as
* <code>HttpServletResponseWrapper</code> does not have a method to get
* the content type).
*/
private String contentType;
// Constructors ----------------------------------------------------------
/**
* @param theResponse the wrapped response object
*/
public GenericResponseWrapper(HttpServletResponse theResponse)
{
super(theResponse);
this.output = new ByteArrayOutputStream();
}
// New methods -----------------------------------------------------------
/**
* @return the data sent to the output stream
*/
public byte[] getData()
{
return output.toByteArray();
}
// Overridden methods ----------------------------------------------------
public ServletOutputStream getOutputStream()
{
return new FilterServletOutputStream(this.output);
}
public void setContentLength(int theLength)
{
this.contentLength = theLength;
super.setContentLength(theLength);
}
public int getContentLength()
{
return this.contentLength;
}
public void setContentType(String theType)
{
this.contentType = theType;
super.setContentType(theType);
}
public String getContentType()
{
return this.contentType;
}
public PrintWriter getWriter()
{
return new PrintWriter(getOutputStream(), true);
}
}