package com.breeze.webserver; import java.io.BufferedReader; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.StringTokenizer; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.breeze.util.JsonGson; public abstract class ControllerServlet extends HttpServlet { private static final long serialVersionUID = 1L; @Override public void doGet(HttpServletRequest request, HttpServletResponse response) { doGetOrPost(request, response); } @Override public void doPost(HttpServletRequest request, HttpServletResponse response) { doGetOrPost(request, response); } protected void doGetOrPost(HttpServletRequest request, HttpServletResponse response) { request.setAttribute("servletPath", request.getServletPath()); handleRequest(request, response); } protected void dispatch(Object target, Method m, HttpServletRequest request, HttpServletResponse response) throws ControllerException { try { m.invoke(target, new Object[] { request, response }); } catch (IllegalAccessException ex) { throw new ControllerException("couldn't access method"); } catch (InvocationTargetException ex) { Throwable targetEx = ex.getTargetException(); throw new ControllerException(targetEx.getMessage()); } } protected String readPostData(HttpServletRequest request) { StringBuffer sb = new StringBuffer(); String line = null; try { BufferedReader reader = request.getReader(); while ((line = reader.readLine()) != null) sb.append(line); } catch (Exception e) { /*report an error*/ } return sb.toString(); } protected void writeResponse(HttpServletResponse response, String data) { try { response.setContentType("application/json;charset=UTF-8"); response.getWriter().write(data); } catch (IOException e) { // TODO log this e.printStackTrace(); } } protected void writeError(HttpServletResponse response, int status, String message) { writeError(response, status, message, null); } protected void writeError(HttpServletResponse response, int status, String message, String stack) { try { HttpErrorInfo err = new HttpErrorInfo(status, message, stack); String errMsg = JsonGson.toJson(err); response.setContentType("application/json;charset=UTF-8"); response.setStatus(status); response.getWriter().write(errMsg); } catch (IOException e) { // TODO log this e.printStackTrace(); } } static final Class[] sFormalArgs = { HttpServletRequest.class, HttpServletResponse.class }; protected Method getMethod(Object target, String methodName) { try { return target.getClass().getMethod(methodName, sFormalArgs); } catch (NoSuchMethodException ex) { return null; } } protected String getMethodName(HttpServletRequest req) { if (req.getPathInfo() == null) return null; StringTokenizer tokens = new StringTokenizer(req.getPathInfo(), "/"); if (tokens.hasMoreTokens()) { return tokens.nextToken(); } else { return null; } } protected abstract void handleRequest(HttpServletRequest request, HttpServletResponse response); class ControllerException extends ServletException { private static final long serialVersionUID = 1L; ControllerException(String reason) { super(reason); } } }