package com.nabalive.framework.web;
import com.thoughtworks.xstream.XStream;
import org.codehaus.jackson.map.ObjectMapper;
import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.buffer.ChannelBufferOutputStream;
import org.jboss.netty.buffer.ChannelBuffers;
import org.jboss.netty.channel.ChannelFuture;
import org.jboss.netty.channel.ChannelFutureListener;
import org.jboss.netty.channel.ChannelHandlerContext;
import org.jboss.netty.handler.codec.http.DefaultHttpResponse;
import org.jboss.netty.handler.codec.http.HttpHeaders;
import org.jboss.netty.handler.codec.http.HttpRequest;
import org.jboss.netty.handler.codec.http.HttpResponse;
import org.jboss.netty.util.CharsetUtil;
import java.io.IOException;
import java.nio.charset.Charset;
import static org.jboss.netty.handler.codec.http.HttpHeaders.isKeepAlive;
import static org.jboss.netty.handler.codec.http.HttpHeaders.setContentLength;
import static org.jboss.netty.handler.codec.http.HttpResponseStatus.OK;
import static org.jboss.netty.handler.codec.http.HttpVersion.HTTP_1_1;
/**
* Created by IntelliJ IDEA.
* User: Julien Cheype
* Date: 10/24/11
*/
public class Response {
private final static ObjectMapper mapper = new ObjectMapper();
private final static XStream xstreamXML = new XStream();
// static{
// SimpleModule simpleModule = new SimpleModule("SimpleModule",
// new Version(1,0,0,null));
// simpleModule.addSerializer(new ObjectIdSerializer());
// mapper.registerModule(simpleModule);
// }
public final ChannelHandlerContext ctx;
public final HttpRequest request;
public Response(ChannelHandlerContext ctx, HttpRequest request) {
this.request = request;
this.ctx = ctx;
}
public void write(byte[] data) {
final ChannelBuffer buffer = ChannelBuffers.copiedBuffer(data);
write(buffer);
}
public void write(ChannelBuffer buffer) {
HttpResponse response = new DefaultHttpResponse(HTTP_1_1, OK);
response.setHeader(HttpHeaders.Names.SERVER, "nuvoos server");
setContentLength(response, buffer.readableBytes());
response.setContent(buffer);
if (isKeepAlive(request)) {
response.setHeader(HttpHeaders.Names.CONNECTION, "Keep-Alive");
}
final ChannelFuture future = ctx.getChannel().write(response);
if (!isKeepAlive(request)) {
future.addListener(ChannelFutureListener.CLOSE);
}
}
public void write(String data, Charset charset) {
write(data.getBytes(charset));
}
public void write(String data) {
write(data, CharsetUtil.UTF_8);
}
public void write(HttpResponse response) {
if (isKeepAlive(request)) {
response.setHeader(HttpHeaders.Names.CONNECTION, "Keep-Alive");
}
setContentLength(response, response.getContent().readableBytes());
ChannelFuture future = ctx.getChannel().write(response);
if (!isKeepAlive(request)) {
future.addListener(ChannelFutureListener.CLOSE);
}
}
public void writeJSON(Object object) throws IOException {
ChannelBuffer channelBuffer = ChannelBuffers.dynamicBuffer();
ChannelBufferOutputStream outputStream = new ChannelBufferOutputStream(channelBuffer);
mapper.writeValue(outputStream, object);
outputStream.close();
write(channelBuffer);
}
public void writeXML(Object object) {
ChannelBuffer channelBuffer = ChannelBuffers.dynamicBuffer();
ChannelBufferOutputStream outputStream = new ChannelBufferOutputStream(channelBuffer);
xstreamXML.toXML(object, outputStream);
write(channelBuffer);
}
}