View Javadoc

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