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 2023/08/23 15:37:38 UTC

[camel] 01/04: Fixes (#11189)

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 <cl...@gmail.com>
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();
+        }
+    }
+
 }