This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch openapi2 in repository https://gitbox.apache.org/repos/asf/camel.git
commit 443af94082bac115cde67d5e6356f065bb1684fe Author: Claus Ibsen <claus.ib...@gmail.com> AuthorDate: Sun Mar 24 15:37:52 2024 +0100 CAMEL-20557: Rest DSL to use openapi spec directly --- .../rest/openapi/RestOpenApiEndpoint.java | 5 +- .../rest/openapi/RestOpenApiProcessor.java | 63 ++++++++++++++++++++-- 2 files changed, 63 insertions(+), 5 deletions(-) diff --git a/components/camel-rest-openapi/src/main/java/org/apache/camel/component/rest/openapi/RestOpenApiEndpoint.java b/components/camel-rest-openapi/src/main/java/org/apache/camel/component/rest/openapi/RestOpenApiEndpoint.java index c65a309d923..c6b8eca82f9 100644 --- a/components/camel-rest-openapi/src/main/java/org/apache/camel/component/rest/openapi/RestOpenApiEndpoint.java +++ b/components/camel-rest-openapi/src/main/java/org/apache/camel/component/rest/openapi/RestOpenApiEndpoint.java @@ -53,6 +53,7 @@ import io.swagger.v3.oas.models.servers.Server; import io.swagger.v3.parser.core.models.ParseOptions; import io.swagger.v3.parser.core.models.SwaggerParseResult; import org.apache.camel.CamelContext; +import org.apache.camel.CamelContextAware; import org.apache.camel.Category; import org.apache.camel.Component; import org.apache.camel.Consumer; @@ -208,7 +209,9 @@ public final class RestOpenApiEndpoint extends DefaultEndpoint { public Consumer createConsumer(final Processor processor) throws Exception { OpenAPI doc = loadSpecificationFrom(getCamelContext(), specificationUri); String path = determineBasePath(doc); - return createConsumerFor(path, new RestOpenApiProcessor(doc, path, processor)); + Processor target = new RestOpenApiProcessor(doc, path, processor); + CamelContextAware.trySetCamelContext(target, getCamelContext()); + return createConsumerFor(path, target); } protected Consumer createConsumerFor(String basePath, Processor processor) throws Exception { diff --git a/components/camel-rest-openapi/src/main/java/org/apache/camel/component/rest/openapi/RestOpenApiProcessor.java b/components/camel-rest-openapi/src/main/java/org/apache/camel/component/rest/openapi/RestOpenApiProcessor.java index 98409220064..bc9767eaadd 100644 --- a/components/camel-rest-openapi/src/main/java/org/apache/camel/component/rest/openapi/RestOpenApiProcessor.java +++ b/components/camel-rest-openapi/src/main/java/org/apache/camel/component/rest/openapi/RestOpenApiProcessor.java @@ -18,14 +18,23 @@ package org.apache.camel.component.rest.openapi; import io.swagger.v3.oas.models.OpenAPI; import org.apache.camel.AsyncCallback; +import org.apache.camel.AsyncProducer; +import org.apache.camel.CamelContext; +import org.apache.camel.CamelContextAware; +import org.apache.camel.Endpoint; import org.apache.camel.Exchange; import org.apache.camel.Processor; +import org.apache.camel.spi.ProducerCache; +import org.apache.camel.support.cache.DefaultProducerCache; import org.apache.camel.support.processor.DelegateAsyncProcessor; +import org.apache.camel.support.service.ServiceHelper; -public class RestOpenApiProcessor extends DelegateAsyncProcessor { +public class RestOpenApiProcessor extends DelegateAsyncProcessor implements CamelContextAware { + private CamelContext camelContext; private final OpenAPI openAPI; private final String basePath; + private ProducerCache producerCache; public RestOpenApiProcessor(OpenAPI openAPI, String basePath, Processor processor) { super(processor); @@ -33,10 +42,56 @@ public class RestOpenApiProcessor extends DelegateAsyncProcessor { this.openAPI = openAPI; } + @Override + public CamelContext getCamelContext() { + return camelContext; + } + + @Override + public void setCamelContext(CamelContext camelContext) { + this.camelContext = camelContext; + } + @Override public boolean process(Exchange exchange, AsyncCallback callback) { - // what operation to invoke - exchange.getMessage().setBody("I was here"); - return super.process(exchange, callback); + String path = exchange.getMessage().getHeader(Exchange.HTTP_PATH, String.class); + if (path != null && path.startsWith(basePath)) { + path = path.substring(basePath.length() + 1); + } + + // TODO: choose processor strategy (mapping by operation id -> direct) + // TODO: check if valid operation according to OpenApi + // TODO: validate GET/POST etc + // TODO: 404 and so on + // TODO: binding + + Endpoint e = camelContext.getEndpoint("direct:" + path); + AsyncProducer p = producerCache.acquireProducer(e); + return p.process(exchange, new AsyncCallback() { + @Override + public void done(boolean doneSync) { + producerCache.releaseProducer(e, p); + callback.done(doneSync); + } + }); + } + + @Override + protected void doInit() throws Exception { + super.doInit(); + producerCache = new DefaultProducerCache(this, getCamelContext(), 1000); + ServiceHelper.initService(producerCache); + } + + @Override + protected void doStart() throws Exception { + super.doStart(); + ServiceHelper.startService(producerCache); + } + + @Override + protected void doStop() throws Exception { + super.doStop(); + ServiceHelper.stopService(producerCache); } }