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

davsclaus pushed a commit to branch bean-loader
in repository https://gitbox.apache.org/repos/asf/camel.git

commit dbbc5c0631dbe903e0865f79b84acd58fd90ac45
Author: Claus Ibsen <claus.ib...@gmail.com>
AuthorDate: Tue Sep 19 11:09:52 2023 +0200

    CAMEL-19846: yaml and xml DSL - Add support for BeanLoader so they can 
define beans that can be used for advanced global configuration on camel 
context which the legacy spring/blueprint XML DSL can do.
---
 .../main/java/org/apache/camel/spi/BeanLoader.java |  34 +++++
 .../camel/dsl/support/AutoConfigureBeanLoader.java | 146 +++++++++++++++++++++
 .../dsl/support/RouteBuilderLoaderSupport.java     |  18 +++
 .../camel/dsl/xml/io/XmlRoutesBuilderLoader.java   |   5 +
 .../dsl/xml/io/MessageHistoryFactoryTest.java      |  47 +++++++
 .../camel/dsl/xml/io/messageHistoryFactory.xml     |  33 +++++
 .../yaml/common/YamlDeserializationContext.java    |  10 ++
 .../dsl/yaml/deserializers/BeansDeserializer.java  |  18 ++-
 .../camel/dsl/yaml/YamlRoutesBuilderLoader.java    |   2 +-
 .../dsl/yaml/YamlRoutesBuilderLoaderSupport.java   |   9 +-
 .../dsl/yaml/MessageHistoryFactoryTest.groovy      |  49 +++++++
 .../org/apache/camel/dsl/yaml/TryTest.groovy       |   2 +-
 12 files changed, 366 insertions(+), 7 deletions(-)

diff --git a/core/camel-api/src/main/java/org/apache/camel/spi/BeanLoader.java 
b/core/camel-api/src/main/java/org/apache/camel/spi/BeanLoader.java
new file mode 100644
index 00000000000..4fd129733dc
--- /dev/null
+++ b/core/camel-api/src/main/java/org/apache/camel/spi/BeanLoader.java
@@ -0,0 +1,34 @@
+/*
+ * 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.spi;
+
+/**
+ * SPI for loading beans from a {@link Resource}.
+ *
+ * For example with YAML or XML DSL.
+ */
+public interface BeanLoader {
+
+    /**
+     * The loaded bean which typically has been bound to the {@link Registry}.
+     *
+     * @param name name of the bean
+     * @param bean the bean instance
+     */
+    void onLoadedBean(String name, Object bean);
+
+}
diff --git 
a/dsl/camel-dsl-support/src/main/java/org/apache/camel/dsl/support/AutoConfigureBeanLoader.java
 
