This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch ro2
in repository https://gitbox.apache.org/repos/asf/camel.git

commit 013114474538527c0253efdf9e9bca8173ccac84
Author: Claus Ibsen <[email protected]>
AuthorDate: Mon Feb 9 12:30:07 2026 +0100

    CAMEL-22971: camel-rest is optional
---
 .../http/vertx/VertxPlatformHttpConsumer.java        | 15 ++++++++++++---
 .../component/rest/openapi/RestOpenApiProcessor.java |  8 ++++++--
 .../apache/camel/component/rest/RestEndpoint.java    |  5 ++++-
 .../camel/component/webhook/MultiRestConsumer.java   | 10 +++++++---
 .../src/main/java/org/apache/camel/CamelContext.java |  4 ++++
 .../camel/impl/engine/AbstractCamelContext.java      |  5 +++--
 .../impl/engine/DefaultCamelContextExtension.java    | 20 --------------------
 .../apache/camel/impl/console/RestDevConsole.java    |  9 +++++----
 .../java/org/apache/camel/support/PluginHelper.java  | 15 +++++++++++++++
 9 files changed, 56 insertions(+), 35 deletions(-)

diff --git 
a/components/camel-platform-http-vertx/src/main/java/org/apache/camel/component/platform/http/vertx/VertxPlatformHttpConsumer.java
 
b/components/camel-platform-http-vertx/src/main/java/org/apache/camel/component/platform/http/vertx/VertxPlatformHttpConsumer.java
index d552bad55f78..d5a248039cd4 100644
--- 
a/components/camel-platform-http-vertx/src/main/java/org/apache/camel/component/platform/http/vertx/VertxPlatformHttpConsumer.java
+++ 
b/components/camel-platform-http-vertx/src/main/java/org/apache/camel/component/platform/http/vertx/VertxPlatformHttpConsumer.java
@@ -54,7 +54,9 @@ import 
org.apache.camel.component.platform.http.cookie.CookieHandler;
 import org.apache.camel.component.platform.http.spi.Method;
 import org.apache.camel.component.platform.http.spi.PlatformHttpConsumer;
 import org.apache.camel.spi.HeaderFilterStrategy;
+import org.apache.camel.spi.RestRegistry;
 import org.apache.camel.support.DefaultConsumer;
+import org.apache.camel.support.PluginHelper;
 import org.apache.camel.util.FileUtil;
 import org.apache.camel.util.MimeTypeHelper;
 import org.slf4j.Logger;
@@ -82,6 +84,7 @@ public class VertxPlatformHttpConsumer extends DefaultConsumer
     private final boolean muteExceptions;
     private final boolean handleWriteResponseError;
     private final List<Route> routes = new ArrayList<>();
+    private RestRegistry restRegistry;
     private Set<Method> methods;
     private String path;
     private VertxPlatformHttpRouter router;
