Skip to content

Commit

Permalink
CAMEL-7800: camel-swagger-java - work in progress
Browse files Browse the repository at this point in the history
  • Loading branch information
davsclaus committed Sep 18, 2015
1 parent d54f0bc commit 2047a20
Show file tree
Hide file tree
Showing 5 changed files with 49 additions and 35 deletions.
Expand Up @@ -29,6 +29,7 @@
import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.SerializationFeature;
import io.swagger.core.filter.SpecFilter;
import io.swagger.jaxrs.config.BeanConfig; import io.swagger.jaxrs.config.BeanConfig;
import io.swagger.models.Contact; import io.swagger.models.Contact;
import io.swagger.models.Info; import io.swagger.models.Info;
Expand Down Expand Up @@ -144,21 +145,14 @@ protected void doGet(HttpServletRequest request, HttpServletResponse response) t
route = route.substring(contextId.length()); route = route.substring(contextId.length());
} }



renderResourceListing(request, response, contextId, route);
// TODO: implement these
if (!route.equals("") && !route.equals("/")) {
// render overview if the route is empty or is the root path
// renderApiDeclaration(request, response, contextId, route);
} else {
renderResourceListing(request, response, contextId);
}
} }
} catch (Exception e) { } catch (Exception e) {
LOG.warn("Error rendering swagger due " + e.getMessage(), e); LOG.warn("Error rendering swagger due " + e.getMessage(), e);
} }
} }


