View Javadoc

1   package com.atlassian.johnson.filters;
2   
3   import com.atlassian.johnson.JohnsonEventContainer;
4   import com.atlassian.johnson.event.Event;
5   import com.atlassian.johnson.event.EventLevel;
6   import org.apache.log4j.Category;
7   
8   import javax.servlet.http.HttpServletResponse;
9   import javax.servlet.http.HttpServletRequest;
10  import java.io.IOException;
11  import java.util.Collection;
12  
13  /**
14   * A handler that returns a no-content temporarily unavailable response suitable for refusing responses when an
15   * application is unable to handle normal requests. This is especially useful for cases where the normal response
16   * is of an unknown, or dynamic content-type and sending actual content may confuse clients.
17   * <p>
18   * Example uses include AJAX requests, generated images, pdf, excel and word docs.
19   */
20  public class Johnson503Filter extends AbstractJohnsonFilter
21  {
22      public static final Category log = Category.getInstance(Johnson503Filter.class);
23  
24      protected void handleError(JohnsonEventContainer appEventContainer, HttpServletRequest servletRequest, HttpServletResponse servletResponse) throws IOException
25      {
26          log.info("The application is unavailable, or there are errors.  Returing a temporarily unavailable status.");
27          servletResponse.setStatus(HttpServletResponse.SC_SERVICE_UNAVAILABLE);
28          if (hasOnlyWarnings(appEventContainer))
29          {
30              servletResponse.setHeader("Retry-After", "30");
31          }
32          // flushing the writer stops the app server from putting its html message into the otherwise empty response
33          servletResponse.getWriter().flush();
34      }
35  
36      protected void handleNotSetup(HttpServletRequest servletRequest, HttpServletResponse servletResponse) throws IOException
37      {
38          log.info("The application is not setup.  Returing a temporarily unavailable status.");
39          servletResponse.setStatus(HttpServletResponse.SC_SERVICE_UNAVAILABLE);
40          // flushing the writer stops the app server from putting its html message into the otherwise empty response
41          servletResponse.getWriter().flush();
42      }
43      
44      private boolean hasOnlyWarnings(final JohnsonEventContainer eventContainer)
45      {
46          if (eventContainer != null && eventContainer.hasEvents())
47          {
48              final Collection events = eventContainer.getEvents();
49              return allEventsAreWarnings(events);
50          }
51          else
52          {
53              return false;
54          }
55      }
56  
57      private boolean allEventsAreWarnings(final Collection events)
58      {
59          for (final Object eventObject : events)
60          {
61              if (eventObject instanceof Event)
62              {
63                  if (hasNonWarningLevel((Event) eventObject))
64                  {
65                      return false;
66                  }
67              }
68              else
69              {
70                  return false;
71              }
72          }
73          return true;
74      }
75  
76      private boolean hasNonWarningLevel(final Event event)
77      {
78          return !EventLevel.WARNING.equals(event.getLevel().getLevel());
79      }
80  }