@@ -111,6 +114,12 @@ public class VertxPlatformHttpConsumer extends 
DefaultConsumer
     @Override
     protected void doInit() throws Exception {
         super.doInit();
+
+        // camel-rest is optional
+        if 
(getEndpoint().getCamelContext().getCamelContextExtension().isContextPluginInUse(RestRegistry.class))
 {
+            restRegistry = 
PluginHelper.getRestRegistry(getEndpoint().getCamelContext());
+        }
+
         methods = Method.parseList(getEndpoint().getHttpMethodRestrict());
         path = configureEndpointPath(getEndpoint());  // in vertx-web we 
should replace path parameters from {xxx} to :xxx syntax
         router = 
VertxPlatformHttpRouter.lookup(getEndpoint().getCamelContext(), routerName);
@@ -137,7 +146,7 @@ public class VertxPlatformHttpConsumer extends 
DefaultConsumer
     protected void doStart() throws Exception {
         super.doStart();
 
-        if (startRestServicesContractFirst()) {
+        if (restRegistry != null && startRestServicesContractFirst()) {
             // rest-dsl contract first using multiple routers per api endpoint
             return;
         }
@@ -191,7 +200,7 @@ public class VertxPlatformHttpConsumer extends 
DefaultConsumer
      */
     protected boolean startRestServicesContractFirst() throws Exception {
         boolean matched = false;
-        for (var r : 
getEndpoint().getCamelContext().getRestRegistry().listAllRestServices()) {
+        for (var r : restRegistry.listAllRestServices()) {
             // rest-dsl contract-first we need to create a new unique router 
per API endpoint
             String target = path;
             if (target.endsWith("*")) {
@@ -227,7 +236,7 @@ public class VertxPlatformHttpConsumer extends 
DefaultConsumer
                 this.routes.add(sr);
             }
         }
-        for (var r : 
getEndpoint().getCamelContext().getRestRegistry().listAllRestSpecifications()) {
+        for (var r : restRegistry.listAllRestSpecifications()) {
             // rest-dsl contract-first we need to see if there is an api spec
             // that should be exposed via a vertx http router
             String target = path;
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 e1816fcd17cb..9ee7eb9d11ec 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
@@ -26,7 +26,9 @@ import org.apache.camel.*;
 import org.apache.camel.component.platform.http.spi.PlatformHttpConsumerAware;
 import org.apache.camel.http.base.HttpHelper;
 import org.apache.camel.spi.RestConfiguration;
+import org.apache.camel.spi.RestRegistry;
 import org.apache.camel.support.AsyncProcessorSupport;
+import org.apache.camel.support.PluginHelper;
 import org.apache.camel.support.RestConsumerContextPathMatcher;
 import org.apache.camel.support.processor.RestBindingAdvice;
 import org.apache.camel.support.processor.RestBindingAdviceFactory;
@@ -169,7 +171,8 @@ public class RestOpenApiProcessor extends 
AsyncProcessorSupport implements Camel
                 if (consumer instanceof RouteAware ra) {
                     routeId = ra.getRoute().getRouteId();
                 }
-                camelContext.getRestRegistry().addRestService(consumer, true, 
url, path, basePath, null, v, bc.getConsumes(),
+                RestRegistry restRegistry = 
PluginHelper.getRestRegistry(camelContext);
+                restRegistry.addRestService(consumer, true, url, path, 
basePath, null, v, bc.getConsumes(),
                         bc.getProduces(), bc.getType(), bc.getOutType(), 
routeId, desc);
 
                 try {
@@ -193,7 +196,8 @@ public class RestOpenApiProcessor extends 
AsyncProcessorSupport implements Camel
                 produces = "text/yaml";
             }
             // register api-doc
-            camelContext.getRestRegistry().addRestSpecification(consumer, 
true, url, apiContextPath, basePath, "GET", produces,
+            RestRegistry restRegistry = 
PluginHelper.getRestRegistry(camelContext);
+            restRegistry.addRestSpecification(consumer, true, url, 
apiContextPath, basePath, "GET", produces,
                     null);
         }
 
diff --git 
a/components/camel-rest/src/main/java/org/apache/camel/component/rest/RestEndpoint.java
 
b/components/camel-rest/src/main/java/org/apache/camel/component/rest/RestEndpoint.java
index 48d701eb52c2..5a686150b655 100644
--- 
a/components/camel-rest/src/main/java/org/apache/camel/component/rest/RestEndpoint.java
+++ 
b/components/camel-rest/src/main/java/org/apache/camel/component/rest/RestEndpoint.java
@@ -32,11 +32,13 @@ import org.apache.camel.spi.Metadata;
 import org.apache.camel.spi.RestConfiguration;
 import org.apache.camel.spi.RestConsumerFactory;
 import org.apache.camel.spi.RestProducerFactory;
+import org.apache.camel.spi.RestRegistry;
 import org.apache.camel.spi.UriEndpoint;
 import org.apache.camel.spi.UriParam;
 import org.apache.camel.spi.UriPath;
 import org.apache.camel.support.CamelContextHelper;
 import org.apache.camel.support.DefaultEndpoint;
+import org.apache.camel.support.PluginHelper;
 import org.apache.camel.support.component.PropertyConfigurerSupport;
 import org.apache.camel.util.HostUtils;
 import org.apache.camel.util.MimeTypeHelper;
@@ -494,7 +496,8 @@ public class RestEndpoint extends DefaultEndpoint {
         configureConsumer(consumer);
 
         // add to rest registry, so we can keep track of them
-        getCamelContext().getRestRegistry().addRestService(consumer, false, 
url, baseUrl, getPath(), getUriTemplate(),
+        RestRegistry registry = 
PluginHelper.getRestRegistry(getCamelContext());
+        registry.addRestService(consumer, false, url, baseUrl, getPath(), 
getUriTemplate(),
                 getMethod(), getConsumes(), getProduces(), getInType(), 
getOutType(), getRouteId(), getDescription());
         return consumer;
     }
diff --git 
a/components/camel-webhook/src/main/java/org/apache/camel/component/webhook/MultiRestConsumer.java
 
b/components/camel-webhook/src/main/java/org/apache/camel/component/webhook/MultiRestConsumer.java
index 17d2e3c1c19c..a023b25f0a7d 100644
--- 
a/components/camel-webhook/src/main/java/org/apache/camel/component/webhook/MultiRestConsumer.java
+++ 
b/components/camel-webhook/src/main/java/org/apache/camel/component/webhook/MultiRestConsumer.java
@@ -26,14 +26,16 @@ import org.apache.camel.Endpoint;
 import org.apache.camel.Processor;
 import org.apache.camel.spi.RestConfiguration;
 import org.apache.camel.spi.RestConsumerFactory;
+import org.apache.camel.spi.RestRegistry;
 import org.apache.camel.support.DefaultConsumer;
+import org.apache.camel.support.PluginHelper;
 import org.apache.camel.support.service.ServiceHelper;
 
 /**
  * MultiRestConsumer allows to bind the webhook to multiple local rest 
endpoints. It is useful for services that need to
  * respond to multiple kinds of requests.
  * <p>
- * E.g. some webhook providers operate over POST but they do require that a 
specific endpoint replies also to GET
+ * E.g. some webhook providers operate over POST, but they do require that a 
specific endpoint replies also to GET
  * requests during handshake.
  */
 public class MultiRestConsumer extends DefaultConsumer {
@@ -50,8 +52,10 @@ public class MultiRestConsumer extends DefaultConsumer {
                     null, null, null, config, Collections.emptyMap());
             configurer.configure(consumer);
 
-            context.getRestRegistry().addRestService(consumer, false, url, 
url, path, null, method,
-                    null, null, null, null, null, null);
+            if 
(context.getCamelContextExtension().isContextPluginInUse(RestRegistry.class)) {
+                PluginHelper.getRestRegistry(context).addRestService(consumer, 
false, url, url, path, null, method,
+                        null, null, null, null, null, null);
+            }
 
             this.delegateConsumers.add(consumer);
         }
diff --git a/core/camel-api/src/main/java/org/apache/camel/CamelContext.java 
b/core/camel-api/src/main/java/org/apache/camel/CamelContext.java
index 6db7888cd985..1393ad10c4e7 100644
--- a/core/camel-api/src/main/java/org/apache/camel/CamelContext.java
+++ b/core/camel-api/src/main/java/org/apache/camel/CamelContext.java
@@ -809,12 +809,16 @@ public interface CamelContext extends 
CamelContextLifecycle, RuntimeConfiguratio
 
     /**
      * Gets the {@link org.apache.camel.spi.RestRegistry} to use
+     *
+     * @deprecated use PluginHelper
      */
+    @Deprecated
     RestRegistry getRestRegistry();
 
     /**
      * Sets a custom {@link org.apache.camel.spi.RestRegistry} to use.
      */
+    @Deprecated
     void setRestRegistry(RestRegistry restRegistry);
 
     // Properties
diff --git 
a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java
 
b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java
index 77510a1632a5..e0c5a77a35c9 100644
--- 
a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java
+++ 
b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java
@@ -404,6 +404,7 @@ public abstract class AbstractCamelContext extends 
BaseService
         camelContextExtension.lazyAddContextPlugin(BackOffTimerFactory.class, 
this::createBackOffTimerFactory);
         camelContextExtension.lazyAddContextPlugin(GroovyScriptCompiler.class, 
this::createGroovyScriptCompiler);
         
camelContextExtension.lazyAddContextPlugin(SimpleFunctionRegistry.class, 
this::createSimpleFunctionRegistry);
+        camelContextExtension.lazyAddContextPlugin(RestRegistry.class, 
this::createRestRegistry);
     }
 
     protected static <T> T lookup(CamelContext context, String ref, Class<T> 
type) {
@@ -4272,12 +4273,12 @@ public abstract class AbstractCamelContext extends 
BaseService
 
     @Override
     public RestRegistry getRestRegistry() {
-        return camelContextExtension.getRestRegistry();
+        return PluginHelper.getRestRegistry(this);
     }
 
     @Override
     public void setRestRegistry(RestRegistry restRegistry) {
-        camelContextExtension.setRestRegistry(restRegistry);
+        throw new UnsupportedOperationException("Not in use");
     }
 
     protected RestRegistry createRestRegistry() {
diff --git 
a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultCamelContextExtension.java
 
b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultCamelContextExtension.java
index 6e3cb2a5953c..944770e21380 100644
--- 
a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultCamelContextExtension.java
+++ 
b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultCamelContextExtension.java
@@ -68,7 +68,6 @@ import org.apache.camel.spi.PropertiesComponent;
 import org.apache.camel.spi.ReactiveExecutor;
 import org.apache.camel.spi.Registry;
 import org.apache.camel.spi.RestConfiguration;
-import org.apache.camel.spi.RestRegistry;
 import org.apache.camel.spi.RestRegistryFactory;
 import org.apache.camel.spi.RouteController;
 import org.apache.camel.spi.RouteStartupOrder;
@@ -122,7 +121,6 @@ class DefaultCamelContextExtension implements 
ExtendedCamelContext {
     private volatile PropertiesComponent propertiesComponent;
     private volatile RestRegistryFactory restRegistryFactory;
     private volatile RestConfiguration restConfiguration;
-    private volatile RestRegistry restRegistry;
     private volatile ClassResolver classResolver;
     private volatile MessageHistoryFactory messageHistoryFactory;
     private volatile StreamCachingStrategy streamCachingStrategy;
@@ -731,24 +729,6 @@ class DefaultCamelContextExtension implements 
ExtendedCamelContext {
         this.restRegistryFactory = 
camelContext.getInternalServiceManager().addService(camelContext, 
restRegistryFactory);
     }
 
-    RestRegistry getRestRegistry() {
-        if (restRegistry == null) {
-            lock.lock();
-            try {
-                if (restRegistry == null) {
-                    setRestRegistry(camelContext.createRestRegistry());
-                }
-            } finally {
-                lock.unlock();
-            }
-        }
-        return restRegistry;
-    }
-
-    void setRestRegistry(RestRegistry restRegistry) {
-        this.restRegistry = 
camelContext.getInternalServiceManager().addService(camelContext, restRegistry);
-    }
-
     RestConfiguration getRestConfiguration() {
         if (restConfiguration == null) {
             lock.lock();
diff --git 
a/core/camel-console/src/main/java/org/apache/camel/impl/console/RestDevConsole.java
 
b/core/camel-console/src/main/java/org/apache/camel/impl/console/RestDevConsole.java
index 878b099c363d..69bde671b714 100644
--- 
a/core/camel-console/src/main/java/org/apache/camel/impl/console/RestDevConsole.java
+++ 
b/core/camel-console/src/main/java/org/apache/camel/impl/console/RestDevConsole.java
@@ -22,6 +22,7 @@ import java.util.Map;
 
 import org.apache.camel.spi.RestRegistry;
 import org.apache.camel.spi.annotations.DevConsole;
+import org.apache.camel.support.PluginHelper;
 import org.apache.camel.support.console.AbstractDevConsole;
 import org.apache.camel.util.json.JsonObject;
 
@@ -37,10 +38,10 @@ public class RestDevConsole extends AbstractDevConsole {
     @Override
     protected void doInit() throws Exception {
         super.doInit();
-        try {
-            rr = getCamelContext().getRestRegistry();
-        } catch (IllegalArgumentException e) {
-            // ignore as this is optional
+
+        // camel-rest is optional
+        if 
(getCamelContext().getCamelContextExtension().isContextPluginInUse(RestRegistry.class))
 {
+            rr = PluginHelper.getRestRegistry(getCamelContext());
         }
     }
 
diff --git 
a/core/camel-support/src/main/java/org/apache/camel/support/PluginHelper.java 
b/core/camel-support/src/main/java/org/apache/camel/support/PluginHelper.java
index 9373bb004666..f423f1dbd35e 100644
--- 
a/core/camel-support/src/main/java/org/apache/camel/support/PluginHelper.java
+++ 
b/core/camel-support/src/main/java/org/apache/camel/support/PluginHelper.java
@@ -53,6 +53,7 @@ import org.apache.camel.spi.ProcessorFactory;
 import org.apache.camel.spi.ResourceLoader;
 import org.apache.camel.spi.RestBindingJacksonXmlDataFormatFactory;
 import org.apache.camel.spi.RestBindingJaxbDataFormatFactory;
+import org.apache.camel.spi.RestRegistry;
 import org.apache.camel.spi.RouteFactory;
 import org.apache.camel.spi.RoutesLoader;
 import org.apache.camel.spi.SimpleFunctionRegistry;
@@ -639,4 +640,18 @@ public final class PluginHelper {
         return 
extendedCamelContext.getContextPlugin(SimpleFunctionRegistry.class);
     }
 
+    /**
+     * Gets the {@link RestRegistry} to use.
+     */
+    public static RestRegistry getRestRegistry(CamelContext camelContext) {
+        return 
camelContext.getCamelContextExtension().getContextPlugin(RestRegistry.class);
+    }
+
+    /**
+     * Gets the {@link RestRegistry} to use.
+     */
+    public static RestRegistry getRestRegistry(ExtendedCamelContext 
extendedCamelContext) {
+        return extendedCamelContext.getContextPlugin(RestRegistry.class);
+    }
+
 }

Reply via email to