/sitebricks/src/main/java/com/google/sitebricks/SitebricksFilter.java

http://github.com/dhanji/sitebricks · Java · 98 lines · 70 code · 17 blank · 11 comment · 12 complexity · 667c2fb43f68ea91b769ac24a51fab4a MD5 · raw file

  1. package com.google.sitebricks;
  2. import java.io.IOException;
  3. import java.net.URLEncoder;
  4. import javax.servlet.Filter;
  5. import javax.servlet.FilterChain;
  6. import javax.servlet.FilterConfig;
  7. import javax.servlet.ServletException;
  8. import javax.servlet.ServletRequest;
  9. import javax.servlet.ServletResponse;
  10. import javax.servlet.http.HttpServletRequest;
  11. import javax.servlet.http.HttpServletResponse;
  12. import net.jcip.annotations.Immutable;
  13. import com.google.inject.Inject;
  14. import com.google.inject.Provider;
  15. import com.google.inject.Singleton;
  16. import com.google.sitebricks.headless.Reply;
  17. import com.google.sitebricks.headless.ReplyBasedHeadlessRenderer;
  18. import com.google.sitebricks.headless.Request;
  19. import com.google.sitebricks.routing.RoutingDispatcher;
  20. import com.google.sitebricks.routing.RoutingDispatcher.Events;
  21. /**
  22. * @author Dhanji R. Prasanna (dhanji@gmail.com)
  23. */
  24. @Immutable
  25. @Singleton
  26. class SitebricksFilter implements Filter {
  27. private final RoutingDispatcher dispatcher;
  28. private final Provider<Bootstrapper> bootstrapper;
  29. private final Provider<Shutdowner> teardowner;
  30. private final Provider<Request> requestProvider;
  31. private final ReplyBasedHeadlessRenderer headlessRenderer;
  32. @Inject
  33. public SitebricksFilter(RoutingDispatcher dispatcher, Provider<Bootstrapper> bootstrapper,
  34. Provider<Shutdowner> teardowner, Provider<Request> requestProvider,
  35. ReplyBasedHeadlessRenderer headlessRenderer) {
  36. this.dispatcher = dispatcher;
  37. this.bootstrapper = bootstrapper;
  38. this.teardowner = teardowner;
  39. this.requestProvider = requestProvider;
  40. this.headlessRenderer = headlessRenderer;
  41. }
  42. public void init(FilterConfig filterConfig) throws ServletException {
  43. bootstrapper.get().start();
  44. }
  45. public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
  46. FilterChain filterChain)
  47. throws IOException, ServletException {
  48. HttpServletRequest request = (HttpServletRequest) servletRequest;
  49. HttpServletResponse response = (HttpServletResponse) servletResponse;
  50. //dispatch
  51. Object respondObject = dispatcher.dispatch(this.requestProvider.get(), Events.DURING);
  52. //was there any matching page? (if it was a headless response, we don't need to do anything).
  53. // Also we do not do anything if the page elected to do nothing.
  54. if (null != respondObject && null == request.getAttribute(Reply.NO_REPLY_ATTR)) {
  55. // Only use the string rendering pipeline if this is not a headless request.
  56. if (respondObject instanceof Respond) {
  57. Respond respond = (Respond) respondObject;
  58. //do we need to redirect or was this a successful render?
  59. final String redirect = respond.getRedirect();
  60. if (null != redirect) {
  61. response.sendRedirect(redirect);
  62. } else { //successful render
  63. // by checking if a content type was set, we allow users to override content-type
  64. // on an arbitrary basis
  65. if (null == response.getContentType()) {
  66. response.setContentType(respond.getContentType());
  67. }
  68. response.getWriter().write(respond.toString());
  69. }
  70. } else { // It must be a headless Reply. Render the headless response.
  71. headlessRenderer.render(response, respondObject);
  72. }
  73. } else {
  74. //continue down filter-chain
  75. filterChain.doFilter(request, response);
  76. }
  77. }
  78. public void destroy() {
  79. teardowner.get().shutdown();
  80. }
  81. }