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          return "<?xml version=\"1.0\"?>\n" +
24                  "<methodResponse>\n" +
25                  "    <fault>\n" +
26                  "        <value>\n" +
27                  "            <struct>\n" +
28                  "                <member>\n" +
29                  "                    <name>faultString</name>\n" +
30                  "                    <value>" +
31                  error +
32                  "</value>\n" +
33                  "                </member>\n" +
34                  "                <member>\n" +
35                  "                    <name>faultCode</name>\n" +
36                  "                    <value>\n" +
37                  "                        <int>" +
38                  faultCode +
39                  "</int>\n" +
40                  "                    </value>\n" +
41                  "                </member>\n" +
42                  "            </struct>\n" +
43                  "        </value>\n" +
44                  "    </fault>\n" +
45                  "</methodResponse>";
46      }
47  
48      protected void handleError(JohnsonEventContainer appEventContainer, HttpServletRequest servletRequest, HttpServletResponse servletResponse) throws IOException {
49          LOG.info("The application is unavailable, or there are errors.  Returning a SOAP fault with the event message.");
50          servletResponse.setContentType(TEXT_XML_UTF8_CONTENT_TYPE);
51          String message = getStringForEvents(appEventContainer.getEvents());
52          servletResponse.setStatus(HttpServletResponse.SC_SERVICE_UNAVAILABLE);
53          servletResponse.getWriter().write(buildXmlRpcErrorMessage(message, FAULT_CODE));
54      }
55  
56      protected void handleNotSetup(HttpServletRequest servletRequest, HttpServletResponse servletResponse) throws IOException {
57          LOG.info("The application is not setup.  Returning a SOAP fault with a 'not setup' message.");
58          servletResponse.setContentType(TEXT_XML_UTF8_CONTENT_TYPE);
59          String message = "The application has not yet been setup.";
60          servletResponse.setStatus(HttpServletResponse.SC_SERVICE_UNAVAILABLE);
61          servletResponse.getWriter().write(buildXmlRpcErrorMessage(message, FAULT_CODE));
62      }
63  }