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 }