org.opendaylight.controller.swaggerui.BasePathModifierServlet Maven / Gradle / Ivy
package org.opendaylight.controller.swaggerui;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
/**
* Servlet implementation class BasePathModifierServlet
*/
public class BasePathModifierServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private static final Logger logger = LoggerFactory
.getLogger(BasePathModifierServlet.class);
private static final String API_BASE_PATH_SUFFIX = "/swagger/apis";
private static final String BASE_PATH_KEY = "basePath";
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
* response)
*/
@Override
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
String resourcePath = request.getRequestURI().substring(
request.getContextPath().length());
logger.debug("Locating resource : {}.", resourcePath);
JsonObject jsonObject = null;
try {
InputStream stream = this.getServletContext().getResourceAsStream(
resourcePath);
if (stream == null) {
response.sendError(HttpServletResponse.SC_NOT_FOUND,
"API / API Listing not found");
return;
}
BufferedReader streamReader = new BufferedReader(
new InputStreamReader(stream, "UTF-8"));
StringBuilder responseStrBuilder = new StringBuilder();
String inputStr;
while ((inputStr = streamReader.readLine()) != null)
responseStrBuilder.append(inputStr);
JsonElement jelement = new JsonParser().parse(responseStrBuilder
.toString());
jsonObject = jelement.getAsJsonObject();
String basePath = jsonObject.get(BASE_PATH_KEY).getAsString();
// construct base path
StringBuilder requestURL = new StringBuilder();
requestURL.append(request.isSecure() ? "https://" : "http://")
.append(request.getServerName()).append(":")
.append(request.getServerPort());
if (!basePath.contains(requestURL)) {
String endPath = "";
if (basePath.contains(API_BASE_PATH_SUFFIX)) {
endPath = basePath.substring(basePath
.indexOf(API_BASE_PATH_SUFFIX));
}
basePath = requestURL + endPath;
logger.debug("Modified Base Path is {}", basePath);
jsonObject.addProperty(BASE_PATH_KEY, basePath);
}
} catch (Exception ex) {
logger.error("Error processing JSON data", ex);
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
"Could not read API Listing or APIs");
return;
}
try {
response.setContentType("application/json");
PrintWriter out = response.getWriter();
out.print(jsonObject);
out.flush();
} catch (Exception ex) {
logger.error("Error while writing response", ex);
response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
"Internal Error while writing resposne");
}
}
}