This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch camel-4.0.x in repository https://gitbox.apache.org/repos/asf/camel.git
commit 9289b3af6e77663c1b6f5d9e288f06b1dbdfdf31 Author: Claus Ibsen <[email protected]> AuthorDate: Wed Aug 23 17:17:08 2023 +0200 Fixes (#11189) * CAMEL-19784: camel-core - PropertyBindingSupport - mandatory reference should fail if cannot resolve bean * Regen * CAMEL-19785: camel-yaml-dsl - Order of beans should not matter --- .../camel/support/PropertyBindingSupport.java | 4 ++ .../dsl/yaml/deserializers/BeansDeserializer.java | 71 ++++++++++++++++------ 2 files changed, 56 insertions(+), 19 deletions(-) diff --git a/core/camel-support/src/main/java/org/apache/camel/support/PropertyBindingSupport.java b/core/camel-support/src/main/java/org/apache/camel/support/PropertyBindingSupport.java index 1b2f7ee6d84..67d0a8179f4 100644 --- a/core/camel-support/src/main/java/org/apache/camel/support/PropertyBindingSupport.java +++ b/core/camel-support/src/main/java/org/apache/camel/support/PropertyBindingSupport.java @@ -542,6 +542,10 @@ public final class PropertyBindingSupport { // resolve property placeholders str = camelContext.resolvePropertyPlaceholders(str.toString()); } + if (str == null && reference && mandatory && !optional) { + // we could not resolve the reference and this is mandatory + throw new PropertyBindingException(target, key, value); + } value = str; } catch (Exception e) { // report the exception using the long key and parent target 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 e4bb570b140..7425de959f4 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 @@ -17,13 +17,12 @@ package org.apache.camel.dsl.yaml.deserializers; import java.util.ArrayList; -import java.util.List; -import org.apache.camel.CamelContext; import org.apache.camel.dsl.yaml.common.YamlDeserializationContext; import org.apache.camel.dsl.yaml.common.YamlDeserializerResolver; import org.apache.camel.dsl.yaml.common.YamlDeserializerSupport; import org.apache.camel.dsl.yaml.common.YamlSupport; +import org.apache.camel.model.Model; import org.apache.camel.model.app.RegistryBeanDefinition; import org.apache.camel.spi.CamelContextCustomizer; import org.apache.camel.spi.annotations.YamlIn; @@ -46,8 +45,8 @@ 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 List<CamelContextCustomizer> customizers = new ArrayList<>(); final YamlDeserializationContext dc = getDeserializationContext(node); for (Node item : sn.getValue()) { @@ -61,24 +60,10 @@ public class BeansDeserializer extends YamlDeserializerSupport implements Constr bean.setType("#class:" + bean.getType()); } - customizers.add(new CamelContextCustomizer() { - @Override - public void configure(CamelContext camelContext) { - try { - // to support hot reloading of beans then we need to unbind old existing first - String name = bean.getName(); - camelContext.getRegistry().unbind(name); - camelContext.getRegistry().bind( - name, - newInstance(bean, camelContext)); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - }); + answer.addBean(bean); } - return YamlSupport.customizer(customizers); + return answer; } public Object newInstance(RegistryBeanDefinition bean, CamelContext context) throws Exception { @@ -91,4 +76,52 @@ public class BeansDeserializer extends YamlDeserializerSupport implements Constr return target; } + protected void registerBean( + CamelContext camelContext, + List<RegistryBeanDefinition> delayedRegistrations, + RegistryBeanDefinition def, boolean delayIfFailed) { + try { + // to support hot reloading of beans then we need to unbind old existing first + String name = def.getName(); + Object bean = newInstance(def, camelContext); + camelContext.getRegistry().unbind(name); + camelContext.getRegistry().bind(name, bean); + + // register bean in model + Model model = camelContext.getCamelContextExtension().getContextPlugin(Model.class); + model.addRegistryBean(def); + + } catch (Exception e) { + if (delayIfFailed) { + delayedRegistrations.add(def); + } else { + throw new RuntimeException(e); + } + } + } + + private class BeansCustomizer implements CamelContextCustomizer { + + private final List<RegistryBeanDefinition> delayedRegistrations = new ArrayList<>(); + private final List<RegistryBeanDefinition> beans = new ArrayList<>(); + + public void addBean(RegistryBeanDefinition bean) { + beans.add(bean); + } + + @Override + public void configure(CamelContext camelContext) { + // first-pass of creating beans + for (RegistryBeanDefinition bean : beans) { + registerBean(camelContext, delayedRegistrations, bean, true); + } + beans.clear(); + // second-pass of creating beans should fail if not possible + for (RegistryBeanDefinition bean : delayedRegistrations) { + registerBean(camelContext, delayedRegistrations, bean, false); + } + delayedRegistrations.clear(); + } + } + }