private void renderResourceListing(HttpServletRequest request, HttpServletResponse response, String contextId) throws Exception { private void renderResourceListing(HttpServletRequest request, HttpServletResponse response, String contextId, String route) throws Exception {
LOG.trace("renderResourceListing"); LOG.trace("renderResourceListing");


if (cors) { if (cors) {
Expand All @@ -169,17 +163,13 @@ private void renderResourceListing(HttpServletRequest request, HttpServletRespon


List<RestDefinition> rests = getRestDefinitions(contextId); List<RestDefinition> rests = getRestDefinitions(contextId);
if (rests != null) { if (rests != null) {
// read the rest-dsl into swagger model
Swagger swagger = reader.read(rests, route, swaggerConfig, new DefaultClassResolver());


// TODO: combine the rests ObjectMapper mapper = new ObjectMapper();

mapper.enable(SerializationFeature.INDENT_OUTPUT);
for (RestDefinition rest : rests) { mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
Swagger swagger = reader.read(rest, swaggerConfig, new DefaultClassResolver()); mapper.writeValue(response.getOutputStream(), swagger);

ObjectMapper mapper = new ObjectMapper();
mapper.enable(SerializationFeature.INDENT_OUTPUT);
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
mapper.writeValue(response.getOutputStream(), swagger);
}
} else { } else {
response.setStatus(204); response.setStatus(204);
} }
Expand Down
Expand Up @@ -50,23 +50,43 @@
import org.apache.camel.model.rest.RestParamType; import org.apache.camel.model.rest.RestParamType;
import org.apache.camel.model.rest.VerbDefinition; import org.apache.camel.model.rest.VerbDefinition;
import org.apache.camel.spi.ClassResolver; import org.apache.camel.spi.ClassResolver;
import org.apache.camel.util.ObjectHelper;


/** /**
* A Camel REST-DSL swagger reader that parse the rest-dsl into a swagger model representation. * A Camel REST-DSL swagger reader that parse the rest-dsl into a swagger model representation.
*/ */
public class RestSwaggerReader { public class RestSwaggerReader {


/** /**
* Read the REST-DSL definition and parse that as a Swagger model representation * Read the REST-DSL definition's and parse that as a Swagger model representation
* *
* @param rest the rest-dsl * @param rests the rest-dsl
* @param route optional route path to filter the rest-dsl to only include from the chose route
* @param config the swagger configuration * @param config the swagger configuration
* @param classResolver class resolver to use * @param classResolver class resolver to use
* @return the swagger model * @return the swagger model
*/ */
public Swagger read(RestDefinition rest, BeanConfig config, ClassResolver classResolver) { public Swagger read(List<RestDefinition> rests, String route, BeanConfig config, ClassResolver classResolver) {
Swagger swagger = new Swagger(); Swagger swagger = new Swagger();


for (RestDefinition rest : rests) {

if (ObjectHelper.isNotEmpty(route) && !route.equals("/")) {
// filter by route
if (!rest.getPath().equals(route)) {
continue;
}
}

parse(swagger, rest, classResolver);
}

// configure before returning
swagger = config.configure(swagger);
return swagger;
}

private void parse(Swagger swagger, RestDefinition rest, ClassResolver classResolver) {
List<VerbDefinition> verbs = new ArrayList<>(rest.getVerbs()); List<VerbDefinition> verbs = new ArrayList<>(rest.getVerbs());
// must sort the verbs by uri so we group them together when an uri has multiple operations // must sort the verbs by uri so we group them together when an uri has multiple operations
Collections.sort(verbs, new VerbOrdering()); Collections.sort(verbs, new VerbOrdering());
Expand Down Expand Up @@ -207,10 +227,6 @@ public Swagger read(RestDefinition rest, BeanConfig config, ClassResolver classR
// add path // add path
swagger.path(opPath, path); swagger.path(opPath, path);
} }

// configure before returning
swagger = config.configure(swagger);
return swagger;
} }


private Model asModel(String typeName, Swagger swagger) { private Model asModel(String typeName, Swagger swagger) {
Expand Down
Expand Up @@ -65,9 +65,6 @@ public void configure() throws Exception {


@Test @Test
public void testReaderRead() throws Exception { public void testReaderRead() throws Exception {
RestDefinition rest = context.getRestDefinitions().get(0);
assertNotNull(rest);

BeanConfig config = new BeanConfig(); BeanConfig config = new BeanConfig();
config.setHost("localhost:8080"); config.setHost("localhost:8080");
config.setSchemes(new String[]{"http"}); config.setSchemes(new String[]{"http"});
Expand All @@ -77,7 +74,7 @@ public void testReaderRead() throws Exception {
config.setLicenseUrl("http://www.apache.org/licenses/LICENSE-2.0.html"); config.setLicenseUrl("http://www.apache.org/licenses/LICENSE-2.0.html");
RestSwaggerReader reader = new RestSwaggerReader(); RestSwaggerReader reader = new RestSwaggerReader();


Swagger swagger = reader.read(rest, config, new DefaultClassResolver()); Swagger swagger = reader.read(context.getRestDefinitions(), null, config, new DefaultClassResolver());
assertNotNull(swagger); assertNotNull(swagger);


ObjectMapper mapper = new ObjectMapper(); ObjectMapper mapper = new ObjectMapper();
Expand Down
Expand Up @@ -24,7 +24,6 @@
import org.apache.camel.builder.RouteBuilder; import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.impl.DefaultClassResolver; import org.apache.camel.impl.DefaultClassResolver;
import org.apache.camel.impl.JndiRegistry; import org.apache.camel.impl.JndiRegistry;
import org.apache.camel.model.rest.RestDefinition;
import org.apache.camel.model.rest.RestParamType; import org.apache.camel.model.rest.RestParamType;
import org.apache.camel.test.junit4.CamelTestSupport; import org.apache.camel.test.junit4.CamelTestSupport;
import org.junit.Test; import org.junit.Test;
Expand Down Expand Up @@ -60,16 +59,13 @@ public void configure() throws Exception {


@Test @Test
public void testReaderRead() throws Exception { public void testReaderRead() throws Exception {
RestDefinition rest = context.getRestDefinitions().get(0);
assertNotNull(rest);

BeanConfig config = new BeanConfig(); BeanConfig config = new BeanConfig();
config.setHost("localhost:8080"); config.setHost("localhost:8080");
config.setSchemes(new String[]{"http"}); config.setSchemes(new String[]{"http"});
config.setBasePath("/api"); config.setBasePath("/api");
RestSwaggerReader reader = new RestSwaggerReader(); RestSwaggerReader reader = new RestSwaggerReader();


Swagger swagger = reader.read(rest, config, new DefaultClassResolver()); Swagger swagger = reader.read(context.getRestDefinitions(), null, config, new DefaultClassResolver());
assertNotNull(swagger); assertNotNull(swagger);


ObjectMapper mapper = new ObjectMapper(); ObjectMapper mapper = new ObjectMapper();
Expand Down
Expand Up @@ -75,6 +75,21 @@
</get> </get>
</rest> </rest>


<!-- defines the rest services using the context-path /echo -->
<rest path="/echo" consumes="application/text" produces="application/text">
<description>Echo rest service</description>

<get uri="/ping">
<description>A ping service</description>
<route>
<transform>
<constant>pong</constant>
</transform>
</route>
</get>

</rest>

</camelContext> </camelContext>


</beans> </beans>

0 comments on commit 2047a20

Please sign in to comment.