CAMEL-7800: camel-swagger-java - 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/14083335 Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/14083335 Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/14083335 Branch: refs/heads/master Commit: 1408333526d7d5c8d66879a7ff6425be702439f3 Parents: 1d5b0da Author: Claus Ibsen <davscl...@apache.org> Authored: Thu Sep 17 15:02:33 2015 +0200 Committer: Claus Ibsen <davscl...@apache.org> Committed: Fri Sep 18 16:16:11 2015 +0200 ---------------------------------------------------------------------- .../apache/camel/swagger/RestSwaggerReader.java | 116 +++++++++++++++++++ .../camel/swagger/DummyRestConsumerFactory.java | 48 ++++++++ .../camel/swagger/RestSwaggerReaderTest.java | 79 +++++++++++++ .../src/test/resources/log4j.properties | 2 +- 4 files changed, 244 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/14083335/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/RestSwaggerReader.java ---------------------------------------------------------------------- diff --git a/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/RestSwaggerReader.java b/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/RestSwaggerReader.java new file mode 100644 index 0000000..4a896a3 --- /dev/null +++ b/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/RestSwaggerReader.java @@ -0,0 +1,116 @@ +/** + * 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.swagger; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import java.util.Locale; + +import io.swagger.config.SwaggerConfig; +import io.swagger.models.Operation; +import io.swagger.models.Path; +import io.swagger.models.Swagger; +import org.apache.camel.model.rest.RestDefinition; +import org.apache.camel.model.rest.VerbDefinition; + +public class RestSwaggerReader { + + public Swagger read(RestDefinition rest) { + Swagger swagger = new Swagger(); + + List<VerbDefinition> verbs = new ArrayList<>(rest.getVerbs()); + // must sort the verbs by uri so we group them together when an uri has multiple operations + Collections.sort(verbs, new VerbOrdering()); + + // used during gathering of apis + List<Path> paths = new ArrayList<>(); + + String basePath = rest.getPath(); + + for (VerbDefinition verb : verbs) { + + // TODO: should be base path and a lot more + + + // the method must be in lower case + String method = verb.asVerb().toLowerCase(Locale.US); + + String opPath = getPath(basePath, verb.getUri()); + + Operation op = new Operation(); + + Path path = swagger.getPath(opPath); + if (path == null) { + path = new Path(); + paths.add(path); + } + path = path.set(method, op); + + if (verb.getConsumes() != null) { + op.consumes(verb.getConsumes()); + } + if (verb.getProduces() != null) { + op.produces(verb.getProduces()); + } + if (verb.getDescriptionText() != null) { + op.summary(verb.getDescriptionText()); + } + + // add path + swagger.path(opPath, path); + } + + return swagger; + } + + private String getPath(String basePath, String uri) { + // TODO: slash check and avoid double slash and all that + return basePath + "/" + uri; + } + + /** + * To sort the rest operations + */ + private static class VerbOrdering implements Comparator<VerbDefinition> { + + @Override + public int compare(VerbDefinition a, VerbDefinition b) { + + String u1 = ""; + if (a.getUri() != null) { + // replace { with _ which comes before a when soring by char + u1 = a.getUri().replace("{", "_"); + } + String u2 = ""; + if (b.getUri() != null) { + // replace { with _ which comes before a when soring by char + u2 = b.getUri().replace("{", "_"); + } + + int num = u1.compareTo(u2); + if (num == 0) { + // same uri, so use http method as sorting + num = a.asVerb().compareTo(b.asVerb()); + } + return num; + } + } + + +} http://git-wip-us.apache.org/repos/asf/camel/blob/14083335/components/camel-swagger-java/src/test/java/org/apache/camel/swagger/DummyRestConsumerFactory.java ---------------------------------------------------------------------- diff --git a/components/camel-swagger-java/src/test/java/org/apache/camel/swagger/DummyRestConsumerFactory.java b/components/camel-swagger-java/src/test/java/org/apache/camel/swagger/DummyRestConsumerFactory.java new file mode 100644 index 0000000..d0d6efe --- /dev/null +++ b/components/camel-swagger-java/src/test/java/org/apache/camel/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.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/14083335/components/camel-swagger-java/src/test/java/org/apache/camel/swagger/RestSwaggerReaderTest.java ---------------------------------------------------------------------- diff --git a/components/camel-swagger-java/src/test/java/org/apache/camel/swagger/RestSwaggerReaderTest.java b/components/camel-swagger-java/src/test/java/org/apache/camel/swagger/RestSwaggerReaderTest.java new file mode 100644 index 0000000..2252479 --- /dev/null +++ b/components/camel-swagger-java/src/test/java/org/apache/camel/swagger/RestSwaggerReaderTest.java @@ -0,0 +1,79 @@ +/** + * 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.swagger; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import io.swagger.jaxrs.config.BeanConfig; +import io.swagger.models.Swagger; +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; + +public class RestSwaggerReaderTest extends CamelTestSupport { + + @Override + protected JndiRegistry createRegistry() throws Exception { + JndiRegistry jndi = super.createRegistry(); + jndi.bind("dummy-rest", new DummyRestConsumerFactory()); + return jndi; + } + + @Override + protected RouteBuilder createRouteBuilder() throws Exception { + return new RouteBuilder() { + @Override + public void configure() throws Exception { + rest("/hello") + .get("/hi").to("log:hi") + .get("/bye").to("log:bye") + .post("/bye").to("log:bye"); + } + }; + } + + @Test + public void testReaderRead() throws Exception { + RestDefinition rest = context.getRestDefinitions().get(0); + assertNotNull(rest); + + BeanConfig config = new BeanConfig(); + config.setBasePath("http://localhost:8080/api"); + RestSwaggerReader reader = new RestSwaggerReader(); + + Swagger swagger = reader.read(rest); + assertNotNull(swagger); + + ObjectMapper mapper = new ObjectMapper(); + mapper.enable(SerializationFeature.INDENT_OUTPUT); + mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); + String json = mapper.writeValueAsString(swagger); + + log.info(json); + + assertTrue(json.contains("\"basePath\":\"http://localhost:8080/api\"")); + assertTrue(json.contains("\"resourcePath\":\"/hello\"")); + assertTrue(json.contains("\"method\":\"GET\"")); + assertTrue(json.contains("\"nickname\":\"getHelloHi\"")); + + context.stop(); + } + +} http://git-wip-us.apache.org/repos/asf/camel/blob/14083335/components/camel-swagger-java/src/test/resources/log4j.properties ---------------------------------------------------------------------- diff --git a/components/camel-swagger-java/src/test/resources/log4j.properties b/components/camel-swagger-java/src/test/resources/log4j.properties index 3e0349e..36983fa 100644 --- a/components/camel-swagger-java/src/test/resources/log4j.properties +++ b/components/camel-swagger-java/src/test/resources/log4j.properties @@ -18,7 +18,7 @@ # # The logging properties used for testing. # -log4j.rootLogger=INFO, file +log4j.rootLogger=INFO, out # uncomment the following to enable camel debugging #log4j.logger.org.apache.camel.component.swagger=TRACE