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
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 }