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 d6bb1b12c6d8 CAMEL-23008 (#21453)
d6bb1b12c6d8 is described below
commit d6bb1b12c6d8d452f3ed4c0c64bdd60fd681def1
Author: Claus Ibsen <[email protected]>
AuthorDate: Sun Feb 15 19:18:18 2026 +0100
CAMEL-23008 (#21453)
* CAMEL-23008: camel-jbang - Transform route that refers to beans via
#class should be possible
---
.../docs/modules/eips/pages/multicast-eip.adoc | 1 +
.../org/apache/camel/reifier/AbstractReifier.java | 18 ++++--
.../org/apache/camel/support/EndpointHelper.java | 9 ++-
.../apache/camel/main/stub/BeanStubReifier.java | 66 ---------------------
...KameletStubReifier.java => StubEipReifier.java} | 67 +++++++++++++++++++---
.../java/org/apache/camel/main/KameletMain.java | 10 +---
.../camel/dsl/yaml/validator/CamelYamlParser.java | 11 ++--
7 files changed, 90 insertions(+), 92 deletions(-)
diff --git
a/core/camel-core-engine/src/main/docs/modules/eips/pages/multicast-eip.adoc
b/core/camel-core-engine/src/main/docs/modules/eips/pages/multicast-eip.adoc
index e80eb6ac65f0..851eab8702d0 100644
--- a/core/camel-core-engine/src/main/docs/modules/eips/pages/multicast-eip.adoc
+++ b/core/camel-core-engine/src/main/docs/modules/eips/pages/multicast-eip.adoc
@@ -61,6 +61,7 @@ XML::
----
YAML::
++
[source,yaml]
----
- route:
diff --git
a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/AbstractReifier.java
b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/AbstractReifier.java
index f76ca5a68488..802b60040a53 100644
---
a/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/AbstractReifier.java
+++
b/core/camel-core-reifier/src/main/java/org/apache/camel/reifier/AbstractReifier.java
@@ -187,11 +187,15 @@ public abstract class AbstractReifier implements
BeanRepository {
}
name = parseString(name);
+ Object answer = null;
if (EndpointHelper.isReferenceParameter(name)) {
- return EndpointHelper.resolveReferenceParameter(camelContext,
name, Object.class, false);
- } else {
+ answer = EndpointHelper.resolveReferenceParameter(camelContext,
name, Object.class, false);
+ }
+ if (answer == null) {
+ // fallback to use registry which allows tooling to influence
reifier that uses beans or classes
return getRegistry().lookupByName(name);
}
+ return answer;
}
public <T> T lookupByNameAndType(String name, Class<T> type) {
@@ -200,11 +204,15 @@ public abstract class AbstractReifier implements
BeanRepository {
}
name = parseString(name);
+ T answer = null;
if (EndpointHelper.isReferenceParameter(name)) {
- return EndpointHelper.resolveReferenceParameter(camelContext,
name, type, false);
- } else {
- return getRegistry().lookupByNameAndType(name, type);
+ answer = EndpointHelper.resolveReferenceParameter(camelContext,
name, type, false);
+ }
+ if (answer == null) {
+ // fallback to use registry which allows tooling to influence
reifier that uses beans or classes
+ answer = getRegistry().lookupByNameAndType(name, type);
}
+ return answer;
}
@Override
diff --git
a/core/camel-support/src/main/java/org/apache/camel/support/EndpointHelper.java
b/core/camel-support/src/main/java/org/apache/camel/support/EndpointHelper.java
index e061826597a8..284eee27cf5b 100644
---
a/core/camel-support/src/main/java/org/apache/camel/support/EndpointHelper.java
+++
b/core/camel-support/src/main/java/org/apache/camel/support/EndpointHelper.java
@@ -413,7 +413,7 @@ public final class EndpointHelper {
factoryMethod = StringHelper.after(className, "#");
className = StringHelper.before(className, "#");
}
- Class<?> clazz =
camelContext.getClassResolver().resolveMandatoryClass(className);
+ Class<?> clazz =
camelContext.getClassResolver().resolveClass(className);
Class<?> factoryClass = null;
if (factoryMethod != null) {
String typeOrRef = StringHelper.before(factoryMethod, ":");
@@ -425,11 +425,16 @@ public final class EndpointHelper {
if (existing != null) {
factoryClass = existing.getClass();
} else {
- factoryClass =
camelContext.getClassResolver().resolveMandatoryClass(typeOrRef);
+ factoryClass =
camelContext.getClassResolver().resolveClass(typeOrRef);
}
}
}
+ if (clazz == null && factoryClass == null) {
+ // cannot create bean from class
+ return null;
+ }
+
if (factoryMethod != null && parameters != null) {
Class<?> target = factoryClass != null ? factoryClass : clazz;
answer =
PropertyBindingSupport.newInstanceFactoryParameters(camelContext, target,
factoryMethod, parameters);
diff --git
a/dsl/camel-kamelet-main-support/src/main/java/org/apache/camel/main/stub/BeanStubReifier.java
b/dsl/camel-kamelet-main-support/src/main/java/org/apache/camel/main/stub/BeanStubReifier.java
deleted file mode 100644
index b8935aacb2b4..000000000000
---
a/dsl/camel-kamelet-main-support/src/main/java/org/apache/camel/main/stub/BeanStubReifier.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * 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.stub;
-
-import org.apache.camel.Expression;
-import org.apache.camel.Predicate;
-import org.apache.camel.Processor;
-import org.apache.camel.builder.ExpressionBuilder;
-import org.apache.camel.builder.PredicateBuilder;
-import org.apache.camel.model.BeanDefinition;
-import org.apache.camel.model.language.MethodCallExpression;
-import org.apache.camel.processor.DisabledProcessor;
-import org.apache.camel.reifier.ProcessorReifier;
-import org.apache.camel.reifier.language.ExpressionReifier;
-
-public class BeanStubReifier {
-
- private BeanStubReifier() {
- }
-
- public static void registerStubBeanReifiers() {
- ExpressionReifier.registerReifier(MethodCallExpression.class,
(camelContext, expressionDefinition) -> {
- if (expressionDefinition instanceof MethodCallExpression) {
- return new ExpressionReifier<>(camelContext,
expressionDefinition) {
- @Override
- public Expression createExpression() {
- return ExpressionBuilder.constantExpression(null);
- }
-
- @Override
- public Predicate createPredicate() {
- return PredicateBuilder.constant(true);
- }
- };
- }
- return null;
- });
- ProcessorReifier.registerReifier(BeanDefinition.class,
- (route, processorDefinition) -> {
- if (processorDefinition instanceof BeanDefinition bd) {
- return new ProcessorReifier<>(route, bd) {
- @Override
- public Processor createProcessor() throws
Exception {
- return new DisabledProcessor();
- }
- };
- }
- return null;
- });
- }
-
-}
diff --git
a/dsl/camel-kamelet-main-support/src/main/java/org/apache/camel/main/stub/KameletStubReifier.java
b/dsl/camel-kamelet-main-support/src/main/java/org/apache/camel/main/stub/StubEipReifier.java
similarity index 50%
rename from
dsl/camel-kamelet-main-support/src/main/java/org/apache/camel/main/stub/KameletStubReifier.java
rename to
dsl/camel-kamelet-main-support/src/main/java/org/apache/camel/main/stub/StubEipReifier.java
index a918c36dc53b..5383cc71c261 100644
---
a/dsl/camel-kamelet-main-support/src/main/java/org/apache/camel/main/stub/KameletStubReifier.java
+++
b/dsl/camel-kamelet-main-support/src/main/java/org/apache/camel/main/stub/StubEipReifier.java
@@ -17,21 +17,76 @@
package org.apache.camel.main.stub;
import org.apache.camel.CamelContext;
+import org.apache.camel.Expression;
import org.apache.camel.NamedNode;
+import org.apache.camel.Predicate;
import org.apache.camel.Processor;
import org.apache.camel.Route;
+import org.apache.camel.builder.ExpressionBuilder;
+import org.apache.camel.builder.PredicateBuilder;
+import org.apache.camel.model.BeanDefinition;
import org.apache.camel.model.KameletDefinition;
+import org.apache.camel.model.ThrowExceptionDefinition;
+import org.apache.camel.model.language.MethodCallExpression;
import org.apache.camel.processor.DisabledProcessor;
import org.apache.camel.reifier.ProcessorReifier;
+import org.apache.camel.reifier.language.ExpressionReifier;
import org.apache.camel.spi.ProcessorFactory;
import org.apache.camel.support.PluginHelper;
-public class KameletStubReifier {
+public class StubEipReifier {
- private KameletStubReifier() {
+ private StubEipReifier() {
}
- public static void registerStubKameletReifiers(CamelContext context) {
+ public static void registerStubEipReifiers(final CamelContext
camelContext) {
+
+ // bean language (method call) refers to custom classes which we don't
want to load or require being on classpath
+ ExpressionReifier.registerReifier(MethodCallExpression.class,
(context, expressionDefinition) -> {
+ if (expressionDefinition instanceof MethodCallExpression) {
+ return new ExpressionReifier<>(camelContext,
expressionDefinition) {
+ @Override
+ public Expression createExpression() {
+ return ExpressionBuilder.constantExpression(null);
+ }
+
+ @Override
+ public Predicate createPredicate() {
+ return PredicateBuilder.constant(true);
+ }
+ };
+ }
+ return null;
+ });
+ ProcessorReifier.registerReifier(BeanDefinition.class,
+ // bean refers to custom classes which we don't want to load
or require being on classpath
+ (route, processorDefinition) -> {
+ if (processorDefinition instanceof BeanDefinition bd) {
+ return new ProcessorReifier<>(route, bd) {
+ @Override
+ public Processor createProcessor() throws
Exception {
+ return new DisabledProcessor();
+ }
+ };
+ }
+ return null;
+ });
+
+ ProcessorReifier.registerReifier(ThrowExceptionDefinition.class,
+ // throw exception to custom classes which we don't want to
load or require being on classpath
+ (route, processorDefinition) -> {
+ if (processorDefinition instanceof
ThrowExceptionDefinition td) {
+ return new ProcessorReifier<>(route, td) {
+ @Override
+ public Processor createProcessor() throws
Exception {
+ return new DisabledProcessor();
+ }
+ };
+ }
+ return null;
+ });
+
+ // kamelet EIP should be stubbed
ProcessorReifier.registerReifier(KameletDefinition.class,
(route, processorDefinition) -> {
if (processorDefinition instanceof KameletDefinition kd) {
@@ -44,10 +99,9 @@ public class KameletStubReifier {
}
return null;
});
-
// stub kamelet process factory also
- final ProcessorFactory fac = PluginHelper.getProcessorFactory(context);
-
context.getCamelContextExtension().addContextPlugin(ProcessorFactory.class, new
ProcessorFactory() {
+ final ProcessorFactory fac =
PluginHelper.getProcessorFactory(camelContext);
+
camelContext.getCamelContextExtension().addContextPlugin(ProcessorFactory.class,
new ProcessorFactory() {
@Override
public Processor createChildProcessor(Route route, NamedNode
definition, boolean mandatory) throws Exception {
if (definition instanceof KameletDefinition) {
@@ -72,7 +126,6 @@ public class KameletStubReifier {
return fac.createProcessor(camelContext, definitionName, args);
}
});
-
}
}
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 ffb188b9e754..6d949b81481a 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
@@ -78,9 +78,8 @@ import org.apache.camel.main.download.TransactedDownloader;
import org.apache.camel.main.download.TypeConverterLoaderDownloadListener;
import org.apache.camel.main.injection.AnnotationDependencyInjection;
import org.apache.camel.main.reload.OpenApiGeneratorReloadStrategy;
-import org.apache.camel.main.stub.BeanStubReifier;
-import org.apache.camel.main.stub.KameletStubReifier;
import org.apache.camel.main.stub.StubBeanRepository;
+import org.apache.camel.main.stub.StubEipReifier;
import org.apache.camel.main.util.ClipboardReloadStrategy;
import org.apache.camel.main.util.ExtraClassesClassLoader;
import org.apache.camel.main.util.ExtraFilesClassLoader;
@@ -492,11 +491,8 @@ public class KameletMain extends MainCommandLineSupport {
// turn off inlining routes
configure().rest().withInlineRoutes(false);
blueprintXmlBeansHandler.setTransform(true);
- // stub beans
- BeanStubReifier.registerStubBeanReifiers();
- // stub kamelet EIP
- KameletStubReifier.registerStubKameletReifiers(answer);
- // stub languages
+ // stub EIPs
+ StubEipReifier.registerStubEipReifiers(answer);
}
if (silent) {
// silent should not include http server
diff --git
a/dsl/camel-yaml-dsl/camel-yaml-dsl-validator/src/main/java/org/apache/camel/dsl/yaml/validator/CamelYamlParser.java
b/dsl/camel-yaml-dsl/camel-yaml-dsl-validator/src/main/java/org/apache/camel/dsl/yaml/validator/CamelYamlParser.java
index de355b21ef70..43b3abefa64e 100644
---
a/dsl/camel-yaml-dsl/camel-yaml-dsl-validator/src/main/java/org/apache/camel/dsl/yaml/validator/CamelYamlParser.java
+++
b/dsl/camel-yaml-dsl/camel-yaml-dsl-validator/src/main/java/org/apache/camel/dsl/yaml/validator/CamelYamlParser.java
@@ -26,10 +26,9 @@ import org.apache.camel.CamelContext;
import org.apache.camel.component.stub.StubComponent;
import org.apache.camel.dsl.yaml.YamlRoutesBuilderLoader;
import org.apache.camel.impl.DefaultCamelContext;
-import org.apache.camel.main.stub.BeanStubReifier;
-import org.apache.camel.main.stub.KameletStubReifier;
import org.apache.camel.main.stub.StubBeanRepository;
import org.apache.camel.main.stub.StubDataFormat;
+import org.apache.camel.main.stub.StubEipReifier;
import org.apache.camel.main.stub.StubLanguage;
import org.apache.camel.main.stub.StubTransformer;
import org.apache.camel.spi.ComponentResolver;
@@ -64,11 +63,13 @@ public class CamelYamlParser {
(name, context) -> new StubLanguage());
camelContext.getCamelContextExtension().addContextPlugin(TransformerResolver.class,
(name, context) -> new StubTransformer());
- camelContext.start();
+ // stub EIPs
+ StubEipReifier.registerStubEipReifiers(camelContext);
- BeanStubReifier.registerStubBeanReifiers();
- KameletStubReifier.registerStubKameletReifiers(camelContext);
+ // start camel
+ camelContext.start();
+ // load yaml to validate
try (YamlRoutesBuilderLoader loader = new
YamlRoutesBuilderLoader()) {
loader.setCamelContext(camelContext);
loader.start();