This is an automated email from the ASF dual-hosted git repository.
davsclaus pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/main by this push:
new 4c881ac53d59 CAMEL-23102: camel-jbang - Automatic keep up to date list
of Camel FactoryFinder as known dependencies (#21643)
4c881ac53d59 is described below
commit 4c881ac53d59f31b489e0857f9dcd29cf991c4b6
Author: Claus Ibsen <[email protected]>
AuthorDate: Sat Feb 28 07:23:37 2026 +0100
CAMEL-23102: camel-jbang - Automatic keep up to date list of Camel
FactoryFinder as known dependencies (#21643)
---
components/camel-oauth/src/main/docs/oauth.adoc | 5 +-
.../apache/camel/openapi/RestOpenApiSupport.java | 7 +-
.../platform/http/main/MainHttpServer.java | 8 +-
.../platform/http/main/ManagementHttpServer.java | 8 +-
.../apache/camel/spring/SpringCamelContext.java | 14 +-
.../org/apache/camel/NoSuchServiceException.java | 40 +++++
.../camel/impl/engine/SimpleCamelContext.java | 182 ++++++---------------
.../simple/ast/SimpleFunctionExpression.java | 49 ++----
.../java/org/apache/camel/support/OAuthHelper.java | 9 +-
.../org/apache/camel/support/ResolverHelper.java | 60 ++++++-
...mel-factoryfinder-known-dependencies.properties | 64 ++++++++
.../java/org/apache/camel/main/KameletMain.java | 7 +
.../download/DependencyDownloadFactoryFinder.java | 55 +++++++
.../DependencyDownloadFactoryFinderResolver.java | 44 +++++
.../main/download/KnownDependenciesResolver.java | 4 +
.../camel-main-known-dependencies.properties | 50 +++---
.../maven/packaging/PrepareKameletMainMojo.java | 72 ++++++++
17 files changed, 450 insertions(+), 228 deletions(-)
diff --git a/components/camel-oauth/src/main/docs/oauth.adoc
b/components/camel-oauth/src/main/docs/oauth.adoc
index 08b9717e10c2..c16651fd7d01 100644
--- a/components/camel-oauth/src/main/docs/oauth.adoc
+++ b/components/camel-oauth/src/main/docs/oauth.adoc
@@ -162,10 +162,9 @@ import
org.apache.camel.spi.OAuthClientAuthenticationFactory;
import org.apache.camel.spi.OAuthClientConfig;
import org.apache.camel.support.ResolverHelper;
-OAuthClientAuthenticationFactory factory = ResolverHelper.resolveService(
+OAuthClientAuthenticationFactory factory =
ResolverHelper.resolveMandatoryService(
context, OAuthClientAuthenticationFactory.FACTORY,
- OAuthClientAuthenticationFactory.class)
- .orElseThrow(() -> new IllegalArgumentException("Add camel-oauth to the
classpath"));
+ OAuthClientAuthenticationFactory.class, "camel-oauth");
String token = factory.resolveToken(
new OAuthClientConfig()
diff --git
a/components/camel-openapi-java/src/main/java/org/apache/camel/openapi/RestOpenApiSupport.java
b/components/camel-openapi-java/src/main/java/org/apache/camel/openapi/RestOpenApiSupport.java
index 7920dff28891..d4b0de1c21d5 100644
---
a/components/camel-openapi-java/src/main/java/org/apache/camel/openapi/RestOpenApiSupport.java
+++
b/components/camel-openapi-java/src/main/java/org/apache/camel/openapi/RestOpenApiSupport.java
@@ -300,13 +300,12 @@ public class RestOpenApiSupport {
}
protected RestDefinitionsResolver
createJmxRestDefinitionsResolver(CamelContext camelContext) {
- return ResolverHelper.resolveService(
+ return ResolverHelper.resolveMandatoryService(
camelContext,
camelContext.getCamelContextExtension().getBootstrapFactoryFinder(),
JMX_REST_DEFINITION_RESOLVER,
- RestDefinitionsResolver.class)
- .orElseThrow(
- () -> new IllegalArgumentException("Cannot find
camel-openapi-java on classpath."));
+ RestDefinitionsResolver.class,
+ "camel-openapi-java");
}
public void setupXForwardHeaders(RestApiResponseAdapter response, Exchange
exchange) {
diff --git
a/components/camel-platform-http-main/src/main/java/org/apache/camel/component/platform/http/main/MainHttpServer.java
b/components/camel-platform-http-main/src/main/java/org/apache/camel/component/platform/http/main/MainHttpServer.java
index 125913eae0a9..4881996cc03d 100644
---
a/components/camel-platform-http-main/src/main/java/org/apache/camel/component/platform/http/main/MainHttpServer.java
+++
b/components/camel-platform-http-main/src/main/java/org/apache/camel/component/platform/http/main/MainHttpServer.java
@@ -19,7 +19,6 @@ package org.apache.camel.component.platform.http.main;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
-import java.util.Optional;
import io.vertx.core.Handler;
import io.vertx.core.http.impl.MimeMapping;
@@ -304,12 +303,11 @@ public class MainHttpServer extends ServiceSupport
implements CamelContextAware,
}
protected PlatformHttpPluginRegistry resolvePlatformHttpPluginRegistry() {
- Optional<PlatformHttpPluginRegistry> result =
ResolverHelper.resolveService(
+ return ResolverHelper.resolveMandatoryService(
getCamelContext(),
PlatformHttpPluginRegistry.FACTORY,
- PlatformHttpPluginRegistry.class);
- return result.orElseThrow(() -> new IllegalArgumentException(
- "Cannot create PlatformHttpPluginRegistry. Make sure
camel-platform-http JAR is on classpath."));
+ PlatformHttpPluginRegistry.class,
+ "camel-platform-http");
}
protected void setupStartupSummary() throws Exception {
diff --git
a/components/camel-platform-http-main/src/main/java/org/apache/camel/component/platform/http/main/ManagementHttpServer.java
b/components/camel-platform-http-main/src/main/java/org/apache/camel/component/platform/http/main/ManagementHttpServer.java
index 376fd86a3b55..6ec3285eb3ca 100644
---
a/components/camel-platform-http-main/src/main/java/org/apache/camel/component/platform/http/main/ManagementHttpServer.java
+++
b/components/camel-platform-http-main/src/main/java/org/apache/camel/component/platform/http/main/ManagementHttpServer.java
@@ -29,7 +29,6 @@ import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
-import java.util.Optional;
import java.util.Set;
import java.util.StringJoiner;
import java.util.TreeSet;
@@ -895,12 +894,11 @@ public class ManagementHttpServer extends ServiceSupport
implements CamelContext
}
protected PlatformHttpPluginRegistry resolvePlatformHttpPluginRegistry() {
- Optional<PlatformHttpPluginRegistry> result =
ResolverHelper.resolveService(
+ return ResolverHelper.resolveMandatoryService(
getCamelContext(),
PlatformHttpPluginRegistry.FACTORY,
- PlatformHttpPluginRegistry.class);
- return result.orElseThrow(() -> new IllegalArgumentException(
- "Cannot create PlatformHttpPluginRegistry. Make sure
camel-platform-http JAR is on classpath."));
+ PlatformHttpPluginRegistry.class,
+ "camel-platform-http");
}
private static void healthCheckStatus(JsonObject jo, boolean up) {
diff --git
a/components/camel-spring-parent/camel-spring/src/main/java/org/apache/camel/spring/SpringCamelContext.java
b/components/camel-spring-parent/camel-spring/src/main/java/org/apache/camel/spring/SpringCamelContext.java
index 94fb745b45ea..ee490b001bb5 100644
---
a/components/camel-spring-parent/camel-spring/src/main/java/org/apache/camel/spring/SpringCamelContext.java
+++
b/components/camel-spring-parent/camel-spring/src/main/java/org/apache/camel/spring/SpringCamelContext.java
@@ -16,8 +16,6 @@
*/
package org.apache.camel.spring;
-import java.util.Optional;
-
import org.apache.camel.Endpoint;
import org.apache.camel.Processor;
import org.apache.camel.RuntimeCamelException;
@@ -258,18 +256,12 @@ public class SpringCamelContext extends
DefaultCamelContext
@Override
protected ModelJAXBContextFactory createModelJAXBContextFactory() {
- Optional<ModelJAXBContextFactory> result =
ResolverHelper.resolveService(
+ return ResolverHelper.resolveMandatoryService(
getCamelContextReference(),
getCamelContextExtension().getBootstrapFactoryFinder(),
ModelJAXBContextFactory.FACTORY + "-spring",
- ModelJAXBContextFactory.class);
-
- if (result.isPresent()) {
- return result.get();
- } else {
- throw new IllegalArgumentException(
- "Cannot find ModelJAXBContextFactory on classpath. Add
camel-spring-xml to classpath.");
- }
+ ModelJAXBContextFactory.class,
+ "camel-spring-xml");
}
@Override
diff --git
a/core/camel-api/src/main/java/org/apache/camel/NoSuchServiceException.java
b/core/camel-api/src/main/java/org/apache/camel/NoSuchServiceException.java
new file mode 100644
index 000000000000..9d6cd80a4d95
--- /dev/null
+++ b/core/camel-api/src/main/java/org/apache/camel/NoSuchServiceException.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel;
+
+/**
+ * A runtime exception if a given service could not be found in the classpath
+ */
+public class NoSuchServiceException extends RuntimeCamelException {
+
+ private final String name;
+ private final String jar;
+
+ public NoSuchServiceException(String name, String jar) {
+ super("No " + name + " service could be found in the classpath. Add "
+ jar + " to classpath.");
+ this.name = name;
+ this.jar = jar;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public String getJar() {
+ return jar;
+ }
+}
diff --git
a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/SimpleCamelContext.java
b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/SimpleCamelContext.java
index cd5884d4ccd1..74f27ad17234 100644
---
a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/SimpleCamelContext.java
+++
b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/SimpleCamelContext.java
@@ -247,18 +247,12 @@ public class SimpleCamelContext extends
AbstractCamelContext {
@Override
protected ModelJAXBContextFactory createModelJAXBContextFactory() {
- Optional<ModelJAXBContextFactory> result =
ResolverHelper.resolveService(
+ return ResolverHelper.resolveMandatoryService(
getCamelContextReference(),
getCamelContextExtension().getBootstrapFactoryFinder(),
ModelJAXBContextFactory.FACTORY,
- ModelJAXBContextFactory.class);
-
- if (result.isPresent()) {
- return result.get();
- } else {
- throw new IllegalArgumentException(
- "Cannot find ModelJAXBContextFactory on classpath. Add
camel-xml-jaxb to classpath.");
- }
+ ModelJAXBContextFactory.class,
+ "camel-xml-jaxb");
}
@Override
@@ -303,34 +297,21 @@ public class SimpleCamelContext extends
AbstractCamelContext {
@Override
protected ProcessorFactory createProcessorFactory() {
- Optional<ProcessorFactory> result = ResolverHelper.resolveService(
+ return ResolverHelper.resolveMandatoryService(
getCamelContextReference(),
getCamelContextExtension().getBootstrapFactoryFinder(),
ProcessorFactory.FACTORY,
- ProcessorFactory.class);
-
- if (result.isPresent()) {
- return result.get();
- } else {
- throw new IllegalArgumentException(
- "Cannot find ProcessorFactory on classpath. Add
camel-core-processor to classpath.");
- }
+ ProcessorFactory.class, "camel-core-processor");
}
@Override
protected InternalProcessorFactory createInternalProcessorFactory() {
- Optional<InternalProcessorFactory> result =
ResolverHelper.resolveService(
+ return ResolverHelper.resolveMandatoryService(
getCamelContextReference(),
getCamelContextExtension().getBootstrapFactoryFinder(),
InternalProcessorFactory.FACTORY,
- InternalProcessorFactory.class);
-
- if (result.isPresent()) {
- return result.get();
- } else {
- throw new IllegalArgumentException(
- "Cannot find InternalProcessorFactory on classpath. Add
camel-core-processor to classpath.");
- }
+ InternalProcessorFactory.class,
+ "camel-core-processor");
}
@Override
@@ -409,18 +390,12 @@ public class SimpleCamelContext extends
AbstractCamelContext {
@Override
protected RuntimeCamelCatalog createRuntimeCamelCatalog() {
- Optional<RuntimeCamelCatalog> result = ResolverHelper.resolveService(
+ return ResolverHelper.resolveMandatoryService(
getCamelContextReference(),
getCamelContextExtension().getBootstrapFactoryFinder(),
RuntimeCamelCatalog.FACTORY,
- RuntimeCamelCatalog.class);
-
- if (result.isPresent()) {
- return result.get();
- } else {
- throw new IllegalArgumentException(
- "Cannot find RuntimeCamelCatalog on classpath. Add
camel-core-catalog to classpath.");
- }
+ RuntimeCamelCatalog.class,
+ "camel-core-catalog");
}
@Override
@@ -437,21 +412,17 @@ public class SimpleCamelContext extends
AbstractCamelContext {
DumpRoutesStrategy.FACTORY,
DumpRoutesStrategy.class);
- if (result.isEmpty()) {
- // lookup default factory
- result = ResolverHelper.resolveService(
- getCamelContextReference(),
- getCamelContextExtension().getBootstrapFactoryFinder(),
- "default-" + DumpRoutesStrategy.FACTORY,
- DumpRoutesStrategy.class);
- }
-
if (result.isPresent()) {
return result.get();
- } else {
- throw new IllegalArgumentException(
- "Cannot find DumpRoutesStrategy on classpath. Add
camel-core-engine to classpath.");
}
+
+ // lookup default factory
+ return ResolverHelper.resolveMandatoryService(
+ getCamelContextReference(),
+ getCamelContextExtension().getBootstrapFactoryFinder(),
+ "default-" + DumpRoutesStrategy.FACTORY,
+ DumpRoutesStrategy.class,
+ "camel-core-engine");
}
@Override
@@ -509,64 +480,42 @@ public class SimpleCamelContext extends
AbstractCamelContext {
@Override
protected BeanProxyFactory createBeanProxyFactory() {
- Optional<BeanProxyFactory> result = ResolverHelper.resolveService(
+ return ResolverHelper.resolveMandatoryService(
getCamelContextReference(),
getCamelContextExtension().getBootstrapFactoryFinder(),
BeanProxyFactory.FACTORY,
- BeanProxyFactory.class);
-
- if (result.isPresent()) {
- return result.get();
- } else {
- throw new IllegalArgumentException("Cannot find BeanProxyFactory
on classpath. Add camel-bean to classpath.");
- }
+ BeanProxyFactory.class,
+ "camel-bean");
}
@Override
protected AnnotationBasedProcessorFactory
createAnnotationBasedProcessorFactory() {
- Optional<AnnotationBasedProcessorFactory> result =
ResolverHelper.resolveService(
+ return ResolverHelper.resolveMandatoryService(
getCamelContextReference(),
getCamelContextExtension().getBootstrapFactoryFinder(),
AnnotationBasedProcessorFactory.FACTORY,
- AnnotationBasedProcessorFactory.class);
-
- if (result.isPresent()) {
- return result.get();
- } else {
- throw new IllegalArgumentException(
- "Cannot find AnnotationBasedProcessorFactory on classpath.
Add camel-core-processor to classpath.");
- }
+ AnnotationBasedProcessorFactory.class,
+ "camel-core-processor");
}
@Override
protected DeferServiceFactory createDeferServiceFactory() {
- Optional<DeferServiceFactory> result = ResolverHelper.resolveService(
+ return ResolverHelper.resolveMandatoryService(
getCamelContextReference(),
getCamelContextExtension().getBootstrapFactoryFinder(),
DeferServiceFactory.FACTORY,
- DeferServiceFactory.class);
-
- if (result.isPresent()) {
- return result.get();
- } else {
- throw new IllegalArgumentException(
- "Cannot find DeferServiceFactory on classpath. Add
camel-core-processor to classpath.");
- }
+ DeferServiceFactory.class,
+ "camel-core-processor");
}
@Override
protected BeanProcessorFactory createBeanProcessorFactory() {
- Optional<BeanProcessorFactory> result = ResolverHelper.resolveService(
+ return ResolverHelper.resolveMandatoryService(
getCamelContextReference(),
getCamelContextExtension().getBootstrapFactoryFinder(),
BeanProcessorFactory.FACTORY,
- BeanProcessorFactory.class);
-
- if (result.isPresent()) {
- return result.get();
- } else {
- throw new IllegalArgumentException("Cannot find
BeanProcessorFactory on classpath. Add camel-bean to classpath.");
- }
+ BeanProcessorFactory.class,
+ "camel-bean");
}
@Override
@@ -598,80 +547,52 @@ public class SimpleCamelContext extends
AbstractCamelContext {
@Override
protected ModelToXMLDumper createModelToXMLDumper() {
- Optional<ModelToXMLDumper> result = ResolverHelper.resolveService(
+ return ResolverHelper.resolveMandatoryService(
getCamelContextReference(),
getCamelContextExtension().getBootstrapFactoryFinder(),
ModelToXMLDumper.FACTORY,
- ModelToXMLDumper.class);
-
- if (result.isPresent()) {
- return result.get();
- } else {
- throw new IllegalArgumentException("Cannot find ModelToXMLDumper
on classpath. Add camel-xml-io to classpath.");
- }
+ ModelToXMLDumper.class,
+ "camel-xml-io");
}
@Override
protected ModelToYAMLDumper createModelToYAMLDumper() {
- Optional<ModelToYAMLDumper> result = ResolverHelper.resolveService(
+ return ResolverHelper.resolveMandatoryService(
getCamelContextReference(),
getCamelContextExtension().getBootstrapFactoryFinder(),
ModelToYAMLDumper.FACTORY,
- ModelToYAMLDumper.class);
-
- if (result.isPresent()) {
- return result.get();
- } else {
- throw new IllegalArgumentException("Cannot find ModelToYAMLDumper
on classpath. Add camel-yaml-io to classpath.");
- }
+ ModelToYAMLDumper.class,
+ "camel-yaml-io");
}
@Override
protected ModelToStructureDumper createModelToStructureDumper() {
- Optional<ModelToStructureDumper> result =
ResolverHelper.resolveService(
+ return ResolverHelper.resolveMandatoryService(
getCamelContextReference(),
getCamelContextExtension().getBootstrapFactoryFinder(),
ModelToStructureDumper.FACTORY,
- ModelToStructureDumper.class);
-
- if (result.isPresent()) {
- return result.get();
- } else {
- throw new IllegalArgumentException(
- "Cannot find ModelToStructureDumper on classpath. Add
camel-core-engine to classpath.");
- }
+ ModelToStructureDumper.class,
+ "camel-core-engine");
}
@Override
protected RestBindingJaxbDataFormatFactory
createRestBindingJaxbDataFormatFactory() {
- Optional<RestBindingJaxbDataFormatFactory> result =
ResolverHelper.resolveService(
+ return ResolverHelper.resolveMandatoryService(
getCamelContextReference(),
getCamelContextExtension().getBootstrapFactoryFinder(),
RestBindingJaxbDataFormatFactory.FACTORY,
- RestBindingJaxbDataFormatFactory.class);
-
- if (result.isPresent()) {
- return result.get();
- } else {
- throw new IllegalArgumentException(
- "Cannot find RestBindingJaxbDataFormatFactory on
classpath. Add camel-jaxb to classpath.");
- }
+ RestBindingJaxbDataFormatFactory.class,
+ "camel-jaxb");
}
@Override
protected RestBindingJacksonXmlDataFormatFactory
createRestBindingJacksonXmlDataFormatFactory() {
- Optional<RestBindingJacksonXmlDataFormatFactory> result =
ResolverHelper.resolveService(
+ return ResolverHelper.resolveMandatoryService(
getCamelContextReference(),
getCamelContextExtension().getBootstrapFactoryFinder(),
RestBindingJacksonXmlDataFormatFactory.FACTORY,
- RestBindingJacksonXmlDataFormatFactory.class);
-
- if (result.isPresent()) {
- return result.get();
- } else {
- throw new IllegalArgumentException(
- "Cannot find RestBindingJacksonXmlDataFormatFactory on
classpath. Add camel-jacksonxml to classpath.");
- }
+ RestBindingJacksonXmlDataFormatFactory.class,
+ "camel-jacksonxml");
}
@Override
@@ -712,17 +633,12 @@ public class SimpleCamelContext extends
AbstractCamelContext {
@Override
protected RestRegistryFactory createRestRegistryFactory() {
- Optional<RestRegistryFactory> result = ResolverHelper.resolveService(
+ return ResolverHelper.resolveMandatoryService(
getCamelContextReference(),
getCamelContextExtension().getBootstrapFactoryFinder(),
RestRegistryFactory.FACTORY,
- RestRegistryFactory.class);
-
- if (result.isPresent()) {
- return result.get();
- } else {
- throw new IllegalArgumentException("Cannot find
RestRegistryFactory on classpath. Add camel-rest to classpath.");
- }
+ RestRegistryFactory.class,
+ "camel-rest");
}
@Override
diff --git
a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionExpression.java
b/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionExpression.java
index 7b56bdf513db..6731f16e5b79 100644
---
a/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionExpression.java
+++
b/core/camel-core-languages/src/main/java/org/apache/camel/language/simple/ast/SimpleFunctionExpression.java
@@ -21,7 +21,6 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
-import java.util.Optional;
import java.util.StringJoiner;
import java.util.stream.Collectors;
@@ -394,31 +393,23 @@ public class SimpleFunctionExpression extends
LiteralExpression {
}
private Expression createSimpleAttachments(CamelContext camelContext,
String function) {
- Optional<SimpleLanguageFunctionFactory> factory =
ResolverHelper.resolveService(
+ SimpleLanguageFunctionFactory factory =
ResolverHelper.resolveMandatoryService(
camelContext,
camelContext.getCamelContextExtension().getBootstrapFactoryFinder(),
SimpleLanguageFunctionFactory.FACTORY + "/camel-attachments",
- SimpleLanguageFunctionFactory.class);
-
- if (factory.isEmpty()) {
- throw new IllegalArgumentException(
- "Cannot find SimpleLanguageFunctionFactory on classpath.
Add camel-attachments to classpath.");
- }
- return factory.get().createFunction(camelContext, function,
token.getIndex());
+ SimpleLanguageFunctionFactory.class,
+ "camel-attachments");
+ return factory.createFunction(camelContext, function,
token.getIndex());
}
private Expression createSimpleBase64(CamelContext camelContext, String
function) {
- Optional<SimpleLanguageFunctionFactory> factory =
ResolverHelper.resolveService(
+ SimpleLanguageFunctionFactory factory =
ResolverHelper.resolveMandatoryService(
camelContext,
camelContext.getCamelContextExtension().getBootstrapFactoryFinder(),
SimpleLanguageFunctionFactory.FACTORY + "/camel-base64",
- SimpleLanguageFunctionFactory.class);
-
- if (factory.isEmpty()) {
- throw new IllegalArgumentException(
- "Cannot find SimpleLanguageFunctionFactory on classpath.
Add camel-base64 to classpath.");
- }
- return factory.get().createFunction(camelContext, function,
token.getIndex());
+ SimpleLanguageFunctionFactory.class,
+ "camel-base64");
+ return factory.createFunction(camelContext, function,
token.getIndex());
}
private Expression createSimpleExpressionMessage(CamelContext
camelContext, String function, boolean strict) {
@@ -2594,31 +2585,23 @@ public class SimpleFunctionExpression extends
LiteralExpression {
}
private String createCodeAttachments(CamelContext camelContext, String
function) {
- Optional<SimpleLanguageFunctionFactory> factory =
ResolverHelper.resolveService(
+ SimpleLanguageFunctionFactory factory =
ResolverHelper.resolveMandatoryService(
camelContext,
camelContext.getCamelContextExtension().getBootstrapFactoryFinder(),
SimpleLanguageFunctionFactory.FACTORY + "/camel-attachments",
- SimpleLanguageFunctionFactory.class);
-
- if (factory.isEmpty()) {
- throw new IllegalArgumentException(
- "Cannot find SimpleLanguageFunctionFactory on classpath.
Add camel-attachments to classpath.");
- }
- return factory.get().createCode(camelContext, function,
token.getIndex());
+ SimpleLanguageFunctionFactory.class,
+ "camel-attachments");
+ return factory.createCode(camelContext, function, token.getIndex());
}
private String createCodeBase64(CamelContext camelContext, String
function) {
- Optional<SimpleLanguageFunctionFactory> factory =
ResolverHelper.resolveService(
+ SimpleLanguageFunctionFactory factory =
ResolverHelper.resolveMandatoryService(
camelContext,
camelContext.getCamelContextExtension().getBootstrapFactoryFinder(),
SimpleLanguageFunctionFactory.FACTORY + "/camel-base64",
- SimpleLanguageFunctionFactory.class);
-
- if (factory.isEmpty()) {
- throw new IllegalArgumentException(
- "Cannot find SimpleLanguageFunctionFactory on classpath.
Add camel-base64 to classpath.");
- }
- return factory.get().createCode(camelContext, function,
token.getIndex());
+ SimpleLanguageFunctionFactory.class,
+ "camel-base64");
+ return factory.createCode(camelContext, function, token.getIndex());
}
private String createCodeExpressionMisc(CamelContext camelContext, String
function) {
diff --git
a/core/camel-support/src/main/java/org/apache/camel/support/OAuthHelper.java
b/core/camel-support/src/main/java/org/apache/camel/support/OAuthHelper.java
index 6648c82d5328..912c868d91d3 100644
--- a/core/camel-support/src/main/java/org/apache/camel/support/OAuthHelper.java
+++ b/core/camel-support/src/main/java/org/apache/camel/support/OAuthHelper.java
@@ -40,14 +40,11 @@ public final class OAuthHelper {
* @throws Exception if the factory is not found or token acquisition
fails
*/
public static String resolveOAuthToken(CamelContext context, String
profileName) throws Exception {
- OAuthClientAuthenticationFactory factory =
ResolverHelper.resolveService(
+ OAuthClientAuthenticationFactory factory =
ResolverHelper.resolveMandatoryService(
context,
OAuthClientAuthenticationFactory.FACTORY,
- OAuthClientAuthenticationFactory.class)
- .orElseThrow(() -> new IllegalArgumentException(
- "Cannot find OAuthClientAuthenticationFactory. "
- + "Add
camel-oauth to the classpath to use oauthProfile."));
-
+ OAuthClientAuthenticationFactory.class,
+ "camel-oauth");
return factory.resolveToken(context, profileName);
}
}
diff --git
a/core/camel-support/src/main/java/org/apache/camel/support/ResolverHelper.java
b/core/camel-support/src/main/java/org/apache/camel/support/ResolverHelper.java
index 23cdf2e40b32..f39fa11880c2 100644
---
a/core/camel-support/src/main/java/org/apache/camel/support/ResolverHelper.java
+++
b/core/camel-support/src/main/java/org/apache/camel/support/ResolverHelper.java
@@ -20,6 +20,7 @@ import java.util.Optional;
import org.apache.camel.CamelContext;
import org.apache.camel.Component;
+import org.apache.camel.NoSuchServiceException;
import org.apache.camel.spi.DataFormat;
import org.apache.camel.spi.DataFormatFactory;
import org.apache.camel.spi.FactoryFinder;
@@ -148,6 +149,43 @@ public final class ResolverHelper {
factoryKey, factoryClass);
}
+ /**
+ * Create an instance of the given factory using the default factory finder
+ *
+ * @param camelContext the {@link CamelContext}
+ * @param factoryKey the key used top lookup the factory class
+ * @param factoryClass the type of the class
+ * @param jarName the JAR to add to the classpath if
service is missing
+ * @return an instance of the given factory
+ * @throws NoSuchServiceException is thrown if service is not found
+ */
+ public static <T> T resolveMandatoryService(
+ CamelContext camelContext, String factoryKey, Class<T>
factoryClass, String jarName)
+ throws NoSuchServiceException {
+ return resolveMandatoryService(camelContext,
camelContext.getCamelContextExtension().getDefaultFactoryFinder(),
+ factoryKey, factoryClass, jarName);
+ }
+
+ /**
+ * Create an instance of the given factory using the default factory finder
+ *
+ * @param camelContext the {@link CamelContext}
+ * @param factoryFinder the factory finder to use
+ * @param factoryKey the key used top lookup the factory class
+ * @param factoryClass the type of the class
+ * @param jarName the JAR to add to the classpath if
service is missing
+ * @return an instance of the given factory
+ * @throws NoSuchServiceException is thrown if service is not found
+ */
+ public static <T> T resolveMandatoryService(
+ CamelContext camelContext, FactoryFinder factoryFinder, String
factoryKey, Class<T> factoryClass, String jarName)
+ throws NoSuchServiceException {
+ return doResolveService(
+ camelContext,
+ factoryFinder,
+ factoryKey, factoryClass, false).orElseThrow(() -> new
NoSuchServiceException(factoryKey, jarName));
+ }
+
/**
* Create an instance of the given factory using the default factory finder
*
@@ -175,12 +213,32 @@ public final class ResolverHelper {
*/
public static <T> Optional<T> resolveService(
CamelContext camelContext, FactoryFinder factoryFinder, String
factoryKey, Class<T> factoryClass) {
+ return doResolveService(camelContext, factoryFinder, factoryKey,
factoryClass, true);
+ }
+
+ /**
+ * Create an instance of the given factory.
+ *
+ * @param camelContext the {@link CamelContext}
+ * @param factoryFinder the {@link FactoryFinder} to use
+ * @param factoryKey the key used top lookup the factory class
+ * @param factoryClass the type of the class
+ * @param optional whether the service is optional
+ * @return an instance fo the given factory
+ */
+ private static <T> Optional<T> doResolveService(
+ CamelContext camelContext, FactoryFinder factoryFinder, String
factoryKey, Class<T> factoryClass,
+ boolean optional) {
// use factory finder to find a custom implementations
Class<?> type = null;
try {
- type = factoryFinder.findClass(factoryKey).orElse(null);
+ if (optional) {
+ type =
factoryFinder.findOptionalClass(factoryKey).orElse(null);
+ } else {
+ type = factoryFinder.findClass(factoryKey).orElse(null);
+ }
} catch (Exception e) {
// ignore
}
diff --git
a/dsl/camel-kamelet-main/src/generated/resources/camel-factoryfinder-known-dependencies.properties
b/dsl/camel-kamelet-main/src/generated/resources/camel-factoryfinder-known-dependencies.properties
new file mode 100644
index 000000000000..58a5c88156a1
--- /dev/null
+++
b/dsl/camel-kamelet-main/src/generated/resources/camel-factoryfinder-known-dependencies.properties
@@ -0,0 +1,64 @@
+## ---------------------------------------------------------------------------
+## Licensed to the Apache Software Foundation (ASF) under one or more
+## contributor license agreements. See the NOTICE file distributed with
+## this work for additional information regarding copyright ownership.
+## The ASF licenses this file to You under the Apache License, Version 2.0
+## (the "License"); you may not use this file except in compliance with
+## the License. You may obtain a copy of the License at
+##
+## http://www.apache.org/licenses/LICENSE-2.0
+##
+## Unless required by applicable law or agreed to in writing, software
+## distributed under the License is distributed on an "AS IS" BASIS,
+## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+## See the License for the specific language governing permissions and
+## limitations under the License.
+## ---------------------------------------------------------------------------
+
+META-INF/services/org/apache/camel/bean-processor-factory=camel:bean
+META-INF/services/org/apache/camel/bean-proxy-factory=camel:bean
+META-INF/services/org/apache/camel/cloud/consul-service-discovery=camel:consul
+META-INF/services/org/apache/camel/cloud/dns-service-discovery=camel:dns
+META-INF/services/org/apache/camel/cloud/http-service-expression=camel:http
+META-INF/services/org/apache/camel/cloud/https-service-expression=camel:http
+META-INF/services/org/apache/camel/cloud/kubernetes-service-discovery=camel:kubernetes
+META-INF/services/org/apache/camel/cloud/netty-http-service-expression=camel:netty-http
+META-INF/services/org/apache/camel/cloud/undertow-service-expression=camel:undertow
+META-INF/services/org/apache/camel/cloud/zookeeper-service-discovery=camel:zookeeper
+META-INF/services/org/apache/camel/csimple-compiler=camel:csimple-joor
+META-INF/services/org/apache/camel/debugger-factory=camel:debug
+META-INF/services/org/apache/camel/file-adapter-factory=camel:file
+META-INF/services/org/apache/camel/groovy-script-compiler=camel:groovy
+META-INF/services/org/apache/camel/headers-map-factory=camel:headersmap
+META-INF/services/org/apache/camel/jandex-class-resolver=camel:jandex
+META-INF/services/org/apache/camel/jmx-rest-definition-resolver=camel:openapi-java
+META-INF/services/org/apache/camel/kafka-adapter-factory=camel:kafka
+META-INF/services/org/apache/camel/kafka-resume-strategy=camel:kafka
+META-INF/services/org/apache/camel/lra-saga-service=camel:lra
+META-INF/services/org/apache/camel/mdc-service=camel:mdc
+META-INF/services/org/apache/camel/micrometer-observability-tracer=camel:micrometer-observability
+META-INF/services/org/apache/camel/micrometer-prometheus=camel:micrometer-prometheus
+META-INF/services/org/apache/camel/mock-send-to-endpoint-strategy-factory=camel:mock
+META-INF/services/org/apache/camel/oauth-client-authentication-factory=camel:oauth
+META-INF/services/org/apache/camel/opentelemetry-tracer-2=camel:opentelemetry2
+META-INF/services/org/apache/camel/opentelemetry-tracer=camel:opentelemetry
+META-INF/services/org/apache/camel/periodic-task/hashicorp-secret-refresh=camel:hashicorp-vault
+META-INF/services/org/apache/camel/periodic-task/kubernetes-configmaps-refresh=camel:kubernetes
+META-INF/services/org/apache/camel/periodic-task/kubernetes-secret-refresh=camel:kubernetes
+META-INF/services/org/apache/camel/platform-http-engine=camel:platform-http-vertx
+META-INF/services/org/apache/camel/platform-http-server=camel:platform-http-main
+META-INF/services/org/apache/camel/platform-http/jolokia=camel:platform-http-jolokia
+META-INF/services/org/apache/camel/platform-http/plugin-registry=camel:platform-http
+META-INF/services/org/apache/camel/resilience4j-micrometer-factory=camel:resilience4j-micrometer
+META-INF/services/org/apache/camel/resource-resolver/bean=camel:bean
+META-INF/services/org/apache/camel/resource-resolver/gist=camel:resourceresolver-github
+META-INF/services/org/apache/camel/resource-resolver/github=camel:resourceresolver-github
+META-INF/services/org/apache/camel/rest-binding-jacksonxml-dataformat-factory=camel:jacksonxml
+META-INF/services/org/apache/camel/rest-binding-jaxb-dataformat-factory=camel:jaxb
+META-INF/services/org/apache/camel/rest-client-request-validator-factory=camel:openapi-validator
+META-INF/services/org/apache/camel/rest-client-response-validator-factory=camel:openapi-validator
+META-INF/services/org/apache/camel/rest-registry-factory=camel:rest
+META-INF/services/org/apache/camel/startup-step-recorder=camel:jfr
+META-INF/services/org/apache/camel/telemetry-dev-tracer=camel:telemetry-dev
+META-INF/services/org/apache/camel/thread-factory-listener=camel:opentelemetry
+META-INF/services/org/apache/camel/write-ahead-resume-strategy=camel:wal
diff --git
a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/KameletMain.java
b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/KameletMain.java
index 91ace180b2b7..f31ff10ddcae 100644
---
a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/KameletMain.java
+++
b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/KameletMain.java
@@ -43,6 +43,7 @@ import
org.apache.camel.main.download.BasePackageScanDownloadListener;
import org.apache.camel.main.download.CamelCustomClassLoader;
import org.apache.camel.main.download.CircuitBreakerDownloader;
import org.apache.camel.main.download.CommandLineDependencyDownloader;
+import org.apache.camel.main.download.DependencyDownloadFactoryFinderResolver;
import org.apache.camel.main.download.DependencyDownloaderClassLoader;
import org.apache.camel.main.download.DependencyDownloaderClassResolver;
import org.apache.camel.main.download.DependencyDownloaderComponentResolver;
@@ -631,6 +632,12 @@ public class KameletMain extends MainCommandLineSupport {
String springBootVersion = (String)
getInitialProperties().get(getInstanceType() + ".springBootVersion");
String quarkusVersion = (String)
getInitialProperties().get(getInstanceType() + ".quarkusVersion");
+ // factory finder that can autodownload from known dependencies
+ KnownDependenciesResolver ffKnownDeps = new
KnownDependenciesResolver(answer, springBootVersion, quarkusVersion);
+ ffKnownDeps.loadKnownFactoryFinderDependencies();
+ DependencyDownloadFactoryFinderResolver fr = new
DependencyDownloadFactoryFinderResolver(answer, ffKnownDeps);
+
answer.getCamelContextExtension().addContextPlugin(FactoryFinderResolver.class,
fr);
+
KnownDependenciesResolver knownDeps = new
KnownDependenciesResolver(answer, springBootVersion, quarkusVersion);
knownDeps.loadKnownDependencies();
DependencyDownloaderPropertyBindingListener listener
diff --git
a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloadFactoryFinder.java
b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloadFactoryFinder.java
new file mode 100644
index 000000000000..f91038333b12
--- /dev/null
+++
b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloadFactoryFinder.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.main.download;
+
+import java.util.Optional;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.impl.engine.DefaultFactoryFinder;
+import org.apache.camel.spi.ClassResolver;
+import org.apache.camel.spi.FactoryFinder;
+import org.apache.camel.tooling.maven.MavenGav;
+
+public class DependencyDownloadFactoryFinder extends DefaultFactoryFinder {
+
+ private final KnownDependenciesResolver knownDependenciesResolver;
+ private final DependencyDownloader downloader;
+
+ public DependencyDownloadFactoryFinder(CamelContext camelContext,
ClassResolver classResolver, String resourcePath,
+ KnownDependenciesResolver
knownDependenciesResolver) {
+ super(classResolver, resourcePath);
+ this.knownDependenciesResolver = knownDependenciesResolver;
+ this.downloader = camelContext.hasService(DependencyDownloader.class);
+ }
+
+ @Override
+ public Optional<Class<?>> findClass(String key) {
+ // this is not optional so we can auto download the JAR as it's
intended to be on the classpath
+ MavenGav gav =
knownDependenciesResolver.mavenGavForClass(FactoryFinder.DEFAULT_PATH + key);
+ if (gav != null) {
+ downloadLoader(gav.getGroupId(), gav.getArtifactId(),
gav.getVersion());
+ }
+ return super.findClass(key);
+ }
+
+ private void downloadLoader(String groupId, String artifactId, String
version) {
+ if (!downloader.alreadyOnClasspath(groupId, artifactId, version)) {
+ downloader.downloadDependency(groupId, artifactId, version);
+ }
+ }
+
+}
diff --git
a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloadFactoryFinderResolver.java
b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloadFactoryFinderResolver.java
new file mode 100644
index 000000000000..0502df7225d3
--- /dev/null
+++
b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloadFactoryFinderResolver.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.main.download;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.impl.engine.BootstrapFactoryFinder;
+import org.apache.camel.spi.ClassResolver;
+import org.apache.camel.spi.FactoryFinder;
+import org.apache.camel.spi.FactoryFinderResolver;
+
+public class DependencyDownloadFactoryFinderResolver implements
FactoryFinderResolver {
+
+ private final CamelContext camelContext;
+ private final KnownDependenciesResolver knownDeps;
+
+ public DependencyDownloadFactoryFinderResolver(CamelContext camelContext,
KnownDependenciesResolver knownDeps) {
+ this.camelContext = camelContext;
+ this.knownDeps = knownDeps;
+ }
+
+ @Override
+ public FactoryFinder resolveBootstrapFactoryFinder(ClassResolver
classResolver, String resourcePath) {
+ return new BootstrapFactoryFinder(classResolver, resourcePath);
+ }
+
+ @Override
+ public FactoryFinder resolveFactoryFinder(ClassResolver classResolver,
String resourcePath) {
+ return new DependencyDownloadFactoryFinder(camelContext,
classResolver, resourcePath, knownDeps);
+ }
+}
diff --git
a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/KnownDependenciesResolver.java
b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/KnownDependenciesResolver.java
index 35c4c8f962cd..cae1d090987a 100644
---
a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/KnownDependenciesResolver.java
+++
b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/KnownDependenciesResolver.java
@@ -44,6 +44,10 @@ public final class KnownDependenciesResolver {
doLoadKnownDependencies("camel-component-known-dependencies.properties");
}
+ public void loadKnownFactoryFinderDependencies() {
+
doLoadKnownDependencies("camel-factoryfinder-known-dependencies.properties");
+ }
+
private void doLoadKnownDependencies(String name) {
try {
Enumeration<URL> resources =
getClass().getClassLoader().getResources(name);
diff --git
a/dsl/camel-kamelet-main/src/main/resources/camel-main-known-dependencies.properties
b/dsl/camel-kamelet-main/src/main/resources/camel-main-known-dependencies.properties
index 1caa9011b5c4..1dc329a60c4c 100644
---
a/dsl/camel-kamelet-main/src/main/resources/camel-main-known-dependencies.properties
+++
b/dsl/camel-kamelet-main/src/main/resources/camel-main-known-dependencies.properties
@@ -21,6 +21,18 @@ org.springframework.stereotype.Component = camel:spring
org.springframework.beans.factory.annotation.Qualifier = camel:spring
org.springframework.stereotype.Service = camel:spring
org.springframework.beans.factory.annotation.Value = camel:spring
+org.springframework.amqp.rabbit.connection.CachingConnectionFactory =
camel:spring-rabbitmq
+org.springframework.jdbc.datasource.SimpleDriverDataSource = camel:sql
+spring.datasource.url =
org.springframework.boot:spring-boot-starter-jdbc:${spring-boot-version}
+
+quarkus.datasource.db-kind\=db2 =
io.quarkus:quarkus-jdbc-db2:${quarkus-version}
+quarkus.datasource.db-kind\=derby =
io.quarkus:quarkus-jdbc-derby:${quarkus-version}
+quarkus.datasource.db-kind\=h2 = io.quarkus:quarkus-jdbc-h2:${quarkus-version}
+quarkus.datasource.db-kind\=mariadb =
io.quarkus:quarkus-jdbc-mariadb:${quarkus-version}
+quarkus.datasource.db-kind\=mssql =
io.quarkus:quarkus-jdbc-mssql:${quarkus-version}
+quarkus.datasource.db-kind\=mysql =
io.quarkus:quarkus-jdbc-mysql:${quarkus-version}
+quarkus.datasource.db-kind\=oracle =
io.quarkus:quarkus-jdbc-oracle:${quarkus-version}
+quarkus.datasource.db-kind\=postgresql =
io.quarkus:quarkus-jdbc-postgresql:${quarkus-version}
jakarta.enterprise.context.ApplicationScoped =
io.quarkus:quarkus-core:${quarkus-version}
jakarta.inject.Inject = io.quarkus:quarkus-core:${quarkus-version}
@@ -29,39 +41,23 @@ jakarta.enterprise.inject.Produces =
io.quarkus:quarkus-core:${quarkus-version}
jakarta.inject.Singleton = io.quarkus:quarkus-core:${quarkus-version}
org.eclipse.microprofile.config.inject.ConfigProperty =
camel:microprofile-config
+META-INF/services/org/apache/camel/modelxml-dumper = camel:xml-io
+META-INF/services/org/apache/camel/modelyaml-dumper = camel:yaml-io
+META-INF/services/org/apache/camel/cron/cron-service = camel:quartz
+
com.amazon.redshift.jdbc.Driver = com.amazon.redshift:redshift-jdbc42:2.1.0.33
com.microsoft.sqlserver.jdbc.SQLServerDriver =
com.microsoft.sqlserver:mssql-jdbc:12.10.0.jre11
com.mysql.cj.jdbc.Driver =
com.mysql:mysql-connector-j:${debezium-mysql-connector-version}
+com.zaxxer.hikari.HikariDataSource = com.zaxxer:HikariCP:6.3.0
net.sf.saxon.xpath.XPathFactoryImpl = camel:saxon
-org.springframework.amqp.rabbit.connection.CachingConnectionFactory =
camel:spring-rabbitmq
+oracle.jdbc.driver.OracleDriver = com.oracle.database.jdbc:ojdbc17:23.8.0.25.04
org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory =
org.apache.activemq:artemis-jakarta-client-all:${activemq-artemis-version}
-org.messaginghub.pooled.jms.JmsPoolConnectionFactory =
org.messaginghub:pooled-jms:${pooled-jms-version}
+org.apache.camel.component.activemq.ActiveMQComponent\:embedded\=true =
org.apache.activemq:activemq-broker:${activemq-version}
+org.apache.camel.component.activemq6.ActiveMQComponent\:embedded\=true =
org.apache.activemq:activemq-broker:${activemq6-version}
+org.apache.camel.component.cxf.jaxrs.CxfRsEndpoint = camel:cxf-rest
+org.apache.camel.component.cxf.jaxws.CxfEndpoint = camel:cxf-soap
org.apache.commons.dbcp2.BasicDataSource =
org.apache.commons:commons-dbcp2:${commons-dbcp2-version}
org.apache.qpid.jms.JmsConnectionFactory =
org.apache.qpid:qpid-jms-client:${qpid-jms-client-version}
+org.messaginghub.pooled.jms.JmsPoolConnectionFactory =
org.messaginghub:pooled-jms:${pooled-jms-version}
org.postgresql.Driver = org.postgresql:postgresql:${pgjdbc-driver-version}
org.postgresql.ds.PGSimpleDataSource =
org.postgresql:postgresql:${pgjdbc-driver-version}
-org.apache.camel.component.cxf.jaxws.CxfEndpoint = camel:cxf-soap
-org.apache.camel.component.cxf.jaxrs.CxfRsEndpoint = camel:cxf-rest
-META-INF/services/org/apache/camel/oauth-client-authentication-factory =
camel:oauth
-META-INF/services/org/apache/camel/restapi/openapi = camel:openapi-java
-META-INF/services/org/apache/camel/modelxml-dumper = camel:xml-io
-META-INF/services/org/apache/camel/modelyaml-dumper = camel:yaml-io
-META-INF/services/org/apache/camel/micrometer-prometheus =
camel:micrometer-prometheus
-META-INF/services/org/apache/camel/cron/cron-service = camel:quartz
-META-INF/services/org/apache/camel/platform-http/jolokia =
camel:camel-platform-http-jolokia
-META-INF/services/org/apache/camel/jandex-class-resolver = camel:jandex
-META-INF/services/org/apache/camel/groovy-script-compiler = camel:groovy
-org.apache.camel.component.activemq.ActiveMQComponent\:embedded\=true =
org.apache.activemq:activemq-broker:${activemq-version}
-org.apache.camel.component.activemq6.ActiveMQComponent\:embedded\=true =
org.apache.activemq:activemq-broker:${activemq6-version}
-spring.datasource.url =
org.springframework.boot:spring-boot-starter-jdbc:${spring-boot-version}
-quarkus.datasource.db-kind\=db2 =
io.quarkus:quarkus-jdbc-db2:${quarkus-version}
-quarkus.datasource.db-kind\=derby =
io.quarkus:quarkus-jdbc-derby:${quarkus-version}
-quarkus.datasource.db-kind\=h2 = io.quarkus:quarkus-jdbc-h2:${quarkus-version}
-quarkus.datasource.db-kind\=mariadb =
io.quarkus:quarkus-jdbc-mariadb:${quarkus-version}
-quarkus.datasource.db-kind\=mssql =
io.quarkus:quarkus-jdbc-mssql:${quarkus-version}
-quarkus.datasource.db-kind\=mysql =
io.quarkus:quarkus-jdbc-mysql:${quarkus-version}
-quarkus.datasource.db-kind\=oracle =
io.quarkus:quarkus-jdbc-oracle:${quarkus-version}
-quarkus.datasource.db-kind\=postgresql =
io.quarkus:quarkus-jdbc-postgresql:${quarkus-version}
-org.springframework.jdbc.datasource.SimpleDriverDataSource = camel:sql
-oracle.jdbc.driver.OracleDriver = com.oracle.database.jdbc:ojdbc17:23.8.0.25.04
-com.zaxxer.hikari.HikariDataSource = com.zaxxer:HikariCP:6.3.0
\ No newline at end of file
diff --git
a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareKameletMainMojo.java
b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareKameletMainMojo.java
index aff5b0d3ec59..14fc2003efeb 100644
---
a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareKameletMainMojo.java
+++
b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/PrepareKameletMainMojo.java
@@ -27,6 +27,7 @@ import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.Objects;
import java.util.TreeSet;
import java.util.stream.Collectors;
@@ -46,6 +47,7 @@ import org.apache.maven.project.MavenProject;
import org.codehaus.plexus.build.BuildContext;
import static
org.apache.camel.maven.packaging.generics.PackagePluginUtils.joinHeaderAndSource;
+import static org.apache.camel.tooling.util.PackageHelper.findCamelDirectory;
import static org.apache.camel.tooling.util.PackageHelper.loadText;
/**
@@ -71,6 +73,9 @@ public class PrepareKameletMainMojo extends AbstractMojo {
@Parameter(defaultValue =
"${project.directory}/../../../catalog/camel-catalog")
protected File catalogDir;
+ @Parameter(defaultValue = "${project.directory}/../../../components")
+ protected File componentsDir;
+
@Parameter(defaultValue = "src/generated/")
protected File genDir;
@@ -95,6 +100,12 @@ public class PrepareKameletMainMojo extends AbstractMojo {
} catch (Exception e) {
throw new MojoFailureException("Error updating
camel-component-known-dependencies.properties", e);
}
+
+ try {
+ updateKnownFactoryFinders();
+ } catch (Exception e) {
+ throw new MojoFailureException("Error updating
camel-factoryfinder-known-dependencies.properties", e);
+ }
}
protected void updateKnownDependencies() throws Exception {
@@ -143,6 +154,27 @@ public class PrepareKameletMainMojo extends AbstractMojo {
writeSourceIfChanged(source, "resources",
"camel-component-known-dependencies.properties", genDir);
}
+ protected void updateKnownFactoryFinders() throws Exception {
+ List<String> lines = findFactoryFinder(componentsDir);
+
+ // remove duplicate
+ lines = lines.stream().distinct().collect(Collectors.toList());
+ // and sort
+ Collections.sort(lines);
+
+ getLog().info("Found " + lines.size() + " FactoryFinder @JdkService");
+
+ // load license header
+ try (InputStream is =
getClass().getClassLoader().getResourceAsStream("license-header.txt")) {
+ this.licenseHeader = loadText(is);
+ } catch (Exception e) {
+ throw new MojoFailureException("Error loading license-header.txt
file", e);
+ }
+
+ String source = String.join("\n", lines) + "\n";
+ writeSourceIfChanged(source, "resources",
"camel-factoryfinder-known-dependencies.properties", genDir);
+ }
+
protected boolean writeSourceIfChanged(String source, String filePath,
String fileName, File outputDir)
throws MojoFailureException {
Path target = outputDir.toPath().resolve(filePath).resolve(fileName);
@@ -178,4 +210,44 @@ public class PrepareKameletMainMojo extends AbstractMojo {
}
}
+ private static List<String> findFactoryFinder(File rootDir) {
+ List<String> answer = new ArrayList<>();
+
+ for (File f : Objects.requireNonNull(rootDir.listFiles())) {
+ String artifact = f.getName();
+ if (artifact.startsWith("camel-")) {
+ artifact = artifact.substring(6);
+ }
+ if (f.isDirectory()) {
+ File fd = findCamelDirectory(f,
"src/generated/resources/META-INF/services/org/apache/camel/");
+ if (fd != null && fd.isDirectory()) {
+ findFactoryFinder(answer, artifact, fd, null);
+ }
+ }
+ }
+
+ return answer;
+ }
+
+ private static void findFactoryFinder(List<String> answer, String
artifact, File dir, String subdir) {
+ for (File sf : Objects.requireNonNull(dir.listFiles())) {
+ if (sf.isFile() && !sf.getName().contains(".") &&
acceptFactoryFinderFile(sf.getName())) {
+ // service marker file
+ String path = subdir != null ? subdir + "/" + sf.getName() :
sf.getName();
+ answer.add("META-INF/services/org/apache/camel/" + path +
"=camel:" + artifact);
+ } else if (sf.isDirectory() &&
acceptFactoryFinderSubDir(sf.getName())) {
+ findFactoryFinder(answer, artifact, sf, sf.getName());
+ }
+ }
+ }
+
+ private static boolean acceptFactoryFinderSubDir(String name) {
+ return "cloud".equals(name) || "platform-http".equals(name) ||
"periodic-task".equals(name)
+ || "resource-resolver".equals(name);
+ }
+
+ private static boolean acceptFactoryFinderFile(String name) {
+ return !"TypeConverterLoader".equals(name) &&
!"reactive-executor".equals(name) && !"thread-pool-factory".equals(name);
+ }
+
}