b/dsl/camel-dsl-support/src/main/java/org/apache/camel/dsl/support/AutoConfigureBeanLoader.java
new file mode 100644
index 00000000000..3a41ffd622a
--- /dev/null
+++ 
b/dsl/camel-dsl-support/src/main/java/org/apache/camel/dsl/support/AutoConfigureBeanLoader.java
@@ -0,0 +1,146 @@
+/*
+ * 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.dsl.support;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.CamelContextAware;
+import org.apache.camel.ExtendedCamelContext;
+import org.apache.camel.TypeConverters;
+import org.apache.camel.spi.AsyncProcessorAwaitManager;
+import org.apache.camel.spi.BacklogTracer;
+import org.apache.camel.spi.BeanLoader;
+import org.apache.camel.spi.ClassResolver;
+import org.apache.camel.spi.CliConnectorFactory;
+import org.apache.camel.spi.Debugger;
+import org.apache.camel.spi.EndpointStrategy;
+import org.apache.camel.spi.EventFactory;
+import org.apache.camel.spi.EventNotifier;
+import org.apache.camel.spi.ExchangeFactory;
+import org.apache.camel.spi.ExecutorServiceManager;
+import org.apache.camel.spi.FactoryFinderResolver;
+import org.apache.camel.spi.InflightRepository;
+import org.apache.camel.spi.LogListener;
+import org.apache.camel.spi.ManagementObjectNameStrategy;
+import org.apache.camel.spi.ManagementStrategy;
+import org.apache.camel.spi.MessageHistoryFactory;
+import org.apache.camel.spi.ModelJAXBContextFactory;
+import org.apache.camel.spi.NodeIdFactory;
+import org.apache.camel.spi.ProcessorFactory;
+import org.apache.camel.spi.PropertiesComponent;
+import org.apache.camel.spi.ReactiveExecutor;
+import org.apache.camel.spi.RouteController;
+import org.apache.camel.spi.RoutePolicyFactory;
+import org.apache.camel.spi.RuntimeEndpointRegistry;
+import org.apache.camel.spi.ShutdownStrategy;
+import org.apache.camel.spi.StartupStepRecorder;
+import org.apache.camel.spi.ThreadPoolFactory;
+import org.apache.camel.spi.UnitOfWorkFactory;
+import org.apache.camel.spi.UuidGenerator;
+
+/**
+ * This {@link BeanLoader} is used by YAML and XML DSL when they have beans in 
their DSLs, which are beans for advanced
+ * auto configuration of {@link CamelContext}.
+ */
+public class AutoConfigureBeanLoader implements BeanLoader, CamelContextAware {
+
+    private CamelContext camelContext;
+
+    @Override
+    public CamelContext getCamelContext() {
+        return camelContext;
+    }
+
+    @Override
+    public void setCamelContext(CamelContext camelContext) {
+        this.camelContext = camelContext;
+    }
+
+    @Override
+    public void onLoadedBean(String name, Object bean) {
+        // similar logic (almost) to 
DefaultConfigurationConfigurer.afterConfigure
+
+        ExtendedCamelContext ecc = camelContext.getCamelContextExtension();
+        ManagementStrategy managementStrategy = 
camelContext.getManagementStrategy();
+
+        if (bean instanceof StartupStepRecorder ssr) {
+            ecc.setStartupStepRecorder(ssr);
+        } else if (bean instanceof CliConnectorFactory ccf) {
+            ecc.addContextPlugin(CliConnectorFactory.class, ccf);
+        } else if (bean instanceof PropertiesComponent pc) {
+            camelContext.setPropertiesComponent(pc);
+        } else if (bean instanceof BacklogTracer bt) {
+            ecc.addContextPlugin(BacklogTracer.class, bt);
+        } else if (bean instanceof InflightRepository ifr) {
+            camelContext.setInflightRepository(ifr);
+        } else if (bean instanceof AsyncProcessorAwaitManager am) {
+            ecc.addContextPlugin(AsyncProcessorAwaitManager.class, am);
+        } else if (bean instanceof ManagementStrategy ms) {
+            camelContext.setManagementStrategy(ms);
+        } else if (bean instanceof ManagementObjectNameStrategy mos) {
+            managementStrategy.setManagementObjectNameStrategy(mos);
+        } else if (bean instanceof EventFactory ef) {
+            managementStrategy.setEventFactory(ef);
+        } else if (bean instanceof UnitOfWorkFactory uowf) {
+            ecc.addContextPlugin(UnitOfWorkFactory.class, uowf);
+        } else if (bean instanceof RuntimeEndpointRegistry rer) {
+            camelContext.setRuntimeEndpointRegistry(rer);
+        } else if (bean instanceof ModelJAXBContextFactory jf) {
+            ecc.addContextPlugin(ModelJAXBContextFactory.class, jf);
+        } else if (bean instanceof ClassResolver cr) {
+            camelContext.setClassResolver(cr);
+        } else if (bean instanceof FactoryFinderResolver ffr) {
+            ecc.addContextPlugin(FactoryFinderResolver.class, ffr);
+        } else if (bean instanceof RouteController rc) {
+            camelContext.setRouteController(rc);
+        } else if (bean instanceof UuidGenerator ug) {
+            camelContext.setUuidGenerator(ug);
+        } else if (bean instanceof ExecutorServiceManager em) {
+            camelContext.setExecutorServiceManager(em);
+        } else if (bean instanceof ThreadPoolFactory tpf) {
+            camelContext.getExecutorServiceManager().setThreadPoolFactory(tpf);
+        } else if (bean instanceof ProcessorFactory pf) {
+            ecc.addContextPlugin(ProcessorFactory.class, pf);
+        } else if (bean instanceof Debugger deb) {
+            camelContext.setDebugger(deb);
+        } else if (bean instanceof NodeIdFactory nf) {
+            ecc.addContextPlugin(NodeIdFactory.class, nf);
+        } else if (bean instanceof MessageHistoryFactory mf) {
+            camelContext.setMessageHistoryFactory(mf);
+        } else if (bean instanceof ReactiveExecutor re) {
+            ecc.setReactiveExecutor(re);
+        } else if (bean instanceof ShutdownStrategy ss) {
+            camelContext.setShutdownStrategy(ss);
+        } else if (bean instanceof ExchangeFactory ef) {
+            ecc.setExchangeFactory(ef);
+        } else if (bean instanceof TypeConverters tc) {
+            camelContext.getTypeConverterRegistry().addTypeConverters(tc);
+        } else if (bean instanceof EventNotifier en) {
+            managementStrategy.addEventNotifier(en);
+        } else if (bean instanceof EndpointStrategy es) {
+            ecc.registerEndpointCallback(es);
+        } else if (bean instanceof RoutePolicyFactory rpf) {
+            camelContext.addRoutePolicyFactory(rpf);
+        } else if (bean instanceof LogListener ll) {
+            boolean contains = ecc.getLogListeners() != null
+                    && ecc.getLogListeners().contains(ll);
+            if (!contains) {
+                ecc.addLogListener(ll);
+            }
+        }
+    }
+
+}
diff --git 
a/dsl/camel-dsl-support/src/main/java/org/apache/camel/dsl/support/RouteBuilderLoaderSupport.java
 
