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

Reply via email to