You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by zr...@apache.org on 2020/03/10 22:49:24 UTC
[camel] 03/03: CAMEL-14691: dereference parameters
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 <zr...@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");
+ }
+}