Repository: camel Updated Branches: refs/heads/master 6f41a86d6 -> 6fdee41be
CAMEL-7878: camel-swagger now supports relative paths for base/api paths which gets calculated at runtime to the actual absolute url. Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/6fdee41b Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/6fdee41b Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/6fdee41b Branch: refs/heads/master Commit: 6fdee41be09ce276b7d50ebfceb223c9ef870c87 Parents: 6f41a86 Author: Claus Ibsen <davscl...@apache.org> Authored: Wed Dec 24 13:49:56 2014 +0100 Committer: Claus Ibsen <davscl...@apache.org> Committed: Wed Dec 24 13:49:56 2014 +0100 ---------------------------------------------------------------------- .../RestSwaggerApiDeclarationServlet.scala | 56 ++++++++++++++++++++ .../src/main/webapp/WEB-INF/web.xml | 8 ++- 2 files changed, 62 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/6fdee41b/components/camel-swagger/src/main/scala/org/apache/camel/component/swagger/RestSwaggerApiDeclarationServlet.scala ---------------------------------------------------------------------- diff --git a/components/camel-swagger/src/main/scala/org/apache/camel/component/swagger/RestSwaggerApiDeclarationServlet.scala b/components/camel-swagger/src/main/scala/org/apache/camel/component/swagger/RestSwaggerApiDeclarationServlet.scala index 8a058db..9057863 100644 --- a/components/camel-swagger/src/main/scala/org/apache/camel/component/swagger/RestSwaggerApiDeclarationServlet.scala +++ b/components/camel-swagger/src/main/scala/org/apache/camel/component/swagger/RestSwaggerApiDeclarationServlet.scala @@ -16,6 +16,7 @@ */ package org.apache.camel.component.swagger +import java.net.URL import javax.servlet.http.{HttpServlet, HttpServletResponse, HttpServletRequest} import javax.servlet.ServletConfig @@ -40,6 +41,7 @@ abstract class RestSwaggerApiDeclarationServlet extends HttpServlet { var camelId: String = null val swaggerConfig: SwaggerConfig = ConfigFactory.config var cors: Boolean = false + var initDone: Boolean = false override def init(config: ServletConfig): Unit = { super.init(config) @@ -84,6 +86,10 @@ abstract class RestSwaggerApiDeclarationServlet extends HttpServlet { def getRestDefinitions(camelId: String) : mutable.Buffer[RestDefinition] override protected def doGet(request: HttpServletRequest, response: HttpServletResponse) = { + if (!initDone) { + initBaseAndApiPaths(request) + } + val route = request.getPathInfo // render overview if the route is empty or is the root path if (route != null && route != "" && route != "/") { @@ -93,6 +99,56 @@ abstract class RestSwaggerApiDeclarationServlet extends HttpServlet { } } + def initBaseAndApiPaths(request: HttpServletRequest) = { + var base = swaggerConfig.getBasePath + if (base == null || !base.startsWith("http")) { + // base path is configured using relative, so lets calculate the absolute url now we have the http request + val url = new URL(request.getRequestURL.toString) + if (base == null) { + base = "" + } + val path = translateContextPath(request) + if (url.getPort != 80) { + base = url.getProtocol + "://" + url.getHost + ":" + url.getPort + path + "/" + base + } else { + base = url.getProtocol + "://" + url.getHost + request.getContextPath + "/" + base + } + swaggerConfig.setBasePath(base) + } + base = swaggerConfig.getApiPath + if (base == null || !base.startsWith("http")) { + // api path is configured using relative, so lets calculate the absolute url now we have the http request + val url = new URL(request.getRequestURL.toString) + if (base == null) { + base = "" + } + val path = translateContextPath(request) + if (url.getPort != 80) { + base = url.getProtocol + "://" + url.getHost + ":" + url.getPort + path + "/" + base + } else { + base = url.getProtocol + "://" + url.getHost + request.getContextPath + "/" + base + } + swaggerConfig.setApiPath(base) + } + initDone = true + } + + /** + * We do only want the base context-path and not sub paths + */ + def translateContextPath(request: HttpServletRequest): String = { + var path = request.getContextPath + if (path.isEmpty || path.equals("/")) { + return "" + } else { + val idx = path.lastIndexOf("/") + if (idx > 0) { + return path.substring(0, idx) + } + } + path + } + /** * Renders the resource listing which is the overview of all the apis */ http://git-wip-us.apache.org/repos/asf/camel/blob/6fdee41b/examples/camel-example-servlet-rest-tomcat/src/main/webapp/WEB-INF/web.xml ---------------------------------------------------------------------- diff --git a/examples/camel-example-servlet-rest-tomcat/src/main/webapp/WEB-INF/web.xml b/examples/camel-example-servlet-rest-tomcat/src/main/webapp/WEB-INF/web.xml index 251e5f1..3cd24b4 100755 --- a/examples/camel-example-servlet-rest-tomcat/src/main/webapp/WEB-INF/web.xml +++ b/examples/camel-example-servlet-rest-tomcat/src/main/webapp/WEB-INF/web.xml @@ -53,12 +53,16 @@ <servlet-name>ApiDeclarationServlet</servlet-name> <servlet-class>org.apache.camel.component.swagger.DefaultCamelSwaggerServlet</servlet-class> <init-param> + <!-- we specify the base.path using relative notation, that means the actual path will be calculated at runtime as + http://server:port/contextpath/rest --> <param-name>base.path</param-name> - <param-value>http://localhost:8080/camel-example-servlet-rest-tomcat/rest</param-value> + <param-value>rest</param-value> </init-param> <init-param> + <!-- we specify the api.path using relative notation, that means the actual path will be calculated at runtime as + http://server:port/contextpath/api-docs --> <param-name>api.path</param-name> - <param-value>http://localhost:8080/camel-example-servlet-rest-tomcat/api-docs</param-value> + <param-value>api-docs</param-value> </init-param> <init-param> <param-name>api.version</param-name>