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/1817a41e Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/1817a41e Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/1817a41e Branch: refs/heads/master Commit: 1817a41ea9165453bd8904498a4ed5c2a20e81a0 Parents: bf36f61 Author: Claus Ibsen <davscl...@apache.org> Authored: Fri Sep 18 12:23:55 2015 +0200 Committer: Claus Ibsen <davscl...@apache.org> Committed: Fri Sep 18 16:16:13 2015 +0200 ---------------------------------------------------------------------- .../apache/camel/swagger/RestSwaggerReader.java | 85 ++++++++++++++------ .../src/test/resources/log4j.properties | 2 +- 2 files changed, 61 insertions(+), 26 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/1817a41e/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 index e664529..90f5956 100644 --- 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 @@ -30,6 +30,7 @@ import io.swagger.models.Model; import io.swagger.models.ModelImpl; import io.swagger.models.Operation; import io.swagger.models.Path; +import io.swagger.models.RefModel; import io.swagger.models.Response; import io.swagger.models.Swagger; import io.swagger.models.parameters.BodyParameter; @@ -40,6 +41,7 @@ import io.swagger.models.parameters.PathParameter; import io.swagger.models.parameters.QueryParameter; import io.swagger.models.parameters.SerializableParameter; import io.swagger.models.properties.ArrayProperty; +import io.swagger.models.properties.Property; import io.swagger.models.properties.RefProperty; import io.swagger.models.properties.StringProperty; import org.apache.camel.model.rest.RestDefinition; @@ -159,15 +161,18 @@ public class RestSwaggerReader { if (parameter instanceof SerializableParameter) { SerializableParameter sp = (SerializableParameter) parameter; - // TODO: like response object with type refer to model if (param.getDataType() != null) { sp.setType(param.getDataType()); - } else if (verb.getType() != null) { - boolean array = verb.getType().endsWith("[]"); - if (array) { - sp.setType("array"); - } else { - sp.setType(verb.getType()); + } + } + + if (parameter instanceof BodyParameter) { + BodyParameter bp = (BodyParameter) parameter; + + if (verb.getType() != null) { + String ref = modelTypeAsRef(verb.getType(), swagger); + if (ref != null) { + bp.setSchema(new RefModel(ref)); } } } @@ -178,23 +183,8 @@ public class RestSwaggerReader { if (verb.getOutType() != null) { Response response = new Response(); - boolean array = verb.getOutType().endsWith("[]"); - String type = array ? verb.getOutType().substring(0, verb.getOutType().length() - 2) : verb.getOutType(); - // lookup in models to use key instead of FQN - - for (Model model : swagger.getDefinitions().values()) { - StringProperty modelType = (StringProperty) model.getVendorExtensions().get("x-className"); - if (modelType != null && type.equals(modelType.getFormat())) { - type = ((ModelImpl) model).getName(); - break; - } - } - - if (array) { - response.setSchema(new ArrayProperty(new RefProperty(type))); - } else { - response.setSchema(new RefProperty(type)); - } + Property prop = modelTypeAsProperty(verb.getOutType(), swagger); + response.setSchema(prop); response.setDescription("Output type"); op.addResponse("200", response); } @@ -207,12 +197,57 @@ public class RestSwaggerReader { // add path swagger.path(opPath, path); - } return swagger; } + private Model asModel(String typeName, Swagger swagger) { + boolean array = typeName.endsWith("[]"); + if (array) { + typeName = typeName.substring(0, typeName.length() - 2); + } + + for (Model model : swagger.getDefinitions().values()) { + StringProperty modelType = (StringProperty) model.getVendorExtensions().get("x-className"); + if (modelType != null && typeName.equals(modelType.getFormat())) { + return model; + } + } + return null; + } + + private String modelTypeAsRef(String typeName, Swagger swagger) { + boolean array = typeName.endsWith("[]"); + if (array) { + typeName = typeName.substring(0, typeName.length() - 2); + } + + Model model = asModel(typeName, swagger); + if (model != null) { + typeName = ((ModelImpl) model).getName(); + return typeName; + } + + return null; + } + + private Property modelTypeAsProperty(String typeName, Swagger swagger) { + boolean array = typeName.endsWith("[]"); + if (array) { + typeName = typeName.substring(0, typeName.length() - 2); + } + + String ref = modelTypeAsRef(typeName, swagger); + + Property prop = ref != null ? new RefProperty(ref) : new StringProperty(typeName); + if (array) { + return new ArrayProperty(prop); + } else { + return prop; + } + } + /** * If the class is annotated with swagger annotations its parsed into a Swagger model representation * which is added to swagger http://git-wip-us.apache.org/repos/asf/camel/blob/1817a41e/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 6e040b0..e5d9b29 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.swagger=TRACE