This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch jc in repository https://gitbox.apache.org/repos/asf/camel.git
commit dc469462a8bfda9a61ff8298129418ec302e3c90 Author: Claus Ibsen <[email protected]> AuthorDate: Sun Feb 15 16:38:07 2026 +0100 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..44cea83adbe6 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 @@ -27,6 +27,7 @@ import java.util.Optional; import java.util.TreeMap; import java.util.stream.Stream; +import org.apache.camel.main.stub.StubEipReifier; import org.w3c.dom.Document; import org.apache.camel.CamelContext; @@ -78,8 +79,6 @@ 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.util.ClipboardReloadStrategy; import org.apache.camel.main.util.ExtraClassesClassLoader; @@ -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();
