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