View Javadoc
1   package com.atlassian.refapp.trustedapps.client;
2   
3   import com.atlassian.sal.api.net.Request.MethodType;
4   import com.atlassian.sal.api.net.Response;
5   import com.atlassian.sal.api.net.ResponseException;
6   import com.atlassian.sal.api.net.ResponseHandler;
7   import com.atlassian.sal.api.net.TrustedRequest;
8   import com.atlassian.sal.api.net.TrustedRequestFactory;
9   import org.apache.commons.lang.StringUtils;
10  import org.apache.velocity.Template;
11  import org.apache.velocity.VelocityContext;
12  import org.apache.velocity.app.Velocity;
13  import org.apache.velocity.app.VelocityEngine;
14  import org.apache.velocity.runtime.log.JdkLogChute;
15  import org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader;
16  import org.apache.velocity.tools.generic.EscapeTool;
17  
18  import javax.servlet.ServletException;
19  import javax.servlet.http.HttpServlet;
20  import javax.servlet.http.HttpServletRequest;
21  import javax.servlet.http.HttpServletResponse;
22  import java.io.BufferedReader;
23  import java.io.IOException;
24  import java.io.InputStreamReader;
25  import java.net.MalformedURLException;
26  import java.net.URL;
27  import java.util.HashMap;
28  import java.util.Map;
29  
30  public class TrustedAppsClientServlet extends HttpServlet {
31      private final VelocityEngine velocity;
32      private final TrustedRequestFactory<?> requestFactory;
33  
34      public TrustedAppsClientServlet(TrustedRequestFactory<?> requestFactory) throws Exception {
35          this.requestFactory = requestFactory;
36  
37          velocity = new VelocityEngine();
38          velocity.addProperty(Velocity.RUNTIME_LOG_LOGSYSTEM_CLASS, JdkLogChute.class.getName());
39          velocity.addProperty(Velocity.RESOURCE_LOADER, "classpath");
40          velocity.addProperty("classpath.resource.loader.class", ClasspathResourceLoader.class.getName());
41          velocity.init();
42      }
43  
44      @Override
45      public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
46          response.setContentType("text/html");
47          Map<String, Object> params = new HashMap<String, Object>();
48          if (!StringUtils.isBlank(request.getParameter("url"))) {
49              try {
50                  params.putAll(makeRequest(request.getParameter("url")));
51              } catch (ResponseException e) {
52                  throw new ServletException(e);
53              }
54          }
55          render("/client.vm", params, request, response);
56      }
57  
58      private Map<String, Object> makeRequest(String url) throws ResponseException {
59          final TrustedRequest request = requestFactory.createTrustedRequest(MethodType.GET, url);
60  
61          try {
62              final String hostname = new URL(url).getHost();
63              request.addTrustedTokenAuthentication(hostname);
64          } catch (MalformedURLException e) {
65              throw new ResponseException(e);
66          }
67          final Map<String, Object> responseData = new HashMap<String, Object>();
68          request.execute(new ResponseHandler() {
69              public void handle(Response response) throws ResponseException {
70                  responseData.put("responseStatusCode", response.getStatusCode());
71                  responseData.put("responseStatusText", response.getStatusText());
72                  try {
73                      BufferedReader reader = new BufferedReader(new InputStreamReader(response.getResponseBodyAsStream()));
74                      StringBuilder builder = new StringBuilder();
75                      String line;
76                      while ((line = reader.readLine()) != null) {
77                          builder.append(line);
78                      }
79                      responseData.put("responseBody", builder.toString());
80                  } catch (IOException e) {
81                      throw new ResponseException(e);
82                  }
83              }
84          });
85          return responseData;
86      }
87  
88      private Template getTemplate(String templateName) throws ServletException {
89          try {
90              return velocity.getTemplate(templateName);
91          } catch (Exception e) {
92              throw new ServletException(e);
93          }
94      }
95  
96      private void render(String templateName, Map<String, Object> params, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
97          Template template = getTemplate(templateName);
98          VelocityContext context = new VelocityContext();
99          for (Map.Entry<String, Object> param : params.entrySet()) {
100             context.put(param.getKey(), param.getValue());
101         }
102         context.put("esc", new EscapeTool());
103         context.put("request", request);
104         template.merge(context, response.getWriter());
105     }
106 }