/*
* Copyright (C) 2014 Civilian Framework.
*
* Licensed under the Civilian License (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.civilian-framework.org/license.txt
*
* 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.civilian.context.servlet;
import java.io.Flushable;
import java.io.IOException;
import java.io.OutputStream;
import java.io.Writer;
import java.util.Collection;
import java.util.Iterator;
import java.util.Locale;
import javax.servlet.ServletResponse;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
import org.civilian.content.ContentType;
import org.civilian.internal.AbstractResponse;
import org.civilian.internal.Logs;
import org.civilian.response.ResponseHeaders;
import org.civilian.util.ClassUtil;
/**
* A Response implementation based on a HttpServletResponse.
*/
class ServletResponseAdapter extends AbstractResponse
{
/**
* Creates a new ServletResponseAdapter.
*/
public ServletResponseAdapter(ServletRequestAdapter request, HttpServletResponse response)
{
super(request);
servletResponse_ = response;
}
/**
* Forwards to the HttpServletResponse.
*/
@Override public boolean isCommitted()
{
return servletResponse_.isCommitted();
}
/**
* Forwards to the HttpServletResponse.
*/
@Override public void reset()
{
servletResponse_.reset();
}
/**
* Forwards to the HttpServletResponse.
*/
@Override public void addCookie(Cookie cookie)
{
servletResponse_.addCookie(cookie);
}
/**
* Forwards to the HttpServletResponse#encodeURL(String)
*/
@Override public String addSessionId(String url)
{
return servletResponse_.encodeURL(url);
}
/**
* Forwards to the HttpServletResponse.
*/
@Override protected void sendRedirectImpl(String url) throws IOException
{
if (Logs.RESPONSE.isDebugEnabled())
Logs.RESPONSE.debug("redirect to " + url);
// will fail if response was already committed
url = servletResponse_.encodeRedirectURL(url);
servletResponse_.sendRedirect(url);
}
/**
* Forwards to the HttpServletResponse.
*/
@Override public int getStatus()
{
return servletResponse_.getStatus();
}
/**
* Forwards to the HttpServletResponse.
*/
@Override public void setStatus(int statusCode)
{
servletResponse_.setStatus(statusCode);
}
//-----------------------------------
// response body
//-----------------------------------
/**
* Forwards to the HttpServletResponse.
*/
@Override protected Writer getContentWriterImpl() throws IOException
{
return servletResponse_.getWriter();
}
/**
* Forwards to the HttpServletResponse.
*/
@Override protected OutputStream getContentStreamImpl() throws IOException
{
return servletResponse_.getOutputStream();
}
/**
* Forwards to the HttpServletResponse.
*/
@Override public void setContentType(ContentType type)
{
servletResponse_.setContentType(type != null ? type.getValue() : null);
contentType_ = type;
}
/**
* Forwards to the HttpServletResponse.
*/
@Override public ContentType getContentType()
{
return contentType_;
}
/**
* Forwards to the HttpServletResponse.
*/
@Override protected void setContentEncodingImpl(String encoding)
{
servletResponse_.setCharacterEncoding(encoding);
}
/**
* Forwards to the HttpServletResponse.
*/
@Override public void setContentLength(long length)
{
if (SETCONTENT_LENGTH_LONG_METHOD != null)
{
try
{
SETCONTENT_LENGTH_LONG_METHOD.invoke(servletResponse_, Long.valueOf(length));
}
catch(Exception e)
{
Logs.REQUEST.error("unexpected", e);
}
}
servletResponse_.setContentLength((int)length);
}
/**
* Sets the content language and forwards to the HttpServletResponse.
*/
@Override public void setContentLanguage(Locale locale)
{
super.setContentLanguage(locale);
servletResponse_.setLocale(locale);
}
/**
* Forwards to the HttpServletResponse.
*/
@Override protected void resetBufferImpl()
{
servletResponse_.resetBuffer();
}
/**
* Forwards to the HttpServletResponse.
*/
@Override protected void flushBuffer(Flushable flushable) throws IOException
{
if (flushable != null)
flushable.flush();
else
servletResponse_.flushBuffer();
}
/**
* Forwards to the HttpServletResponse.
*/
@Override public void setBufferSize(int size)
{
servletResponse_.setBufferSize(size);
}
/**
* Forwards to the HttpServletResponse.
*/
@Override public int getBufferSize()
{
return servletResponse_.getBufferSize();
}
//----------------------------
// ResponseHeaders interface
//----------------------------
/**
* Returns a ResponseHeaders object.
*/
@Override public ResponseHeaders getHeaders()
{
if (headers_ == null)
headers_ = new Headers();
return headers_;
}
private class Headers implements ResponseHeaders
{
/**
* Forwards to the HttpServletResponse.
*/
@Override public void add(String name, String value)
{
servletResponse_.addHeader(name, value);
}
/**
* Forwards to the HttpServletResponse.
*/
@Override public void addDate(String name, long value)
{
servletResponse_.addDateHeader(name, value);
}
/**
* Forwards to the HttpServletResponse.
*/
@Override public void addInt(String name, int value)
{
servletResponse_.addIntHeader(name, value);
}
/**
* Forwards to the HttpServletResponse.
*/
@Override public boolean contains(String name)
{
return servletResponse_.containsHeader(name);
}
/**
* Forwards to the HttpServletResponse.
*/
@Override public Iterator<String> iterator()
{
return servletResponse_.getHeaderNames().iterator();
}
/**
* Forwards to the HttpServletResponse.
*/
@Override public String[] getAll(String name)
{
Collection<String> values = servletResponse_.getHeaders(name);
return values.toArray(new String[values.size()]);
}
@Override public String get(String name)
{
return servletResponse_.getHeader(name);
}
/**
* Forwards to the HttpServletResponse.
*/
@Override public void set(String name, String... values)
{
servletResponse_.setHeader(name, null);
if (values != null)
{
for (String v : values)
servletResponse_.addHeader(name, v);
}
}
/**
* Forwards to the HttpServletResponse.
*/
@Override public void setDate(String name, long value)
{
servletResponse_.setDateHeader(name, value);
}
/**
* Forwards to the HttpServletResponse.
*/
@Override public void setInt(String name, int value)
{
servletResponse_.setIntHeader(name, value);
}
}
/**
* Returns the HttpServletResponse.
*/
public HttpServletResponse getServletResponse()
{
return servletResponse_;
}
/**
* Returns the HttpServletResponse, if implClass is ServletResponse.class or
* HttpServletResponse.class
*/
@Override public <T> T unwrap(Class<T> implClass)
{
return ClassUtil.unwrap(servletResponse_, implClass);
}
private HttpServletResponse servletResponse_;
private Headers headers_;
private ContentType contentType_;
private static final java.lang.reflect.Method SETCONTENT_LENGTH_LONG_METHOD;
static
{
java.lang.reflect.Method set = null;
try
{
set = ServletResponse.class.getMethod("setContentLengthLong", Long.class);
}
catch(Exception e)
{
}
SETCONTENT_LENGTH_LONG_METHOD = set;
}
}