View Javadoc
1   package com.atlassian.plugin.spring.scanner.test.servlet;
2   
3   import com.atlassian.plugin.spring.scanner.test.dynamic.DynamicContextManager;
4   import com.atlassian.plugin.spring.scanner.test.registry.BeanLister;
5   
6   import javax.servlet.http.HttpServlet;
7   import javax.servlet.http.HttpServletRequest;
8   import javax.servlet.http.HttpServletResponse;
9   import java.io.IOException;
10  import java.io.PrintWriter;
11  import java.util.Set;
12  
13  /**
14   * Allows enabling and disabling of the dynamic inner application context.
15   */
16  public class ManageDynamicContextServlet extends HttpServlet {
17      private final DynamicContextManager bootstrappingComponent;
18      private final BeanLister beanLister;
19  
20      public ManageDynamicContextServlet(final DynamicContextManager bootstrappingComponent,
21                                         final BeanLister beanLister) {
22          this.bootstrappingComponent = bootstrappingComponent;
23          this.beanLister = beanLister;
24      }
25  
26      @Override
27      protected void doGet(final HttpServletRequest request, final HttpServletResponse response) throws IOException {
28          PrintWriter out = response.getWriter();
29  
30          if (request.getParameter("startup") != null) {
31              doStartup(response);
32          } else if (request.getParameter("shutdown") != null) {
33              doShutdown(response);
34          } else {
35              writeSuccess(response, "");
36          }
37  
38          response.flushBuffer();
39      }
40  
41      private void doStartup(HttpServletResponse response) throws IOException {
42          DynamicContextManager.Result result = bootstrappingComponent.bootstrapTheRestOfTheApplication();
43          if (result.tookPlace()) {
44              writeSuccess(response, String.format("Bootstrapped....in %d ms", result.getTimeTaken()));
45          } else {
46              response.setStatus(500);
47              throw new IllegalStateException("Oop...looks like we are already bootstrapped!");
48          }
49      }
50  
51      private void doShutdown(HttpServletResponse response) throws IOException {
52          DynamicContextManager.Result result = bootstrappingComponent.shutdownNewContext();
53          if (result.tookPlace()) {
54              writeSuccess(response, String.format("The internal components have been shutdown in %d ms", result.getTimeTaken()));
55          } else {
56              response.setStatus(500);
57              throw new IllegalStateException("The shutdown has already taken place");
58          }
59      }
60  
61      private void links(PrintWriter out) {
62          out.print("</br></br><div>"
63                  + "<a href='manage-dynamic-contexts?startup'>Start dynamic context</a> "
64                  + "<a href='manage-dynamic-contexts?shutdown'>Shut down dynamic context</a> "
65                  + "<a href='component-status'>List components</a> "
66                  + "</div>");
67      }
68  
69      private void writeSuccess(HttpServletResponse response, String body) throws IOException {
70          response.setStatus(200);
71          PrintWriter out = response.getWriter();
72          out.print("<html><body>");
73          out.print(body);
74  
75          displayBody(out, beanLister.listBeans(), beanLister.listServices());
76  
77          out.print("</body></html>");
78      }
79  
80      private void displayBody(final PrintWriter out, final Set<String> beans, final Set<String> services) {
81          displaySection(out, "The following components are defined in the app context:", beans);
82          displaySection(out, "The following services are exported by this bundle:", services);
83          links(out);
84      }
85  
86      private void displaySection(final PrintWriter out, final String title, final Set<String> things) {
87          out.print("<h3>" + title + "</h3>" + "<div><ul>");
88          for (final String thing : things) {
89              out.print(String.format("<li><pre>%s</pre></li>", thing));
90          }
91          out.print("</ul></div>");
92      }
93  }