Swagger UI for AD-SAL
[controller.git] / opendaylight / northbound / swagger-ui / src / main / java / org / opendaylight / controller / swaggerui / BasePathModifierServlet.java
1 package org.opendaylight.controller.swaggerui;
2
3 import java.io.BufferedReader;
4 import java.io.IOException;
5 import java.io.InputStream;
6 import java.io.InputStreamReader;
7 import java.io.PrintWriter;
8
9 import javax.servlet.ServletException;
10 import javax.servlet.http.HttpServlet;
11 import javax.servlet.http.HttpServletRequest;
12 import javax.servlet.http.HttpServletResponse;
13
14 import org.slf4j.Logger;
15 import org.slf4j.LoggerFactory;
16
17 import com.google.gson.JsonElement;
18 import com.google.gson.JsonObject;
19 import com.google.gson.JsonParser;
20
21 /**
22  * Servlet implementation class BasePathModifierServlet
23  */
24 public class BasePathModifierServlet extends HttpServlet {
25     private static final long serialVersionUID = 1L;
26     private static final Logger logger = LoggerFactory
27             .getLogger(BasePathModifierServlet.class);
28
29     private static final String API_BASE_PATH_SUFFIX = "/swagger/apis";
30     private static final String BASE_PATH_KEY = "basePath";
31
32     /**
33      * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
34      *      response)
35      */
36     @Override
37     protected void doGet(HttpServletRequest request,
38             HttpServletResponse response) throws ServletException, IOException {
39         String resourcePath = request.getRequestURI().substring(
40                 request.getContextPath().length());
41         logger.debug("Locating resource : {}.", resourcePath);
42         JsonObject jsonObject = null;
43         try {
44
45             InputStream stream = this.getServletContext().getResourceAsStream(
46                     resourcePath);
47             if (stream == null) {
48                 response.sendError(HttpServletResponse.SC_NOT_FOUND,
49                         "API / API Listing not found");
50                 return;
51             }
52             BufferedReader streamReader = new BufferedReader(
53                     new InputStreamReader(stream, "UTF-8"));
54             StringBuilder responseStrBuilder = new StringBuilder();
55
56             String inputStr;
57             while ((inputStr = streamReader.readLine()) != null)
58                 responseStrBuilder.append(inputStr);
59
60             JsonElement jelement = new JsonParser().parse(responseStrBuilder
61                     .toString());
62             jsonObject = jelement.getAsJsonObject();
63
64             String basePath = jsonObject.get(BASE_PATH_KEY).getAsString();
65
66             // construct base path
67             StringBuilder requestURL = new StringBuilder();
68
69             requestURL.append(request.isSecure() ? "https://" : "http://")
70                     .append(request.getServerName()).append(":")
71                     .append(request.getServerPort());
72             if (!basePath.contains(requestURL)) {
73                 String endPath = "";
74                 if (basePath.contains(API_BASE_PATH_SUFFIX)) {
75                     endPath = basePath.substring(basePath
76                             .indexOf(API_BASE_PATH_SUFFIX));
77                 }
78                 basePath = requestURL + endPath;
79                 logger.debug("Modified Base Path is {}", basePath);
80                 jsonObject.addProperty(BASE_PATH_KEY, basePath);
81             }
82         } catch (Exception ex) {
83             logger.error("Error processing JSON data", ex);
84             response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
85                     "Could not read API Listing or APIs");
86             return;
87         }
88
89         try {
90             response.setContentType("application/json");
91             PrintWriter out = response.getWriter();
92             out.print(jsonObject);
93             out.flush();
94         } catch (Exception ex) {
95             logger.error("Error while writing response", ex);
96             response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
97                     "Internal Error while writing resposne");
98         }
99     }
100
101 }