You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2014/08/10 11:42:14 UTC
[08/11] git commit: Rest DSL. camel-swagger work in progress.
Rest DSL. camel-swagger work in progress.
Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/3f821b09
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/3f821b09
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/3f821b09
Branch: refs/heads/master
Commit: 3f821b0975470a9aebe03029dd9d4d765b209e5d
Parents: 8b3d645
Author: Claus Ibsen <da...@apache.org>
Authored: Sun Aug 10 10:36:30 2014 +0200
Committer: Claus Ibsen <da...@apache.org>
Committed: Sun Aug 10 10:39:59 2014 +0200
----------------------------------------------------------------------
.../component/swagger/RestApiListingCache.scala | 11 ++---
.../RestSwaggerApiDeclarationServlet.scala | 11 +++--
.../component/swagger/RestSwaggerReader.scala | 47 +++++++++++++++++---
3 files changed, 53 insertions(+), 16 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/camel/blob/3f821b09/components/camel-swagger/src/main/scala/org/apache/camel/component/swagger/RestApiListingCache.scala
----------------------------------------------------------------------
diff --git a/components/camel-swagger/src/main/scala/org/apache/camel/component/swagger/RestApiListingCache.scala b/components/camel-swagger/src/main/scala/org/apache/camel/component/swagger/RestApiListingCache.scala
index 494e620..65abddf 100644
--- a/components/camel-swagger/src/main/scala/org/apache/camel/component/swagger/RestApiListingCache.scala
+++ b/components/camel-swagger/src/main/scala/org/apache/camel/component/swagger/RestApiListingCache.scala
@@ -18,8 +18,10 @@ package org.apache.camel.component.swagger
import com.wordnik.swagger.core.util.ReaderUtil
import com.wordnik.swagger.config.SwaggerConfig
+import com.wordnik.swagger.model.ApiListing
+
import org.apache.camel.CamelContext
-import com.wordnik.swagger.model.{Operation, ApiListing}
+
import scala.collection.mutable.ListBuffer
// to iterate Java list using for loop
@@ -36,10 +38,9 @@ object RestApiListingCache extends ReaderUtil {
val rests = camel.getRestDefinitions.asScala
for (rest <- rests) {
- // TODO: this can be nicer
- val option = reader.read(rest, config)
- if (option.get != null) {
- listings += option.get
+ val some = reader.read(rest, config)
+ if (!some.isEmpty) {
+ listings += some.get
}
}
http://git-wip-us.apache.org/repos/asf/camel/blob/3f821b09/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 11af449..fb72242 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
@@ -43,7 +43,6 @@ class RestSwaggerApiDeclarationServlet extends HttpServlet {
override def init(config: ServletConfig): Unit = {
super.init(config)
- LOG.info("init")
// configure swagger options
var s = config.getInitParameter("api.version")
@@ -99,13 +98,12 @@ class RestSwaggerApiDeclarationServlet extends HttpServlet {
* Renders the resource listing which is the overview of all the apis
*/
def renderResourceListing(request: HttpServletRequest, response: HttpServletResponse) = {
- LOG.info("renderResourceListing")
+ LOG.trace("renderResourceListing")
val queryParams = Map[String, List[String]]()
val cookies = Map[String, String]()
val headers = Map[String, List[String]]()
- LOG.info("renderResourceListing camel -> {}", camel)
if (camel != null) {
val f = new SpecFilter
val listings = RestApiListingCache.listing(camel, swaggerConfig).map(specs => {
@@ -123,7 +121,7 @@ class RestSwaggerApiDeclarationServlet extends HttpServlet {
List(),
swaggerConfig.info
)
- LOG.info("renderResourceListing write response -> {}", resourceListing)
+ LOG.debug("renderResourceListing write response -> {}", resourceListing)
response.getOutputStream.write(JsonSerializer.asJson(resourceListing).getBytes("utf-8"))
} else {
response.setStatus(204)
@@ -134,6 +132,8 @@ class RestSwaggerApiDeclarationServlet extends HttpServlet {
* Renders the api listing of a single resource
*/
def renderApiDeclaration(request: HttpServletRequest, response: HttpServletResponse) = {
+ LOG.trace("renderApiDeclaration")
+
val route = request.getPathInfo
val docRoot = request.getPathInfo
val f = new SpecFilter
@@ -142,7 +142,6 @@ class RestSwaggerApiDeclarationServlet extends HttpServlet {
val headers = Map[String, List[String]]()
val pathPart = docRoot
- LOG.info("renderApiDeclaration camel -> {}", camel)
if (camel != null) {
val listings = RestApiListingCache.listing(camel, swaggerConfig).map(specs => {
(for (spec <- specs.values) yield {
@@ -151,7 +150,7 @@ class RestSwaggerApiDeclarationServlet extends HttpServlet {
}).toList.flatten
listings.size match {
case 1 => {
- LOG.info("renderResourceListing write response -> {}", listings.head)
+ LOG.debug("renderResourceListing write response -> {}", listings.head)
response.getOutputStream.write(JsonSerializer.asJson(listings.head).getBytes("utf-8"))
}
case _ => response.setStatus(404)
http://git-wip-us.apache.org/repos/asf/camel/blob/3f821b09/components/camel-swagger/src/main/scala/org/apache/camel/component/swagger/RestSwaggerReader.scala
----------------------------------------------------------------------
diff --git a/components/camel-swagger/src/main/scala/org/apache/camel/component/swagger/RestSwaggerReader.scala b/components/camel-swagger/src/main/scala/org/apache/camel/component/swagger/RestSwaggerReader.scala
index 39f0f56..f9fe70f 100644
--- a/components/camel-swagger/src/main/scala/org/apache/camel/component/swagger/RestSwaggerReader.scala
+++ b/components/camel-swagger/src/main/scala/org/apache/camel/component/swagger/RestSwaggerReader.scala
@@ -6,7 +6,7 @@
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
- * http://www.apache.org/licenses/LICENSE-2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
@@ -25,7 +25,7 @@ import com.wordnik.swagger.core.SwaggerSpec
import org.apache.camel.model.rest.{VerbDefinition, RestDefinition}
import org.apache.camel.util.FileUtil
- import org.slf4j.LoggerFactory
+import org.slf4j.LoggerFactory
import scala.collection.mutable.ListBuffer
@@ -48,11 +48,20 @@ class RestSwaggerReader {
}
}
- // TOOD: register classloader
+ // TODO: add parameters to operations
+ // - {id} is a path type, and required
+ // - type/typeList/outType/outTypeList is body type and required
def read(rest: RestDefinition, config: SwaggerConfig): Option[ApiListing] = {
- val resourcePath = rest.getPath
+ var resourcePath = rest.getPath
+ // resource path must start with slash
+ if (resourcePath == null) {
+ resourcePath = ""
+ }
+ if (!resourcePath.startsWith("/")) {
+ resourcePath = "/" + resourcePath
+ }
// create a list of apis
val apis = new ListBuffer[ApiDescription]
@@ -82,8 +91,13 @@ class RestSwaggerReader {
}
path = verb.getUri
+
+ // the method must be in upper case
var method = verb.asVerb().toUpperCase(Locale.US)
+ // create an unique nickname using the method and paths
+ var nickName = createNickname(verb.asVerb(), buildUrl(resourcePath, path))
+
var responseType = verb.getOutType match {
case e: String => e
case _ => "java.lang.Void"
@@ -104,7 +118,7 @@ class RestSwaggerReader {
"",
"",
responseType,
- "",
+ nickName,
0,
produces,
consumes,
@@ -154,4 +168,27 @@ class RestSwaggerReader {
else None
}
+ def createNickname(method: String, absPath : String): String = {
+ val s = method + "/" + absPath
+ val arr = s.split("\\/")
+ val r = arr.foldLeft("") {
+ (a, b) => a + toTitleCase(sanitizeNickname(b))
+ }
+ // first char should be lower
+ r.charAt(0).toLower + r.substring(1)
+ }
+
+ def toTitleCase(s: String): String = {
+ if (s.size > 0) {
+ s.charAt(0).toUpper + s.substring(1)
+ } else {
+ s
+ }
+ }
+
+ def sanitizeNickname(s: String): String = {
+ // nick name must only be alpha chars
+ s.replaceAll("\\W", "")
+ }
+
}