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());

Reply via email to