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: