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");
+    }
+}