View Javadoc

1   package com.atlassian.johnson.spring.web;
2   
3   import org.springframework.util.StringUtils;
4   
5   import javax.servlet.ServletConfig;
6   import javax.servlet.ServletContext;
7   
8   /**
9    * Constants related to determining which {@link com.atlassian.johnson.event.EventType EventType} to use for Spring-
10   * related {@link com.atlassian.johnson.event.Event Event}s.
11   * 
12   * @since 2.0
13   */
14  public class SpringEventType
15  {
16      /**
17       * Defines the {@code init-param} which may be used for controlling whether an event is added when a portion of
18       * Spring initialisation is bypassed due to previous errors.
19       * <p/>
20       * Note: This flag does not control whether an event is added when Spring initialisation is not bypassed and fails.
21       *
22       * @see #addEventOnBypass(javax.servlet.ServletContext)
23       */
24      public static final String ADD_EVENT_ON_BYPASS_PARAM = "johnson.spring.addEventOnBypass";
25      /**
26       * Defines the {@code init-param} which may be used for controlling the event type added when Spring events occur.
27       * Where the value must be set depends on the type being initialised.
28       *
29       * @see #getContextEventType(javax.servlet.ServletContext)
30       * @see #getServletEventType(javax.servlet.ServletConfig)
31       */
32      public static final String EVENT_TYPE_PARAM = "johnson.spring.eventType";
33  
34      /**
35       * Defines the default context event type which will be used if one is not explicitly set.
36       */
37      public static final String SPRING_CONTEXT_EVENT_TYPE = "spring";
38      /**
39       * Defines the default servlet event type which will be used if one is not explicitly set.
40       */
41      public static final String SPRING_SERVLET_EVENT_TYPE = "spring-mvc";
42      
43      private SpringEventType()
44      {
45          
46      }
47  
48      /**
49       * Retrieves a flag indicating whether a Johnson event should be added when Spring initialisation is bypassed
50       * due to previous fatal errors.
51       * <p/>
52       * By default, an event is <i>not</i> added. If a {@code context-param} named {@link #ADD_EVENT_ON_BYPASS_PARAM}
53       * exists with the value {@code true}, then an {@link #getContextEventType(javax.servlet.ServletContext) event}
54       * will be added when initialisation is bypassed.
55       * <p/>
56       * To set this value, add the following to {@code web.xml}:
57       * <pre><code>
58       *     &lt;context-param&gt;
59       *         &lt;param-name&gt;johnson.spring.addEventOnBypass&lt;/param-name&gt;
60       *         &lt;param-value&gt;true&lt;/param-value&gt;
61       *     &lt;/context-param&gt;
62       * </code></pre>
63       * Note: If initialisation is not bypassed and fails, this flag <i>does not</i> control whether an event will be
64       * added at that time.
65       * 
66       * @param context the servlet context
67       * @return {@code true} if an event has been explicitly requested; otherwise, {@code false}
68       */
69      public static boolean addEventOnBypass(ServletContext context)
70      {
71          return "true".equals(context.getInitParameter(ADD_EVENT_ON_BYPASS_PARAM));
72      }
73  
74      /**
75       * Retrieves a flag indicating whether a Johnson event should be added when SpringMVC initialisation is bypassed
76       * due to previous fatal Spring errors.
77       * <p/>
78       * By default, an event is <i>not</i> added. If an {@code init-param} named {@link #ADD_EVENT_ON_BYPASS_PARAM}
79       * exists, its value ({@code true} or {@code false}) controls whether an event is added. Otherwise, a fallback check
80       * is made {@link #addEventOnBypass(javax.servlet.ServletContext) to the context} for a {@code context-param}.
81       * This means if an event is explicitly requested at the context level, by default it will also be requested at
82       * the servlet level. However, individual servlets can explicitly disable that by setting their {@code init-param}
83       * to {@code false}.
84       * <p/>
85       * To set this value, add the following to the declaration for the servlet in {@code web.xml}:
86       * <pre><code>
87       *     &lt;init-param&gt;
88       *         &lt;param-name&gt;johnson.spring.addEventOnBypass&lt;/param-name&gt;
89       *         &lt;param-value&gt;true&lt;/param-value&gt;
90       *     &lt;/init-param&gt;
91       * </code></pre>
92       * Note: If initialisation is not bypassed and fails, this flag <i>does not</i> control whether an event will be
93       * added at that time.
94       *
95       * @param config the servlet configuration
96       * @return {@code true} if an event has been specifically requested, either at the servlet level or at the context
97       *         level; otherwise, {@code false}
98       */
99      public static boolean addEventOnBypass(ServletConfig config)
100     {
101         String value = config.getInitParameter(ADD_EVENT_ON_BYPASS_PARAM);
102         if (value == null)
103         {
104             //If no parameter was found at the servlet level, look at the context level.
105             return addEventOnBypass(config.getServletContext());
106         }
107         //If any value is found at the servlet level, be it true or false, that value always overrides any value set
108         //at the context level.
109         return "true".equals(value);
110     }
111 
112     /**
113      * Examines the provided {@code ServletContext} for a {@code context-param} named {@link #EVENT_TYPE_PARAM} and, if
114      * one is found, returns its value; otherwise the default {@link #SPRING_CONTEXT_EVENT_TYPE} is returned.
115      * <p/>
116      * To set this value, add the following to {@code web.xml}:
117      * <pre><code>
118      *     &lt;context-param&gt;
119      *         &lt;param-name&gt;johnson.spring.eventType&lt;/param-name&gt;
120      *         &lt;param-value&gt;my-spring-context-event-type&lt;/param-value&gt;
121      *     &lt;/context-param&gt;
122      * </code></pre>
123      * 
124      * @param context the servlet context
125      * @return the context event type
126      */
127     public static String getContextEventType(ServletContext context)
128     {
129         String value = context.getInitParameter(EVENT_TYPE_PARAM);
130         if (!StringUtils.hasText(value))
131         {
132             value = SPRING_CONTEXT_EVENT_TYPE;
133         }
134         return value;
135     }
136 
137     /**
138      * Examines the provided {@code ServletConfig} for an {@code init-param} named {@link #EVENT_TYPE_PARAM} and, if
139      * one is found, returns its value; otherwise, the default {@link #SPRING_SERVLET_EVENT_TYPE} is returned.
140      * <p/>
141      * To set this value, add the following to the declaration for the servlet in {@code web.xml}:
142      * <pre><code>
143      *     &lt;init-param&gt;
144      *         &lt;param-name&gt;johnson.spring.eventType&lt;/param-name&gt;
145      *         &lt;param-value&gt;my-spring-servlet-event-type&lt;/param-value&gt;
146      *     &lt;/init-param&gt;
147      * </code></pre>
148      *
149      * @param config the servlet configuration
150      * @return the servlet event type
151      */
152     public static String getServletEventType(ServletConfig config)
153     {
154         String value = config.getInitParameter(EVENT_TYPE_PARAM);
155         if (!StringUtils.hasText(value))
156         {
157             value = SPRING_SERVLET_EVENT_TYPE;
158         }
159         return value;
160     }
161 }