package org.jboss.resteasy.core.interception.jaxrs;
import org.jboss.resteasy.specimpl.BuiltResponse;
import org.jboss.resteasy.spi.HttpRequest;
import org.jboss.resteasy.spi.HttpResponse;
import javax.ws.rs.container.ContainerResponseContext;
import javax.ws.rs.core.EntityTag;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.Link;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.core.NewCookie;
import javax.ws.rs.core.Response;
import java.io.IOException;
import java.io.OutputStream;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import java.net.URI;
import java.util.Date;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
/**
* @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
* @version $Revision: 1 $
*/
public class ContainerResponseContextImpl implements ContainerResponseContext
{
protected final HttpRequest request;
protected final HttpResponse httpResponse;
protected final BuiltResponse jaxrsResponse;
public ContainerResponseContextImpl(HttpRequest request, HttpResponse httpResponse, BuiltResponse serverResponse)
{
this.request = request;
this.httpResponse = httpResponse;
this.jaxrsResponse = serverResponse;
}
public BuiltResponse getJaxrsResponse()
{
return jaxrsResponse;
}
public HttpResponse getHttpResponse()
{
return httpResponse;
}
@Override
public int getStatus()
{
return jaxrsResponse.getStatus();
}
@Override
public void setStatus(int code)
{
httpResponse.setStatus(code);
jaxrsResponse.setStatus(code);
}
@Override
public Response.StatusType getStatusInfo()
{
return jaxrsResponse.getStatusInfo();
}
@Override
public void setStatusInfo(Response.StatusType statusInfo)
{
httpResponse.setStatus(statusInfo.getStatusCode());
jaxrsResponse.setStatus(statusInfo.getStatusCode());
}
@Override
public Class<?> getEntityClass()
{
return jaxrsResponse.getEntityClass();
}
@Override
public Type getEntityType()
{
return jaxrsResponse.getGenericType();
}
@Override
public void setEntity(Object entity)
{
//if (entity != null) logger.info("*** setEntity(Object) " + entity.toString());
jaxrsResponse.setEntity(entity);
// todo TCK does weird things in its testing of get length
// it resets the entity in a response filter which results
// in a bad content-length being sent back to the client
// so, we'll remove any content-length setting
getHeaders().remove(HttpHeaders.CONTENT_LENGTH);
}
@Override
public void setEntity(Object entity, Annotation[] annotations, MediaType mediaType)
{
//if (entity != null) logger.info("*** setEntity(Object, Annotation[], MediaType) " + entity.toString() + ", " + mediaType);
jaxrsResponse.setEntity(entity);
jaxrsResponse.setAnnotations(annotations);
jaxrsResponse.getHeaders().putSingle(HttpHeaders.CONTENT_TYPE, mediaType);
// todo TCK does weird things in its testing of get length
// it resets the entity in a response filter which results
// in a bad content-length being sent back to the client
// so, we'll remove any content-length setting
getHeaders().remove(HttpHeaders.CONTENT_LENGTH);
}
@Override
public MultivaluedMap<String, Object> getHeaders()
{
return jaxrsResponse.getMetadata();
}
@Override
public Set<String> getAllowedMethods()
{
return jaxrsResponse.getAllowedMethods();
}
@Override
public Date getDate()
{
return jaxrsResponse.getDate();
}
@Override
public Locale getLanguage()
{
return jaxrsResponse.getLanguage();
}
@Override
public int getLength()
{
return jaxrsResponse.getLength();
}
@Override
public MediaType getMediaType()
{
return jaxrsResponse.getMediaType();
}
@Override
public Map<String, NewCookie> getCookies()
{
return jaxrsResponse.getCookies();
}
@Override
public EntityTag getEntityTag()
{
return jaxrsResponse.getEntityTag();
}
@Override
public Date getLastModified()
{
return jaxrsResponse.getLastModified();
}
@Override
public URI getLocation()
{
return jaxrsResponse.getLocation();
}
@Override
public Set<Link> getLinks()
{
return jaxrsResponse.getLinks();
}
@Override
public boolean hasLink(String relation)
{
return jaxrsResponse.hasLink(relation);
}
@Override
public Link getLink(String relation)
{
return jaxrsResponse.getLink(relation);
}
@Override
public Link.Builder getLinkBuilder(String relation)
{
return jaxrsResponse.getLinkBuilder(relation);
}
@Override
public boolean hasEntity()
{
return jaxrsResponse.hasEntity();
}
@Override
public Object getEntity()
{
return jaxrsResponse.getEntity();
}
@Override
public OutputStream getEntityStream()
{
try
{
return httpResponse.getOutputStream();
}
catch (IOException e)
{
throw new RuntimeException(e);
}
}
@Override
public void setEntityStream(OutputStream entityStream)
{
httpResponse.setOutputStream(entityStream);
}
@Override
public Annotation[] getEntityAnnotations()
{
return jaxrsResponse.getAnnotations();
}
@Override
public MultivaluedMap<String, String> getStringHeaders()
{
return jaxrsResponse.getStringHeaders();
}
@Override
public String getHeaderString(String name)
{
return jaxrsResponse.getHeaderString(name);
}
}