From seam-commits at lists.jboss.org Mon Jul 13 12:08:36 2009 Content-Type: multipart/mixed; boundary="===============6935626995255991705==" MIME-Version: 1.0 From: seam-commits at lists.jboss.org To: seam-commits at lists.jboss.org Subject: [seam-commits] Seam SVN: r11279 - in branches/enterprise/JBPAPP_5_0: src/main/org/jboss/seam/mock and 1 other directory. Date: Mon, 13 Jul 2009 11:50:48 -0400 Message-ID: <200907131550.n6DFom75015746@svn01.web.mwc.hst.phx2.redhat.com> --===============6935626995255991705== Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Author: manaRH Date: 2009-07-13 11:50:48 -0400 (Mon, 13 Jul 2009) New Revision: 11279 Added: branches/enterprise/JBPAPP_5_0/src/main/org/jboss/seam/mock/DelegatingSe= rvletInputStream.java branches/enterprise/JBPAPP_5_0/src/main/org/jboss/seam/mock/DelegatingSe= rvletOutputStream.java branches/enterprise/JBPAPP_5_0/src/main/org/jboss/seam/mock/EnhancedMock= HttpServletRequest.java branches/enterprise/JBPAPP_5_0/src/main/org/jboss/seam/mock/EnhancedMock= HttpServletResponse.java branches/enterprise/JBPAPP_5_0/src/main/org/jboss/seam/mock/HeaderValueH= older.java branches/enterprise/JBPAPP_5_0/src/main/org/jboss/seam/mock/MockRequestD= ispatcher.java branches/enterprise/JBPAPP_5_0/src/main/org/jboss/seam/mock/ResourceRequ= estEnvironment.java Removed: branches/enterprise/JBPAPP_5_0/src/main/org/jboss/seam/mock/AbstractDBUn= itSeamTest.java Modified: branches/enterprise/JBPAPP_5_0/doc/Seam_Reference_Guide/en-US/Webservice= s.xml Log: back ported JBSEAM-4195 Modified: branches/enterprise/JBPAPP_5_0/doc/Seam_Reference_Guide/en-US/Web= services.xml =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- branches/enterprise/JBPAPP_5_0/doc/Seam_Reference_Guide/en-US/Webservic= es.xml 2009-07-13 12:20:22 UTC (rev 11278) +++ branches/enterprise/JBPAPP_5_0/doc/Seam_Reference_Guide/en-US/Webservic= es.xml 2009-07-13 15:50:48 UTC (rev 11279) @@ -599,40 +599,49 @@
Used by {@link MockHttpServletRequest}; typically not directly
+ * used for testing application controllers.
+ *
+ * @author Juergen Hoeller
+ * @see MockHttpServletRequest
+ * @since 1.0.2
+ */
+public class DelegatingServletInputStream extends ServletInputStream
+{
+
+ private final InputStream sourceStream;
+
+
+ /**
+ * Create a DelegatingServletInputStream for the given source stream.
+ *
+ * @param sourceStream the source stream (never null
)
+ */
+ public DelegatingServletInputStream(InputStream sourceStream)
+ {
+ this.sourceStream =3D sourceStream;
+ }
+
+ /**
+ * Return the underlying source stream (never null
).
+ */
+ public final InputStream getSourceStream()
+ {
+ return this.sourceStream;
+ }
+
+
+ public int read() throws IOException
+ {
+ return this.sourceStream.read();
+ }
+
+ public void close() throws IOException
+ {
+ super.close();
+ this.sourceStream.close();
+ }
+
+}
\ No newline at end of file
Added: branches/enterprise/JBPAPP_5_0/src/main/org/jboss/seam/mock/Delegati=
ngServletOutputStream.java
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- branches/enterprise/JBPAPP_5_0/src/main/org/jboss/seam/mock/DelegatingS=
ervletOutputStream.java (rev 0)
+++ branches/enterprise/JBPAPP_5_0/src/main/org/jboss/seam/mock/DelegatingS=
ervletOutputStream.java 2009-07-13 15:50:48 UTC (rev 11279)
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2002-2007 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.jboss.seam.mock;
+
+import javax.servlet.ServletOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+
+
+/**
+ * Delegating implementation of {@link javax.servlet.ServletOutputStream}.
+ *
Used by {@link MockHttpServletResponse}; typically not directly
+ * used for testing application controllers.
+ *
+ * @author Juergen Hoeller
+ * @see MockHttpServletResponse
+ * @since 1.0.2
+ */
+public class DelegatingServletOutputStream extends ServletOutputStream
+{
+
+ private final OutputStream targetStream;
+
+
+ /**
+ * Create a DelegatingServletOutputStream for the given target stream.
+ *
+ * @param targetStream the target stream (never null
)
+ */
+ public DelegatingServletOutputStream(OutputStream targetStream)
+ {
+ this.targetStream =3D targetStream;
+ }
+
+ /**
+ * Return the underlying target stream (never null
).
+ */
+ public final OutputStream getTargetStream()
+ {
+ return this.targetStream;
+ }
+
+
+ public void write(int b) throws IOException
+ {
+ this.targetStream.write(b);
+ }
+
+ public void flush() throws IOException
+ {
+ super.flush();
+ this.targetStream.flush();
+ }
+
+ public void close() throws IOException
+ {
+ super.close();
+ this.targetStream.close();
+ }
+
+}
\ No newline at end of file
Copied: branches/enterprise/JBPAPP_5_0/src/main/org/jboss/seam/mock/Enhance=
dMockHttpServletRequest.java (from rev 11257, branches/enterprise/JBPAPP_5_=
0/src/main/org/jboss/seam/mock/MockHttpServletRequest.java)
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- branches/enterprise/JBPAPP_5_0/src/main/org/jboss/seam/mock/EnhancedMoc=
kHttpServletRequest.java (rev 0)
+++ branches/enterprise/JBPAPP_5_0/src/main/org/jboss/seam/mock/EnhancedMoc=
kHttpServletRequest.java 2009-07-13 15:50:48 UTC (rev 11279)
@@ -0,0 +1,1093 @@
+/*
+ * Copyright 2002-2008 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.jboss.seam.mock;
+
+import javax.servlet.RequestDispatcher;
+import javax.servlet.ServletContext;
+import javax.servlet.ServletInputStream;
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+import java.io.BufferedReader;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.io.UnsupportedEncodingException;
+import java.security.Principal;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Date;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Set;
+import java.util.Vector;
+
+/**
+ * Mock implementation of the {@link javax.servlet.http.HttpServletRequest}
+ * interface. Supports the Servlet 2.4 API level.
+ *
Used for testing the web framework; also useful for testing
+ * application controllers.
+ *
+ * @author Juergen Hoeller
+ * @author Rod Johnson
+ * @author Rick Evans
+ * @author Mark Fisher
+ * @since 1.0.2
+ */
+public class EnhancedMockHttpServletRequest implements HttpServletRequest
+{
+
+ /**
+ * The default protocol: 'http'.
+ */
+ public static final String DEFAULT_PROTOCOL =3D "http";
+
+ /**
+ * The default server address: '127.0.0.1'.
+ */
+ public static final String DEFAULT_SERVER_ADDR =3D "127.0.0.1";
+
+ /**
+ * The default server name: 'localhost'.
+ */
+ public static final String DEFAULT_SERVER_NAME =3D "localhost";
+
+ /**
+ * The default server port: '80'.
+ */
+ public static final int DEFAULT_SERVER_PORT =3D 80;
+
+ /**
+ * The default remote address: '127.0.0.1'.
+ */
+ public static final String DEFAULT_REMOTE_ADDR =3D "127.0.0.1";
+
+ /**
+ * The default remote host: 'localhost'.
+ */
+ public static final String DEFAULT_REMOTE_HOST =3D "localhost";
+
+ private boolean active =3D true;
+
+
+ //---------------------------------------------------------------------
+ // ServletRequest properties
+ //---------------------------------------------------------------------
+
+ private final Hashtable attributes =3D new Hashtable();
+
+ private String characterEncoding;
+
+ private byte[] content;
+
+ private String contentType;
+
+ private final Map parameters =3D new LinkedHashMap(16);
+
+ private String protocol =3D DEFAULT_PROTOCOL;
+
+ private String scheme =3D DEFAULT_PROTOCOL;
+
+ private String serverName =3D DEFAULT_SERVER_NAME;
+
+ private int serverPort =3D DEFAULT_SERVER_PORT;
+
+ private String remoteAddr =3D DEFAULT_REMOTE_ADDR;
+
+ private String remoteHost =3D DEFAULT_REMOTE_HOST;
+
+ /**
+ * List of locales in descending order
+ */
+ private final Vector locales =3D new Vector();
+
+ private boolean secure =3D false;
+
+ private final ServletContext servletContext;
+
+ private int remotePort =3D DEFAULT_SERVER_PORT;
+
+ private String localName =3D DEFAULT_SERVER_NAME;
+
+ private String localAddr =3D DEFAULT_SERVER_ADDR;
+
+ private int localPort =3D DEFAULT_SERVER_PORT;
+
+
+ //---------------------------------------------------------------------
+ // HttpServletRequest properties
+ //---------------------------------------------------------------------
+
+ private String authType;
+
+ private Cookie[] cookies;
+
+ /**
+ * The key is the lowercase header name; the value is a {@link org.jbos=
s.seam.mock.HeaderValueHolder} object.
+ */
+ private final Hashtable headers =3D new Hashtable();
+
+ private String method;
+
+ private String pathInfo;
+
+ private String contextPath =3D "";
+
+ private String queryString;
+
+ private Map If there are already one or more values registered for the given
+ * parameter name, they will be replaced.
+ */
+ public void setParameter(String name, String value)
+ {
+ setParameter(name, new String[]{value});
+ }
+
+ /**
+ * Set an array of values for the specified HTTP parameter.
+ * If there are already one or more values registered for the given
+ * parameter name, they will be replaced.
+ */
+ public void setParameter(String name, String[] values)
+ {
+ this.parameters.put(name, values);
+ }
+
+ /**
+ * Sets all provided parameters If there are already one or more values registered for the given
+ * parameter name, the given value will be added to the end of the list.
+ */
+ public void addParameter(String name, String value)
+ {
+ addParameter(name, new String[]{value});
+ }
+
+ /**
+ * Add an array of values for the specified HTTP parameter.
+ * If there are already one or more values registered for the given
+ * parameter name, the given values will be added to the end of the lis=
t.
+ */
+ public void addParameter(String name, String[] values)
+ {
+ String[] oldArr =3D (String[]) this.parameters.get(name);
+ if (oldArr !=3D null)
+ {
+ String[] newArr =3D new String[oldArr.length + values.length];
+ System.arraycopy(oldArr, 0, newArr, 0, oldArr.length);
+ System.arraycopy(values, 0, newArr, oldArr.length, values.length);
+ this.parameters.put(name, newArr);
+ }
+ else
+ {
+ this.parameters.put(name, values);
+ }
+ }
+
+ /**
+ * Adds all provided parameters If there was no entry for that header name before,
+ * the value will be used as-is. In case of an existing entry,
+ * a String array will be created, adding the given value (more
+ * specifically, its toString representation) as further element.
+ * Multiple values can only be stored as list of Strings,
+ * following the Servlet spec (see Used for testing the web framework; also useful for testing
+ * application controllers.
+ *
+ * @author Juergen Hoeller
+ * @author Rod Johnson
+ * @since 1.0.2
+ */
+public class EnhancedMockHttpServletResponse implements HttpServletRespons=
e {
+
+ public static final int DEFAULT_SERVER_PORT =3D 80;
+
+ private static final String CHARSET_PREFIX =3D "charset=3D";
+
+
+ //---------------------------------------------------------------------
+ // ServletResponse properties
+ //---------------------------------------------------------------------
+
+ private boolean outputStreamAccessAllowed =3D true;
+
+ private boolean writerAccessAllowed =3D true;
+
+ private String characterEncoding =3D "ISO-8859-1";
+
+ private final ByteArrayOutputStream content =3D new ByteArrayOutputStream=
();
+
+ private final ServletOutputStream outputStream =3D new ResponseServletOut=
putStream(this.content);
+
+ private PrintWriter writer;
+
+ private int contentLength =3D 0;
+
+ private String contentType;
+
+ private int bufferSize =3D 4096;
+
+ private boolean committed;
+
+ private Locale locale =3D Locale.getDefault();
+
+
+ //---------------------------------------------------------------------
+ // HttpServletResponse properties
+ //---------------------------------------------------------------------
+
+ private final List cookies =3D new ArrayList();
+
+ /**
+ * The key is the lowercase header name; the value is a {@link org.jboss.=
seam.mock.HeaderValueHolder} object.
+ */
+ private final Map headers =3D new HashMap();
+
+ private int status =3D HttpServletResponse.SC_OK;
+
+ private String statusMessage;
+
+ private String redirectedUrl;
+
+ private String forwardedUrl;
+
+ private String includedUrl;
+
+
+ //---------------------------------------------------------------------
+ // ServletResponse interface
+ //---------------------------------------------------------------------
+
+ /**
+ * Set whether {@link #getOutputStream()} access is allowed.
+ * Default is Default is Will return the first value in case of multiple values.
+ * @param name the name of the header
+ * @return the associated header value, or Can be overridden in subclasses, appending a session id or the like.
+ */
+ public String encodeURL(String url) {
+ return url;
+ }
+
+ /**
+ * The default implementation delegates to {@link #encodeURL},
+ * returning the given URL String as-is.
+ * Can be overridden in subclasses, appending a session id or the like
+ * in a redirect-specific fashion. For general URL encoding rules,
+ * override the common {@link #encodeURL} method instead, appyling
+ * to redirect URLs as well as to general URLs.
+ */
+ public String encodeRedirectURL(String url) {
+ return encodeURL(url);
+ }
+
+ public String encodeUrl(String url) {
+ return encodeURL(url);
+ }
+
+ public String encodeRedirectUrl(String url) {
+ return encodeRedirectURL(url);
+ }
+
+ public void sendError(int status, String errorMessage) throws IOException=
{
+ if (isCommitted()) {
+ throw new IllegalStateException("Cannot set error status - response is =
already committed");
+ }
+ this.status =3D status;
+ this.statusMessage =3D errorMessage;
+ setCommitted(true);
+ }
+
+ public void sendError(int status) throws IOException {
+ if (isCommitted()) {
+ throw new IllegalStateException("Cannot set error status - response is =
already committed");
+ }
+ this.status =3D status;
+ setCommitted(true);
+ }
+
+ public void sendRedirect(String url) throws IOException {
+ if (isCommitted()) {
+ throw new IllegalStateException("Cannot send redirect - response is alr=
eady committed");
+ }
+ this.redirectedUrl =3D url;
+ setCommitted(true);
+ }
+
+ public String getRedirectedUrl() {
+ return this.redirectedUrl;
+ }
+
+ public void setDateHeader(String name, long value) {
+ setHeaderValue(name, new Long(value));
+ }
+
+ public void addDateHeader(String name, long value) {
+ addHeaderValue(name, new Long(value));
+ }
+
+ public void setHeader(String name, String value) {
+ setHeaderValue(name, value);
+ }
+
+ public void addHeader(String name, String value) {
+ addHeaderValue(name, value);
+ }
+
+ public void setIntHeader(String name, int value) {
+ setHeaderValue(name, new Integer(value));
+ }
+
+ public void addIntHeader(String name, int value) {
+ addHeaderValue(name, new Integer(value));
+ }
+
+ private void setHeaderValue(String name, Object value) {
+ doAddHeaderValue(name, value, true);
+ }
+
+ private void addHeaderValue(String name, Object value) {
+ doAddHeaderValue(name, value, false);
+ }
+
+ private void doAddHeaderValue(String name, Object value, boolean replace)=
{
+ HeaderValueHolder header =3D HeaderValueHolder.getByName(this.headers, n=
ame);
+ if (header =3D=3D null) {
+ header =3D new HeaderValueHolder();
+ this.headers.put(name, header);
+ }
+ if (replace) {
+ header.setValue(value);
+ }
+ else {
+ header.addValue(value);
+ }
+ }
+
+ public void setStatus(int status) {
+ this.status =3D status;
+ }
+
+ public void setStatus(int status, String statusMessage) {
+ this.status =3D status;
+ this.statusMessage =3D statusMessage;
+ }
+
+ public int getStatus() {
+ return this.status;
+ }
+
+ public String getStatusMessage() {
+ return this.statusMessage;
+ }
+
+
+ //---------------------------------------------------------------------
+ // Methods for MockRequestDispatcher
+ //---------------------------------------------------------------------
+
+ public void setForwardedUrl(String forwardedUrl) {
+ this.forwardedUrl =3D forwardedUrl;
+ }
+
+ public String getForwardedUrl() {
+ return this.forwardedUrl;
+ }
+
+ public void setIncludedUrl(String includedUrl) {
+ this.includedUrl =3D includedUrl;
+ }
+
+ public String getIncludedUrl() {
+ return this.includedUrl;
+ }
+
+
+ /**
+ * Inner class that adapts the ServletOutputStream to mark the
+ * response as committed once the buffer size is exceeded.
+ */
+ private class ResponseServletOutputStream extends DelegatingServletOutput=
Stream
+ {
+
+ public ResponseServletOutputStream(OutputStream out) {
+ super(out);
+ }
+
+ public void write(int b) throws IOException {
+ super.write(b);
+ super.flush();
+ setCommittedIfBufferSizeExceeded();
+ }
+
+ public void flush() throws IOException {
+ super.flush();
+ setCommitted(true);
+ }
+ }
+
+
+ /**
+ * Inner class that adapts the PrintWriter to mark the
+ * response as committed once the buffer size is exceeded.
+ */
+ private class ResponsePrintWriter extends PrintWriter {
+
+ public ResponsePrintWriter(Writer out) {
+ super(out, true);
+ }
+
+ public void write(char buf[], int off, int len) {
+ super.write(buf, off, len);
+ super.flush();
+ setCommittedIfBufferSizeExceeded();
+ }
+
+ public void write(String s, int off, int len) {
+ super.write(s, off, len);
+ super.flush();
+ setCommittedIfBufferSizeExceeded();
+ }
+
+ public void write(int c) {
+ super.write(c);
+ super.flush();
+ setCommittedIfBufferSizeExceeded();
+ }
+
+ public void flush() {
+ super.flush();
+ setCommitted(true);
+ }
+ }
+
+}
\ No newline at end of file
Added: branches/enterprise/JBPAPP_5_0/src/main/org/jboss/seam/mock/HeaderVa=
lueHolder.java
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- branches/enterprise/JBPAPP_5_0/src/main/org/jboss/seam/mock/HeaderValue=
Holder.java (rev 0)
+++ branches/enterprise/JBPAPP_5_0/src/main/org/jboss/seam/mock/HeaderValue=
Holder.java 2009-07-13 15:50:48 UTC (rev 11279)
@@ -0,0 +1,123 @@
+/*
+ * Copyright 2002-2007 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.jboss.seam.mock;
+
+import java.lang.reflect.Array;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Internal helper class that serves as value holder for request headers.
+ *
+ * @author Juergen Hoeller
+ * @author Rick Evans
+ * @since 2.0.1
+ */
+class HeaderValueHolder
+{
+
+ private final List values =3D new LinkedList();
+
+
+ public void setValue(Object value)
+ {
+ this.values.clear();
+ this.values.add(value);
+ }
+
+ public void addValue(Object value)
+ {
+ this.values.add(value);
+ }
+
+ public void addValues(Collection values)
+ {
+ this.values.addAll(values);
+ }
+
+ public void addValueArray(Object values)
+ {
+ Object[] arr =3D toObjectArray(values);
+ this.values.addAll(Arrays.asList(arr));
+ }
+
+ public List getValues()
+ {
+ return Collections.unmodifiableList(this.values);
+ }
+
+ public Object getValue()
+ {
+ return (!this.values.isEmpty() ? this.values.get(0) : null);
+ }
+
+
+ /**
+ * Find a HeaderValueHolder by name, ignoring casing.
+ *
+ * @param headers the Map of header names to HeaderValueHolders
+ * @param name the name of the desired header
+ * @return the corresponding HeaderValueHolder,
+ * or Used for testing the web framework; typically not necessary for
+ * testing application controllers.
+ *
+ * @author Rod Johnson
+ * @author Juergen Hoeller
+ * @since 1.0.2
+ */
+public class MockRequestDispatcher implements RequestDispatcher
+{
+
+ private final Log logger =3D LogFactory.getLog(getClass());
+
+ private final String url;
+
+
+ /**
+ * Create a new MockRequestDispatcher for the given URL.
+ *
+ * @param url the URL to dispatch to.
+ */
+ public MockRequestDispatcher(String url)
+ {
+ this.url =3D url;
+ }
+
+
+ public void forward(ServletRequest request, ServletResponse response)
+ {
+ if (response.isCommitted())
+ {
+ throw new IllegalStateException("Cannot perform forward - respons=
e is already committed");
+ }
+ getMockHttpServletResponse(response).setForwardedUrl(this.url);
+ if (logger.isDebugEnabled())
+ {
+ logger.debug("MockRequestDispatcher: forwarding to URL [" + this.=
url + "]");
+ }
+ }
+
+ public void include(ServletRequest request, ServletResponse response)
+ {
+ getMockHttpServletResponse(response).setIncludedUrl(this.url);
+ if (logger.isDebugEnabled())
+ {
+ logger.debug("MockRequestDispatcher: including URL [" + this.url =
+ "]");
+ }
+ }
+
+ /**
+ * Obtain the underlying EnhancedMockHttpServletResponse,
+ * unwrapping {@link javax.servlet.http.HttpServletResponseWrapper} dec=
orators if necessary.
+ */
+ protected EnhancedMockHttpServletResponse getMockHttpServletResponse(Se=
rvletResponse response)
+ {
+ if (response instanceof EnhancedMockHttpServletResponse)
+ {
+ return (EnhancedMockHttpServletResponse) response;
+ }
+ if (response instanceof HttpServletResponseWrapper)
+ {
+ return getMockHttpServletResponse(((HttpServletResponseWrapper) r=
esponse).getResponse());
+ }
+ throw new IllegalArgumentException("MockRequestDispatcher requires M=
ockHttpServletResponse");
+ }
+
+}
\ No newline at end of file
Added: branches/enterprise/JBPAPP_5_0/src/main/org/jboss/seam/mock/Resource=
RequestEnvironment.java
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- branches/enterprise/JBPAPP_5_0/src/main/org/jboss/seam/mock/ResourceReq=
uestEnvironment.java (rev 0)
+++ branches/enterprise/JBPAPP_5_0/src/main/org/jboss/seam/mock/ResourceReq=
uestEnvironment.java 2009-07-13 15:50:48 UTC (rev 11279)
@@ -0,0 +1,267 @@
+package org.jboss.seam.mock;
+
+import org.jboss.seam.servlet.SeamResourceServlet;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.Cookie;
+import javax.servlet.ServletException;
+import javax.servlet.ServletResponse;
+import javax.servlet.ServletRequest;
+import javax.servlet.FilterChain;
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletContext;
+import java.util.Collections;
+import java.util.Set;
+import java.util.List;
+import java.util.Map;
+import java.util.Enumeration;
+import java.security.Principal;
+import java.io.IOException;
+
+/**
+ * Executes (through local calls, not TCP sockets) an HTTP request in a un=
it test, passing it through
+ * the Seam resource handlers and filters.
+ *
+ *
+ * This class is supposed to be used within a SeamTest, in=
fact, you need
+ * to pass an instance of SeamTest into its constructor. This pre=
pares the environment
+ * for the resource request processing. You can either share an instance o=
f the environment between
+ * all your test methods (prepare it in @BeforeClass) or you=
can create a new instance
+ * for each ResourceRequest:
+ *
+ * Note that in a SeamTest the (mock) HTTP session is always shar=
ed between all requests in a particular test
+ * method. Each test method however executes with a new (mock) HTTP sessio=
n. Design your tests accordingly, this is not
+ * configurable.
+ *
+ * IMPORTANT: A ResourceRequest has to be executed in a @T=
est method or in a
+ * @BeforeMethod callback. You can not execute it in any other ca=
llback, such * as @BeforeClass.
+ * null
)
+ * @param requestURI the request URI (may be null
)
+ * @see #setMethod
+ * @see #setRequestURI
+ * @see MockServletContext
+ */
+ public EnhancedMockHttpServletRequest(String method, String requestURI)
+ {
+ this(null, method, requestURI);
+ }
+
+ /**
+ * Create a new MockHttpServletRequest.
+ *
+ * @param servletContext the ServletContext that the request runs in
+ * (may be null
to use a default Moc=
kServletContext)
+ * @see MockServletContext
+ */
+ public EnhancedMockHttpServletRequest(ServletContext servletContext)
+ {
+ this(servletContext, "", "");
+ }
+
+ /**
+ * Create a new MockHttpServletRequest.
+ *
+ * @param servletContext the ServletContext that the request runs in
+ * (may be null
to use a default Moc=
kServletContext)
+ * @param method the request method (may be null
)
+ * @param requestURI the request URI (may be null
)
+ * @see #setMethod
+ * @see #setRequestURI
+ * @see MockServletContext
+ */
+ public EnhancedMockHttpServletRequest(ServletContext servletContext, St=
ring method, String requestURI)
+ {
+ this.servletContext =3D (servletContext !=3D null ? servletContext :=
new MockServletContext());
+ this.method =3D method;
+ this.requestURI =3D requestURI;
+ this.locales.add(Locale.ENGLISH);
+
+ // Old mock: The 1.2 RI NPEs if this header isn't present
+ addHeader("Accept", new String[0]);
+ }
+
+
+ // OLD CONSTRUCTORS FROM < SEAM 2.2 MOCKS!
+
+ public EnhancedMockHttpServletRequest(HttpSession session)
+ {
+ this(session, null, new HashSetgetHeaders
accessor).
+ * As alternative to repeated addHeader
calls for
+ * individual elements, you can use a single call with an entire
+ * array or Collection of values as parameter.
+ *
+ * @see #getHeaderNames
+ * @see #getHeader
+ * @see #getHeaders
+ * @see #getDateHeader
+ * @see #getIntHeader
+ */
+ public void addHeader(String name, Object value)
+ {
+ HeaderValueHolder header =3D HeaderValueHolder.getByName(this.header=
s, name);
+ if (header =3D=3D null)
+ {
+ header =3D new HeaderValueHolder();
+ this.headers.put(name, header);
+ }
+ if (value instanceof Collection)
+ {
+ header.addValues((Collection) value);
+ }
+ else if (value.getClass().isArray())
+ {
+ header.addValueArray(value);
+ }
+ else
+ {
+ header.addValue(value);
+ }
+ }
+
+ public long getDateHeader(String name)
+ {
+ HeaderValueHolder header =3D HeaderValueHolder.getByName(this.header=
s, name);
+ Object value =3D (header !=3D null ? header.getValue() : null);
+ if (value instanceof Date)
+ {
+ return ((Date) value).getTime();
+ }
+ else if (value instanceof Number)
+ {
+ return ((Number) value).longValue();
+ }
+ else if (value !=3D null)
+ {
+ throw new IllegalArgumentException(
+ "Value for header '" + name + "' is neither a Date nor a Nu=
mber: " + value);
+ }
+ else
+ {
+ return -1L;
+ }
+ }
+
+ public String getHeader(String name)
+ {
+ HeaderValueHolder header =3D HeaderValueHolder.getByName(this.header=
s, name);
+ return (header !=3D null ? header.getValue().toString() : null);
+ }
+
+ public Maptrue
.
+ */
+ public void setOutputStreamAccessAllowed(boolean outputStreamAccessAllowe=
d) {
+ this.outputStreamAccessAllowed =3D outputStreamAccessAllowed;
+ }
+
+ /**
+ * Return whether {@link #getOutputStream()} access is allowed.
+ */
+ public boolean isOutputStreamAccessAllowed() {
+ return this.outputStreamAccessAllowed;
+ }
+
+ /**
+ * Set whether {@link #getWriter()} access is allowed.
+ * true
.
+ */
+ public void setWriterAccessAllowed(boolean writerAccessAllowed) {
+ this.writerAccessAllowed =3D writerAccessAllowed;
+ }
+
+ /**
+ * Return whether {@link #getOutputStream()} access is allowed.
+ */
+ public boolean isWriterAccessAllowed() {
+ return this.writerAccessAllowed;
+ }
+
+ public void setCharacterEncoding(String characterEncoding) {
+ this.characterEncoding =3D characterEncoding;
+ }
+
+ public String getCharacterEncoding() {
+ return this.characterEncoding;
+ }
+
+ public ServletOutputStream getOutputStream() {
+ if (!this.outputStreamAccessAllowed) {
+ throw new IllegalStateException("OutputStream access not allowed");
+ }
+ return this.outputStream;
+ }
+
+ public PrintWriter getWriter() throws UnsupportedEncodingException {
+ if (!this.writerAccessAllowed) {
+ throw new IllegalStateException("Writer access not allowed");
+ }
+ if (this.writer =3D=3D null) {
+ Writer targetWriter =3D (this.characterEncoding !=3D null ?
+ new OutputStreamWriter(this.content, this.characterEncoding) : new Ou=
tputStreamWriter(this.content));
+ this.writer =3D new ResponsePrintWriter(targetWriter);
+ }
+ return this.writer;
+ }
+
+ public byte[] getContentAsByteArray() {
+ flushBuffer();
+ return this.content.toByteArray();
+ }
+
+ public String getContentAsString() {
+ flushBuffer();
+ try {
+ return (this.characterEncoding !=3D null) ?
+ this.content.toString(this.characterEncoding) : this.conten=
t.toString();
+ } catch (UnsupportedEncodingException ex) {
+ throw new RuntimeException(ex);
+ }
+ }
+
+ public void setContentLength(int contentLength) {
+ this.contentLength =3D contentLength;
+ }
+
+ public int getContentLength() {
+ return this.contentLength;
+ }
+
+ public void setContentType(String contentType) {
+ this.contentType =3D contentType;
+ if (contentType !=3D null) {
+ int charsetIndex =3D contentType.toLowerCase().indexOf(CHARSET_PREFIX);
+ if (charsetIndex !=3D -1) {
+ String encoding =3D contentType.substring(charsetIndex + CHARSET_PREFI=
X.length());
+ setCharacterEncoding(encoding);
+ }
+ }
+ }
+
+ public String getContentType() {
+ return this.contentType;
+ }
+
+ public void setBufferSize(int bufferSize) {
+ this.bufferSize =3D bufferSize;
+ }
+
+ public int getBufferSize() {
+ return this.bufferSize;
+ }
+
+ public void flushBuffer() {
+ setCommitted(true);
+ }
+
+ public void resetBuffer() {
+ if (isCommitted()) {
+ throw new IllegalStateException("Cannot reset buffer - response is alre=
ady committed");
+ }
+ this.content.reset();
+ }
+
+ private void setCommittedIfBufferSizeExceeded() {
+ int bufSize =3D getBufferSize();
+ if (bufSize > 0 && this.content.size() > bufSize) {
+ setCommitted(true);
+ }
+ }
+
+ public void setCommitted(boolean committed) {
+ this.committed =3D committed;
+ }
+
+ public boolean isCommitted() {
+ return this.committed;
+ }
+
+ public void reset() {
+ resetBuffer();
+ this.characterEncoding =3D null;
+ this.contentLength =3D 0;
+ this.contentType =3D null;
+ this.locale =3D null;
+ this.cookies.clear();
+ this.headers.clear();
+ this.status =3D HttpServletResponse.SC_OK;
+ this.statusMessage =3D null;
+ }
+
+ public void setLocale(Locale locale) {
+ this.locale =3D locale;
+ }
+
+ public Locale getLocale() {
+ return this.locale;
+ }
+
+
+ //---------------------------------------------------------------------
+ // HttpServletResponse interface
+ //---------------------------------------------------------------------
+
+ public void addCookie(Cookie cookie) {
+ this.cookies.add(cookie);
+ }
+
+ public Cookie[] getCookies() {
+ return (Cookie[]) this.cookies.toArray(new Cookie[this.cookies.size()]);
+ }
+
+ public Cookie getCookie(String name) {
+ for (Iterator it =3D this.cookies.iterator(); it.hasNext();) {
+ Cookie cookie =3D (Cookie) it.next();
+ if (name.equals(cookie.getName())) {
+ return cookie;
+ }
+ }
+ return null;
+ }
+
+ public boolean containsHeader(String name) {
+ return (HeaderValueHolder.getByName(this.headers, name) !=3D null);
+ }
+
+ /**
+ * Return the names of all specified headers as a Set of Strings.
+ * @return the Set
of header name Strings
, or a=
n empty Set
if none
+ */
+ public Set getHeaderNames() {
+ return this.headers.keySet();
+ }
+
+ /**
+ * Return the primary value for the given header, if any.
+ * null
if none
+ */
+ public Object getHeader(String name) {
+ HeaderValueHolder header =3D HeaderValueHolder.getByName(this.headers, n=
ame);
+ return (header !=3D null ? header.getValue() : null);
+ }
+
+ /**
+ * Return all values for the given header as a List of value objects.
+ * @param name the name of the header
+ * @return the associated header values, or an empty List if none
+ */
+ public List getHeaders(String name) {
+ HeaderValueHolder header =3D HeaderValueHolder.getByName(this.headers, n=
ame);
+ return (header !=3D null ? header.getValues() : Collections.EMPTY_LIST);
+ }
+
+ /**
+ * The default implementation returns the given URL String as-is.
+ *
null
if none found
+ */
+ public static HeaderValueHolder getByName(Map headers, String name)
+ {
+ for (Iterator it =3D headers.keySet().iterator(); it.hasNext();)
+ {
+ String headerName =3D (String) it.next();
+ if (headerName.equalsIgnoreCase(name))
+ {
+ return (HeaderValueHolder) headers.get(headerName);
+ }
+ }
+ return null;
+ }
+
+ public static Object[] toObjectArray(Object source)
+ {
+ if (source instanceof Object[])
+ {
+ return (Object[]) source;
+ }
+ if (source =3D=3D null)
+ {
+ return new Object[0];
+ }
+ if (!source.getClass().isArray())
+ {
+ throw new IllegalArgumentException("Source is not an array: " + s=
ource);
+ }
+ int length =3D Array.getLength(source);
+ if (length =3D=3D 0)
+ {
+ return new Object[0];
+ }
+ Class wrapperType =3D Array.get(source, 0).getClass();
+ Object[] newArray =3D (Object[]) Array.newInstance(wrapperType, leng=
th);
+ for (int i =3D 0; i < length; i++)
+ {
+ newArray[i] =3D Array.get(source, i);
+ }
+ return newArray;
+ }
+
+}
\ No newline at end of file
Added: branches/enterprise/JBPAPP_5_0/src/main/org/jboss/seam/mock/MockRequ=
estDispatcher.java
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- branches/enterprise/JBPAPP_5_0/src/main/org/jboss/seam/mock/MockRequest=
Dispatcher.java (rev 0)
+++ branches/enterprise/JBPAPP_5_0/src/main/org/jboss/seam/mock/MockRequest=
Dispatcher.java 2009-07-13 15:50:48 UTC (rev 11279)
@@ -0,0 +1,95 @@
+/*
+ * Copyright 2002-2007 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.jboss.seam.mock;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import javax.servlet.RequestDispatcher;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletResponseWrapper;
+
+/**
+ * Mock implementation of the {@link javax.servlet.RequestDispatcher} inte=
rface.
+ *
+ * import org.jboss.seam.mock.ResourceRequestEnvironment;
+ * import org.jboss.seam.mock.EnhancedMockHttpServletRequest;
+ * import org.jboss.seam.mock.EnhancedMockHttpServletResponse;
+ * import static org.jboss.seam.mock.ResourceRequestEnvironment.ResourceRe=
quest;
+ * import static org.jboss.seam.mock.ResourceRequestEnvironment.Method;
+ *
+ * public class MyTest extends SeamTest {
+ *
+ * ResourceRequestEnvironment sharedEnvironment;
+ *
+ * @BeforeClass
+ * public void prepareSharedEnvironment() throws Exception {
+ * sharedEnvironment =3D new ResourceRequestEnvironment(this) {
+ * @Override
+ * public Map
+ *