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:11 UTC
[05/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/a578af93
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/a578af93
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/a578af93
Branch: refs/heads/master
Commit: a578af9375b7ab86737505858801cc79362f5560
Parents: 7aa0b4a
Author: Claus Ibsen <da...@apache.org>
Authored: Sat Aug 9 10:35:20 2014 +0200
Committer: Claus Ibsen <da...@apache.org>
Committed: Sat Aug 9 11:06:32 2014 +0200
----------------------------------------------------------------------
.../component/swagger/RestSwaggerReader.scala | 194 +++++++++++--------
.../swagger/DummyRestConsumerFactory.java | 48 +++++
.../swagger/RestSwaggerReaderTest.java | 38 ++--
3 files changed, 182 insertions(+), 98 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/camel/blob/a578af93/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 c8e84a7..2b57013 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,
@@ -16,109 +16,137 @@
*/
package org.apache.camel.component.swagger
-import org.apache.camel.model.rest.{VerbDefinition, RestDefinition}
+import java.util.Locale
+
import com.wordnik.swagger.config.SwaggerConfig
import com.wordnik.swagger.model.{ApiDescription, Operation, ApiListing}
-import org.slf4j.LoggerFactory
import com.wordnik.swagger.core.util.ModelUtil
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 scala.collection.mutable.ListBuffer
-import java.util.Locale
-// to iterate using for loop
+// to iterate Java list using for loop
import scala.collection.JavaConverters._
class RestSwaggerReader {
private val LOG = LoggerFactory.getLogger(classOf[RestSwaggerReader])
+ def buildUrl(path1: String, path2: String): String = {
+ val s1 = FileUtil.stripTrailingSeparator(path1)
+ val s2 = FileUtil.stripLeadingSeparator(path2)
+ if (s1 != null && s2 != null) {
+ s1 + "/" + s2
+ } else if (path1 != null) {
+ path1
+ } else {
+ path2
+ }
+ }
+
def read(rest: RestDefinition, config: SwaggerConfig): Option[ApiListing] = {
- val api = rest.getPath
- if (api != null) {
- val fullPath = {
- if (api.startsWith("/")) api.substring(1)
- else api
+ val resourcePath = rest.getPath
+
+ // create a list of apis
+ val apis = new ListBuffer[ApiDescription]
+
+ // used during gathering of apis
+ val operations = new ListBuffer[Operation]
+ var path: String = null
+
+ // must sort the verbs by uri so we group them together when an uri has multiple operations
+ // TODO: we want to sort /{xx} first, so we may need some regexp matching to trigger sorting them before non {}
+ // TODO: and then 2nd sort by http method
+ var list = rest.getVerbs.asScala
+ list = list.sortBy(v => v.getUri match {
+ case v: Any => v
+ case _ => ""
+ })
+
+ for (verb: VerbDefinition <- list) {
+
+ if (verb.getUri != path && operations.size > 0) {
+ // restart
+ apis += ApiDescription(
+ buildUrl(resourcePath, path),
+ Some(""),
+ operations.toList)
+ operations.clear()
}
- val (resourcePath, subpath) = {
- if (fullPath.indexOf("/") > 0) {
- val pos = fullPath.indexOf("/")
- ("/" + fullPath.substring(0, pos), fullPath.substring(pos))
- }
- else ("/", fullPath)
+
+ path = verb.getUri
+ var method = verb.asVerb().toUpperCase(Locale.US)
+
+ var responseType = verb.getOutType match {
+ case e: String => e
+ case _ => "java.lang.Void"
}
- LOG.debug("read routes from classes: %s, %s".format(resourcePath, subpath))
-
- val operations = new ListBuffer[Operation]
-
- val list = rest.getVerbs.asScala
- for (verb: VerbDefinition <- list) {
-
- var method = verb.asVerb().toUpperCase(Locale.US)
-
- var responseType = verb.getOutType match {
- case e: String => e
- case _ => "java.lang.Void"
- }
-
- var p = verb.getProduces
- if (p == null) {
- p = rest.getProduces
- }
- val produces = p match {
- case e: String if e != "" => e.split(",").map(_.trim).toList
- case _ => List()
- }
-
- var c = verb.getConsumes
- if (c == null) {
- c = rest.getConsumes
- }
- val consumes = c match {
- case e: String if e != "" => e.split(",").map(_.trim).toList
- case _ => List()
- }
-
- operations += Operation(
- method,
- "",
- "",
- responseType,
- "",
- 0,
- produces,
- consumes,
- List(),
- List(),
- List(),
- List(),
- None)
+ var p = verb.getProduces
+ if (p == null) {
+ p = rest.getProduces
+ }
+ val produces = p match {
+ case e: String if e != "" => e.split(",").map(_.trim).toList
+ case _ => List()
}
- if (operations.size > 0) {
- val apis = List(
- ApiDescription(
- "/" + fullPath,
- Some(""),
- operations.toList))
- val models = ModelUtil.modelsFromApis(apis)
- Some(
- ApiListing(
- config.apiVersion,
- SwaggerSpec.version,
- config.basePath,
- resourcePath,
- List(), // produces
- List(), // consumes
- List(), // protocols
- List(), // authorizations
- ModelUtil.stripPackages(apis),
- models)
- )
+ var c = verb.getConsumes
+ if (c == null) {
+ c = rest.getConsumes
}
- else None
+ val consumes = c match {
+ case e: String if e != "" => e.split(",").map(_.trim).toList
+ case _ => List()
+ }
+
+ operations += Operation(
+ method,
+ "",
+ "",
+ responseType,
+ "",
+ 0,
+ produces,
+ consumes,
+ List(),
+ List(),
+ List(),
+ List(),
+ None)
}
+
+ // add remainder
+ if (operations.size > 0) {
+ apis += ApiDescription(
+ buildUrl(resourcePath, path),
+ Some(""),
+ operations.toList)
+ }
+
+ if (apis.size > 0) {
+
+ val models = ModelUtil.modelsFromApis(apis.toList)
+ Some(
+ ApiListing(
+ config.apiVersion,
+ SwaggerSpec.version,
+ config.basePath,
+ resourcePath,
+ List(), // produces
+ List(), // consumes
+ List(), // protocols
+ List(), // authorizations
+ ModelUtil.stripPackages(apis.toList),
+ models)
+ )
+ }
+
else None
}
http://git-wip-us.apache.org/repos/asf/camel/blob/a578af93/components/camel-swagger/src/test/java/org/apache/camel/component/swagger/DummyRestConsumerFactory.java
----------------------------------------------------------------------
diff --git a/components/camel-swagger/src/test/java/org/apache/camel/component/swagger/DummyRestConsumerFactory.java b/components/camel-swagger/src/test/java/org/apache/camel/component/swagger/DummyRestConsumerFactory.java
new file mode 100644
index 0000000..eed969e
--- /dev/null
+++ b/components/camel-swagger/src/test/java/org/apache/camel/component/swagger/DummyRestConsumerFactory.java
@@ -0,0 +1,48 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (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
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.component.swagger;
+
+import java.util.Map;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.Consumer;
+import org.apache.camel.Processor;
+import org.apache.camel.component.seda.SedaEndpoint;
+import org.apache.camel.impl.ActiveMQUuidGenerator;
+import org.apache.camel.spi.RestConsumerFactory;
+
+public class DummyRestConsumerFactory implements RestConsumerFactory {
+
+ @Override
+ public Consumer createConsumer(CamelContext camelContext, Processor processor, String verb, String basePath, String uriTemplate,
+ String consumes, String produces, Map<String, Object> parameters) throws Exception {
+ // just use a seda endpoint for testing purpose
+ String id;
+ if (uriTemplate != null) {
+ id = ActiveMQUuidGenerator.generateSanitizedId(basePath + uriTemplate);
+ } else {
+ id = ActiveMQUuidGenerator.generateSanitizedId(basePath);
+ }
+ // remove leading dash as we add that ourselves
+ if (id.startsWith("-")) {
+ id = id.substring(1);
+ }
+ SedaEndpoint seda = camelContext.getEndpoint("seda:" + verb + "-" + id, SedaEndpoint.class);
+ return seda.createConsumer(processor);
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/a578af93/components/camel-swagger/src/test/java/org/apache/camel/component/swagger/RestSwaggerReaderTest.java
----------------------------------------------------------------------
diff --git a/components/camel-swagger/src/test/java/org/apache/camel/component/swagger/RestSwaggerReaderTest.java b/components/camel-swagger/src/test/java/org/apache/camel/component/swagger/RestSwaggerReaderTest.java
index 041e421..d1be9c9 100644
--- a/components/camel-swagger/src/test/java/org/apache/camel/component/swagger/RestSwaggerReaderTest.java
+++ b/components/camel-swagger/src/test/java/org/apache/camel/component/swagger/RestSwaggerReaderTest.java
@@ -17,38 +17,44 @@
package org.apache.camel.component.swagger;
import com.wordnik.swagger.config.SwaggerConfig;
+import com.wordnik.swagger.core.util.JsonSerializer;
import com.wordnik.swagger.model.ApiListing;
-import org.apache.camel.CamelContext;
import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.impl.DefaultCamelContext;
+import org.apache.camel.impl.JndiRegistry;
import org.apache.camel.model.rest.RestDefinition;
-import org.junit.Ignore;
+import org.apache.camel.test.junit4.CamelTestSupport;
import org.junit.Test;
import scala.Option;
-import static org.junit.Assert.assertNotNull;
+public class RestSwaggerReaderTest extends CamelTestSupport {
-public class RestSwaggerReaderTest {
+ @Override
+ protected JndiRegistry createRegistry() throws Exception {
+ JndiRegistry jndi = super.createRegistry();
+ jndi.bind("dummy-rest", new DummyRestConsumerFactory());
+ return jndi;
+ }
- @Test
- @Ignore
- public void testReaderRead() throws Exception {
- CamelContext context = new DefaultCamelContext();
- context.addRoutes(new RouteBuilder() {
+ @Override
+ protected RouteBuilder createRouteBuilder() throws Exception {
+ return new RouteBuilder() {
@Override
public void configure() throws Exception {
- restConfiguration().component("jetty").host("localhost").port(9090);
-
rest("/hello")
- .get("/hi").to("log:hi");
+ .get("/hi").to("log:hi")
+ .get("/bye").to("log:bye")
+ .post("/bye").to("log:bye");
}
- });
- context.start();
+ };
+ }
+ @Test
+ public void testReaderRead() throws Exception {
RestDefinition rest = context.getRestDefinitions().get(0);
assertNotNull(rest);
SwaggerConfig config = new SwaggerConfig();
+ config.setBasePath("http://localhost:8080/api");
RestSwaggerReader reader = new RestSwaggerReader();
Option<ApiListing> option = reader.read(rest, config);
assertNotNull(option);
@@ -56,6 +62,8 @@ public class RestSwaggerReaderTest {
assertNotNull(listing);
System.out.println(listing);
+ String json = JsonSerializer.asJson(listing);
+ System.out.println(json);
context.stop();
}