b/dsl/camel-dsl-support/src/main/java/org/apache/camel/dsl/support/RouteBuilderLoaderSupport.java
index 6ea89eebc72..c37a5e54357 100644
--- 
a/dsl/camel-dsl-support/src/main/java/org/apache/camel/dsl/support/RouteBuilderLoaderSupport.java
+++ 
b/dsl/camel-dsl-support/src/main/java/org/apache/camel/dsl/support/RouteBuilderLoaderSupport.java
@@ -30,6 +30,7 @@ import org.apache.camel.StartupStep;
 import org.apache.camel.api.management.ManagedAttribute;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.builder.RouteBuilderLifecycleStrategy;
+import org.apache.camel.spi.BeanLoader;
 import org.apache.camel.spi.CompilePostProcessor;
 import org.apache.camel.spi.Resource;
 import org.apache.camel.spi.RoutesBuilderLoader;
@@ -44,6 +45,7 @@ public abstract class RouteBuilderLoaderSupport extends 
RoutesBuilderLoaderSuppo
     private final List<CompilePostProcessor> compilePostProcessors = new 
ArrayList<>();
     private StartupStepRecorder recorder;
     private SourceLoader sourceLoader = new DefaultSourceLoader();
+    private BeanLoader beanLoader;
 
     protected RouteBuilderLoaderSupport(String extension) {
         this.extension = extension;
@@ -70,12 +72,21 @@ public abstract class RouteBuilderLoaderSupport extends 
RoutesBuilderLoaderSuppo
         this.compilePostProcessors.add(preProcessor);
     }
 
+    public BeanLoader getBeanLoader() {
+        return beanLoader;
+    }
+
+    public void setBeanLoader(BeanLoader beanLoader) {
+        this.beanLoader = beanLoader;
+    }
+
     @Override
     protected void doBuild() throws Exception {
         super.doBuild();
 
         if (getCamelContext() != null) {
             this.recorder = 
getCamelContext().getCamelContextExtension().getStartupStepRecorder();
+            this.beanLoader = new AutoConfigureBeanLoader();
         }
     }
 
