From 6c9ca8b5d408757fe8810d8ffe8efa6de8edf144 Mon Sep 17 00:00:00 2001 From: Akram Yakubov Date: Fri, 1 Mar 2024 17:34:36 -0800 Subject: [PATCH 1/2] WIP --- .../asyncapi/internal/AsyncapiProtocol.java | 2 +- .../internal/AyncapiKafkaProtocol.java | 5 +- .../internal/model/AsyncapiMessage.java | 1 + .../internal/view/AsyncapiMessageView.java | 5 ++ .../internal/view/AsyncapiSchemaView.java | 5 ++ .../OpenapiAsyncCompositeBindingAdapter.java | 71 +++++++++++++++++-- .../OpenapiClientCompositeBindingAdapter.java | 38 +++++----- .../OpenapiServerCompositeBindingAdapter.java | 71 +++++++++++-------- .../openapi/internal/model/Openapi.java | 4 +- ...BearerAuth.java => OpenapiBearerAuth.java} | 2 +- ...Components.java => OpenapiComponents.java} | 6 +- ...{OpenApiHeader.java => OpenapiHeader.java} | 4 +- .../{OpenApiItem.java => OpenapiItem.java} | 2 +- ...piMediaType.java => OpenapiMediaType.java} | 4 +- ...piOperation.java => OpenapiOperation.java} | 6 +- ...piParameter.java => OpenapiParameter.java} | 4 +- .../internal/model/OpenapiPathItem.java | 16 ++--- ...questBody.java => OpenapiRequestBody.java} | 4 +- ...nApiResponse.java => OpenapiResponse.java} | 4 +- .../model/OpenapiResponseByContentType.java | 4 +- ...{OpenApiSchema.java => OpenapiSchema.java} | 6 +- ...Scheme.java => OpenapiSecurityScheme.java} | 2 +- ...{OpenApiServer.java => OpenapiServer.java} | 2 +- ...ionView.java => OpenapiOperationView.java} | 16 ++--- ...nsView.java => OpenapiOperationsView.java} | 18 ++--- ...nApiPathView.java => OpenapiPathView.java} | 20 +++--- ...Resolvable.java => OpenapiResolvable.java} | 4 +- ...SchemaView.java => OpenapiSchemaView.java} | 39 ++++++---- ...ServerView.java => OpenapiServerView.java} | 14 ++-- .../inline/internal/InlineCatalogHandler.java | 4 +- .../model/json/internal/JsonModelHandler.java | 5 +- .../internal/JsonReadConverterHandler.java | 4 +- .../json/internal/JsonValidatorHandler.java | 1 - .../internal/stream/HttpServerFactory.java | 2 +- 34 files changed, 244 insertions(+), 151 deletions(-) rename incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/{OpenApiBearerAuth.java => OpenapiBearerAuth.java} (95%) rename incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/{OpenApiComponents.java => OpenapiComponents.java} (82%) rename incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/{OpenApiHeader.java => OpenapiHeader.java} (91%) rename incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/{OpenApiItem.java => OpenapiItem.java} (96%) rename incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/{OpenApiMediaType.java => OpenapiMediaType.java} (91%) rename incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/{OpenApiOperation.java => OpenapiOperation.java} (87%) rename incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/{OpenApiParameter.java => OpenapiParameter.java} (92%) rename incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/{OpenApiRequestBody.java => OpenapiRequestBody.java} (89%) rename incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/{OpenApiResponse.java => OpenapiResponse.java} (91%) rename incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/{OpenApiSchema.java => OpenapiSchema.java} (89%) rename incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/{OpenApiSecurityScheme.java => OpenapiSecurityScheme.java} (95%) rename incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/{OpenApiServer.java => OpenapiServer.java} (96%) rename incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/view/{OpenApiOperationView.java => OpenapiOperationView.java} (86%) rename incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/view/{OpenApiOperationsView.java => OpenapiOperationsView.java} (81%) rename incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/view/{OpenApiPathView.java => OpenapiPathView.java} (80%) rename incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/view/{OpenApiResolvable.java => OpenapiResolvable.java} (94%) rename incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/view/{OpenApiSchemaView.java => OpenapiSchemaView.java} (65%) rename incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/view/{OpenApiServerView.java => OpenapiServerView.java} (79%) diff --git a/incubator/binding-asyncapi/src/main/java/io/aklivity/zilla/runtime/binding/asyncapi/internal/AsyncapiProtocol.java b/incubator/binding-asyncapi/src/main/java/io/aklivity/zilla/runtime/binding/asyncapi/internal/AsyncapiProtocol.java index a3774df8cc..66ab35de82 100644 --- a/incubator/binding-asyncapi/src/main/java/io/aklivity/zilla/runtime/binding/asyncapi/internal/AsyncapiProtocol.java +++ b/incubator/binding-asyncapi/src/main/java/io/aklivity/zilla/runtime/binding/asyncapi/internal/AsyncapiProtocol.java @@ -33,7 +33,7 @@ public abstract class AsyncapiProtocol { protected static final String INLINE_CATALOG_NAME = "catalog0"; protected static final Pattern JSON_CONTENT_TYPE = Pattern.compile("^application/(?:.+\\+)?json$"); - private static final String VERSION_LATEST = "latest"; + protected static final String VERSION_LATEST = "latest"; protected final Matcher jsonContentType = JSON_CONTENT_TYPE.matcher(""); diff --git a/incubator/binding-asyncapi/src/main/java/io/aklivity/zilla/runtime/binding/asyncapi/internal/AyncapiKafkaProtocol.java b/incubator/binding-asyncapi/src/main/java/io/aklivity/zilla/runtime/binding/asyncapi/internal/AyncapiKafkaProtocol.java index 1e2e27860e..ec7e1243b2 100644 --- a/incubator/binding-asyncapi/src/main/java/io/aklivity/zilla/runtime/binding/asyncapi/internal/AyncapiKafkaProtocol.java +++ b/incubator/binding-asyncapi/src/main/java/io/aklivity/zilla/runtime/binding/asyncapi/internal/AyncapiKafkaProtocol.java @@ -24,6 +24,7 @@ import io.aklivity.zilla.runtime.binding.asyncapi.internal.model.AsyncapiOperation; import io.aklivity.zilla.runtime.binding.asyncapi.internal.view.AsyncapiChannelView; import io.aklivity.zilla.runtime.binding.asyncapi.internal.view.AsyncapiMessageView; +import io.aklivity.zilla.runtime.binding.asyncapi.internal.view.AsyncapiSchemaView; import io.aklivity.zilla.runtime.binding.kafka.config.KafkaOptionsConfig; import io.aklivity.zilla.runtime.binding.kafka.config.KafkaOptionsConfigBuilder; import io.aklivity.zilla.runtime.binding.kafka.config.KafkaSaslConfig; @@ -194,10 +195,12 @@ private CatalogedConfigBuilder injectSchemas( for (String name : messages.keySet()) { AsyncapiMessageView message = AsyncapiMessageView.of(asyncApi.components.messages, messages.get(name)); - String subject = message.refKey() != null ? message.refKey() : name; + AsyncapiSchemaView payload = AsyncapiSchemaView.of(asyncApi.components.schemas, message.payload()); + String subject = payload.refKey() != null ? payload.refKey() : name; catalog .schema() .subject(subject) + .version(VERSION_LATEST) .build() .build(); } diff --git a/incubator/binding-asyncapi/src/main/java/io/aklivity/zilla/runtime/binding/asyncapi/internal/model/AsyncapiMessage.java b/incubator/binding-asyncapi/src/main/java/io/aklivity/zilla/runtime/binding/asyncapi/internal/model/AsyncapiMessage.java index b0f3b8f93c..70fd6ab122 100644 --- a/incubator/binding-asyncapi/src/main/java/io/aklivity/zilla/runtime/binding/asyncapi/internal/model/AsyncapiMessage.java +++ b/incubator/binding-asyncapi/src/main/java/io/aklivity/zilla/runtime/binding/asyncapi/internal/model/AsyncapiMessage.java @@ -20,6 +20,7 @@ public class AsyncapiMessage { public AsyncapiSchema headers; public String contentType; + public AsyncapiSchema payload; @JsonbProperty("$ref") public String ref; diff --git a/incubator/binding-asyncapi/src/main/java/io/aklivity/zilla/runtime/binding/asyncapi/internal/view/AsyncapiMessageView.java b/incubator/binding-asyncapi/src/main/java/io/aklivity/zilla/runtime/binding/asyncapi/internal/view/AsyncapiMessageView.java index e5535ea784..a1087313ad 100644 --- a/incubator/binding-asyncapi/src/main/java/io/aklivity/zilla/runtime/binding/asyncapi/internal/view/AsyncapiMessageView.java +++ b/incubator/binding-asyncapi/src/main/java/io/aklivity/zilla/runtime/binding/asyncapi/internal/view/AsyncapiMessageView.java @@ -38,6 +38,11 @@ public String contentType() return message.contentType; } + public AsyncapiSchema payload() + { + return message.payload; + } + public static AsyncapiMessageView of( Map messages, AsyncapiMessage asyncapiMessage) diff --git a/incubator/binding-asyncapi/src/main/java/io/aklivity/zilla/runtime/binding/asyncapi/internal/view/AsyncapiSchemaView.java b/incubator/binding-asyncapi/src/main/java/io/aklivity/zilla/runtime/binding/asyncapi/internal/view/AsyncapiSchemaView.java index d92de500f8..8755f88bb2 100644 --- a/incubator/binding-asyncapi/src/main/java/io/aklivity/zilla/runtime/binding/asyncapi/internal/view/AsyncapiSchemaView.java +++ b/incubator/binding-asyncapi/src/main/java/io/aklivity/zilla/runtime/binding/asyncapi/internal/view/AsyncapiSchemaView.java @@ -40,6 +40,11 @@ public String getType() return schema.type; } + public String refKey() + { + return key; + } + public AsyncapiSchemaView getItems() { return schema.items == null ? null : AsyncapiSchemaView.of(schemas, schema.items); diff --git a/incubator/binding-openapi-asyncapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/asyncapi/internal/config/OpenapiAsyncCompositeBindingAdapter.java b/incubator/binding-openapi-asyncapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/asyncapi/internal/config/OpenapiAsyncCompositeBindingAdapter.java index 3badc8d43c..81344c31f0 100644 --- a/incubator/binding-openapi-asyncapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/asyncapi/internal/config/OpenapiAsyncCompositeBindingAdapter.java +++ b/incubator/binding-openapi-asyncapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/asyncapi/internal/config/OpenapiAsyncCompositeBindingAdapter.java @@ -18,6 +18,9 @@ import static java.util.stream.Collectors.toList; import java.util.List; +import java.util.Map; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import io.aklivity.zilla.runtime.binding.asyncapi.internal.model.Asyncapi; import io.aklivity.zilla.runtime.binding.asyncapi.internal.model.AsyncapiOperation; @@ -26,12 +29,18 @@ import io.aklivity.zilla.runtime.binding.http.kafka.config.HttpKafkaWithConfig; import io.aklivity.zilla.runtime.binding.http.kafka.config.HttpKafkaWithConfigBuilder; import io.aklivity.zilla.runtime.binding.http.kafka.config.HttpKafkaWithFetchConfig; +import io.aklivity.zilla.runtime.binding.http.kafka.config.HttpKafkaWithFetchConfigBuilder; +import io.aklivity.zilla.runtime.binding.http.kafka.config.HttpKafkaWithFetchMergeConfig; import io.aklivity.zilla.runtime.binding.http.kafka.config.HttpKafkaWithProduceConfig; import io.aklivity.zilla.runtime.binding.openapi.asyncapi.config.OpenapiAsyncapiOptionsConfig; import io.aklivity.zilla.runtime.binding.openapi.asyncapi.config.OpenapiAsyncapiSpecConfig; import io.aklivity.zilla.runtime.binding.openapi.asyncapi.internal.OpenapiAsyncapiBinding; import io.aklivity.zilla.runtime.binding.openapi.internal.model.Openapi; -import io.aklivity.zilla.runtime.binding.openapi.internal.view.OpenApiPathView; +import io.aklivity.zilla.runtime.binding.openapi.internal.model.OpenapiOperation; +import io.aklivity.zilla.runtime.binding.openapi.internal.model.OpenapiResponse; +import io.aklivity.zilla.runtime.binding.openapi.internal.model.OpenapiResponseByContentType; +import io.aklivity.zilla.runtime.binding.openapi.internal.view.OpenapiPathView; +import io.aklivity.zilla.runtime.binding.openapi.internal.view.OpenapiSchemaView; import io.aklivity.zilla.runtime.engine.config.BindingConfig; import io.aklivity.zilla.runtime.engine.config.BindingConfigBuilder; import io.aklivity.zilla.runtime.engine.config.CompositeBindingAdapterSpi; @@ -39,6 +48,10 @@ public final class OpenapiAsyncCompositeBindingAdapter implements CompositeBindingAdapterSpi { + private static final Pattern JSON_CONTENT_TYPE = Pattern.compile("^application/(?:.+\\+)?json$"); + + private final Matcher jsonContentType = JSON_CONTENT_TYPE.matcher(""); + @Override public String type() { @@ -89,20 +102,22 @@ private BindingConfigBuilder injectHttpKafkaRoutes( for (String item : openapi.paths.keySet()) { - OpenApiPathView path = OpenApiPathView.of(openapi.paths.get(item)); + OpenapiPathView path = OpenapiPathView.of(openapi.paths.get(item)); for (String method : path.methods().keySet()) { final String operationId = condition.operationId != null ? condition.operationId : path.methods().get(method).operationId; - final AsyncapiOperation operation = asyncapi.operations.entrySet().stream() + final OpenapiOperation openapiOperation = path.methods().get(method); + + final AsyncapiOperation asyncapiOperation = asyncapi.operations.entrySet().stream() .filter(f -> f.getKey().equals(operationId)) .map(v -> v.getValue()) .findFirst() .get(); final AsyncapiChannelView channel = AsyncapiChannelView - .of(asyncapi.channels, operation.channel); + .of(asyncapi.channels, asyncapiOperation.channel); binding .route() @@ -111,7 +126,8 @@ private BindingConfigBuilder injectHttpKafkaRoutes( .method(method) .path(item) .build() - .inject(r -> injectHttpKafkaRouteWith(r, operation.action, channel.address())) + .inject(r -> injectHttpKafkaRouteWith(r, openapi, openapiOperation, + asyncapiOperation.action, channel.address())) .build(); } } @@ -123,6 +139,8 @@ private BindingConfigBuilder injectHttpKafkaRoutes( private RouteConfigBuilder injectHttpKafkaRouteWith( RouteConfigBuilder route, + Openapi openapi, + OpenapiOperation operation, String action, String address) { @@ -133,6 +151,7 @@ private RouteConfigBuilder injectHttpKafkaRouteWith( case "receive": newWith.fetch(HttpKafkaWithFetchConfig.builder() .topic(address) + .inject(with -> this.injectHttpKafkaRouteFetchWith(with, openapi, operation)) .build()); break; case "send": @@ -147,4 +166,46 @@ private RouteConfigBuilder injectHttpKafkaRouteWith( return route; } + + private HttpKafkaWithFetchConfigBuilder injectHttpKafkaRouteFetchWith( + HttpKafkaWithFetchConfigBuilder fetch, + Openapi openapi, + OpenapiOperation operation) + { + merge: + for (Map.Entry response : operation.responses.entrySet()) + { + OpenapiSchemaView schema = resolveSchemaForJsonContentType(response.getValue().content, openapi); + + if ("array".equals(schema.getType())) + { + fetch.merged(HttpKafkaWithFetchMergeConfig.builder() + .contentType("application/json") + .build()); + break merge; + } + + } + return fetch; + } + + private OpenapiSchemaView resolveSchemaForJsonContentType( + Map content, + Openapi openApi) + { + OpenapiResponse response = null; + if (content != null) + { + for (String contentType : content.keySet()) + { + if (jsonContentType.reset(contentType).matches()) + { + response = content.get(contentType); + break; + } + } + } + + return response == null ? null : OpenapiSchemaView.of(openApi.components.schemas, response.schema); + } } diff --git a/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/config/OpenapiClientCompositeBindingAdapter.java b/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/config/OpenapiClientCompositeBindingAdapter.java index 2318346547..3de2592b3b 100644 --- a/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/config/OpenapiClientCompositeBindingAdapter.java +++ b/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/config/OpenapiClientCompositeBindingAdapter.java @@ -28,16 +28,16 @@ import io.aklivity.zilla.runtime.binding.openapi.config.OpenapiConfig; import io.aklivity.zilla.runtime.binding.openapi.config.OpenapiOptionsConfig; import io.aklivity.zilla.runtime.binding.openapi.internal.OpenapiBinding; -import io.aklivity.zilla.runtime.binding.openapi.internal.model.OpenApiHeader; -import io.aklivity.zilla.runtime.binding.openapi.internal.model.OpenApiResponse; -import io.aklivity.zilla.runtime.binding.openapi.internal.model.OpenApiServer; +import io.aklivity.zilla.runtime.binding.openapi.internal.model.OpenapiHeader; +import io.aklivity.zilla.runtime.binding.openapi.internal.model.OpenapiResponse; +import io.aklivity.zilla.runtime.binding.openapi.internal.model.OpenapiServer; import io.aklivity.zilla.runtime.binding.openapi.internal.model.Openapi; import io.aklivity.zilla.runtime.binding.openapi.internal.model.OpenapiResponseByContentType; -import io.aklivity.zilla.runtime.binding.openapi.internal.view.OpenApiOperationView; -import io.aklivity.zilla.runtime.binding.openapi.internal.view.OpenApiOperationsView; -import io.aklivity.zilla.runtime.binding.openapi.internal.view.OpenApiPathView; -import io.aklivity.zilla.runtime.binding.openapi.internal.view.OpenApiSchemaView; -import io.aklivity.zilla.runtime.binding.openapi.internal.view.OpenApiServerView; +import io.aklivity.zilla.runtime.binding.openapi.internal.view.OpenapiOperationView; +import io.aklivity.zilla.runtime.binding.openapi.internal.view.OpenapiOperationsView; +import io.aklivity.zilla.runtime.binding.openapi.internal.view.OpenapiPathView; +import io.aklivity.zilla.runtime.binding.openapi.internal.view.OpenapiSchemaView; +import io.aklivity.zilla.runtime.binding.openapi.internal.view.OpenapiServerView; import io.aklivity.zilla.runtime.binding.tls.config.TlsOptionsConfig; import io.aklivity.zilla.runtime.engine.config.BindingConfig; import io.aklivity.zilla.runtime.engine.config.BindingConfigBuilder; @@ -119,9 +119,9 @@ private URI findFirstServerUrlWithScheme( { requireNonNull(scheme); URI result = null; - for (OpenApiServer item : openApi.servers) + for (OpenapiServer item : openApi.servers) { - OpenApiServerView server = OpenApiServerView.of(item); + OpenapiServerView server = OpenapiServerView.of(item); if (scheme.equals(server.url().getScheme())) { result = server.url(); @@ -135,7 +135,7 @@ private BindingConfigBuilder injectHttpClientOptions( BindingConfigBuilder binding, Openapi openApi) { - OpenApiOperationsView operations = OpenApiOperationsView.of(openApi.paths); + OpenapiOperationsView operations = OpenapiOperationsView.of(openApi.paths); if (operations.hasResponses()) { binding. @@ -147,16 +147,16 @@ private BindingConfigBuilder injectHttpClientOptions( } private HttpOptionsConfigBuilder injectHttpClientRequests( - OpenApiOperationsView operations, + OpenapiOperationsView operations, HttpOptionsConfigBuilder options, Openapi openApi) { for (String pathName : openApi.paths.keySet()) { - OpenApiPathView path = OpenApiPathView.of(openApi.paths.get(pathName)); + OpenapiPathView path = OpenapiPathView.of(openApi.paths.get(pathName)); for (String methodName : path.methods().keySet()) { - OpenApiOperationView operation = operations.operation(pathName, methodName); + OpenapiOperationView operation = operations.operation(pathName, methodName); if (operation.hasResponses()) { options @@ -174,7 +174,7 @@ private HttpOptionsConfigBuilder injectHttpClientRequests( private HttpRequestConfigBuilder injectResponses( HttpRequestConfigBuilder request, - OpenApiOperationView operation, + OpenapiOperationView operation, Openapi openApi) { if (operation != null && operation.responsesByStatus() != null) @@ -183,11 +183,11 @@ private HttpRequestConfigBuilder injectResponses( { String status = responses0.getKey(); OpenapiResponseByContentType responses1 = responses0.getValue(); - if (!(OpenApiOperationView.DEFAULT.equals(status)) && responses1.content != null) + if (!(OpenapiOperationView.DEFAULT.equals(status)) && responses1.content != null) { - for (Map.Entry response2 : responses1.content.entrySet()) + for (Map.Entry response2 : responses1.content.entrySet()) { - OpenApiSchemaView schema = OpenApiSchemaView.of(openApi.components.schemas, response2.getValue().schema); + OpenapiSchemaView schema = OpenapiSchemaView.of(openApi.components.schemas, response2.getValue().schema); request .response() .status(Integer.parseInt(status)) @@ -215,7 +215,7 @@ private HttpResponseConfigBuilder injectResponseHeaders( { if (responses.headers != null && !responses.headers.isEmpty()) { - for (Map.Entry header : responses.headers.entrySet()) + for (Map.Entry header : responses.headers.entrySet()) { String name = header.getKey(); ModelConfig model = models.get(header.getValue().schema.type); diff --git a/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/config/OpenapiServerCompositeBindingAdapter.java b/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/config/OpenapiServerCompositeBindingAdapter.java index efa232860b..b98aca9058 100644 --- a/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/config/OpenapiServerCompositeBindingAdapter.java +++ b/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/config/OpenapiServerCompositeBindingAdapter.java @@ -39,15 +39,15 @@ import io.aklivity.zilla.runtime.binding.openapi.config.OpenapiConfig; import io.aklivity.zilla.runtime.binding.openapi.config.OpenapiOptionsConfig; import io.aklivity.zilla.runtime.binding.openapi.internal.OpenapiBinding; -import io.aklivity.zilla.runtime.binding.openapi.internal.model.OpenApiMediaType; -import io.aklivity.zilla.runtime.binding.openapi.internal.model.OpenApiOperation; -import io.aklivity.zilla.runtime.binding.openapi.internal.model.OpenApiParameter; -import io.aklivity.zilla.runtime.binding.openapi.internal.model.OpenApiSchema; -import io.aklivity.zilla.runtime.binding.openapi.internal.model.OpenApiServer; import io.aklivity.zilla.runtime.binding.openapi.internal.model.Openapi; -import io.aklivity.zilla.runtime.binding.openapi.internal.view.OpenApiPathView; -import io.aklivity.zilla.runtime.binding.openapi.internal.view.OpenApiSchemaView; -import io.aklivity.zilla.runtime.binding.openapi.internal.view.OpenApiServerView; +import io.aklivity.zilla.runtime.binding.openapi.internal.model.OpenapiMediaType; +import io.aklivity.zilla.runtime.binding.openapi.internal.model.OpenapiOperation; +import io.aklivity.zilla.runtime.binding.openapi.internal.model.OpenapiParameter; +import io.aklivity.zilla.runtime.binding.openapi.internal.model.OpenapiSchema; +import io.aklivity.zilla.runtime.binding.openapi.internal.model.OpenapiServer; +import io.aklivity.zilla.runtime.binding.openapi.internal.view.OpenapiPathView; +import io.aklivity.zilla.runtime.binding.openapi.internal.view.OpenapiSchemaView; +import io.aklivity.zilla.runtime.binding.openapi.internal.view.OpenapiServerView; import io.aklivity.zilla.runtime.binding.tcp.config.TcpConditionConfig; import io.aklivity.zilla.runtime.binding.tcp.config.TcpOptionsConfig; import io.aklivity.zilla.runtime.binding.tls.config.TlsOptionsConfig; @@ -206,20 +206,23 @@ private HttpOptionsConfigBuilder injectHttpServerOptions( private HttpOptionsConfigBuilder injectHttpServerRequests( HttpOptionsConfigBuilder options, - Openapi openApi) + Openapi openapi) { - for (String pathName : openApi.paths.keySet()) + for (String pathName : openapi.paths.keySet()) { - OpenApiPathView path = OpenApiPathView.of(openApi.paths.get(pathName)); + OpenapiPathView path = OpenapiPathView.of(openapi.paths.get(pathName)); for (String methodName : path.methods().keySet()) { - OpenApiOperation operation = path.methods().get(methodName); - if (operation.requestBody != null || operation.parameters != null && !operation.parameters.isEmpty()) + final OpenapiOperation operation = path.methods().get(methodName); + if (operation.requestBody != null || + operation.parameters != null && + !operation.parameters.isEmpty()) { options .request() .path(pathName) .method(HttpRequestConfig.Method.valueOf(methodName)) + .inject(request -> injectContent(request, operation, openapi)) .inject(request -> injectParams(request, operation)) .build(); } @@ -230,12 +233,14 @@ private HttpOptionsConfigBuilder injectHttpServerRequests( private HttpRequestConfigBuilder injectContent( HttpRequestConfigBuilder request, - OpenApiOperation operation, + OpenapiOperation operation, Openapi openApi) { - if (operation.requestBody != null && operation.requestBody.content != null && !operation.requestBody.content.isEmpty()) + if (operation.requestBody != null && + operation.requestBody.content != null && + !operation.requestBody.content.isEmpty()) { - OpenApiSchemaView schema = resolveSchemaForJsonContentType(operation.requestBody.content, openApi); + OpenapiSchemaView schema = resolveSchemaForJsonContentType(operation.requestBody.content, openApi); if (schema != null) { request. @@ -244,6 +249,7 @@ private HttpRequestConfigBuilder injectContent( .name(INLINE_CATALOG_NAME) .schema() .subject(schema.refKey()) + .version(VERSION_LATEST) .build() .build() .build(); @@ -254,11 +260,11 @@ private HttpRequestConfigBuilder injectContent( private HttpRequestConfigBuilder injectParams( HttpRequestConfigBuilder request, - OpenApiOperation operation) + OpenapiOperation operation) { if (operation != null && operation.parameters != null) { - for (OpenApiParameter parameter : operation.parameters) + for (OpenapiParameter parameter : operation.parameters) { if (parameter.schema != null && parameter.schema.type != null) { @@ -305,7 +311,7 @@ private BindingConfigBuilder injectHttpServerRoutes( { for (String item : openApi.paths.keySet()) { - OpenApiPathView path = OpenApiPathView.of(openApi.paths.get(item)); + OpenapiPathView path = OpenapiPathView.of(openApi.paths.get(item)); for (String method : path.methods().keySet()) { binding @@ -324,7 +330,7 @@ private BindingConfigBuilder injectHttpServerRoutes( private RouteConfigBuilder injectHttpServerRouteGuarded( RouteConfigBuilder route, - OpenApiPathView path, + OpenapiPathView path, String method, String guardName, Map securitySchemes) @@ -391,13 +397,16 @@ private InlineSchemaConfigBuilder injectSubjects( { try (Jsonb jsonb = JsonbBuilder.create()) { - for (Map.Entry entry : openApi.components.schemas.entrySet()) + for (Map.Entry entry : openApi.components.schemas.entrySet()) { + OpenapiSchemaView schemaView = OpenapiSchemaView.of(openApi.components.schemas, entry.getValue()); + OpenapiSchema schema = schemaView.ref() != null ? schemaView.ref() : entry.getValue(); + subjects .subject(entry.getKey()) - .version(VERSION_LATEST) - .schema(jsonb.toJson(openApi.components.schemas)) - .build(); + .schema(jsonb.toJson(schema)) + .version(VERSION_LATEST) + .build(); } } catch (Exception ex) @@ -413,7 +422,7 @@ private int[] resolveAllPorts( int[] ports = new int[openApi.servers.size()]; for (int i = 0; i < openApi.servers.size(); i++) { - OpenApiServerView server = OpenApiServerView.of(openApi.servers.get(i)); + OpenapiServerView server = OpenapiServerView.of(openApi.servers.get(i)); URI url = server.url(); ports[i] = url.getPort(); } @@ -440,9 +449,9 @@ private URI findFirstServerUrlWithScheme( { requireNonNull(scheme); URI result = null; - for (OpenApiServer item : openApi.servers) + for (OpenapiServer item : openApi.servers) { - OpenApiServerView server = OpenApiServerView.of(item); + OpenapiServerView server = OpenapiServerView.of(item); if (scheme.equals(server.url().getScheme())) { result = server.url(); @@ -472,11 +481,11 @@ private Map resolveSecuritySchemes( return result; } - private OpenApiSchemaView resolveSchemaForJsonContentType( - Map content, + private OpenapiSchemaView resolveSchemaForJsonContentType( + Map content, Openapi openApi) { - OpenApiMediaType mediaType = null; + OpenapiMediaType mediaType = null; if (content != null) { for (String contentType : content.keySet()) @@ -489,6 +498,6 @@ private OpenApiSchemaView resolveSchemaForJsonContentType( } } - return mediaType == null ? null : OpenApiSchemaView.of(openApi.components.schemas, mediaType.schema); + return mediaType == null ? null : OpenapiSchemaView.of(openApi.components.schemas, mediaType.schema); } } diff --git a/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/Openapi.java b/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/Openapi.java index 45a5a566bf..f9a144fa31 100644 --- a/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/Openapi.java +++ b/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/Openapi.java @@ -20,7 +20,7 @@ public class Openapi { public String openapi; - public List servers; + public List servers; public Map paths; - public OpenApiComponents components; + public OpenapiComponents components; } diff --git a/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenApiBearerAuth.java b/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenapiBearerAuth.java similarity index 95% rename from incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenApiBearerAuth.java rename to incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenapiBearerAuth.java index db34f20fff..0d781d1425 100644 --- a/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenApiBearerAuth.java +++ b/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenapiBearerAuth.java @@ -14,7 +14,7 @@ */ package io.aklivity.zilla.runtime.binding.openapi.internal.model; -public class OpenApiBearerAuth +public class OpenapiBearerAuth { public String bearerFormat; } diff --git a/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenApiComponents.java b/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenapiComponents.java similarity index 82% rename from incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenApiComponents.java rename to incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenapiComponents.java index 1f31bb5592..b57f8016f4 100644 --- a/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenApiComponents.java +++ b/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenapiComponents.java @@ -16,8 +16,8 @@ import java.util.Map; -public class OpenApiComponents +public class OpenapiComponents { - public Map securitySchemes; - public Map schemas; + public Map securitySchemes; + public Map schemas; } diff --git a/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenApiHeader.java b/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenapiHeader.java similarity index 91% rename from incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenApiHeader.java rename to incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenapiHeader.java index f91603be21..634c68d604 100644 --- a/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenApiHeader.java +++ b/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenapiHeader.java @@ -14,7 +14,7 @@ */ package io.aklivity.zilla.runtime.binding.openapi.internal.model; -public class OpenApiHeader +public class OpenapiHeader { - public OpenApiSchema schema; + public OpenapiSchema schema; } diff --git a/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenApiItem.java b/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenapiItem.java similarity index 96% rename from incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenApiItem.java rename to incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenapiItem.java index b7ff06d8e3..852493a3e3 100644 --- a/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenApiItem.java +++ b/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenapiItem.java @@ -14,7 +14,7 @@ */ package io.aklivity.zilla.runtime.binding.openapi.internal.model; -public class OpenApiItem +public class OpenapiItem { public String type; public String description; diff --git a/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenApiMediaType.java b/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenapiMediaType.java similarity index 91% rename from incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenApiMediaType.java rename to incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenapiMediaType.java index 67635b7d26..fb74808582 100644 --- a/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenApiMediaType.java +++ b/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenapiMediaType.java @@ -14,7 +14,7 @@ */ package io.aklivity.zilla.runtime.binding.openapi.internal.model; -public class OpenApiMediaType +public class OpenapiMediaType { - public OpenApiSchema schema; + public OpenapiSchema schema; } diff --git a/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenApiOperation.java b/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenapiOperation.java similarity index 87% rename from incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenApiOperation.java rename to incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenapiOperation.java index b6e69f0408..a400d5c838 100644 --- a/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenApiOperation.java +++ b/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenapiOperation.java @@ -17,11 +17,11 @@ import java.util.List; import java.util.Map; -public class OpenApiOperation +public class OpenapiOperation { public List>> security; public String operationId; - public OpenApiRequestBody requestBody; - public List parameters; + public OpenapiRequestBody requestBody; + public List parameters; public Map responses; } diff --git a/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenApiParameter.java b/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenapiParameter.java similarity index 92% rename from incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenApiParameter.java rename to incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenapiParameter.java index fb713f91d3..585ed26242 100644 --- a/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenApiParameter.java +++ b/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenapiParameter.java @@ -14,10 +14,10 @@ */ package io.aklivity.zilla.runtime.binding.openapi.internal.model; -public class OpenApiParameter +public class OpenapiParameter { public String name; public String in; public boolean required; - public OpenApiSchema schema; + public OpenapiSchema schema; } diff --git a/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenapiPathItem.java b/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenapiPathItem.java index 8eddf9c820..28e3910280 100644 --- a/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenapiPathItem.java +++ b/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenapiPathItem.java @@ -16,12 +16,12 @@ public class OpenapiPathItem { - public OpenApiOperation get; - public OpenApiOperation put; - public OpenApiOperation post; - public OpenApiOperation delete; - public OpenApiOperation options; - public OpenApiOperation head; - public OpenApiOperation patch; - public OpenApiOperation trace; + public OpenapiOperation get; + public OpenapiOperation put; + public OpenapiOperation post; + public OpenapiOperation delete; + public OpenapiOperation options; + public OpenapiOperation head; + public OpenapiOperation patch; + public OpenapiOperation trace; } diff --git a/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenApiRequestBody.java b/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenapiRequestBody.java similarity index 89% rename from incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenApiRequestBody.java rename to incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenapiRequestBody.java index 245899b8ee..8e63e2eda7 100644 --- a/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenApiRequestBody.java +++ b/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenapiRequestBody.java @@ -16,7 +16,7 @@ import java.util.Map; -public class OpenApiRequestBody +public class OpenapiRequestBody { - public Map content; + public Map content; } diff --git a/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenApiResponse.java b/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenapiResponse.java similarity index 91% rename from incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenApiResponse.java rename to incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenapiResponse.java index 3f23331a88..35bb9bb49e 100644 --- a/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenApiResponse.java +++ b/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenapiResponse.java @@ -14,7 +14,7 @@ */ package io.aklivity.zilla.runtime.binding.openapi.internal.model; -public class OpenApiResponse +public class OpenapiResponse { - public OpenApiSchema schema; + public OpenapiSchema schema; } diff --git a/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenapiResponseByContentType.java b/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenapiResponseByContentType.java index c79664532b..b75951a387 100644 --- a/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenapiResponseByContentType.java +++ b/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenapiResponseByContentType.java @@ -18,6 +18,6 @@ public class OpenapiResponseByContentType { - public Map headers; - public Map content; + public Map headers; + public Map content; } diff --git a/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenApiSchema.java b/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenapiSchema.java similarity index 89% rename from incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenApiSchema.java rename to incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenapiSchema.java index 855472a883..c78a8b2a9f 100644 --- a/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenApiSchema.java +++ b/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenapiSchema.java @@ -19,11 +19,11 @@ import jakarta.json.bind.annotation.JsonbProperty; -public class OpenApiSchema +public class OpenapiSchema { public String type; - public OpenApiSchema items; - public Map properties; + public OpenapiSchema items; + public Map properties; public List required; @JsonbProperty("$ref") diff --git a/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenApiSecurityScheme.java b/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenapiSecurityScheme.java similarity index 95% rename from incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenApiSecurityScheme.java rename to incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenapiSecurityScheme.java index 4d27f750ea..d372dd908e 100644 --- a/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenApiSecurityScheme.java +++ b/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenapiSecurityScheme.java @@ -14,7 +14,7 @@ */ package io.aklivity.zilla.runtime.binding.openapi.internal.model; -public class OpenApiSecurityScheme +public class OpenapiSecurityScheme { public String bearerFormat; } diff --git a/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenApiServer.java b/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenapiServer.java similarity index 96% rename from incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenApiServer.java rename to incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenapiServer.java index da292428f3..b62d40eeec 100644 --- a/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenApiServer.java +++ b/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/model/OpenapiServer.java @@ -14,7 +14,7 @@ */ package io.aklivity.zilla.runtime.binding.openapi.internal.model; -public class OpenApiServer +public class OpenapiServer { public String url; } diff --git a/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/view/OpenApiOperationView.java b/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/view/OpenapiOperationView.java similarity index 86% rename from incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/view/OpenApiOperationView.java rename to incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/view/OpenapiOperationView.java index 45123ef155..e85a07d06c 100644 --- a/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/view/OpenApiOperationView.java +++ b/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/view/OpenapiOperationView.java @@ -16,18 +16,18 @@ import java.util.Map; -import io.aklivity.zilla.runtime.binding.openapi.internal.model.OpenApiOperation; +import io.aklivity.zilla.runtime.binding.openapi.internal.model.OpenapiOperation; import io.aklivity.zilla.runtime.binding.openapi.internal.model.OpenapiResponseByContentType; -public final class OpenApiOperationView +public final class OpenapiOperationView { public static final String DEFAULT = "default"; - private final OpenApiOperation operation; + private final OpenapiOperation operation; private final boolean hasResponses; - private OpenApiOperationView( - OpenApiOperation operation) + private OpenapiOperationView( + OpenapiOperation operation) { this.operation = operation; this.hasResponses = initHasResponses(); @@ -62,9 +62,9 @@ private boolean initHasResponses() return result; } - public static OpenApiOperationView of( - OpenApiOperation operation) + public static OpenapiOperationView of( + OpenapiOperation operation) { - return new OpenApiOperationView(operation); + return new OpenapiOperationView(operation); } } diff --git a/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/view/OpenApiOperationsView.java b/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/view/OpenapiOperationsView.java similarity index 81% rename from incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/view/OpenApiOperationsView.java rename to incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/view/OpenapiOperationsView.java index d2527e84d1..fe735b269d 100644 --- a/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/view/OpenApiOperationsView.java +++ b/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/view/OpenapiOperationsView.java @@ -21,9 +21,9 @@ import io.aklivity.zilla.runtime.binding.openapi.internal.model.OpenapiPathItem; -public final class OpenApiOperationsView +public final class OpenapiOperationsView { - private final Map> operationsByPath; + private final Map> operationsByPath; private final boolean hasResponses; public boolean hasResponses() @@ -31,30 +31,30 @@ public boolean hasResponses() return this.hasResponses; } - public OpenApiOperationView operation( + public OpenapiOperationView operation( String pathName, String methodName) { return operationsByPath.get(pathName).get(methodName); } - public static OpenApiOperationsView of( + public static OpenapiOperationsView of( Map paths) { - return new OpenApiOperationsView(paths); + return new OpenapiOperationsView(paths); } - private OpenApiOperationsView( + private OpenapiOperationsView( Map paths) { this.operationsByPath = new Object2ObjectHashMap<>(); boolean hasResponses = false; for (String pathName : paths.keySet()) { - OpenApiPathView path = OpenApiPathView.of(paths.get(pathName)); + OpenapiPathView path = OpenapiPathView.of(paths.get(pathName)); for (String methodName : path.methods().keySet()) { - OpenApiOperationView operation = OpenApiOperationView.of(path.methods().get(methodName)); + OpenapiOperationView operation = OpenapiOperationView.of(path.methods().get(methodName)); hasResponses |= operation.hasResponses(); if (operationsByPath.containsKey(pathName)) { @@ -62,7 +62,7 @@ private OpenApiOperationsView( } else { - Map operationsPerMethod = new LinkedHashMap<>(); + Map operationsPerMethod = new LinkedHashMap<>(); operationsPerMethod.put(methodName, operation); operationsByPath.put(pathName, operationsPerMethod); } diff --git a/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/view/OpenApiPathView.java b/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/view/OpenapiPathView.java similarity index 80% rename from incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/view/OpenApiPathView.java rename to incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/view/OpenapiPathView.java index 3fbee83d26..1caac5e5b1 100644 --- a/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/view/OpenApiPathView.java +++ b/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/view/OpenapiPathView.java @@ -19,28 +19,28 @@ import java.util.LinkedHashMap; import java.util.Map; -import io.aklivity.zilla.runtime.binding.openapi.internal.model.OpenApiOperation; +import io.aklivity.zilla.runtime.binding.openapi.internal.model.OpenapiOperation; import io.aklivity.zilla.runtime.binding.openapi.internal.model.OpenapiPathItem; -public final class OpenApiPathView +public final class OpenapiPathView { - private final Map methods; + private final Map methods; - public Map methods() + public Map methods() { return methods; } - public static OpenApiPathView of( + public static OpenapiPathView of( OpenapiPathItem pathItem) { - return new OpenApiPathView(pathItem); + return new OpenapiPathView(pathItem); } - private OpenApiPathView( + private OpenapiPathView( OpenapiPathItem pathItem) { - Map methods = new LinkedHashMap<>(); + Map methods = new LinkedHashMap<>(); putIfNotNull(methods, "GET", pathItem.get); putIfNotNull(methods, "PUT", pathItem.put); putIfNotNull(methods, "POST", pathItem.post); @@ -53,9 +53,9 @@ private OpenApiPathView( } private static void putIfNotNull( - Map methods, + Map methods, String method, - OpenApiOperation operation) + OpenapiOperation operation) { if (operation != null) { diff --git a/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/view/OpenApiResolvable.java b/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/view/OpenapiResolvable.java similarity index 94% rename from incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/view/OpenApiResolvable.java rename to incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/view/OpenapiResolvable.java index fc5babcde0..dd6c47b837 100644 --- a/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/view/OpenApiResolvable.java +++ b/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/view/OpenapiResolvable.java @@ -18,14 +18,14 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -public abstract class OpenApiResolvable +public abstract class OpenapiResolvable { private final Map map; private final Matcher matcher; protected String key; - public OpenApiResolvable( + public OpenapiResolvable( Map map, String regex) { diff --git a/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/view/OpenApiSchemaView.java b/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/view/OpenapiSchemaView.java similarity index 65% rename from incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/view/OpenApiSchemaView.java rename to incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/view/OpenapiSchemaView.java index 29eddefb26..366bf5ad78 100644 --- a/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/view/OpenApiSchemaView.java +++ b/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/view/OpenapiSchemaView.java @@ -19,8 +19,8 @@ import jakarta.json.bind.annotation.JsonbPropertyOrder; -import io.aklivity.zilla.runtime.binding.openapi.internal.model.OpenApiItem; -import io.aklivity.zilla.runtime.binding.openapi.internal.model.OpenApiSchema; +import io.aklivity.zilla.runtime.binding.openapi.internal.model.OpenapiItem; +import io.aklivity.zilla.runtime.binding.openapi.internal.model.OpenapiSchema; @JsonbPropertyOrder({ "type", @@ -28,26 +28,31 @@ "properties", "required" }) -public final class OpenApiSchemaView extends OpenApiResolvable +public final class OpenapiSchemaView extends OpenapiResolvable { private static final String ARRAY_TYPE = "array"; - private final OpenApiSchema schema; - private final Map schemas; + private final OpenapiSchema schema; + private final Map schemas; + private final OpenapiSchema schemaRef; - private OpenApiSchemaView( - Map schemas, - OpenApiSchema schema) + private OpenapiSchemaView( + Map schemas, + OpenapiSchema schema) { super(schemas, "#/components/schemas/(\\w+)"); + OpenapiSchema schemaRef = null; if (schema.ref != null) { + schemaRef = new OpenapiSchema(); + schemaRef.ref = schema.ref; schema = resolveRef(schema.ref); } else if (ARRAY_TYPE.equals(schema.type) && schema.items != null && schema.items.ref != null) { schema.items = resolveRef(schema.items.ref); } + this.schemaRef = schemaRef; this.schemas = schemas; this.schema = schema; } @@ -56,18 +61,22 @@ public String refKey() { return key; } + public OpenapiSchema ref() + { + return schemaRef; + } public String getType() { return schema.type; } - public OpenApiSchemaView getItems() + public OpenapiSchemaView getItems() { - return schema.items == null ? null : OpenApiSchemaView.of(schemas, schema.items); + return schema.items == null ? null : OpenapiSchemaView.of(schemas, schema.items); } - public Map getProperties() + public Map getProperties() { return schema.properties; } @@ -77,10 +86,10 @@ public List getRequired() return schema.required; } - public static OpenApiSchemaView of( - Map schemas, - OpenApiSchema schema) + public static OpenapiSchemaView of( + Map schemas, + OpenapiSchema schema) { - return new OpenApiSchemaView(schemas, schema); + return new OpenapiSchemaView(schemas, schema); } } diff --git a/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/view/OpenApiServerView.java b/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/view/OpenapiServerView.java similarity index 79% rename from incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/view/OpenApiServerView.java rename to incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/view/OpenapiServerView.java index 2a78362d66..1a238ee2da 100644 --- a/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/view/OpenApiServerView.java +++ b/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/view/OpenapiServerView.java @@ -16,14 +16,14 @@ import java.net.URI; -import io.aklivity.zilla.runtime.binding.openapi.internal.model.OpenApiServer; +import io.aklivity.zilla.runtime.binding.openapi.internal.model.OpenapiServer; -public final class OpenApiServerView +public final class OpenapiServerView { private URI url; - private OpenApiServerView( - OpenApiServer server) + private OpenapiServerView( + OpenapiServer server) { this.url = URI.create(server.url); } @@ -33,9 +33,9 @@ public URI url() return url; } - public static OpenApiServerView of( - OpenApiServer server) + public static OpenapiServerView of( + OpenapiServer server) { - return new OpenApiServerView(server); + return new OpenapiServerView(server); } } diff --git a/incubator/catalog-inline/src/main/java/io/aklivity/zilla/runtime/catalog/inline/internal/InlineCatalogHandler.java b/incubator/catalog-inline/src/main/java/io/aklivity/zilla/runtime/catalog/inline/internal/InlineCatalogHandler.java index d291d67efb..066f928be0 100644 --- a/incubator/catalog-inline/src/main/java/io/aklivity/zilla/runtime/catalog/inline/internal/InlineCatalogHandler.java +++ b/incubator/catalog-inline/src/main/java/io/aklivity/zilla/runtime/catalog/inline/internal/InlineCatalogHandler.java @@ -51,7 +51,7 @@ public int register( public String resolve( int schemaId) { - return schemas.containsKey(schemaId) ? schemas.get(schemaId) : null; + return schemas.getOrDefault(schemaId, null); } @Override @@ -60,7 +60,7 @@ public int resolve( String version) { String key = subject + version; - return schemaIds.containsKey(key) ? schemaIds.get(key) : NO_SCHEMA_ID; + return schemaIds.getOrDefault(key, NO_SCHEMA_ID); } private int generateCRC32C( diff --git a/incubator/model-json/src/main/java/io/aklivity/zilla/runtime/model/json/internal/JsonModelHandler.java b/incubator/model-json/src/main/java/io/aklivity/zilla/runtime/model/json/internal/JsonModelHandler.java index e86b7dfb3c..5b425d2bae 100644 --- a/incubator/model-json/src/main/java/io/aklivity/zilla/runtime/model/json/internal/JsonModelHandler.java +++ b/incubator/model-json/src/main/java/io/aklivity/zilla/runtime/model/json/internal/JsonModelHandler.java @@ -72,17 +72,16 @@ protected final boolean validate( int index, int length) { - boolean status = false; + boolean status = true; try { JsonProvider provider = supplyProvider(schemaId); in.wrap(buffer, index, length); provider.createReader(in).readValue(); - status = true; } catch (JsonValidatingException ex) { - ex.printStackTrace(); + status = false; } return status; } diff --git a/incubator/model-json/src/main/java/io/aklivity/zilla/runtime/model/json/internal/JsonReadConverterHandler.java b/incubator/model-json/src/main/java/io/aklivity/zilla/runtime/model/json/internal/JsonReadConverterHandler.java index ad62353542..fa78257ad6 100644 --- a/incubator/model-json/src/main/java/io/aklivity/zilla/runtime/model/json/internal/JsonReadConverterHandler.java +++ b/incubator/model-json/src/main/java/io/aklivity/zilla/runtime/model/json/internal/JsonReadConverterHandler.java @@ -65,11 +65,13 @@ private int decodePayload( } } - if (validate(schemaId, data, index, length)) + if (schemaId != NO_SCHEMA_ID && + validate(schemaId, data, index, length)) { next.accept(data, index, length); valLength = length; } + return valLength; } } diff --git a/incubator/model-json/src/main/java/io/aklivity/zilla/runtime/model/json/internal/JsonValidatorHandler.java b/incubator/model-json/src/main/java/io/aklivity/zilla/runtime/model/json/internal/JsonValidatorHandler.java index 994601abc4..445d88193e 100644 --- a/incubator/model-json/src/main/java/io/aklivity/zilla/runtime/model/json/internal/JsonValidatorHandler.java +++ b/incubator/model-json/src/main/java/io/aklivity/zilla/runtime/model/json/internal/JsonValidatorHandler.java @@ -85,7 +85,6 @@ public boolean validate( catch (JsonParsingException ex) { status = false; - ex.printStackTrace(); } return status; diff --git a/runtime/binding-http/src/main/java/io/aklivity/zilla/runtime/binding/http/internal/stream/HttpServerFactory.java b/runtime/binding-http/src/main/java/io/aklivity/zilla/runtime/binding/http/internal/stream/HttpServerFactory.java index e8f99951e9..7b6a5fc925 100644 --- a/runtime/binding-http/src/main/java/io/aklivity/zilla/runtime/binding/http/internal/stream/HttpServerFactory.java +++ b/runtime/binding-http/src/main/java/io/aklivity/zilla/runtime/binding/http/internal/stream/HttpServerFactory.java @@ -2297,7 +2297,7 @@ private int onDecodeBody( int limit, Flyweight extension) { - boolean contentValid = exchange.validateContent(buffer, 0, limit - offset); + boolean contentValid = exchange.validateContent(buffer, offset, limit - offset); int result; if (contentValid) { From bffa803659e11999049067913f949aa440b6a9b3 Mon Sep 17 00:00:00 2001 From: Akram Yakubov Date: Fri, 1 Mar 2024 20:00:18 -0800 Subject: [PATCH 2/2] Fix import order --- .../internal/config/OpenapiClientCompositeBindingAdapter.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/config/OpenapiClientCompositeBindingAdapter.java b/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/config/OpenapiClientCompositeBindingAdapter.java index 3de2592b3b..c49479ef35 100644 --- a/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/config/OpenapiClientCompositeBindingAdapter.java +++ b/incubator/binding-openapi/src/main/java/io/aklivity/zilla/runtime/binding/openapi/internal/config/OpenapiClientCompositeBindingAdapter.java @@ -28,11 +28,11 @@ import io.aklivity.zilla.runtime.binding.openapi.config.OpenapiConfig; import io.aklivity.zilla.runtime.binding.openapi.config.OpenapiOptionsConfig; import io.aklivity.zilla.runtime.binding.openapi.internal.OpenapiBinding; +import io.aklivity.zilla.runtime.binding.openapi.internal.model.Openapi; import io.aklivity.zilla.runtime.binding.openapi.internal.model.OpenapiHeader; import io.aklivity.zilla.runtime.binding.openapi.internal.model.OpenapiResponse; -import io.aklivity.zilla.runtime.binding.openapi.internal.model.OpenapiServer; -import io.aklivity.zilla.runtime.binding.openapi.internal.model.Openapi; import io.aklivity.zilla.runtime.binding.openapi.internal.model.OpenapiResponseByContentType; +import io.aklivity.zilla.runtime.binding.openapi.internal.model.OpenapiServer; import io.aklivity.zilla.runtime.binding.openapi.internal.view.OpenapiOperationView; import io.aklivity.zilla.runtime.binding.openapi.internal.view.OpenapiOperationsView; import io.aklivity.zilla.runtime.binding.openapi.internal.view.OpenapiPathView;