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();
+ }
+ }
+
}