This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch blueprint in repository https://gitbox.apache.org/repos/asf/camel.git
commit cee4cdd2fc41d716cc14e31f3c1a23518379a7ac Author: Claus Ibsen <[email protected]> AuthorDate: Wed Aug 30 13:58:33 2023 +0200 camel-jbang - Allow to load OSGi <blueprint> with embedded <camelContext> --- .../xml/blueprint/BlueprintXmlBeansHandler.java | 60 +++++++++++++++++++--- 1 file changed, 52 insertions(+), 8 deletions(-) diff --git a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/xml/blueprint/BlueprintXmlBeansHandler.java b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/xml/blueprint/BlueprintXmlBeansHandler.java index 9316a5df26a..7fb611d959c 100644 --- a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/xml/blueprint/BlueprintXmlBeansHandler.java +++ b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/xml/blueprint/BlueprintXmlBeansHandler.java @@ -16,7 +16,9 @@ */ package org.apache.camel.main.xml.blueprint; +import java.util.ArrayList; import java.util.LinkedHashMap; +import java.util.List; import java.util.Map; import java.util.StringJoiner; import java.util.regex.Matcher; @@ -34,6 +36,7 @@ import org.apache.camel.model.Model; import org.apache.camel.model.app.RegistryBeanDefinition; import org.apache.camel.spi.Resource; import org.apache.camel.spi.ResourceLoader; +import org.apache.camel.support.PropertyBindingSupport; import org.apache.camel.util.StringHelper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -51,6 +54,7 @@ public class BlueprintXmlBeansHandler { // that's why some beans should be processed later private final Map<String, Node> delayedBeans = new LinkedHashMap<>(); private final Map<String, Resource> resources = new LinkedHashMap<>(); + private final List<RegistryBeanDefinition> delayedRegistrations = new ArrayList<>(); /** * Parses the XML documents and discovers blueprint beans, which will be created manually via Camel. @@ -78,16 +82,20 @@ public class BlueprintXmlBeansHandler { for (Map.Entry<String, Node> entry : delayedBeans.entrySet()) { String id = entry.getKey(); Node n = entry.getValue(); - RegistryBeanDefinition bean = createBeanModel(camelContext, id, n); - // create bean and register to camel - - LOG.info("Creating bean: {}", bean); - // TODO: create bean from the model + RegistryBeanDefinition def = createBeanModel(camelContext, id, n); + LOG.info("Creating bean: {}", def); + registerBeanDefinition(camelContext, def, true); + } - // register bean into model (as a BeanRegistry that allows Camel DSL to know about these beans) - Model model = camelContext.getCamelContextExtension().getContextPlugin(Model.class); - model.addRegistryBean(bean); + if (!delayedRegistrations.isEmpty()) { + // some of the beans were not available yet, so we have to try register them now + for (RegistryBeanDefinition def : delayedRegistrations) { + LOG.info("Creating bean (2nd-try): {}", def); + registerBeanDefinition(camelContext, def, false); + } + delayedRegistrations.clear(); } + } private RegistryBeanDefinition createBeanModel(CamelContext camelContext, String name, Node node) { @@ -179,4 +187,40 @@ public class BlueprintXmlBeansHandler { return val; } + /** + * Try to instantiate bean from the definition. + */ + private void registerBeanDefinition(CamelContext camelContext, RegistryBeanDefinition def, boolean delayIfFailed) { + String type = def.getType(); + String name = def.getName(); + if (name == null || name.trim().isEmpty()) { + name = type; + } + if (type != null) { + if (!type.startsWith("#")) { + type = "#class:" + type; + } + try { + final Object target = PropertyBindingSupport.resolveBean(camelContext, type); + + if (def.getProperties() != null && !def.getProperties().isEmpty()) { + PropertyBindingSupport.setPropertiesOnTarget(camelContext, target, def.getProperties()); + } + camelContext.getRegistry().unbind(name); + camelContext.getRegistry().bind(name, target); + + // register bean in model + Model model = camelContext.getCamelContextExtension().getContextPlugin(Model.class); + model.addRegistryBean(def); + + } catch (Exception e) { + if (delayIfFailed) { + delayedRegistrations.add(def); + } else { + LOG.warn("Error creating bean: {} due to: {}. This exception is ignored.", type, e.getMessage(), e); + } + } + } + } + }
