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