package com.fourspaces.featherdb.httpd; import java.io.IOException; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import org.json.JSONWriter; import com.fourspaces.featherdb.FeatherDB; import com.fourspaces.featherdb.auth.Credentials; import com.fourspaces.featherdb.backend.BackendException; import com.fourspaces.featherdb.document.Document; import com.fourspaces.featherdb.document.DocumentCreationException; import com.fourspaces.featherdb.utils.Logger; import com.fourspaces.featherdb.views.ViewException; public abstract class BaseRequestHandler { protected static final String JSON_MIMETYPE = "application/javascript"; protected FeatherDB featherDB; abstract public boolean match(Credentials credentials, HttpServletRequest request, String db, String id); abstract protected void handleInner(Credentials credentials, HttpServletRequest request, HttpServletResponse response, String db, String id, String rev) throws BackendException, IOException, DocumentCreationException, ViewException; protected Logger log = Logger.get(getClass()); public void handle(Credentials credentials, HttpServletRequest request, HttpServletResponse response, String db, String id, String rev){ try { handleInner(credentials,request,response,db,id,rev);//,fields); } catch (JSONException e) { sendError(response, "JSON processing error"); log.error(e,"JSON error"); } catch (ViewException e) { sendError(response, "View processing error"); log.error(e,"View error"); } catch (BackendException e) { sendError(response, "Backend storage error"); log.error(e,"Backend error"); e.printStackTrace(); } catch (IOException e) { sendError(response, "IO error"); log.error(e,"Backend error"); e.printStackTrace(); } catch (DocumentCreationException e) { sendError(response, "IO error"); log.error(e,"Backend error"); e.printStackTrace(); } } public void setFeatherDB(FeatherDB featherDB) { this.featherDB=featherDB; } protected void sendNotAuth(HttpServletResponse response) { sendError(response,"Not authorized to perform requested action", HttpServletResponse.SC_UNAUTHORIZED); } protected void sendError(HttpServletResponse response, String string) { sendError(response,string,HttpServletResponse.SC_INTERNAL_SERVER_ERROR); } protected void sendError(HttpServletResponse response, String string, int statusCode) { response.setStatus(statusCode); response.setContentType(JSON_MIMETYPE); try { new JSONWriter(response.getWriter()) .object() .key("error") .value(true) .key("message") .value(string) .endObject(); } catch (JSONException e) { log.error(e); } catch (IOException e) { log.error(e); } } protected void sendError(HttpServletResponse response, String string, String status) { sendError(response,string,status,HttpServletResponse.SC_INTERNAL_SERVER_ERROR); } protected void sendError(HttpServletResponse response, String string, String status, int statusCode) { response.setStatus(statusCode); response.setContentType(JSON_MIMETYPE); try { new JSONWriter(response.getWriter()) .object() .key("error") .value(true) .key("message") .value(string) .key("status") .value(status) .endObject(); } catch (JSONException e) { log.error(e); } catch (IOException e) { log.error(e); } } protected void sendError(HttpServletResponse response, String string, JSONObject status) { sendError(response,string,status,HttpServletResponse.SC_INTERNAL_SERVER_ERROR); } protected void sendError(HttpServletResponse response, String string, JSONObject status, int statusCode) { response.setStatus(statusCode); response.setContentType(JSON_MIMETYPE); try { new JSONWriter(response.getWriter()) .object() .key("error") .value(true) .key("message") .value(string) .key("status") .value(status) .endObject(); } catch (JSONException e) { log.error(e); } catch (IOException e) { log.error(e); } } protected void sendOK(HttpServletResponse response, String string){ response.setStatus(HttpServletResponse.SC_OK); response.setContentType(JSON_MIMETYPE); try { new JSONWriter(response.getWriter()) .object() .key("ok") .value(true) .key("message") .value(string) .endObject(); } catch (JSONException e) { log.error(e); } catch (IOException e) { log.error(e); } } protected void sendJSONString(HttpServletResponse response, JSONArray ar) { try { response.setStatus(HttpServletResponse.SC_OK); response.setContentType(JSON_MIMETYPE); response.getWriter().write(ar.toString(4)); } catch (JSONException e) { log.error(e); } catch (IOException e) { log.error(e); } } protected void sendJSONString(HttpServletResponse response, JSONObject json) { try { response.setStatus(HttpServletResponse.SC_OK); response.setContentType(JSON_MIMETYPE); response.getWriter().write(json.toString(2)); } catch (JSONException e) { log.error(e); } catch (IOException e) { log.error(e); } } protected void sendJSONString(HttpServletResponse response, String s) { try { response.setStatus(HttpServletResponse.SC_OK); response.setContentType(JSON_MIMETYPE); response.getWriter().write(s); } catch (JSONException e) { log.error(e); } catch (IOException e) { log.error(e); } } protected void sendDocument(HttpServletResponse response, Document doc, Map<String,String[]> params) { try { response.setStatus(HttpServletResponse.SC_OK); response.setContentType(doc.getContentType()); doc.sendDocument(response.getOutputStream(),params); } catch (JSONException e) { log.error(e); } catch (IOException e) { log.error(e); } } protected void sendMetaData(HttpServletResponse response, Document doc, Map<String,String[]> params) { try { response.setStatus(HttpServletResponse.SC_OK); response.setContentType(Document.DEFAULT_CONTENT_TYPE); doc.writeMetaData(response.getWriter(),params); } catch (JSONException e) { log.error(e); } catch (IOException e) { log.error(e); } } }