This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/camel.git
commit 65c003958d1f0b1d19d44ded4524a65c66e2138e Author: Claus Ibsen <[email protected]> AuthorDate: Mon Apr 19 13:30:33 2021 +0200 CAMEL-16527: Unable to disable component or endpoint autowiring with camel-main --- .../impl/engine/AutowiredLifecycleStrategy.java | 55 ++++++++++++++++++++-- 1 file changed, 51 insertions(+), 4 deletions(-) diff --git a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AutowiredLifecycleStrategy.java b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AutowiredLifecycleStrategy.java index 73da22f..574b329 100644 --- a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AutowiredLifecycleStrategy.java +++ b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AutowiredLifecycleStrategy.java @@ -16,11 +16,14 @@ */ package org.apache.camel.impl.engine; +import java.util.HashMap; +import java.util.Map; import java.util.Set; import org.apache.camel.CamelContext; import org.apache.camel.Component; import org.apache.camel.ExtendedCamelContext; +import org.apache.camel.VetoCamelContextStartException; import org.apache.camel.spi.DataFormat; import org.apache.camel.spi.Language; import org.apache.camel.spi.PropertyConfigurer; @@ -33,14 +36,60 @@ class AutowiredLifecycleStrategy extends LifecycleStrategySupport { private static final Logger LOG = LoggerFactory.getLogger(AutowiredLifecycleStrategy.class); + // provisional maps to hold components, dataformats, languages that are created during + // starting camel, but need to defer autowiring until later in case additional configuration + // would turn this per instance + private final Map<String, Component> autowrieComponents = new HashMap<>(); + private final Map<String, DataFormat> autowrieDataFormats = new HashMap<>(); + private final Map<String, Language> autowrieLanguages = new HashMap<>(); private final ExtendedCamelContext camelContext; + private volatile boolean initialized; public AutowiredLifecycleStrategy(CamelContext camelContext) { this.camelContext = (ExtendedCamelContext) camelContext; } @Override + public void onContextInitialized(CamelContext context) throws VetoCamelContextStartException { + // we are initializd so lets do autowiring on what we have collected during bootstrap + autowrieComponents.forEach(this::autowireComponent); + autowrieDataFormats.forEach(this::autowireDataFormat); + autowrieLanguages.forEach(this::autowireLanguage); + autowrieComponents.clear(); + autowrieDataFormats.clear(); + autowrieLanguages.clear(); + // we are now done initialized + initialized = true; + } + + @Override public void onComponentAdd(String name, Component component) { + if (initialized) { + autowireComponent(name, component); + } else { + autowrieComponents.put(name, component); + } + } + + @Override + public void onDataFormatCreated(String name, DataFormat dataFormat) { + if (initialized) { + autowireDataFormat(name, dataFormat); + } else { + autowrieDataFormats.put(name, dataFormat); + } + } + + @Override + public void onLanguageCreated(String name, Language language) { + if (initialized) { + autowireLanguage(name, language); + } else { + autowrieLanguages.put(name, language); + } + } + + private void autowireComponent(String name, Component component) { // autowiring can be turned off on context level and per component boolean enabled = camelContext.isAutowiredEnabled() && component.isAutowiredEnabled(); if (enabled) { @@ -48,8 +97,7 @@ class AutowiredLifecycleStrategy extends LifecycleStrategySupport { } } - @Override - public void onDataFormatCreated(String name, DataFormat dataFormat) { + private void autowireDataFormat(String name, DataFormat dataFormat) { // autowiring can be turned off on context level boolean enabled = camelContext.isAutowiredEnabled(); if (enabled) { @@ -57,8 +105,7 @@ class AutowiredLifecycleStrategy extends LifecycleStrategySupport { } } - @Override - public void onLanguageCreated(String name, Language language) { + private void autowireLanguage(String name, Language language) { // autowiring can be turned off on context level boolean enabled = camelContext.isAutowiredEnabled(); if (enabled) {
