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   
7   import javax.servlet.http.HttpServletResponse;
8   import javax.servlet.http.HttpServletRequest;
9   import java.io.IOException;
10  
11  /**
12   * Handles error cases with XmlRpc fault responses for an application that is unable to handle normal requests.
13   */
14  public class JohnsonXmlRpcFilter extends AbstractJohnsonFilter
15  {
16      // NOTE: there is no clear definition of what this fault code should be, http://www.xmlrpc.com/spec
17      // it seems that Axis is using 0 so we will also :)
18      public static final int FAULT_CODE = 0;
19  
20      private static final Logger LOG = LoggerFactory.getLogger(JohnsonXmlRpcFilter.class);
21  
22      protected String buildXmlRpcErrorMessage(String error, int faultCode)
23      {
24          return "<?xml version=\"1.0\"?>\n" +
25                  "<methodResponse>\n" +
26                  "    <fault>\n" +
27                  "        <value>\n" +
28                  "            <struct>\n" +
29                  "                <member>\n" +
30                  "                    <name>faultString</name>\n" +
31                  "                    <value>" +
32                  error +
33                  "</value>\n" +
34                  "                </member>\n" +
35                  "                <member>\n" +
36                  "                    <name>faultCode</name>\n" +
37                  "                    <value>\n" +
38                  "                        <int>" +
39                  faultCode +
40                  "</int>\n" +
41                  "                    </value>\n" +
42                  "                </member>\n" +
43                  "            </struct>\n" +
44                  "        </value>\n" +
45                  "    </fault>\n" +
46                  "</methodResponse>";
47      }
48  
49      protected void handleError(JohnsonEventContainer appEventContainer, HttpServletRequest servletRequest, HttpServletResponse servletResponse) throws IOException
50      {
51          LOG.info("The application is unavailable, or there are errors.  Returning a SOAP fault with the event message.");
52          servletResponse.setContentType(TEXT_XML_UTF8_CONTENT_TYPE);
53          String message = getStringForEvents(appEventContainer.getEvents());
54          servletResponse.setStatus(HttpServletResponse.SC_SERVICE_UNAVAILABLE);
55          servletResponse.getWriter().write(buildXmlRpcErrorMessage(message, FAULT_CODE));
56      }
57  
58      protected void handleNotSetup(HttpServletRequest servletRequest, HttpServletResponse servletResponse) throws IOException
59      {
60          LOG.info("The application is not setup.  Returning a SOAP fault with a 'not setup' message.");
61          servletResponse.setContentType(TEXT_XML_UTF8_CONTENT_TYPE);
62          String message = "The application has not yet been setup.";
63          servletResponse.setStatus(HttpServletResponse.SC_SERVICE_UNAVAILABLE);
64          servletResponse.getWriter().write(buildXmlRpcErrorMessage(message, FAULT_CODE));
65      }
66  }