@@ -96,6 +107,13 @@ public abstract class RouteBuilderLoaderSupport extends 
RoutesBuilderLoaderSuppo
             if (sl != null) {
                 this.sourceLoader = sl;
             }
+            CamelContextAware.trySetCamelContext(this.sourceLoader, 
getCamelContext());
+            // discover a special bean loader to be used
+            BeanLoader bl = 
getCamelContext().getRegistry().findSingleByType(BeanLoader.class);
+            if (bl != null) {
+                this.beanLoader = bl;
+            }
+            CamelContextAware.trySetCamelContext(this.beanLoader, 
getCamelContext());
         }
     }
 
diff --git 
a/dsl/camel-xml-io-dsl/src/main/java/org/apache/camel/dsl/xml/io/XmlRoutesBuilderLoader.java
 
b/dsl/camel-xml-io-dsl/src/main/java/org/apache/camel/dsl/xml/io/XmlRoutesBuilderLoader.java
index 3dace301432..db718bd56d0 100644
--- 
a/dsl/camel-xml-io-dsl/src/main/java/org/apache/camel/dsl/xml/io/XmlRoutesBuilderLoader.java
+++ 
b/dsl/camel-xml-io-dsl/src/main/java/org/apache/camel/dsl/xml/io/XmlRoutesBuilderLoader.java
@@ -336,6 +336,11 @@ public class XmlRoutesBuilderLoader extends 
RouteBuilderLoaderSupport {
                 Model model = 
getCamelContext().getCamelContextExtension().getContextPlugin(Model.class);
                 model.addRegistryBean(def);
 
+                // notify about bean loaded
+                if (getBeanLoader() != null) {
+                    getBeanLoader().onLoadedBean(name, target);
+                }
+
             } catch (Exception e) {
                 if (delayIfFailed) {
                     delayedRegistrations.add(def);
diff --git 
a/dsl/camel-xml-io-dsl/src/test/java/org/apache/camel/dsl/xml/io/MessageHistoryFactoryTest.java
 
b/dsl/camel-xml-io-dsl/src/test/java/org/apache/camel/dsl/xml/io/MessageHistoryFactoryTest.java
new file mode 100644
index 00000000000..9820079c860
--- /dev/null
+++ 
b/dsl/camel-xml-io-dsl/src/test/java/org/apache/camel/dsl/xml/io/MessageHistoryFactoryTest.java
@@ -0,0 +1,47 @@
+/*
+ * 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.dsl.xml.io;
+
+import org.apache.camel.impl.DefaultCamelContext;
+import org.apache.camel.spi.Resource;
+import org.apache.camel.support.PluginHelper;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+public class MessageHistoryFactoryTest {
+
+    @Test
+    public void testMessageHistoryFactoryTest() throws Exception {
+        try (DefaultCamelContext context = new DefaultCamelContext()) {
+            context.start();
+
+            assertFalse(context.getMessageHistoryFactory().isCopyMessage());
+
+            // load route from XML and add them to the existing camel context
+            Resource resource = 
PluginHelper.getResourceLoader(context).resolveResource(
+                    "/org/apache/camel/dsl/xml/io/messageHistoryFactory.xml");
+
+            PluginHelper.getRoutesLoader(context).loadRoutes(resource);
+
+            // the loaded route has a bean that change the factory to copy 
enabled
+            assertTrue(context.getMessageHistoryFactory().isCopyMessage());
+        }
+    }
+
+}
diff --git 
a/dsl/camel-xml-io-dsl/src/test/resources/org/apache/camel/dsl/xml/io/messageHistoryFactory.xml
 
b/dsl/camel-xml-io-dsl/src/test/resources/org/apache/camel/dsl/xml/io/messageHistoryFactory.xml
new file mode 100644
index 00000000000..3eff389d2a4
--- /dev/null
+++ 
b/dsl/camel-xml-io-dsl/src/test/resources/org/apache/camel/dsl/xml/io/messageHistoryFactory.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<camel xmlns="http://camel.apache.org/schema/spring";>
+
+    <bean name="myMessageHistoryFactory" 
type="org.apache.camel.impl.engine.DefaultMessageHistoryFactory">
+        <properties>
+            <property key="copyMessage" value="true"/>
+        </properties>
+    </bean>
+
+    <route messageHistory="true">
+        <from uri="timer:yaml?period=5000"/>
+        <to uri="log:test"/>
+    </route>
+
+</camel>
diff --git 
a/dsl/camel-yaml-dsl/camel-yaml-dsl-common/src/main/java/org/apache/camel/dsl/yaml/common/YamlDeserializationContext.java
 
b/dsl/camel-yaml-dsl/camel-yaml-dsl-common/src/main/java/org/apache/camel/dsl/yaml/common/YamlDeserializationContext.java
index e4882c943b6..c5d5c0399da 100644
--- 
a/dsl/camel-yaml-dsl/camel-yaml-dsl-common/src/main/java/org/apache/camel/dsl/yaml/common/YamlDeserializationContext.java
+++ 
b/dsl/camel-yaml-dsl/camel-yaml-dsl-common/src/main/java/org/apache/camel/dsl/yaml/common/YamlDeserializationContext.java
@@ -32,6 +32,7 @@ import org.apache.camel.Service;
 import org.apache.camel.dsl.yaml.common.exception.DuplicateKeyException;
 import org.apache.camel.dsl.yaml.common.exception.UnknownNodeIdException;
 import org.apache.camel.dsl.yaml.common.exception.YamlDeserializationException;
+import org.apache.camel.spi.BeanLoader;
 import org.apache.camel.spi.Resource;
 import org.apache.camel.util.ObjectHelper;
 import org.snakeyaml.engine.v2.api.ConstructNode;
@@ -48,6 +49,7 @@ public class YamlDeserializationContext extends 
StandardConstructor implements C
     private final Map<String, ConstructNode> constructors;
     private CamelContext camelContext;
     private Resource resource;
+    private BeanLoader beanLoader;
 
     public YamlDeserializationContext(LoadSettings settings) {
         super(settings);
@@ -75,6 +77,14 @@ public class YamlDeserializationContext extends 
StandardConstructor implements C
         this.resource = resource;
     }
 
+    public BeanLoader getBeanLoader() {
+        return beanLoader;
+    }
+
+    public void setBeanLoader(BeanLoader beanLoader) {
+        this.beanLoader = beanLoader;
+    }
+
     @Override
     public CamelContext getCamelContext() {
         return camelContext;
diff --git 
a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/BeansDeserializer.java
 
b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/BeansDeserializer.java
index 13c0e91a76a..e080745594c 100644
--- 
a/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/BeansDeserializer.java
+++ 
b/dsl/camel-yaml-dsl/camel-yaml-dsl-deserializers/src/main/java/org/apache/camel/dsl/yaml/deserializers/BeansDeserializer.java
@@ -25,6 +25,7 @@ import 
org.apache.camel.dsl.yaml.common.YamlDeserializerResolver;
 import org.apache.camel.dsl.yaml.common.YamlDeserializerSupport;
 import org.apache.camel.model.Model;
 import org.apache.camel.model.app.RegistryBeanDefinition;
+import org.apache.camel.spi.BeanLoader;
 import org.apache.camel.spi.CamelContextCustomizer;
 import org.apache.camel.spi.annotations.YamlIn;
 import org.apache.camel.spi.annotations.YamlProperty;
@@ -46,9 +47,9 @@ import org.snakeyaml.engine.v2.nodes.SequenceNode;
 public class BeansDeserializer extends YamlDeserializerSupport implements 
ConstructNode {
     @Override
     public Object construct(Node node) {
-        final BeansCustomizer answer = new BeansCustomizer();
         final SequenceNode sn = asSequenceNode(node);
         final YamlDeserializationContext dc = getDeserializationContext(node);
+        final BeansCustomizer answer = new BeansCustomizer(dc != null ? 
dc.getBeanLoader() : null);
 
         for (Node item : sn.getValue()) {
             setDeserializationContext(item, dc);
@@ -82,6 +83,7 @@ public class BeansDeserializer extends 
YamlDeserializerSupport implements Constr
 
     protected void registerBean(
             CamelContext camelContext,
+            BeanLoader beanLoader,
             List<RegistryBeanDefinition> delayedRegistrations,
             RegistryBeanDefinition def, boolean delayIfFailed) {
         try {
@@ -95,6 +97,11 @@ public class BeansDeserializer extends 
YamlDeserializerSupport implements Constr
             Model model = 
camelContext.getCamelContextExtension().getContextPlugin(Model.class);
             model.addRegistryBean(def);
 
+            // notify about bean loaded
+            if (beanLoader != null) {
+                beanLoader.onLoadedBean(name, bean);
+            }
+
         } catch (Exception e) {
             if (delayIfFailed) {
                 delayedRegistrations.add(def);
@@ -106,9 +113,14 @@ public class BeansDeserializer extends 
YamlDeserializerSupport implements Constr
 
     private class BeansCustomizer implements CamelContextCustomizer {
 
+        private final BeanLoader beanLoader;
         private final List<RegistryBeanDefinition> delayedRegistrations = new 
ArrayList<>();
         private final List<RegistryBeanDefinition> beans = new ArrayList<>();
 
+        public BeansCustomizer(BeanLoader beanLoader) {
+            this.beanLoader = beanLoader;
+        }
+
         public void addBean(RegistryBeanDefinition bean) {
             beans.add(bean);
         }
@@ -117,12 +129,12 @@ public class BeansDeserializer extends 
YamlDeserializerSupport implements Constr
         public void configure(CamelContext camelContext) {
             // first-pass of creating beans
             for (RegistryBeanDefinition bean : beans) {
-                registerBean(camelContext, delayedRegistrations, bean, true);
+                registerBean(camelContext, beanLoader, delayedRegistrations, 
bean, true);
             }
             beans.clear();
             // second-pass of creating beans should fail if not possible
             for (RegistryBeanDefinition bean : delayedRegistrations) {
-                registerBean(camelContext, delayedRegistrations, bean, false);
+                registerBean(camelContext, beanLoader, delayedRegistrations, 
bean, false);
             }
             delayedRegistrations.clear();
         }
diff --git 
a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/main/java/org/apache/camel/dsl/yaml/YamlRoutesBuilderLoader.java
 
b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/main/java/org/apache/camel/dsl/yaml/YamlRoutesBuilderLoader.java
index a3239d737ae..53f453bc4cc 100644
--- 
a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/main/java/org/apache/camel/dsl/yaml/YamlRoutesBuilderLoader.java
+++ 
b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/main/java/org/apache/camel/dsl/yaml/YamlRoutesBuilderLoader.java
@@ -850,7 +850,7 @@ public class YamlRoutesBuilderLoader extends 
YamlRoutesBuilderLoaderSupport {
 
         try (InputStream is = resourceInputStream(resource)) {
             LoadSettings local = 
LoadSettings.builder().setLabel(resource.getLocation()).build();
-            YamlDeserializationContext ctx = 
newYamlDeserializationContext(local, resource);
+            YamlDeserializationContext ctx = 
newYamlDeserializationContext(local, resource, getBeanLoader());
             StreamReader reader = new StreamReader(local, new 
YamlUnicodeReader(is));
             Parser parser = new ParserImpl(local, reader);
             Composer composer = new Composer(local, parser);
diff --git 
a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/main/java/org/apache/camel/dsl/yaml/YamlRoutesBuilderLoaderSupport.java
 
b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/main/java/org/apache/camel/dsl/yaml/YamlRoutesBuilderLoaderSupport.java
index bb7998c615d..8c35e5f8bff 100644
--- 
a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/main/java/org/apache/camel/dsl/yaml/YamlRoutesBuilderLoaderSupport.java
+++ 
b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/main/java/org/apache/camel/dsl/yaml/YamlRoutesBuilderLoaderSupport.java
@@ -28,6 +28,7 @@ import 
org.apache.camel.dsl.yaml.common.YamlDeserializationContext;
 import org.apache.camel.dsl.yaml.common.exception.YamlDeserializationException;
 import org.apache.camel.dsl.yaml.deserializers.CustomResolver;
 import org.apache.camel.dsl.yaml.deserializers.ModelDeserializersResolver;
+import org.apache.camel.spi.BeanLoader;
 import org.apache.camel.spi.Resource;
 import org.snakeyaml.engine.v2.api.LoadSettings;
 import org.snakeyaml.engine.v2.api.YamlUnicodeReader;
@@ -47,10 +48,14 @@ public abstract class YamlRoutesBuilderLoaderSupport 
extends RouteBuilderLoaderS
         super(extension);
     }
 
-    protected YamlDeserializationContext 
newYamlDeserializationContext(LoadSettings settings, Resource resource) {
+    protected YamlDeserializationContext newYamlDeserializationContext(
+            LoadSettings settings,
+            Resource resource,
+            BeanLoader beanLoader) {
         YamlDeserializationContext ctx = new 
YamlDeserializationContext(settings);
 
         ctx.setResource(resource);
+        ctx.setBeanLoader(beanLoader);
         ctx.setCamelContext(getCamelContext());
         ctx.addResolvers(new CustomResolver());
         ctx.addResolvers(new ModelDeserializersResolver());
@@ -67,7 +72,7 @@ public abstract class YamlRoutesBuilderLoaderSupport extends 
RouteBuilderLoaderS
             // need a local settings because we want the label to be the 
resource we parse so the parser
             // can show parsing errors referring to actual resource file being 
parsed.
             LoadSettings local = 
LoadSettings.builder().setLabel(resource.getLocation()).build();
-            final YamlDeserializationContext ctx = 
newYamlDeserializationContext(local, resource);
+            final YamlDeserializationContext ctx = 
newYamlDeserializationContext(local, resource, getBeanLoader());
             final StreamReader reader = new StreamReader(local, new 
YamlUnicodeReader(is));
             final Parser parser = new ParserImpl(local, reader);
             final Composer composer = new Composer(local, parser);
diff --git 
a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/MessageHistoryFactoryTest.groovy
 
b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/MessageHistoryFactoryTest.groovy
new file mode 100644
index 00000000000..56161b3d9dc
--- /dev/null
+++ 
b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/MessageHistoryFactoryTest.groovy
@@ -0,0 +1,49 @@
+/*
+ * 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.dsl.yaml
+
+import org.apache.camel.dsl.yaml.support.YamlTestSupport
+import org.apache.camel.model.WireTapDefinition
+import org.junit.jupiter.api.Assertions
+
+class MessageHistoryFactoryTest extends YamlTestSupport {
+
+    def "messageHistoryFactory bean"() {
+        setup:
+            loadRoutes '''
+                - beans: 
+                  - name: messageHistoryFactory
+                    type: 
org.apache.camel.impl.engine.DefaultMessageHistoryFactory
+                    properties: 
+                      copyMessage: true
+                - route: 
+                    messageHistory: true
+                    from: 
+                      uri: "timer:yaml"
+                      parameters: 
+                        period: "3000"
+                      steps: 
+                        - to: 
+                            uri: "log:test"
+            '''
+        when:
+            context.start()
+        then:
+            context.getMessageHistoryFactory().copyMessage == true
+    }
+
+}
diff --git 
a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/TryTest.groovy
 
b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/TryTest.groovy
index 73e13e02ba1..552c2bd3674 100644
--- 
a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/TryTest.groovy
+++ 
b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/TryTest.groovy
@@ -216,7 +216,7 @@ class TryTest extends YamlTestSupport {
         }
     }
 
-    def "Error: kebab-case: do-catch"() {
+    def "Error: kebab-case: do-catch2"() {
         when:
         var route = '''
                 - from:

Reply via email to