You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2026/02/15 15:38:23 UTC

(camel) branch jc created (now dc469462a8bf)

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

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


      at dc469462a8bf CAMEL-23008: camel-jbang - Transform route that refers to beans via #class should be possible

This branch includes the following new commits:

     new dc469462a8bf CAMEL-23008: camel-jbang - Transform route that refers to beans via #class should be possible

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



(camel) 01/01: CAMEL-23008: camel-jbang - Transform route that refers to beans via #class should be possible

Posted by da...@apache.org.
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 <cl...@gmail.com>
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();