Repository: camel Updated Branches: refs/heads/master e5b6761c3 -> a5dd9a053
CAMEL-8175: camel-swagger - Support for multiple CamelContexts. Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/a5dd9a05 Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/a5dd9a05 Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/a5dd9a05 Branch: refs/heads/master Commit: a5dd9a053c13c547fbf45b79bf70de946379eb9b Parents: e5b6761 Author: Claus Ibsen <davscl...@apache.org> Authored: Sun Jun 28 20:52:03 2015 +0200 Committer: Claus Ibsen <davscl...@apache.org> Committed: Mon Jun 29 10:02:24 2015 +0200 ---------------------------------------------------------------------- .../swagger/DefaultCamelSwaggerServlet.scala | 23 +++++++ .../RestSwaggerApiDeclarationServlet.scala | 71 +++++++++++++++----- .../swagger/DefaultCamelSwaggerServletTest.java | 12 +++- 3 files changed, 87 insertions(+), 19 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/a5dd9a05/components/camel-swagger/src/main/scala/org/apache/camel/component/swagger/DefaultCamelSwaggerServlet.scala ---------------------------------------------------------------------- diff --git a/components/camel-swagger/src/main/scala/org/apache/camel/component/swagger/DefaultCamelSwaggerServlet.scala b/components/camel-swagger/src/main/scala/org/apache/camel/component/swagger/DefaultCamelSwaggerServlet.scala index a74b276..d76ebda 100644 --- a/components/camel-swagger/src/main/scala/org/apache/camel/component/swagger/DefaultCamelSwaggerServlet.scala +++ b/components/camel-swagger/src/main/scala/org/apache/camel/component/swagger/DefaultCamelSwaggerServlet.scala @@ -69,4 +69,27 @@ class DefaultCamelSwaggerServlet extends RestSwaggerApiDeclarationServlet { null } + override def findCamelContexts(): List[String] = { + var answer = mutable.MutableList[String]() + + val server: MBeanServer = ManagementFactory.getPlatformMBeanServer + val names = server.queryNames(new ObjectName("*:type=context,*"), null) + for (name <- names.asScala) { + val on = name.asInstanceOf[ObjectName] + var id: String = on.getKeyProperty("name") + if (id.startsWith("\"") && id.endsWith("\"")) { + id = id.substring(1, id.length() - 1) + } + + if (id != null) { + // filter out older Camel versions as this requires Camel 2.15 or better + val version = server.getAttribute(on, "CamelVersion").asInstanceOf[String] + if (CamelVersionHelper.isGE("2.15.0", version)) { + answer += id + } + } + } + return answer.toList + } + } http://git-wip-us.apache.org/repos/asf/camel/blob/a5dd9a05/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 038f18f..c267816 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 @@ -38,7 +38,6 @@ abstract class RestSwaggerApiDeclarationServlet extends HttpServlet { private val LOG = LoggerFactory.getLogger(classOf[RestSwaggerApiDeclarationServlet]) val reader = new RestSwaggerReader() - var camelId: String = null val swaggerConfig: SwaggerConfig = ConfigFactory.config var cors: Boolean = false var initDone: Boolean = false @@ -67,10 +66,6 @@ abstract class RestSwaggerApiDeclarationServlet extends HttpServlet { if (s != null) { cors = "true".equalsIgnoreCase(s) } - s = config.getInitParameter("camelId") - if (s != null) { - camelId = s - } val title = config.getInitParameter("api.title") val description = config.getInitParameter("api.description") @@ -85,17 +80,36 @@ abstract class RestSwaggerApiDeclarationServlet extends HttpServlet { def getRestDefinitions(camelId: String) : mutable.Buffer[RestDefinition] + def findCamelContexts() : List[String] + 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 != "/") { - renderApiDeclaration(request, response) + var contextId: String = null + var route = request.getPathInfo + + // render list of camel contexts as root + if (route == null || route == "" || route == "/") { + renderCamelContexts(request, response) } else { - renderResourceListing(request, response) + // first part is the camel context + if (route.startsWith("/")) { + route = route.substring(1) + } + // the remainder is the route part + contextId = route.split("/").head + if (route.startsWith(contextId)) { + route = route.substring(contextId.length) + } + + if (route != null && route != "" && route != "/") { + // render overview if the route is empty or is the root path + renderApiDeclaration(request, response, contextId, route) + } else { + renderResourceListing(request, response, contextId) + } } } @@ -150,9 +164,33 @@ abstract class RestSwaggerApiDeclarationServlet extends HttpServlet { } /** + * Renders a list of available CamelContexts in the JVM + */ + def renderCamelContexts(request: HttpServletRequest, response: HttpServletResponse) = { + LOG.trace("renderCamelContexts") + + if (cors) { + response.addHeader("Access-Control-Allow-Headers", "Origin, Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers") + response.addHeader("Access-Control-Allow-Methods", "GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS, CONNECT, PATCH") + response.addHeader("Access-Control-Allow-Origin", "*") + } + + val contexts = findCamelContexts() + response.getWriter.print("[\n") + for (i <- 0 until contexts.size) { + val name = contexts(i) + response.getWriter.print("{\"name\": \"" + name + "\"}") + if (i < contexts.size - 1) { + response.getWriter.print(",\n") + } + } + response.getWriter.print("\n]") + } + + /** * Renders the resource listing which is the overview of all the apis */ - def renderResourceListing(request: HttpServletRequest, response: HttpServletResponse) = { + def renderResourceListing(request: HttpServletRequest, response: HttpServletResponse, contextId: String) = { LOG.trace("renderResourceListing") val queryParams = Map[String, List[String]]() @@ -165,7 +203,7 @@ abstract class RestSwaggerApiDeclarationServlet extends HttpServlet { response.addHeader("Access-Control-Allow-Origin", "*") } - val rests = getRestDefinitions(camelId) + val rests = getRestDefinitions(contextId) if (rests != null) { val f = new SpecFilter val listings = RestApiListingCache.listing(rests, swaggerConfig).map(specs => { @@ -193,11 +231,9 @@ abstract class RestSwaggerApiDeclarationServlet extends HttpServlet { /** * Renders the api listing of a single resource */ - def renderApiDeclaration(request: HttpServletRequest, response: HttpServletResponse) = { + def renderApiDeclaration(request: HttpServletRequest, response: HttpServletResponse, contextId: String, docRoot: String) = { LOG.trace("renderApiDeclaration") - val route = request.getPathInfo - val docRoot = request.getPathInfo val f = new SpecFilter val queryParams = Map[String, List[String]]() val cookies = Map[String, String]() @@ -210,7 +246,7 @@ abstract class RestSwaggerApiDeclarationServlet extends HttpServlet { response.addHeader("Access-Control-Allow-Origin", "*") } - val rests = getRestDefinitions(camelId) + val rests = getRestDefinitions(contextId) if (rests != null) { val listings = RestApiListingCache.listing(rests, swaggerConfig).map(specs => { (for (spec <- specs.values) yield { @@ -218,10 +254,9 @@ abstract class RestSwaggerApiDeclarationServlet extends HttpServlet { }).filter(m => m.resourcePath == pathPart) }).toList.flatten listings.size match { - case 1 => { + case 1 => LOG.debug("renderResourceListing write response -> {}", listings.head) response.getOutputStream.write(JsonSerializer.asJson(listings.head).getBytes("utf-8")) - } case _ => response.setStatus(404) } } else { http://git-wip-us.apache.org/repos/asf/camel/blob/a5dd9a05/components/camel-swagger/src/test/java/org/apache/camel/component/swagger/DefaultCamelSwaggerServletTest.java ---------------------------------------------------------------------- diff --git a/components/camel-swagger/src/test/java/org/apache/camel/component/swagger/DefaultCamelSwaggerServletTest.java b/components/camel-swagger/src/test/java/org/apache/camel/component/swagger/DefaultCamelSwaggerServletTest.java index 64714ce..ce9b6b8 100644 --- a/components/camel-swagger/src/test/java/org/apache/camel/component/swagger/DefaultCamelSwaggerServletTest.java +++ b/components/camel-swagger/src/test/java/org/apache/camel/component/swagger/DefaultCamelSwaggerServletTest.java @@ -16,11 +16,13 @@ */ package org.apache.camel.component.swagger; +import org.apache.camel.CamelContext; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.impl.JndiRegistry; import org.apache.camel.model.rest.RestDefinition; import org.apache.camel.test.junit4.CamelTestSupport; import org.junit.Test; +import scala.collection.immutable.List; import scala.collection.mutable.Buffer; public class DefaultCamelSwaggerServletTest extends CamelTestSupport { @@ -60,7 +62,6 @@ public class DefaultCamelSwaggerServletTest extends CamelTestSupport { checkRestDefinition(rest); // get the RestDefinition by using the camel context id - System.out.println(context.getName()); list = servlet.getRestDefinitions(context.getName()); assertEquals(1, list.size()); rest = list.iterator().next(); @@ -70,6 +71,15 @@ public class DefaultCamelSwaggerServletTest extends CamelTestSupport { checkRestDefinition(rest2); } + @Test + public void testContexts() throws Exception { + DefaultCamelSwaggerServlet servlet = new DefaultCamelSwaggerServlet(); + + List<String> list = servlet.findCamelContexts(); + assertEquals(1, list.length()); + assertEquals(context.getName(), list.head()); + } + private void checkRestDefinition(RestDefinition rest) { assertNotNull(rest); assertEquals("/hello", rest.getPath());