This is an automated email from the ASF dual-hosted git repository. zregvart pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/camel.git
commit 1070ac8e0d44d8093ec3f8a5aa06475fbd42dd36 Author: Zoran Regvart <zregv...@apache.org> AuthorDate: Tue Mar 10 23:47:13 2020 +0100 CAMEL-14691: dereference parameters If parameters are references then we need to dereference them. --- .../camel/generator/openapi/OperationVisitor.java | 38 +++-- .../generator/openapi/OperationVisitorTest.java | 163 +++++++++++++++++++++ 2 files changed, 185 insertions(+), 16 deletions(-) diff --git a/tooling/openapi-rest-dsl-generator/src/main/java/org/apache/camel/generator/openapi/OperationVisitor.java b/tooling/openapi-rest-dsl-generator/src/main/java/org/apache/camel/generator/openapi/OperationVisitor.java index 98e7d82..1223aac 100644 --- a/tooling/openapi-rest-dsl-generator/src/main/java/org/apache/camel/generator/openapi/OperationVisitor.java +++ b/tooling/openapi-rest-dsl-generator/src/main/java/org/apache/camel/generator/openapi/OperationVisitor.java @@ -21,6 +21,7 @@ import java.util.Collections; import java.util.List; import java.util.Map.Entry; +import io.apicurio.datamodels.core.util.ReferenceUtil; import io.apicurio.datamodels.openapi.models.OasOperation; import io.apicurio.datamodels.openapi.models.OasParameter; import io.apicurio.datamodels.openapi.models.OasResponse; @@ -69,14 +70,20 @@ class OperationVisitor<T> { CodeEmitter<T> emit(final OasParameter parameter) { emitter.emit("param"); - emit("name", parameter.getName()); - final String parameterType = parameter.in; + + OasParameter toUse = parameter; + if (ObjectHelper.isNotEmpty(parameter.$ref)) { + toUse = (OasParameter) ReferenceUtil.resolveRef(parameter.$ref, parameter); + } + + emit("name", toUse.getName()); + final String parameterType = toUse.in; if (ObjectHelper.isNotEmpty(parameterType)) { emit("type", RestParamType.valueOf(parameterType)); } - if (!parameterType.equals("body")) { - if (parameter instanceof Oas20Parameter) { - final Oas20Parameter serializableParameter = (Oas20Parameter) parameter; + if (!"body".equals(parameterType)) { + if (toUse instanceof Oas20Parameter) { + final Oas20Parameter serializableParameter = (Oas20Parameter) toUse; final String dataType = serializableParameter.type; emit("dataType", dataType); @@ -94,8 +101,8 @@ class OperationVisitor<T> { if ("array".equals(dataType) && items != null) { emit("arrayType", items.type); } - } else if (parameter instanceof Oas30Parameter) { - final Oas30Parameter serializableParameter = (Oas30Parameter) parameter; + } else if (toUse instanceof Oas30Parameter) { + final Oas30Parameter serializableParameter = (Oas30Parameter) toUse; final Oas30Schema schema = (Oas30Schema) serializableParameter.schema; if (schema != null) { final String dataType = schema.type; @@ -103,9 +110,9 @@ class OperationVisitor<T> { emit("dataType", dataType); } emit("allowableValues", asStringList(schema.enum_)); - final String collectionFormat = serializableParameter.style; - if (ObjectHelper.isNotEmpty(collectionFormat)) { - if (collectionFormat.equals("form")) { + final String style = serializableParameter.style; + if (ObjectHelper.isNotEmpty(style)) { + if (style.equals("form")) { if (serializableParameter.explode) { emit("collectionFormat", CollectionFormat.multi); } else { @@ -125,12 +132,12 @@ class OperationVisitor<T> { } } } - if (parameter.required != null) { - emit("required", parameter.required); + if (toUse.required != null) { + emit("required", toUse.required); } else { emit("required", Boolean.FALSE); } - emit("description", parameter.description); + emit("description", toUse.description); emitter.emit("endParam"); return emitter; @@ -190,9 +197,7 @@ class OperationVisitor<T> { emit("produces", operationLevelProduces); if (operation.getParameters() != null) { - operation.getParameters().forEach(parameter -> { - emit(parameter); - }); + operation.getParameters().forEach(this::emit); } if (operation instanceof Oas30Operation) { emitOas30Operation((Oas30Operation) operation); @@ -200,6 +205,7 @@ class OperationVisitor<T> { emitter.emit("to", destinationGenerator.generateDestinationFor(operation)); } + } private CodeEmitter<T> emitOas30Operation(final Oas30Operation operation) { diff --git a/tooling/openapi-rest-dsl-generator/src/test/java/org/apache/camel/generator/openapi/OperationVisitorTest.java b/tooling/openapi-rest-dsl-generator/src/test/java/org/apache/camel/generator/openapi/OperationVisitorTest.java new file mode 100644 index 0000000..ad904b7 --- /dev/null +++ b/tooling/openapi-rest-dsl-generator/src/test/java/org/apache/camel/generator/openapi/OperationVisitorTest.java @@ -0,0 +1,163 @@ +/* + * 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.generator.openapi; + +import java.util.Arrays; + +import com.squareup.javapoet.MethodSpec; +import com.squareup.javapoet.MethodSpec.Builder; +import io.apicurio.datamodels.openapi.v2.models.Oas20Parameter; +import io.apicurio.datamodels.openapi.v3.models.Oas30Document; +import io.apicurio.datamodels.openapi.v3.models.Oas30Parameter; +import io.apicurio.datamodels.openapi.v3.models.Oas30ParameterDefinition; +import io.apicurio.datamodels.openapi.v3.models.Oas30Schema; +import org.junit.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +public class OperationVisitorTest { + + @Test + public void shouldEmitCodeForOas2ParameterInQuery() { + final Builder method = MethodSpec.methodBuilder("configure"); + final MethodBodySourceCodeEmitter emitter = new MethodBodySourceCodeEmitter(method); + final OperationVisitor<?> visitor = new OperationVisitor<>(emitter, null, null, null); + + final Oas20Parameter parameter = new Oas20Parameter("param"); + parameter.in = "query"; + + visitor.emit(parameter); + + assertThat(method.build().toString()).isEqualTo("void configure() {\n" + + " param()\n" + + " .name(\"param\")\n" + + " .type(org.apache.camel.model.rest.RestParamType.query)\n" + + " .required(false)\n" + + " .endParam()}\n"); + } + + @Test + public void shouldEmitCodeForOas3ParameterInPath() { + final Builder method = MethodSpec.methodBuilder("configure"); + final MethodBodySourceCodeEmitter emitter = new MethodBodySourceCodeEmitter(method); + final OperationVisitor<?> visitor = new OperationVisitor<>(emitter, null, null, null); + + final Oas30Parameter parameter = new Oas30Parameter("param"); + parameter.in = "path"; + + visitor.emit(parameter); + + assertThat(method.build().toString()).isEqualTo("void configure() {\n" + + " param()\n" + + " .name(\"param\")\n" + + " .type(org.apache.camel.model.rest.RestParamType.path)\n" + + " .required(false)\n" + + " .endParam()}\n"); + } + + @Test + public void shouldEmitCodeForOas3ParameterWithDefaultValue() { + final Builder method = MethodSpec.methodBuilder("configure"); + final MethodBodySourceCodeEmitter emitter = new MethodBodySourceCodeEmitter(method); + final OperationVisitor<?> visitor = new OperationVisitor<>(emitter, null, null, null); + + final Oas30Parameter parameter = new Oas30Parameter("param"); + parameter.in = "path"; + parameter.schema = parameter.createSchema(); + ((Oas30Schema) parameter.schema).default_ = "default"; + + visitor.emit(parameter); + + assertThat(method.build().toString()).isEqualTo("void configure() {\n" + + " param()\n" + + " .name(\"param\")\n" + + " .type(org.apache.camel.model.rest.RestParamType.path)\n" + + " .defaultValue(\"default\")\n" + + " .required(false)\n" + + " .endParam()}\n"); + } + + @Test + public void shouldEmitCodeForOas3ParameterWithEnum() { + final Builder method = MethodSpec.methodBuilder("configure"); + final MethodBodySourceCodeEmitter emitter = new MethodBodySourceCodeEmitter(method); + final OperationVisitor<?> visitor = new OperationVisitor<>(emitter, null, null, null); + + final Oas30Parameter parameter = new Oas30Parameter("param"); + parameter.in = "query"; + parameter.schema = parameter.createSchema(); + ((Oas30Schema) parameter.schema).enum_ = Arrays.asList("one", "two", "three"); + + visitor.emit(parameter); + + assertThat(method.build().toString()).isEqualTo("void configure() {\n" + + " param()\n" + + " .name(\"param\")\n" + + " .type(org.apache.camel.model.rest.RestParamType.query)\n" + + " .allowableValues(\"one,two,three\")\n" + + " .required(false)\n" + + " .endParam()}\n"); + } + + @Test + public void shouldEmitCodeForOas3ParameterWithType() { + final Builder method = MethodSpec.methodBuilder("configure"); + final MethodBodySourceCodeEmitter emitter = new MethodBodySourceCodeEmitter(method); + final OperationVisitor<?> visitor = new OperationVisitor<>(emitter, null, null, null); + + final Oas30Parameter parameter = new Oas30Parameter("param"); + parameter.in = "query"; + parameter.schema = parameter.createSchema(); + ((Oas30Schema) parameter.schema).type = "integer"; + + visitor.emit(parameter); + + assertThat(method.build().toString()).isEqualTo("void configure() {\n" + + " param()\n" + + " .name(\"param\")\n" + + " .type(org.apache.camel.model.rest.RestParamType.query)\n" + + " .dataType(\"integer\")\n" + + " .required(false)\n" + + " .endParam()}\n"); + } + + @Test + public void shouldEmitCodeForOas3RefParameters() { + final Builder method = MethodSpec.methodBuilder("configure"); + final MethodBodySourceCodeEmitter emitter = new MethodBodySourceCodeEmitter(method); + final OperationVisitor<?> visitor = new OperationVisitor<>(emitter, null, null, null); + + final Oas30Document document = new Oas30Document(); + document.components = document.createComponents(); + final Oas30ParameterDefinition parameterDefinition = new Oas30ParameterDefinition("param"); + parameterDefinition.in = "query"; + document.components.addParameterDefinition("param", parameterDefinition); + + final Oas30Parameter parameter = new Oas30Parameter(); + parameter._ownerDocument = document; + parameter.$ref = "#/components/parameters/param"; + + visitor.emit(parameter); + + assertThat(method.build().toString()).isEqualTo("void configure() {\n" + + " param()\n" + + " .name(\"param\")\n" + + " .type(org.apache.camel.model.rest.RestParamType.query)\n" + + " .required(false)\n" + + " .endParam()}\n"); + } +}