View Javadoc
1   /*
2    * SPDX-License-Identifier: MIT
3    * See LICENSE file for details.
4    *
5    * Copyright 2010-2026 The Waffle Project Contributors: https://github.com/Waffle/waffle/graphs/contributors
6    */
7   package waffle.servlet;
8   
9   import jakarta.servlet.http.HttpServlet;
10  import jakarta.servlet.http.HttpServletRequest;
11  import jakarta.servlet.http.HttpServletResponse;
12  
13  import java.io.IOException;
14  import java.security.Principal;
15  import java.util.Collections;
16  import java.util.List;
17  
18  import javax.xml.XMLConstants;
19  import javax.xml.parsers.ParserConfigurationException;
20  import javax.xml.transform.OutputKeys;
21  import javax.xml.transform.Transformer;
22  import javax.xml.transform.TransformerException;
23  import javax.xml.transform.TransformerFactory;
24  import javax.xml.transform.dom.DOMSource;
25  import javax.xml.transform.stream.StreamResult;
26  
27  import org.slf4j.Logger;
28  import org.slf4j.LoggerFactory;
29  import org.w3c.dom.Document;
30  import org.w3c.dom.Element;
31  
32  import waffle.util.WaffleInfo;
33  
34  /**
35   * A servlet that returns WaffleInfo as XML.
36   */
37  public class WaffleInfoServlet extends HttpServlet {
38  
39      /** The Constant serialVersionUID. */
40      private static final long serialVersionUID = 1L;
41  
42      /** The Constant Logger. */
43      private static final Logger logger = LoggerFactory.getLogger(WaffleInfoServlet.class);
44  
45      @Override
46      public void doGet(final HttpServletRequest request, final HttpServletResponse response) {
47          this.getWaffleInfoResponse(request, response);
48      }
49  
50      @Override
51      public void doPost(final HttpServletRequest request, final HttpServletResponse response) {
52          this.getWaffleInfoResponse(request, response);
53      }
54  
55      /**
56       * Gets the waffle info response.
57       *
58       * @param request
59       *            the request
60       * @param response
61       *            the response
62       */
63      public void getWaffleInfoResponse(final HttpServletRequest request, final HttpServletResponse response) {
64          final WaffleInfo info = new WaffleInfo();
65          try {
66              final Document doc = info.getWaffleInfo();
67              final Element root = doc.getDocumentElement();
68  
69              // Add the Request Information Here
70              final Element http = this.getRequestInfo(doc, request);
71              root.insertBefore(http, root.getFirstChild());
72  
73              // Lookup Accounts By Name
74              final String[] lookup = request.getParameterValues("lookup");
75              if (lookup != null) {
76                  for (final String name : lookup) {
77                      root.appendChild(info.getLookupInfo(doc, name));
78                  }
79              }
80  
81              // Write the XML Response
82              final TransformerFactory transfac = TransformerFactory.newInstance();
83              transfac.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, "");
84              transfac.setAttribute(XMLConstants.ACCESS_EXTERNAL_STYLESHEET, "");
85  
86              final Transformer trans = transfac.newTransformer();
87              trans.setOutputProperty(OutputKeys.INDENT, "yes");
88  
89              final StreamResult result = new StreamResult(response.getWriter());
90              final DOMSource source = new DOMSource(doc);
91              trans.transform(source, result);
92              response.setContentType("application/xml");
93          } catch (final ParserConfigurationException | TransformerException | IOException e) {
94              WaffleInfoServlet.logger.error("", e);
95              throw new RuntimeException("See logs for underlying error condition");
96          }
97      }
98  
99      /**
100      * Gets the request info.
101      *
102      * @param doc
103      *            the doc
104      * @param request
105      *            the request
106      *
107      * @return the request info
108      */
109     private Element getRequestInfo(final Document doc, final HttpServletRequest request) {
110         final Element node = doc.createElement("request");
111 
112         Element value = doc.createElement("AuthType");
113         value.setTextContent(request.getAuthType());
114         node.appendChild(value);
115 
116         final Principal p = request.getUserPrincipal();
117         if (p != null) {
118             final Element child = doc.createElement("principal");
119             child.setAttribute("class", p.getClass().getName());
120 
121             value = doc.createElement("name");
122             value.setTextContent(p.getName());
123             child.appendChild(value);
124 
125             value = doc.createElement("string");
126             value.setTextContent(p.toString());
127             child.appendChild(value);
128 
129             node.appendChild(child);
130         }
131 
132         final List<String> headers = Collections.list(request.getHeaderNames());
133         if (!headers.isEmpty()) {
134             final Element child = doc.createElement("headers");
135             for (String header : headers) {
136                 value = doc.createElement(header);
137                 value.setTextContent(request.getHeader(header));
138                 child.appendChild(value);
139             }
140             node.appendChild(child);
141         }
142         return node;
143     }
144 
145 }