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
16
17
18
19
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
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
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 }