/* * Copyright 2004-2015 the Seasar Foundation and the Others. * * 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.seasar.framework.mock.servlet; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.PrintWriter; import java.util.ArrayList; import java.util.Arrays; import java.util.Enumeration; import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; import javax.servlet.ServletOutputStream; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.seasar.framework.util.EmptyEnumeration; import org.seasar.framework.util.EnumerationAdapter; import org.seasar.framework.util.SPrintWriter; /** * {@link MockHttpServletResponse}の実装クラスです。 * * @author higa * */ public class MockHttpServletResponseImpl implements MockHttpServletResponse { private List cookieList; private Map headers = new HashMap(); private boolean committed = false; private int status; private String message; private byte[] buffer = new byte[1024]; private Locale locale; private String characterEncoding; private PrintWriter writer = new SPrintWriter(); private ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); private ServletOutputStream outputStream = new MockServletOutputStreamImpl( byteArrayOutputStream); private boolean getWriterCalled; private boolean getOutputStreamCalled; /** * {@link MockHttpServletResponseImpl}を作成します。 * * @param request */ public MockHttpServletResponseImpl(HttpServletRequest request) { cookieList = new ArrayList(Arrays.asList(request.getCookies())); locale = request.getLocale(); characterEncoding = request.getCharacterEncoding(); } public Cookie[] getCookies() { return (Cookie[]) cookieList.toArray(new Cookie[cookieList.size()]); } /** * @see javax.servlet.http.HttpServletResponse#addCookie(javax.servlet.http.Cookie) */ public void addCookie(Cookie cookie) { cookieList.add(cookie); } /** * @see javax.servlet.http.HttpServletResponse#containsHeader(java.lang.String) */ public boolean containsHeader(String name) { return headers.containsKey(name); } /** * @see javax.servlet.http.HttpServletResponse#encodeURL(java.lang.String) */ public String encodeURL(String url) { return url; } /** * @see javax.servlet.http.HttpServletResponse#encodeRedirectURL(java.lang.String) */ public String encodeRedirectURL(String url) { return url; } /** * @deprecated * @see javax.servlet.http.HttpServletResponse#encodeUrl(java.lang.String) */ public String encodeUrl(String url) { return encodeURL(url); } /** * @deprecated * @see javax.servlet.http.HttpServletResponse#encodeRedirectUrl(java.lang.String) */ public String encodeRedirectUrl(String url) { return encodeRedirectUrl(url); } public int getStatus() { return status; } public String getMessage() { return message; } /** * @see javax.servlet.http.HttpServletResponse#sendError(int, * java.lang.String) */ public void sendError(int status, String message) throws IOException { setStatus(status, message); } /** * * @see javax.servlet.http.HttpServletResponse#sendError(int) */ public void sendError(int status) throws IOException { setStatus(status); } /** * * @see javax.servlet.http.HttpServletResponse#sendRedirect(java.lang.String) */ public void sendRedirect(String path) throws IOException { } public Enumeration getHeaders(String name) { List values = getHeaderList(name); if (values != null) { return new EnumerationAdapter(values.iterator()); } return new EmptyEnumeration(); } public String getHeader(String name) { List values = getHeaderList(name); if (values != null) { return (String) values.get(0); } return null; } public Enumeration getHeaderNames() { return new EnumerationAdapter(headers.keySet().iterator()); } /** * * @see javax.servlet.http.HttpServletResponse#setDateHeader(java.lang.String, * long) */ public void setDateHeader(String name, long value) { setHeader(name, MockHeaderUtil.getDateValue(value)); } /** * * @see javax.servlet.http.HttpServletResponse#addDateHeader(java.lang.String, * long) */ public void addDateHeader(String name, long value) { addHeader(name, MockHeaderUtil.getDateValue(value)); } /** * * @see javax.servlet.http.HttpServletResponse#setHeader(java.lang.String, * java.lang.String) */ public void setHeader(String name, String value) { List values = new ArrayList(); values.add(value); headers.put(name.toLowerCase(), values); } /** * * @see javax.servlet.http.HttpServletResponse#addHeader(java.lang.String, * java.lang.String) */ public void addHeader(String name, String value) { List values = getHeaderList(name); if (values == null) { values = new ArrayList(); } values.add(value); headers.put(name.toLowerCase(), values); } public int getIntHeader(String name) { String value = getHeader(name); return MockHeaderUtil.getIntValue(value); } /** * * @see javax.servlet.http.HttpServletResponse#setIntHeader(java.lang.String, * int) */ public void setIntHeader(String name, int value) { setHeader(name, value + ""); } /** * * @see javax.servlet.http.HttpServletResponse#addIntHeader(java.lang.String, * int) */ public void addIntHeader(String name, int value) { addHeader(name, value + ""); } private List getHeaderList(String name) { name = name.toLowerCase(); return (List) headers.get(name); } /** * * @see javax.servlet.http.HttpServletResponse#setStatus(int) */ public void setStatus(int status) { setStatus(status, getResponseStatusMessage(status)); } private static String getResponseStatusMessage(int status) { switch (status) { case HttpServletResponse.SC_OK: return "OK"; case HttpServletResponse.SC_ACCEPTED: return "Accepted"; case HttpServletResponse.SC_BAD_GATEWAY: return "Bad Gateway"; case HttpServletResponse.SC_BAD_REQUEST: return "Bad Request"; case HttpServletResponse.SC_CONFLICT: return "Conflict"; case HttpServletResponse.SC_CONTINUE: return "Continue"; case HttpServletResponse.SC_CREATED: return "Created"; case HttpServletResponse.SC_EXPECTATION_FAILED: return "Expectation Failed"; case HttpServletResponse.SC_FORBIDDEN: return "Forbidden"; case HttpServletResponse.SC_GATEWAY_TIMEOUT: return "Gateway Timeout"; case HttpServletResponse.SC_GONE: return "Gone"; case HttpServletResponse.SC_HTTP_VERSION_NOT_SUPPORTED: return "HTTP Version Not Supported"; case HttpServletResponse.SC_INTERNAL_SERVER_ERROR: return "Internal Server Error"; case HttpServletResponse.SC_LENGTH_REQUIRED: return "Length Required"; case HttpServletResponse.SC_METHOD_NOT_ALLOWED: return "Method Not Allowed"; case HttpServletResponse.SC_MOVED_PERMANENTLY: return "Moved Permanently"; case HttpServletResponse.SC_MOVED_TEMPORARILY: return "Moved Temporarily"; case HttpServletResponse.SC_MULTIPLE_CHOICES: return "Multiple Choices"; case HttpServletResponse.SC_NO_CONTENT: return "No Content"; case HttpServletResponse.SC_NON_AUTHORITATIVE_INFORMATION: return "Non-Authoritative Information"; case HttpServletResponse.SC_NOT_ACCEPTABLE: return "Not Acceptable"; case HttpServletResponse.SC_NOT_FOUND: return "Not Found"; case HttpServletResponse.SC_NOT_IMPLEMENTED: return "Not Implemented"; case HttpServletResponse.SC_NOT_MODIFIED: return "Not Modified"; case HttpServletResponse.SC_PARTIAL_CONTENT: return "Partial Content"; case HttpServletResponse.SC_PAYMENT_REQUIRED: return "Payment Required"; case HttpServletResponse.SC_PRECONDITION_FAILED: return "Precondition Failed"; case HttpServletResponse.SC_PROXY_AUTHENTICATION_REQUIRED: return "Proxy Authentication Required"; case HttpServletResponse.SC_REQUEST_ENTITY_TOO_LARGE: return "Request Entity Too Large"; case HttpServletResponse.SC_REQUEST_TIMEOUT: return "Request Timeout"; case HttpServletResponse.SC_REQUEST_URI_TOO_LONG: return "Request URI Too Long"; case HttpServletResponse.SC_REQUESTED_RANGE_NOT_SATISFIABLE: return "Requested Range Not Satisfiable"; case HttpServletResponse.SC_RESET_CONTENT: return "Reset Content"; case HttpServletResponse.SC_SEE_OTHER: return "See Other"; case HttpServletResponse.SC_SERVICE_UNAVAILABLE: return "Service Unavailable"; case HttpServletResponse.SC_SWITCHING_PROTOCOLS: return "Switching Protocols"; case HttpServletResponse.SC_UNAUTHORIZED: return "Unauthorized"; case HttpServletResponse.SC_UNSUPPORTED_MEDIA_TYPE: return "Unsupported Media Type"; case HttpServletResponse.SC_USE_PROXY: return "Use Proxy"; case 207: return "Multi-Status"; case 422: return "Unprocessable Entity"; case 423: return "Locked"; case 507: return "Insufficient Storage"; default: return "HTTP Response Status " + status; } } /** * @deprecated * @see javax.servlet.http.HttpServletResponse#setStatus(int, * java.lang.String) */ public void setStatus(int status, String message) { assertNotCommitted(); this.status = status; this.message = message; resetBuffer(); } private void assertNotCommitted() { if (isCommitted()) { throw new IllegalStateException("Already committed"); } } /** * * @see javax.servlet.ServletResponse#getCharacterEncoding() */ public String getCharacterEncoding() { return characterEncoding; } public void setCharacterEncoding(String characterEncoding) { this.characterEncoding = characterEncoding; } /** * * @see javax.servlet.ServletResponse#getOutputStream() */ public ServletOutputStream getOutputStream() throws IOException { if (getWriterCalled) { throw new IllegalStateException(); } if (!getOutputStreamCalled) { getOutputStreamCalled = true; } return outputStream; } /** * * @see javax.servlet.ServletResponse#getWriter() */ public PrintWriter getWriter() throws IOException { if (getOutputStreamCalled) { throw new IllegalStateException(); } if (!getWriterCalled) { getWriterCalled = true; } return writer; } /** * * @see javax.servlet.ServletResponse#setContentLength(int) */ public void setContentLength(int contentLength) { setIntHeader("content-length", contentLength); } public int getContentLength() { return getIntHeader("content-length"); } public String getContentType() { return getHeader("content-type"); } /** * * @see javax.servlet.ServletResponse#setContentType(java.lang.String) */ public void setContentType(String contentType) { setHeader("content-type", contentType); } /** * @see javax.servlet.ServletResponse#setBufferSize(int) */ public void setBufferSize(int size) { assertNotCommitted(); if (size <= buffer.length) { return; } buffer = new byte[size]; } /** * @see javax.servlet.ServletResponse#getBufferSize() */ public int getBufferSize() { return buffer.length; } /** * @see javax.servlet.ServletResponse#flushBuffer() */ public void flushBuffer() throws IOException { } /** * @see javax.servlet.ServletResponse#resetBuffer() */ public void resetBuffer() { assertNotCommitted(); } /** * @see javax.servlet.ServletResponse#isCommitted() */ public boolean isCommitted() { return committed; } /** * @see javax.servlet.ServletResponse#reset() */ public void reset() { committed = false; } /** * @see javax.servlet.ServletResponse#setLocale(java.util.Locale) */ public void setLocale(Locale locale) { this.locale = locale; } /** * @see javax.servlet.ServletResponse#getLocale() */ public Locale getLocale() { return locale; } public byte[] getResponseBytes() { return byteArrayOutputStream.toByteArray(); } public String getResponseString() { return writer.toString(); } }