001 package com.khubla.pragmatach.framework.servlet; 002 003 import java.io.IOException; 004 import java.util.Map; 005 import java.util.Map.Entry; 006 007 import javax.servlet.ServletConfig; 008 import javax.servlet.ServletException; 009 import javax.servlet.http.HttpServlet; 010 import javax.servlet.http.HttpServletRequest; 011 import javax.servlet.http.HttpServletResponse; 012 013 import com.khubla.pragmatach.framework.annotation.Route; 014 import com.khubla.pragmatach.framework.api.Request; 015 import com.khubla.pragmatach.framework.api.Response; 016 import com.khubla.pragmatach.framework.jmx.impl.PerformanceStatistics; 017 import com.khubla.pragmatach.framework.router.Router; 018 019 /** 020 * @author tome 021 */ 022 public class PragmatachServlet extends HttpServlet { 023 /** 024 * 025 */ 026 private static final long serialVersionUID = 1L; 027 /** 028 * render time header 029 */ 030 private static final String RENDERTIME_HEADER = "X-Pragmatach-RenderTime"; 031 /** 032 * performance stats. 033 */ 034 private static final PerformanceStatistics performanceStatistics = new PerformanceStatistics(); 035 036 public synchronized static PerformanceStatistics getPerformancestatistics() { 037 return performanceStatistics; 038 } 039 040 /** 041 * add custom response headers 042 */ 043 private void addCustomResponseHeaders(Request request, 044 HttpServletResponse httpServletResponse) { 045 /* 046 * add the render time 047 */ 048 final long rendertime = System.currentTimeMillis() 049 - request.getCreationTime(); 050 /* 051 * add 052 */ 053 httpServletResponse.addHeader(RENDERTIME_HEADER, 054 Long.toString(rendertime)); 055 /* 056 * record it too 057 */ 058 getPerformancestatistics().setLastRenderTime(rendertime); 059 /* 060 * record a request 061 */ 062 getPerformancestatistics().incrementTotalRequests(); 063 } 064 065 @Override 066 protected void doGet(HttpServletRequest httpServletRequest, 067 HttpServletResponse httpServletResponse) throws ServletException, 068 IOException { 069 try { 070 final Router requestRouter = new Router(); 071 final Request request = new Request(httpServletRequest, 072 httpServletResponse, Route.HttpMethod.get, 073 getServletConfig()); 074 final Response response = requestRouter.route(request); 075 addCustomResponseHeaders(request, httpServletResponse); 076 processResponse(response, httpServletResponse); 077 } catch (final Exception e) { 078 throw new ServletException("Exception in doGet", e); 079 } 080 } 081 082 @Override 083 protected void doPost(HttpServletRequest httpServletRequest, 084 HttpServletResponse httpServletResponse) throws ServletException, 085 IOException { 086 try { 087 final Router requestRouter = new Router(); 088 final Request request = new Request(httpServletRequest, 089 httpServletResponse, Route.HttpMethod.post, 090 getServletConfig()); 091 final Response response = requestRouter.route(request); 092 addCustomResponseHeaders(request, httpServletResponse); 093 processResponse(response, httpServletResponse); 094 } catch (final Exception e) { 095 throw new ServletException("Exception in doGet", e); 096 } 097 } 098 099 /** 100 * init 101 */ 102 @Override 103 public void init(ServletConfig servletConfig) throws ServletException { 104 try { 105 super.init(servletConfig); 106 } catch (final Exception e) { 107 throw new ServletException("Exception in init", e); 108 } 109 } 110 111 /** 112 * process the response 113 */ 114 private void processResponse(Response response, 115 HttpServletResponse httpServletResponse) throws ServletException { 116 try { 117 if (null != response) { 118 final Map<String, String> headers = response.getHeaders(); 119 if (null != headers) { 120 for (final Entry<String, String> entry : headers.entrySet()) { 121 httpServletResponse.setHeader(entry.getKey(), 122 entry.getValue()); 123 } 124 } 125 response.render(httpServletResponse); 126 final String contentType = response.getContentType(); 127 if (null != contentType) { 128 httpServletResponse.setContentType(contentType); 129 } 130 httpServletResponse.setStatus(response.getHTTPCode()); 131 } 132 } catch (final Exception e) { 133 throw new ServletException("Exception in processResponse", e); 134 } 135 } 136 }