package org.fastcatsearch.http.action; import java.io.BufferedWriter; import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.Writer; import java.nio.charset.Charset; import org.fastcatsearch.http.HttpChannel; import org.fastcatsearch.ir.io.ByteRefArrayOutputStream; import org.jboss.netty.handler.codec.http.HttpResponseStatus; public class ActionResponse { private final static Charset charset = Charset.forName("utf-8"); private Object contentType; private HttpResponseStatus status; private ByteRefArrayOutputStream baos; private boolean isEmpty; private HttpChannel httpChannel; private String responseCookie; private String responseSetCookie; //스트림연결인지. private boolean isStreamResult; //객체유지용. private Writer writer; private StreamWriter streamWriter; public ActionResponse(HttpChannel httpChannel) { this.httpChannel = httpChannel; } public void setContentType(String contentType) { this.contentType = contentType; } public void setStatus(HttpResponseStatus status) { this.status = status; } public void setResponseCookie(String responseCookie) { this.responseCookie = responseCookie; } public void setResponseSetCookie(String responseSetCookie) { this.responseSetCookie = responseSetCookie; } public String responseCookie() { return responseCookie; } public String responseSetCookie() { return responseSetCookie; } public boolean contentThreadSafe() { return false; } public HttpResponseStatus status() { return status; } public OutputStream getOutputStream() { isEmpty = false; if(baos == null){ baos = new ByteRefArrayOutputStream(); } return baos; } public HttpChannel getChannel(){ return httpChannel; } public Writer getWriter() { isEmpty = false; if(writer == null){ if(baos == null){ baos = new ByteRefArrayOutputStream(); } writer = new BufferedWriter(new OutputStreamWriter(baos, charset)); } return writer; } public Writer getExistWriter() { return writer; } public StreamWriter getStreamWriter() { if(streamWriter == null){ streamWriter = new StreamWriter(httpChannel); } isStreamResult = true; return streamWriter; } public byte[] content() { if (!isEmpty) { return baos.array(); } else { return null; } } public int contentOffset() { return 0; } public int contentLength() { if (!isEmpty) { return baos.length(); } else { return 0; } } public Object contentType() { return contentType; } public boolean isEmpty() { return isEmpty; } public void done() throws IOException{ if(isStreamResult) { streamWriter.close(); }else{ httpChannel.sendResponse(this); } } public void error(Throwable e){ if(isStreamResult) { httpChannel.channel().write(e.toString()); httpChannel.channel().close(); }else{ httpChannel.sendError(HttpResponseStatus.INTERNAL_SERVER_ERROR, e); } } }