package org.fastcatsearch.http.action;
import org.fastcatsearch.util.JSONPResponseWriter;
import org.fastcatsearch.util.JSONResponseWriter;
import org.fastcatsearch.util.ResponseWriter;
import org.fastcatsearch.util.XMLResponseWriter;
import org.jboss.netty.handler.codec.http.HttpResponseStatus;
import java.io.Writer;
public abstract class ServiceAction extends HttpAction {
public static final String DEFAULT_ROOT_ELEMENT = "response";
public static final String DEFAULT_CHARSET = "utf-8";
public static enum Type {
json, xml, jsonp, html, text
};
public ServiceAction() {
}
abstract public void doAction(ActionRequest request, ActionResponse response) throws Exception;
@Override
public void runAction(ActionRequest request, ActionResponse response) throws Exception {
try {
doAction(request, response);
} catch (ActionException t) {
writeHeader(response);
Writer writer = response.getWriter();
try {
ResponseWriter resultWriter = getDefaultResponseWriter(writer);
resultWriter.object().key("success").value(false).key("errorMessage").value(t.toString()).endObject();
resultWriter.done();
} finally {
writer.close();
}
} catch (Throwable t) {
logger.error("ServiceAction Error!", t);
writeHeader(response);
Writer writer = response.getWriter();
try {
ResponseWriter resultWriter = getDefaultResponseWriter(writer);
resultWriter.object().key("success").value(false).key("errorMessage").value(t.toString()).endObject();
resultWriter.done();
} finally {
writer.close();
}
}
}
protected void writeHeader(ActionResponse response) {
writeHeader(response, DEFAULT_CHARSET);
}
protected void writeHeader(ActionResponse response, String responseCharset) {
if(response.status() == null) {
response.setStatus(HttpResponseStatus.OK);
}
// logger.debug("resultType > {}", resultType);
if (resultType == Type.json) {
response.setContentType("application/json; charset=" + responseCharset);
} else if (resultType == Type.jsonp) {
response.setContentType("application/json; charset=" + responseCharset);
} else if (resultType == Type.xml) {
response.setContentType("text/xml; charset=" + responseCharset);
} else if (resultType == Type.html) {
response.setContentType("text/html; charset=" + responseCharset);
} else if (resultType == Type.text) {
response.setContentType("text/plain; charset=" + responseCharset);
} else {
response.setContentType("application/json; charset=" + responseCharset);
}
}
protected ResponseWriter getDefaultResponseWriter(Writer writer) {
return getDefaultResponseWriter(writer, false, false);
}
protected ResponseWriter getDefaultResponseWriter(Writer writer, boolean isFieldLowercase, boolean noUnicode) {
return getResponseWriter(writer, DEFAULT_ROOT_ELEMENT, true, null, isFieldLowercase, false);
}
protected ResponseWriter getResponseWriter(Writer writer, String rootElement, boolean isBeautify, String jsonCallback, boolean isFieldLowercase, boolean noUnicode) {
ResponseWriter resultWriter = null;
if (resultType == Type.json) {
resultWriter = new JSONResponseWriter(writer, isBeautify, isFieldLowercase, noUnicode);
} else if (resultType == Type.jsonp) {
resultWriter = new JSONPResponseWriter(writer, jsonCallback, isBeautify, isFieldLowercase, noUnicode);
} else if (resultType == Type.xml) {
resultWriter = new XMLResponseWriter(writer, rootElement, isBeautify, isFieldLowercase);
}
return resultWriter;
}
}