This is an automated email from the ASF dual-hosted git repository.
davsclaus pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/main by this push:
new 3683f77 CAMEL-17326: Resolve swagger references (#6536)
3683f77 is described below
commit 3683f770b7b9a31e1778b3d347cc0dbe047da63e
Author: Jeremy Ross <[email protected]>
AuthorDate: Tue Dec 14 00:27:02 2021 -0600
CAMEL-17326: Resolve swagger references (#6536)
---
.../swagger/RestSwaggerComponentConfigurer.java | 6 +
.../swagger/RestSwaggerEndpointConfigurer.java | 6 +
.../swagger/RestSwaggerEndpointUriFactory.java | 3 +-
.../camel/component/rest/swagger/rest-swagger.json | 2 +
.../rest/swagger/RestSwaggerComponent.java | 11 +
.../rest/swagger/RestSwaggerEndpoint.java | 54 +-
.../rest/swagger/RestSwaggerEndpointTest.java | 24 +-
.../src/test/resources/swagger.json | 1050 +++++++++++++++++++-
.../dsl/RestSwaggerComponentBuilderFactory.java | 17 +
.../dsl/RestSwaggerEndpointBuilderFactory.java | 31 +
10 files changed, 1185 insertions(+), 19 deletions(-)
diff --git
a/components/camel-rest-swagger/src/generated/java/org/apache/camel/component/rest/swagger/RestSwaggerComponentConfigurer.java
b/components/camel-rest-swagger/src/generated/java/org/apache/camel/component/rest/swagger/RestSwaggerComponentConfigurer.java
index ba877d6..301a9af 100644
---
a/components/camel-rest-swagger/src/generated/java/org/apache/camel/component/rest/swagger/RestSwaggerComponentConfigurer.java
+++
b/components/camel-rest-swagger/src/generated/java/org/apache/camel/component/rest/swagger/RestSwaggerComponentConfigurer.java
@@ -32,6 +32,8 @@ public class RestSwaggerComponentConfigurer extends
PropertyConfigurerSupport im
case "lazystartproducer":
case "lazyStartProducer":
target.setLazyStartProducer(property(camelContext, boolean.class, value));
return true;
case "produces": target.setProduces(property(camelContext,
java.lang.String.class, value)); return true;
+ case "resolvereferences":
+ case "resolveReferences":
target.setResolveReferences(property(camelContext, java.lang.Boolean.class,
value)); return true;
case "specificationuri":
case "specificationUri":
target.setSpecificationUri(property(camelContext, java.net.URI.class, value));
return true;
case "sslcontextparameters":
@@ -56,6 +58,8 @@ public class RestSwaggerComponentConfigurer extends
PropertyConfigurerSupport im
case "lazystartproducer":
case "lazyStartProducer": return boolean.class;
case "produces": return java.lang.String.class;
+ case "resolvereferences":
+ case "resolveReferences": return java.lang.Boolean.class;
case "specificationuri":
case "specificationUri": return java.net.URI.class;
case "sslcontextparameters":
@@ -81,6 +85,8 @@ public class RestSwaggerComponentConfigurer extends
PropertyConfigurerSupport im
case "lazystartproducer":
case "lazyStartProducer": return target.isLazyStartProducer();
case "produces": return target.getProduces();
+ case "resolvereferences":
+ case "resolveReferences": return target.getResolveReferences();
case "specificationuri":
case "specificationUri": return target.getSpecificationUri();
case "sslcontextparameters":
diff --git
a/components/camel-rest-swagger/src/generated/java/org/apache/camel/component/rest/swagger/RestSwaggerEndpointConfigurer.java
b/components/camel-rest-swagger/src/generated/java/org/apache/camel/component/rest/swagger/RestSwaggerEndpointConfigurer.java
index a201c5b..f8e5b65 100644
---
a/components/camel-rest-swagger/src/generated/java/org/apache/camel/component/rest/swagger/RestSwaggerEndpointConfigurer.java
+++
b/components/camel-rest-swagger/src/generated/java/org/apache/camel/component/rest/swagger/RestSwaggerEndpointConfigurer.java
@@ -30,6 +30,8 @@ public class RestSwaggerEndpointConfigurer extends
PropertyConfigurerSupport imp
case "lazystartproducer":
case "lazyStartProducer":
target.setLazyStartProducer(property(camelContext, boolean.class, value));
return true;
case "produces": target.setProduces(property(camelContext,
java.lang.String.class, value)); return true;
+ case "resolvereferences":
+ case "resolveReferences":
target.setResolveReferences(property(camelContext, java.lang.Boolean.class,
value)); return true;
case "sslcontextparameters":
case "sslContextParameters":
target.setSslContextParameters(property(camelContext,
org.apache.camel.support.jsse.SSLContextParameters.class, value)); return true;
default: return false;
@@ -48,6 +50,8 @@ public class RestSwaggerEndpointConfigurer extends
PropertyConfigurerSupport imp
case "lazystartproducer":
case "lazyStartProducer": return boolean.class;
case "produces": return java.lang.String.class;
+ case "resolvereferences":
+ case "resolveReferences": return java.lang.Boolean.class;
case "sslcontextparameters":
case "sslContextParameters": return
org.apache.camel.support.jsse.SSLContextParameters.class;
default: return null;
@@ -67,6 +71,8 @@ public class RestSwaggerEndpointConfigurer extends
PropertyConfigurerSupport imp
case "lazystartproducer":
case "lazyStartProducer": return target.isLazyStartProducer();
case "produces": return target.getProduces();
+ case "resolvereferences":
+ case "resolveReferences": return target.getResolveReferences();
case "sslcontextparameters":
case "sslContextParameters": return target.getSslContextParameters();
default: return null;
diff --git
a/components/camel-rest-swagger/src/generated/java/org/apache/camel/component/rest/swagger/RestSwaggerEndpointUriFactory.java
b/components/camel-rest-swagger/src/generated/java/org/apache/camel/component/rest/swagger/RestSwaggerEndpointUriFactory.java
index d00b667..4f85a90 100644
---
a/components/camel-rest-swagger/src/generated/java/org/apache/camel/component/rest/swagger/RestSwaggerEndpointUriFactory.java
+++
b/components/camel-rest-swagger/src/generated/java/org/apache/camel/component/rest/swagger/RestSwaggerEndpointUriFactory.java
@@ -20,13 +20,14 @@ public class RestSwaggerEndpointUriFactory extends
org.apache.camel.support.comp
private static final Set<String> PROPERTY_NAMES;
private static final Set<String> SECRET_PROPERTY_NAMES;
static {
- Set<String> props = new HashSet<>(9);
+ Set<String> props = new HashSet<>(10);
props.add("lazyStartProducer");
props.add("basePath");
props.add("host");
props.add("produces");
props.add("sslContextParameters");
props.add("operationId");
+ props.add("resolveReferences");
props.add("componentName");
props.add("specificationUri");
props.add("consumes");
diff --git
a/components/camel-rest-swagger/src/generated/resources/org/apache/camel/component/rest/swagger/rest-swagger.json
b/components/camel-rest-swagger/src/generated/resources/org/apache/camel/component/rest/swagger/rest-swagger.json
index 57f5167..f3593a7 100644
---
a/components/camel-rest-swagger/src/generated/resources/org/apache/camel/component/rest/swagger/rest-swagger.json
+++
b/components/camel-rest-swagger/src/generated/resources/org/apache/camel/component/rest/swagger/rest-swagger.json
@@ -28,6 +28,7 @@
"host": { "kind": "property", "displayName": "Host", "group": "producer",
"label": "producer", "required": false, "type": "string", "javaType":
"java.lang.String", "deprecated": false, "autowired": false, "secret": false,
"description": "Scheme hostname and port to direct the HTTP requests to in the
form of https:\/\/hostname:port. Can be configured at the endpoint, component
or in the corresponding REST configuration in the Camel Context. If you give
this component a name (e.g. pets [...]
"lazyStartProducer": { "kind": "property", "displayName": "Lazy Start
Producer", "group": "producer", "label": "producer", "required": false, "type":
"boolean", "javaType": "boolean", "deprecated": false, "autowired": false,
"secret": false, "defaultValue": false, "description": "Whether the producer
should be started lazy (on the first message). By starting lazy you can use
this to allow CamelContext and routes to startup in situations where a producer
may otherwise fail during star [...]
"produces": { "kind": "property", "displayName": "Produces", "group":
"producer", "label": "producer", "required": false, "type": "string",
"javaType": "java.lang.String", "deprecated": false, "autowired": false,
"secret": false, "description": "What payload type this component is producing.
For example application\/json according to the RFC7231. This equates to the
value of Content-Type HTTP header. If set overrides any value present in the
Swagger specification. Can be overridden i [...]
+ "resolveReferences": { "kind": "property", "displayName": "Resolve
References", "group": "producer", "label": "producer", "required": false,
"type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false,
"autowired": false, "secret": false, "defaultValue": "false", "description":
"Resolve references in Swagger specification." },
"specificationUri": { "kind": "property", "displayName": "Specification
Uri", "group": "producer", "label": "producer", "required": false, "type":
"string", "javaType": "java.net.URI", "deprecated": false, "autowired": false,
"secret": false, "defaultValue": "swagger.json", "description": "Path to the
Swagger specification file. The scheme, host base path are taken from this
specification, but these can be overridden with properties on the component or
endpoint level. If not given th [...]
"autowiredEnabled": { "kind": "property", "displayName": "Autowired
Enabled", "group": "advanced", "label": "advanced", "required": false, "type":
"boolean", "javaType": "boolean", "deprecated": false, "autowired": false,
"secret": false, "defaultValue": true, "description": "Whether autowiring is
enabled. This is used for automatic autowiring options (the option must be
marked as autowired) by looking up in the registry to find if there is a single
instance of matching type, which t [...]
"sslContextParameters": { "kind": "property", "displayName": "Ssl Context
Parameters", "group": "security", "label": "security", "required": false,
"type": "object", "javaType":
"org.apache.camel.support.jsse.SSLContextParameters", "deprecated": false,
"autowired": false, "secret": false, "description": "Customize TLS parameters
used by the component. If not set defaults to the TLS parameters set in the
Camel context" },
@@ -42,6 +43,7 @@
"host": { "kind": "parameter", "displayName": "Host", "group": "producer",
"label": "producer", "required": false, "type": "string", "javaType":
"java.lang.String", "deprecated": false, "autowired": false, "secret": false,
"description": "Scheme hostname and port to direct the HTTP requests to in the
form of https:\/\/hostname:port. Can be configured at the endpoint, component
or in the corresponding REST configuration in the Camel Context. If you give
this component a name (e.g. pet [...]
"lazyStartProducer": { "kind": "parameter", "displayName": "Lazy Start
Producer", "group": "producer", "label": "producer", "required": false, "type":
"boolean", "javaType": "boolean", "deprecated": false, "autowired": false,
"secret": false, "defaultValue": false, "description": "Whether the producer
should be started lazy (on the first message). By starting lazy you can use
this to allow CamelContext and routes to startup in situations where a producer
may otherwise fail during sta [...]
"produces": { "kind": "parameter", "displayName": "Produces", "group":
"producer", "label": "producer", "required": false, "type": "string",
"javaType": "java.lang.String", "deprecated": false, "autowired": false,
"secret": false, "description": "What payload type this component is producing.
For example application\/json according to the RFC7231. This equates to the
value of Content-Type HTTP header. If set overrides any value present in the
Swagger specification. Overrides all othe [...]
+ "resolveReferences": { "kind": "parameter", "displayName": "Resolve
References", "group": "producer", "label": "producer", "required": false,
"type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false,
"autowired": false, "secret": false, "description": "Resolve references in
Swagger specification." },
"sslContextParameters": { "kind": "parameter", "displayName": "Ssl Context
Parameters", "group": "security", "label": "security", "required": false,
"type": "object", "javaType":
"org.apache.camel.support.jsse.SSLContextParameters", "deprecated": false,
"autowired": false, "secret": false, "description": "To configure security
using SSLContextParameters." }
}
}
diff --git
a/components/camel-rest-swagger/src/main/java/org/apache/camel/component/rest/swagger/RestSwaggerComponent.java
b/components/camel-rest-swagger/src/main/java/org/apache/camel/component/rest/swagger/RestSwaggerComponent.java
index 12e0646..84c68e5 100644
---
a/components/camel-rest-swagger/src/main/java/org/apache/camel/component/rest/swagger/RestSwaggerComponent.java
+++
b/components/camel-rest-swagger/src/main/java/org/apache/camel/component/rest/swagger/RestSwaggerComponent.java
@@ -136,6 +136,10 @@ public final class RestSwaggerComponent extends
DefaultComponent implements SSLC
defaultValue = "false")
private boolean useGlobalSslContextParameters;
+ @Metadata(description = "Resolve references in Swagger specification.",
label = "producer",
+ defaultValue = "false")
+ private Boolean resolveReferences;
+
public RestSwaggerComponent() {
}
@@ -217,4 +221,11 @@ public final class RestSwaggerComponent extends
DefaultComponent implements SSLC
this.useGlobalSslContextParameters = useGlobalSslContextParameters;
}
+ public Boolean getResolveReferences() {
+ return resolveReferences;
+ }
+
+ public void setResolveReferences(Boolean resolveReferences) {
+ this.resolveReferences = resolveReferences;
+ }
}
diff --git
a/components/camel-rest-swagger/src/main/java/org/apache/camel/component/rest/swagger/RestSwaggerEndpoint.java
b/components/camel-rest-swagger/src/main/java/org/apache/camel/component/rest/swagger/RestSwaggerEndpoint.java
index 2109f57..5d8acb9 100644
---
a/components/camel-rest-swagger/src/main/java/org/apache/camel/component/rest/swagger/RestSwaggerEndpoint.java
+++
b/components/camel-rest-swagger/src/main/java/org/apache/camel/component/rest/swagger/RestSwaggerEndpoint.java
@@ -26,6 +26,7 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
+import java.util.Objects;
import java.util.Optional;
import java.util.function.Function;
import java.util.stream.Collectors;
@@ -74,7 +75,9 @@ import static
org.apache.camel.component.rest.swagger.RestSwaggerHelper.isHostPa
import static
org.apache.camel.component.rest.swagger.RestSwaggerHelper.isMediaRange;
import static org.apache.camel.util.ObjectHelper.isNotEmpty;
import static org.apache.camel.util.ObjectHelper.notNull;
-import static org.apache.camel.util.StringHelper.*;
+import static org.apache.camel.util.StringHelper.after;
+import static org.apache.camel.util.StringHelper.before;
+import static org.apache.camel.util.StringHelper.notEmpty;
/**
* Configure REST producers based on a Swagger (OpenAPI) specification
document delegating to a component implementing
@@ -146,6 +149,9 @@ public final class RestSwaggerEndpoint extends
DefaultEndpoint {
defaultValueNote = "By default loads `swagger.json` file", label
= "producer")
private URI specificationUri =
RestSwaggerComponent.DEFAULT_SPECIFICATION_URI;
+ @UriParam(description = "Resolve references in Swagger specification.",
label = "producer")
+ private Boolean resolveReferences;
+
public RestSwaggerEndpoint() {
// help tooling instantiate endpoint
}
@@ -174,7 +180,8 @@ public final class RestSwaggerEndpoint extends
DefaultEndpoint {
public Producer createProducer() throws Exception {
final CamelContext camelContext = getCamelContext();
- final Swagger swagger = loadSpecificationFrom(camelContext,
specificationUri, resolveSslContextParameters());
+ final Swagger swagger = loadSpecificationFrom(camelContext,
specificationUri, resolveSslContextParameters(),
+ determineResolveReferences());
final Map<String, Path> paths = swagger.getPaths();
@@ -289,6 +296,14 @@ public final class RestSwaggerEndpoint extends
DefaultEndpoint {
this.specificationUri = notNull(specificationUri, "specificationUri");
}
+ public Boolean getResolveReferences() {
+ return resolveReferences;
+ }
+
+ public void setResolveReferences(Boolean resolveReferences) {
+ this.resolveReferences = resolveReferences;
+ }
+
RestSwaggerComponent component() {
return (RestSwaggerComponent) getComponent();
}
@@ -350,6 +365,13 @@ public final class RestSwaggerEndpoint extends
DefaultEndpoint {
return
Optional.ofNullable(componentName).orElse(component().getComponentName());
}
+ Boolean determineResolveReferences() {
+ return Stream.of(getResolveReferences(),
component().getResolveReferences())
+ .filter(Objects::nonNull)
+ .findFirst()
+ .orElse(false);
+ }
+
Map<String, Object> determineEndpointParameters(final Swagger swagger,
final Operation operation) {
final Map<String, Object> parameters = new HashMap<>();
@@ -376,11 +398,11 @@ public final class RestSwaggerEndpoint extends
DefaultEndpoint {
// what we produce is what the API defined by Swagger specification
// consumes
- final String determinedProducers =
determineOption(swagger.getConsumes(), operation.getConsumes(),
+ final String determinedProduces =
determineOption(swagger.getConsumes(), operation.getConsumes(),
component.getProduces(), produces);
- if (isNotEmpty(determinedProducers)) {
- parameters.put("produces", determinedProducers);
+ if (isNotEmpty(determinedProduces)) {
+ parameters.put("produces", determinedProduces);
}
final String queryParameters = determineQueryParameters(swagger,
operation).map(this::queryParameter)
@@ -631,7 +653,8 @@ public final class RestSwaggerEndpoint extends
DefaultEndpoint {
* @throws IOException
*/
static Swagger loadSpecificationFrom(
- final CamelContext camelContext, final URI uri,
SSLContextParameters sslContextParameters)
+ final CamelContext camelContext, final URI uri,
SSLContextParameters sslContextParameters,
+ boolean resolveReferences)
throws IOException {
final ObjectMapper mapper = Json.mapper();
@@ -641,9 +664,9 @@ public final class RestSwaggerEndpoint extends
DefaultEndpoint {
if (sslContextParameters == null) {
try (InputStream stream =
ResourceHelper.resolveMandatoryResourceAsInputStream(camelContext,
uriAsString)) {
- return parseInputStream(swaggerParser, mapper, stream);
+ return parseInputStream(swaggerParser, mapper, stream,
resolveReferences);
} catch (final Exception e) {
- return loadSpecificationFallback(swaggerParser, uriAsString,
e);
+ return loadSpecificationFallback(swaggerParser, uriAsString,
e, resolveReferences);
}
}
@@ -654,15 +677,16 @@ public final class RestSwaggerEndpoint extends
DefaultEndpoint {
HttpProducer p = (HttpProducer) e.createProducer();
InputStream stream = p.getHttpClient().execute(new
HttpGet(uri)).getEntity().getContent()) {
- return parseInputStream(swaggerParser, mapper, stream);
+ return parseInputStream(swaggerParser, mapper, stream,
resolveReferences);
} catch (final Exception e) {
- return loadSpecificationFallback(swaggerParser, uriAsString, e);
+ return loadSpecificationFallback(swaggerParser, uriAsString, e,
resolveReferences);
}
}
- static Swagger loadSpecificationFallback(SwaggerParser swaggerParser,
String uriAsString, Exception originalException) {
+ static Swagger loadSpecificationFallback(
+ SwaggerParser swaggerParser, String uriAsString, Exception
originalException, boolean resolveReferences) {
// try Swaggers loader
- final Swagger swagger = swaggerParser.read(uriAsString);
+ final Swagger swagger = swaggerParser.read(uriAsString, null,
resolveReferences);
if (swagger != null) {
return swagger;
@@ -677,10 +701,12 @@ public final class RestSwaggerEndpoint extends
DefaultEndpoint {
originalException);
}
- static Swagger parseInputStream(SwaggerParser swaggerParser, ObjectMapper
mapper, InputStream stream) throws IOException {
+ static Swagger parseInputStream(
+ SwaggerParser swaggerParser, ObjectMapper mapper, InputStream
stream, boolean resolveReferences)
+ throws IOException {
final JsonNode node = mapper.readTree(stream);
- return swaggerParser.read(node);
+ return swaggerParser.read(node, resolveReferences);
}
static String pickBestScheme(final String specificationScheme, final
List<Scheme> schemes) {
diff --git
a/components/camel-rest-swagger/src/test/java/org/apache/camel/component/rest/swagger/RestSwaggerEndpointTest.java
b/components/camel-rest-swagger/src/test/java/org/apache/camel/component/rest/swagger/RestSwaggerEndpointTest.java
index a7a50ee..4803c0d 100644
---
a/components/camel-rest-swagger/src/test/java/org/apache/camel/component/rest/swagger/RestSwaggerEndpointTest.java
+++
b/components/camel-rest-swagger/src/test/java/org/apache/camel/component/rest/swagger/RestSwaggerEndpointTest.java
@@ -23,6 +23,7 @@ import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
+import io.swagger.models.HttpMethod;
import io.swagger.models.Operation;
import io.swagger.models.Scheme;
import io.swagger.models.Swagger;
@@ -75,6 +76,22 @@ public class RestSwaggerEndpointTest {
}
@Test
+ public void shouldComputeQueryParameterReferences() throws IOException {
+ final CamelContext camelContext = mock(CamelContext.class);
+ when(camelContext.getClassResolver()).thenReturn(new
DefaultClassResolver());
+
+ assertThat(
+ RestSwaggerEndpoint
+ .loadSpecificationFrom(camelContext,
RestSwaggerComponent.DEFAULT_SPECIFICATION_URI, null, true)
+
.getPaths().get("/pet/findByTags").getOperationMap().get(HttpMethod.GET).getParameters()
+ .stream()
+ .filter(p -> "offset".equals(p.getName()))
+ .findAny()
+ .orElse(null))
+ .isNotNull();
+ }
+
+ @Test
public void shouldCreateQueryParameterExpressions() {
assertThat(RestSwaggerEndpoint.queryParameterExpression(new
QueryParameter().name("q").required(true)))
.isEqualTo("q={q}");
@@ -339,8 +356,9 @@ public class RestSwaggerEndpointTest {
when(camelContext.getClassResolver()).thenReturn(new
DefaultClassResolver());
assertThat(
- RestSwaggerEndpoint.loadSpecificationFrom(camelContext,
RestSwaggerComponent.DEFAULT_SPECIFICATION_URI, null))
- .isNotNull();
+ RestSwaggerEndpoint.loadSpecificationFrom(camelContext,
RestSwaggerComponent.DEFAULT_SPECIFICATION_URI, null,
+ false))
+ .isNotNull();
}
@Test
@@ -368,7 +386,7 @@ public class RestSwaggerEndpointTest {
final URI uri = URI.create("non-existant.json");
assertThrows(IllegalArgumentException.class,
- () -> RestSwaggerEndpoint.loadSpecificationFrom(camelContext,
uri, null));
+ () -> RestSwaggerEndpoint.loadSpecificationFrom(camelContext,
uri, null, false));
}
@Test
diff --git a/components/camel-rest-swagger/src/test/resources/swagger.json
b/components/camel-rest-swagger/src/test/resources/swagger.json
index 816847f..e6b08db 100644
--- a/components/camel-rest-swagger/src/test/resources/swagger.json
+++ b/components/camel-rest-swagger/src/test/resources/swagger.json
@@ -1 +1,1049 @@
-{"swagger":"2.0","info":{"description":"This is a sample server Petstore
server. You can find out more about Swagger at
[http://swagger.io](http://swagger.io) or on [irc.freenode.net,
#swagger](http://swagger.io/irc/). For this sample, you can use the api key
`special-key` to test the authorization
filters.","version":"1.0.0","title":"Swagger
Petstore","termsOfService":"http://swagger.io/terms/","contact":{"email":"[email protected]"},"license":{"name":"Apache
2.0","url":"http://www.a [...]
\ No newline at end of file
+{
+ "swagger": "2.0",
+ "info": {
+ "description": "This is a sample server Petstore server. You can find out
more about Swagger at [http://swagger.io](http://swagger.io) or on
[irc.freenode.net, #swagger](http://swagger.io/irc/). For this sample, you can
use the api key `special-key` to test the authorization filters.",
+ "version": "1.0.0",
+ "title": "Swagger Petstore",
+ "termsOfService": "http://swagger.io/terms/",
+ "contact": {
+ "email": "[email protected]"
+ },
+ "license": {
+ "name": "Apache 2.0",
+ "url": "http://www.apache.org/licenses/LICENSE-2.0.html"
+ }
+ },
+ "host": "petstore.swagger.io",
+ "basePath": "/v2",
+ "parameters": {
+ "offset": {
+ "description": "Indicates how many items should be skipped before
returning results.",
+ "in": "query",
+ "name": "offset",
+ "required": false,
+ "default": 0,
+ "format": "int32",
+ "type": "integer"
+ }
+ },
+ "tags": [
+ {
+ "name": "pet",
+ "description": "Everything about your Pets",
+ "externalDocs": {
+ "description": "Find out more",
+ "url": "http://swagger.io"
+ }
+ },
+ {
+ "name": "store",
+ "description": "Access to Petstore orders"
+ },
+ {
+ "name": "user",
+ "description": "Operations about user",
+ "externalDocs": {
+ "description": "Find out more about our store",
+ "url": "http://swagger.io"
+ }
+ }
+ ],
+ "schemes": [
+ "http"
+ ],
+ "paths": {
+ "/pet": {
+ "post": {
+ "tags": [
+ "pet"
+ ],
+ "summary": "Add a new pet to the store",
+ "description": "",
+ "operationId": "addPet",
+ "consumes": [
+ "application/json",
+ "application/xml"
+ ],
+ "produces": [
+ "application/xml",
+ "application/json"
+ ],
+ "parameters": [
+ {
+ "in": "body",
+ "name": "body",
+ "description": "Pet object that needs to be added to the store",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/Pet"
+ }
+ }
+ ],
+ "responses": {
+ "405": {
+ "description": "Invalid input"
+ }
+ },
+ "security": [
+ {
+ "petstore_auth": [
+ "write:pets",
+ "read:pets"
+ ]
+ }
+ ]
+ },
+ "put": {
+ "tags": [
+ "pet"
+ ],
+ "summary": "Update an existing pet",
+ "description": "",
+ "operationId": "updatePet",
+ "consumes": [
+ "application/json",
+ "application/xml"
+ ],
+ "produces": [
+ "application/xml",
+ "application/json"
+ ],
+ "parameters": [
+ {
+ "in": "body",
+ "name": "body",
+ "description": "Pet object that needs to be added to the store",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/Pet"
+ }
+ }
+ ],
+ "responses": {
+ "400": {
+ "description": "Invalid ID supplied"
+ },
+ "404": {
+ "description": "Pet not found"
+ },
+ "405": {
+ "description": "Validation exception"
+ }
+ },
+ "security": [
+ {
+ "petstore_auth": [
+ "write:pets",
+ "read:pets"
+ ]
+ }
+ ]
+ }
+ },
+ "/pet/findByStatus": {
+ "get": {
+ "tags": [
+ "pet"
+ ],
+ "summary": "Finds Pets by status",
+ "description": "Multiple status values can be provided with comma
separated strings",
+ "operationId": "findPetsByStatus",
+ "produces": [
+ "application/xml",
+ "application/json"
+ ],
+ "parameters": [
+ {
+ "name": "status",
+ "in": "query",
+ "description": "Status values that need to be considered for
filter",
+ "required": true,
+ "type": "array",
+ "items": {
+ "type": "string",
+ "enum": [
+ "available",
+ "pending",
+ "sold"
+ ],
+ "default": "available"
+ },
+ "collectionFormat": "multi"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "successful operation",
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/Pet"
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid status value"
+ }
+ },
+ "security": [
+ {
+ "petstore_auth": [
+ "write:pets",
+ "read:pets"
+ ]
+ }
+ ]
+ }
+ },
+ "/pet/findByTags": {
+ "get": {
+ "tags": [
+ "pet"
+ ],
+ "summary": "Finds Pets by tags",
+ "description": "Multiple tags can be provided with comma separated
strings. Use tag1, tag2, tag3 for testing.",
+ "operationId": "findPetsByTags",
+ "produces": [
+ "application/xml",
+ "application/json"
+ ],
+ "parameters": [
+ {
+ "name": "tags",
+ "in": "query",
+ "description": "Tags to filter by",
+ "required": true,
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "collectionFormat": "multi"
+ },
+ {
+ "$ref": "#/parameters/offset"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "successful operation",
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/Pet"
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid tag value"
+ }
+ },
+ "security": [
+ {
+ "petstore_auth": [
+ "write:pets",
+ "read:pets"
+ ]
+ }
+ ],
+ "deprecated": true
+ }
+ },
+ "/pet/{petId}": {
+ "get": {
+ "tags": [
+ "pet"
+ ],
+ "summary": "Find pet by ID",
+ "description": "Returns a single pet",
+ "operationId": "getPetById",
+ "produces": [
+ "application/xml",
+ "application/json"
+ ],
+ "parameters": [
+ {
+ "name": "petId",
+ "in": "path",
+ "description": "ID of pet to return",
+ "required": true,
+ "type": "integer",
+ "format": "int64"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "successful operation",
+ "schema": {
+ "$ref": "#/definitions/Pet"
+ }
+ },
+ "400": {
+ "description": "Invalid ID supplied"
+ },
+ "404": {
+ "description": "Pet not found"
+ }
+ },
+ "security": [
+ {
+ "api_key": []
+ }
+ ]
+ },
+ "post": {
+ "tags": [
+ "pet"
+ ],
+ "summary": "Updates a pet in the store with form data",
+ "description": "",
+ "operationId": "updatePetWithForm",
+ "consumes": [
+ "application/x-www-form-urlencoded"
+ ],
+ "produces": [
+ "application/xml",
+ "application/json"
+ ],
+ "parameters": [
+ {
+ "name": "petId",
+ "in": "path",
+ "description": "ID of pet that needs to be updated",
+ "required": true,
+ "type": "integer",
+ "format": "int64"
+ },
+ {
+ "name": "name",
+ "in": "formData",
+ "description": "Updated name of the pet",
+ "required": false,
+ "type": "string"
+ },
+ {
+ "name": "status",
+ "in": "formData",
+ "description": "Updated status of the pet",
+ "required": false,
+ "type": "string"
+ }
+ ],
+ "responses": {
+ "405": {
+ "description": "Invalid input"
+ }
+ },
+ "security": [
+ {
+ "petstore_auth": [
+ "write:pets",
+ "read:pets"
+ ]
+ }
+ ]
+ },
+ "delete": {
+ "tags": [
+ "pet"
+ ],
+ "summary": "Deletes a pet",
+ "description": "",
+ "operationId": "deletePet",
+ "produces": [
+ "application/xml",
+ "application/json"
+ ],
+ "parameters": [
+ {
+ "name": "api_key",
+ "in": "header",
+ "required": false,
+ "type": "string"
+ },
+ {
+ "name": "petId",
+ "in": "path",
+ "description": "Pet id to delete",
+ "required": true,
+ "type": "integer",
+ "format": "int64"
+ }
+ ],
+ "responses": {
+ "400": {
+ "description": "Invalid ID supplied"
+ },
+ "404": {
+ "description": "Pet not found"
+ }
+ },
+ "security": [
+ {
+ "petstore_auth": [
+ "write:pets",
+ "read:pets"
+ ]
+ }
+ ]
+ }
+ },
+ "/pet/{petId}/uploadImage": {
+ "post": {
+ "tags": [
+ "pet"
+ ],
+ "summary": "uploads an image",
+ "description": "",
+ "operationId": "uploadFile",
+ "consumes": [
+ "multipart/form-data"
+ ],
+ "produces": [
+ "application/json"
+ ],
+ "parameters": [
+ {
+ "name": "petId",
+ "in": "path",
+ "description": "ID of pet to update",
+ "required": true,
+ "type": "integer",
+ "format": "int64"
+ },
+ {
+ "name": "additionalMetadata",
+ "in": "formData",
+ "description": "Additional data to pass to server",
+ "required": false,
+ "type": "string"
+ },
+ {
+ "name": "file",
+ "in": "formData",
+ "description": "file to upload",
+ "required": false,
+ "type": "file"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "successful operation",
+ "schema": {
+ "$ref": "#/definitions/ApiResponse"
+ }
+ }
+ },
+ "security": [
+ {
+ "petstore_auth": [
+ "write:pets",
+ "read:pets"
+ ]
+ }
+ ]
+ }
+ },
+ "/store/inventory": {
+ "get": {
+ "tags": [
+ "store"
+ ],
+ "summary": "Returns pet inventories by status",
+ "description": "Returns a map of status codes to quantities",
+ "operationId": "getInventory",
+ "produces": [
+ "application/json"
+ ],
+ "parameters": [],
+ "responses": {
+ "200": {
+ "description": "successful operation",
+ "schema": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "integer",
+ "format": "int32"
+ }
+ }
+ }
+ },
+ "security": [
+ {
+ "api_key": []
+ }
+ ]
+ }
+ },
+ "/store/order": {
+ "post": {
+ "tags": [
+ "store"
+ ],
+ "summary": "Place an order for a pet",
+ "description": "",
+ "operationId": "placeOrder",
+ "produces": [
+ "application/xml",
+ "application/json"
+ ],
+ "parameters": [
+ {
+ "in": "body",
+ "name": "body",
+ "description": "order placed for purchasing the pet",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/Order"
+ }
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "successful operation",
+ "schema": {
+ "$ref": "#/definitions/Order"
+ }
+ },
+ "400": {
+ "description": "Invalid Order"
+ }
+ }
+ }
+ },
+ "/store/order/{orderId}": {
+ "get": {
+ "tags": [
+ "store"
+ ],
+ "summary": "Find purchase order by ID",
+ "description": "For valid response try integer IDs with value >= 1 and
<= 10. Other values will generated exceptions",
+ "operationId": "getOrderById",
+ "produces": [
+ "application/xml",
+ "application/json"
+ ],
+ "parameters": [
+ {
+ "name": "orderId",
+ "in": "path",
+ "description": "ID of pet that needs to be fetched",
+ "required": true,
+ "type": "integer",
+ "maximum": 10.0,
+ "minimum": 1.0,
+ "format": "int64"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "successful operation",
+ "schema": {
+ "$ref": "#/definitions/Order"
+ }
+ },
+ "400": {
+ "description": "Invalid ID supplied"
+ },
+ "404": {
+ "description": "Order not found"
+ }
+ }
+ },
+ "delete": {
+ "tags": [
+ "store"
+ ],
+ "summary": "Delete purchase order by ID",
+ "description": "For valid response try integer IDs with positive
integer value. Negative or non-integer values will generate API errors",
+ "operationId": "deleteOrder",
+ "produces": [
+ "application/xml",
+ "application/json"
+ ],
+ "parameters": [
+ {
+ "name": "orderId",
+ "in": "path",
+ "description": "ID of the order that needs to be deleted",
+ "required": true,
+ "type": "integer",
+ "minimum": 1.0,
+ "format": "int64"
+ }
+ ],
+ "responses": {
+ "400": {
+ "description": "Invalid ID supplied"
+ },
+ "404": {
+ "description": "Order not found"
+ }
+ }
+ }
+ },
+ "/user": {
+ "post": {
+ "tags": [
+ "user"
+ ],
+ "summary": "Create user",
+ "description": "This can only be done by the logged in user.",
+ "operationId": "createUser",
+ "produces": [
+ "application/xml",
+ "application/json"
+ ],
+ "parameters": [
+ {
+ "in": "body",
+ "name": "body",
+ "description": "Created user object",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/User"
+ }
+ }
+ ],
+ "responses": {
+ "default": {
+ "description": "successful operation"
+ }
+ }
+ }
+ },
+ "/user/createWithArray": {
+ "post": {
+ "tags": [
+ "user"
+ ],
+ "summary": "Creates list of users with given input array",
+ "description": "",
+ "operationId": "createUsersWithArrayInput",
+ "produces": [
+ "application/xml",
+ "application/json"
+ ],
+ "parameters": [
+ {
+ "in": "body",
+ "name": "body",
+ "description": "List of user object",
+ "required": true,
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/User"
+ }
+ }
+ }
+ ],
+ "responses": {
+ "default": {
+ "description": "successful operation"
+ }
+ }
+ }
+ },
+ "/user/createWithList": {
+ "post": {
+ "tags": [
+ "user"
+ ],
+ "summary": "Creates list of users with given input array",
+ "description": "",
+ "operationId": "createUsersWithListInput",
+ "produces": [
+ "application/xml",
+ "application/json"
+ ],
+ "parameters": [
+ {
+ "in": "body",
+ "name": "body",
+ "description": "List of user object",
+ "required": true,
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/User"
+ }
+ }
+ }
+ ],
+ "responses": {
+ "default": {
+ "description": "successful operation"
+ }
+ }
+ }
+ },
+ "/user/login": {
+ "get": {
+ "tags": [
+ "user"
+ ],
+ "summary": "Logs user into the system",
+ "description": "",
+ "operationId": "loginUser",
+ "produces": [
+ "application/xml",
+ "application/json"
+ ],
+ "parameters": [
+ {
+ "name": "username",
+ "in": "query",
+ "description": "The user name for login",
+ "required": true,
+ "type": "string"
+ },
+ {
+ "name": "password",
+ "in": "query",
+ "description": "The password for login in clear text",
+ "required": true,
+ "type": "string"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "successful operation",
+ "schema": {
+ "type": "string"
+ },
+ "headers": {
+ "X-Rate-Limit": {
+ "type": "integer",
+ "format": "int32",
+ "description": "calls per hour allowed by the user"
+ },
+ "X-Expires-After": {
+ "type": "string",
+ "format": "date-time",
+ "description": "date in UTC when token expires"
+ }
+ }
+ },
+ "400": {
+ "description": "Invalid username/password supplied"
+ }
+ }
+ }
+ },
+ "/user/logout": {
+ "get": {
+ "tags": [
+ "user"
+ ],
+ "summary": "Logs out current logged in user session",
+ "description": "",
+ "operationId": "logoutUser",
+ "produces": [
+ "application/xml",
+ "application/json"
+ ],
+ "parameters": [],
+ "responses": {
+ "default": {
+ "description": "successful operation"
+ }
+ }
+ }
+ },
+ "/user/{username}": {
+ "get": {
+ "tags": [
+ "user"
+ ],
+ "summary": "Get user by user name",
+ "description": "",
+ "operationId": "getUserByName",
+ "produces": [
+ "application/xml",
+ "application/json"
+ ],
+ "parameters": [
+ {
+ "name": "username",
+ "in": "path",
+ "description": "The name that needs to be fetched. Use user1 for
testing. ",
+ "required": true,
+ "type": "string"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "successful operation",
+ "schema": {
+ "$ref": "#/definitions/User"
+ }
+ },
+ "400": {
+ "description": "Invalid username supplied"
+ },
+ "404": {
+ "description": "User not found"
+ }
+ }
+ },
+ "put": {
+ "tags": [
+ "user"
+ ],
+ "summary": "Updated user",
+ "description": "This can only be done by the logged in user.",
+ "operationId": "updateUser",
+ "produces": [
+ "application/xml",
+ "application/json"
+ ],
+ "parameters": [
+ {
+ "name": "username",
+ "in": "path",
+ "description": "name that need to be updated",
+ "required": true,
+ "type": "string"
+ },
+ {
+ "in": "body",
+ "name": "body",
+ "description": "Updated user object",
+ "required": true,
+ "schema": {
+ "$ref": "#/definitions/User"
+ }
+ }
+ ],
+ "responses": {
+ "400": {
+ "description": "Invalid user supplied"
+ },
+ "404": {
+ "description": "User not found"
+ }
+ }
+ },
+ "delete": {
+ "tags": [
+ "user"
+ ],
+ "summary": "Delete user",
+ "description": "This can only be done by the logged in user.",
+ "operationId": "deleteUser",
+ "produces": [
+ "application/xml",
+ "application/json"
+ ],
+ "parameters": [
+ {
+ "name": "username",
+ "in": "path",
+ "description": "The name that needs to be deleted",
+ "required": true,
+ "type": "string"
+ }
+ ],
+ "responses": {
+ "400": {
+ "description": "Invalid username supplied"
+ },
+ "404": {
+ "description": "User not found"
+ }
+ }
+ }
+ }
+ },
+ "securityDefinitions": {
+ "petstore_auth": {
+ "type": "oauth2",
+ "authorizationUrl": "http://petstore.swagger.io/oauth/dialog",
+ "flow": "implicit",
+ "scopes": {
+ "write:pets": "modify pets in your account",
+ "read:pets": "read your pets"
+ }
+ },
+ "api_key": {
+ "type": "apiKey",
+ "name": "api_key",
+ "in": "header"
+ }
+ },
+ "definitions": {
+ "Order": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "petId": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "quantity": {
+ "type": "integer",
+ "format": "int32"
+ },
+ "shipDate": {
+ "type": "string",
+ "format": "date-time"
+ },
+ "status": {
+ "type": "string",
+ "description": "Order Status",
+ "enum": [
+ "placed",
+ "approved",
+ "delivered"
+ ]
+ },
+ "complete": {
+ "type": "boolean",
+ "default": false
+ }
+ },
+ "xml": {
+ "name": "Order"
+ }
+ },
+ "Category": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "name": {
+ "type": "string"
+ }
+ },
+ "xml": {
+ "name": "Category"
+ }
+ },
+ "User": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "username": {
+ "type": "string"
+ },
+ "firstName": {
+ "type": "string"
+ },
+ "lastName": {
+ "type": "string"
+ },
+ "email": {
+ "type": "string"
+ },
+ "password": {
+ "type": "string"
+ },
+ "phone": {
+ "type": "string"
+ },
+ "userStatus": {
+ "type": "integer",
+ "format": "int32",
+ "description": "User Status"
+ }
+ },
+ "xml": {
+ "name": "User"
+ }
+ },
+ "Tag": {
+ "type": "object",
+ "properties": {
+ "id": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "name": {
+ "type": "string"
+ }
+ },
+ "xml": {
+ "name": "Tag"
+ }
+ },
+ "Pet": {
+ "type": "object",
+ "required": [
+ "name",
+ "photoUrls"
+ ],
+ "properties": {
+ "id": {
+ "type": "integer",
+ "format": "int64"
+ },
+ "category": {
+ "$ref": "#/definitions/Category"
+ },
+ "name": {
+ "type": "string",
+ "example": "doggie"
+ },
+ "photoUrls": {
+ "type": "array",
+ "xml": {
+ "name": "photoUrl",
+ "wrapped": true
+ },
+ "items": {
+ "type": "string"
+ }
+ },
+ "tags": {
+ "type": "array",
+ "xml": {
+ "name": "tag",
+ "wrapped": true
+ },
+ "items": {
+ "$ref": "#/definitions/Tag"
+ }
+ },
+ "status": {
+ "type": "string",
+ "description": "pet status in the store",
+ "enum": [
+ "available",
+ "pending",
+ "sold"
+ ]
+ }
+ },
+ "xml": {
+ "name": "Pet"
+ }
+ },
+ "ApiResponse": {
+ "type": "object",
+ "properties": {
+ "code": {
+ "type": "integer",
+ "format": "int32"
+ },
+ "type": {
+ "type": "string"
+ },
+ "message": {
+ "type": "string"
+ }
+ }
+ }
+ },
+ "externalDocs": {
+ "description": "Find out more about Swagger",
+ "url": "http://swagger.io"
+ }
+}
\ No newline at end of file
diff --git
a/core/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/RestSwaggerComponentBuilderFactory.java
b/core/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/RestSwaggerComponentBuilderFactory.java
index c1c9f76..5b8703d 100644
---
a/core/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/RestSwaggerComponentBuilderFactory.java
+++
b/core/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/RestSwaggerComponentBuilderFactory.java
@@ -169,6 +169,22 @@ public interface RestSwaggerComponentBuilderFactory {
return this;
}
/**
+ * Resolve references in Swagger specification.
+ *
+ * The option is a: <code>java.lang.Boolean</code> type.
+ *
+ * Default: false
+ * Group: producer
+ *
+ * @param resolveReferences the value to set
+ * @return the dsl builder
+ */
+ default RestSwaggerComponentBuilder resolveReferences(
+ java.lang.Boolean resolveReferences) {
+ doSetProperty("resolveReferences", resolveReferences);
+ return this;
+ }
+ /**
* Path to the Swagger specification file. The scheme, host base path
* are taken from this specification, but these can be overridden with
* properties on the component or endpoint level. If not given the
@@ -268,6 +284,7 @@ public interface RestSwaggerComponentBuilderFactory {
case "host": ((RestSwaggerComponent)
component).setHost((java.lang.String) value); return true;
case "lazyStartProducer": ((RestSwaggerComponent)
component).setLazyStartProducer((boolean) value); return true;
case "produces": ((RestSwaggerComponent)
component).setProduces((java.lang.String) value); return true;
+ case "resolveReferences": ((RestSwaggerComponent)
component).setResolveReferences((java.lang.Boolean) value); return true;
case "specificationUri": ((RestSwaggerComponent)
component).setSpecificationUri((java.net.URI) value); return true;
case "autowiredEnabled": ((RestSwaggerComponent)
component).setAutowiredEnabled((boolean) value); return true;
case "sslContextParameters": ((RestSwaggerComponent)
component).setSslContextParameters((org.apache.camel.support.jsse.SSLContextParameters)
value); return true;
diff --git
a/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/RestSwaggerEndpointBuilderFactory.java
b/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/RestSwaggerEndpointBuilderFactory.java
index 904c502..1ea16ff 100644
---
a/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/RestSwaggerEndpointBuilderFactory.java
+++
b/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/RestSwaggerEndpointBuilderFactory.java
@@ -176,6 +176,37 @@ public interface RestSwaggerEndpointBuilderFactory {
return this;
}
/**
+ * Resolve references in Swagger specification.
+ *
+ * The option is a: <code>java.lang.Boolean</code> type.
+ *
+ * Group: producer
+ *
+ * @param resolveReferences the value to set
+ * @return the dsl builder
+ */
+ default RestSwaggerEndpointBuilder resolveReferences(
+ Boolean resolveReferences) {
+ doSetProperty("resolveReferences", resolveReferences);
+ return this;
+ }
+ /**
+ * Resolve references in Swagger specification.
+ *
+ * The option will be converted to a
+ * <code>java.lang.Boolean</code> type.
+ *
+ * Group: producer
+ *
+ * @param resolveReferences the value to set
+ * @return the dsl builder
+ */
+ default RestSwaggerEndpointBuilder resolveReferences(
+ String resolveReferences) {
+ doSetProperty("resolveReferences", resolveReferences);
+ return this;
+ }
+ /**
* To configure security using SSLContextParameters.
*
* The option is a: