You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by or...@apache.org on 2023/04/01 06:47:05 UTC

[camel] branch main updated (dd6d84461e7 -> 078b00ae3fa)

This is an automated email from the ASF dual-hosted git repository.

orpiske pushed a change to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git


    from dd6d84461e7 fixed results of inspection "HashMap can be substituted with EnumMap" (#9744)
     new 12dcb345497 CAMEL-15105: make the ModelJAXBContextFactory a plugin of the context
     new 0f6bcbed35c CAMEL-15105: added support for lazy initialization of plugins
     new 078b00ae3fa CAMEL-15105: make the ModelineFactory a plugin of the context

The 3 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../camel/spring/CamelContextFactoryBeanTest.java  |  3 +-
 .../org/apache/camel/ExtendedCamelContext.java     | 35 ++++------------
 .../java/org/apache/camel/spi/PluginManager.java   | 10 +++++
 .../camel/impl/engine/AbstractCamelContext.java    |  4 +-
 .../impl/engine/DefaultCamelContextExtension.java  | 48 ++++++----------------
 .../impl/engine/DefaultContextPluginManager.java   |  7 ++++
 .../camel/impl/engine/DefaultRoutesLoader.java     |  3 +-
 .../camel/impl/ExtendedCamelContextConfigurer.java | 12 ------
 .../impl/lw/LightweightCamelContextExtension.java  | 28 +++----------
 .../core/xml/AbstractCamelContextFactoryBean.java  |  2 +-
 .../CamelContextAddRestDefinitionsFromXmlTest.java |  3 +-
 ...CamelContextAddRouteDefinitionsFromXmlTest.java |  3 +-
 .../camel/main/DefaultConfigurationConfigurer.java |  2 +-
 .../org/apache/camel/main/RoutesConfigurer.java    |  4 +-
 .../org/apache/camel/support/PluginHelper.java     | 35 ++++++++++++++++
 .../java/org/apache/camel/xml/jaxb/JaxbHelper.java |  3 +-
 .../camel/dsl/modeline/ModelineParserTest.java     |  3 +-
 17 files changed, 96 insertions(+), 109 deletions(-)


[camel] 01/03: CAMEL-15105: make the ModelJAXBContextFactory a plugin of the context

Posted by or...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

orpiske pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git

commit 12dcb345497a864ad82aba16a7e19fb3a0c80138
Author: Otavio Rodolfo Piske <an...@gmail.com>
AuthorDate: Fri Mar 31 16:26:20 2023 +0200

    CAMEL-15105: make the ModelJAXBContextFactory a plugin of the context
---
 .../camel/spring/CamelContextFactoryBeanTest.java     |  3 ++-
 .../java/org/apache/camel/ExtendedCamelContext.java   | 15 ---------------
 .../camel/impl/engine/AbstractCamelContext.java       |  1 -
 .../impl/engine/DefaultCamelContextExtension.java     | 18 ------------------
 .../apache/camel/impl/engine/SimpleCamelContext.java  |  1 +
 .../camel/impl/ExtendedCamelContextConfigurer.java    |  6 ------
 .../impl/lw/LightweightCamelContextExtension.java     | 11 -----------
 .../core/xml/AbstractCamelContextFactoryBean.java     |  2 +-
 .../CamelContextAddRestDefinitionsFromXmlTest.java    |  3 ++-
 .../CamelContextAddRouteDefinitionsFromXmlTest.java   |  3 ++-
 .../camel/main/DefaultConfigurationConfigurer.java    |  2 +-
 .../java/org/apache/camel/support/PluginHelper.java   | 19 +++++++++++++++++++
 .../java/org/apache/camel/xml/jaxb/JaxbHelper.java    |  3 ++-
 13 files changed, 30 insertions(+), 57 deletions(-)

diff --git a/components/camel-spring-xml/src/test/java/org/apache/camel/spring/CamelContextFactoryBeanTest.java b/components/camel-spring-xml/src/test/java/org/apache/camel/spring/CamelContextFactoryBeanTest.java
index 7b6e3d1d7fe..0dcb9248d96 100644
--- a/components/camel-spring-xml/src/test/java/org/apache/camel/spring/CamelContextFactoryBeanTest.java
+++ b/components/camel-spring-xml/src/test/java/org/apache/camel/spring/CamelContextFactoryBeanTest.java
@@ -20,6 +20,7 @@ import org.apache.camel.spi.ModelJAXBContextFactory;
 import org.apache.camel.spi.UuidGenerator;
 import org.apache.camel.spring.xml.CamelContextFactoryBean;
 import org.apache.camel.support.DefaultUuidGenerator;
+import org.apache.camel.support.PluginHelper;
 import org.apache.camel.support.SimpleUuidGenerator;
 import org.apache.camel.xml.jaxb.DefaultModelJAXBContextFactory;
 import org.junit.jupiter.api.BeforeEach;
@@ -68,7 +69,7 @@ public class CamelContextFactoryBeanTest {
         factory.afterPropertiesSet();
 
         ModelJAXBContextFactory modelJAXBContextFactory
-                = factory.getContext().getCamelContextExtension().getModelJAXBContextFactory();
+                = PluginHelper.getModelJAXBContextFactory(factory.getContext());
 
         assertTrue(modelJAXBContextFactory instanceof CustomModelJAXBContextFactory);
     }
diff --git a/core/camel-api/src/main/java/org/apache/camel/ExtendedCamelContext.java b/core/camel-api/src/main/java/org/apache/camel/ExtendedCamelContext.java
index d52b281ef58..7e08346dd92 100644
--- a/core/camel-api/src/main/java/org/apache/camel/ExtendedCamelContext.java
+++ b/core/camel-api/src/main/java/org/apache/camel/ExtendedCamelContext.java
@@ -43,7 +43,6 @@ import org.apache.camel.spi.InternalProcessorFactory;
 import org.apache.camel.spi.LifecycleStrategy;
 import org.apache.camel.spi.LogListener;
 import org.apache.camel.spi.ManagementMBeanAssembler;
-import org.apache.camel.spi.ModelJAXBContextFactory;
 import org.apache.camel.spi.ModelToXMLDumper;
 import org.apache.camel.spi.ModelineFactory;
 import org.apache.camel.spi.NormalizedEndpointUri;
@@ -421,20 +420,6 @@ public interface ExtendedCamelContext {
      */
     void setRouteFactory(RouteFactory routeFactory);
 
-    /**
-     * Returns the JAXB Context factory used to create Models.
-     *
-     * @return the JAXB Context factory used to create Models.
-     */
-    ModelJAXBContextFactory getModelJAXBContextFactory();
-
-    /**
-     * Sets a custom JAXB Context factory to be used
-     *
-     * @param modelJAXBContextFactory a JAXB Context factory
-     */
-    void setModelJAXBContextFactory(ModelJAXBContextFactory modelJAXBContextFactory);
-
     /**
      * Gets the {@link DeferServiceFactory} to use.
      */
diff --git a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java
index 2c54e962502..cf55bfc9aec 100644
--- a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java
+++ b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java
@@ -232,7 +232,6 @@ public abstract class AbstractCamelContext extends BaseService
     volatile InterceptEndpointFactory interceptEndpointFactory;
     volatile RouteFactory routeFactory;
     volatile AsyncProcessorAwaitManager asyncProcessorAwaitManager;
-    volatile ModelJAXBContextFactory modelJAXBContextFactory;
     volatile UnitOfWorkFactory unitOfWorkFactory;
     volatile BeanIntrospection beanIntrospection;
     volatile boolean eventNotificationApplicable;
diff --git a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultCamelContextExtension.java b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultCamelContextExtension.java
index 64e2e66d19e..21c0d1f15cc 100644
--- a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultCamelContextExtension.java
+++ b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultCamelContextExtension.java
@@ -62,7 +62,6 @@ import org.apache.camel.spi.LogListener;
 import org.apache.camel.spi.ManagementMBeanAssembler;
 import org.apache.camel.spi.ManagementStrategy;
 import org.apache.camel.spi.ManagementStrategyFactory;
-import org.apache.camel.spi.ModelJAXBContextFactory;
 import org.apache.camel.spi.ModelToXMLDumper;
 import org.apache.camel.spi.ModelineFactory;
 import org.apache.camel.spi.NormalizedEndpointUri;
@@ -368,23 +367,6 @@ class DefaultCamelContextExtension implements ExtendedCamelContext {
         return factories.computeIfAbsent(path, camelContext::createFactoryFinder);
     }
 
-    @Override
-    public ModelJAXBContextFactory getModelJAXBContextFactory() {
-        if (camelContext.modelJAXBContextFactory == null) {
-            synchronized (camelContext.lock) {
-                if (camelContext.modelJAXBContextFactory == null) {
-                    setModelJAXBContextFactory(camelContext.createModelJAXBContextFactory());
-                }
-            }
-        }
-        return camelContext.modelJAXBContextFactory;
-    }
-
-    @Override
-    public void setModelJAXBContextFactory(final ModelJAXBContextFactory modelJAXBContextFactory) {
-        camelContext.modelJAXBContextFactory = camelContext.getInternalServiceManager().addService(modelJAXBContextFactory);
-    }
-
     @Override
     public ModelineFactory getModelineFactory() {
         if (camelContext.modelineFactory == null) {
diff --git a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/SimpleCamelContext.java b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/SimpleCamelContext.java
index cf3b57f29b6..c9e400502da 100644
--- a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/SimpleCamelContext.java
+++ b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/SimpleCamelContext.java
@@ -135,6 +135,7 @@ public class SimpleCamelContext extends AbstractCamelContext {
 
         getCamelContextExtension().addContextPlugin(CliConnectorFactory.class, createCliConnectorFactory());
         getCamelContextExtension().addContextPlugin(ScheduledExecutorService.class, createErrorHandlerExecutorService());
+        getCamelContextExtension().addContextPlugin(ModelJAXBContextFactory.class, createModelJAXBContextFactory());
     }
 
     @Override
diff --git a/core/camel-core-engine/src/generated/java/org/apache/camel/impl/ExtendedCamelContextConfigurer.java b/core/camel-core-engine/src/generated/java/org/apache/camel/impl/ExtendedCamelContextConfigurer.java
index 8665c5c89e2..82291031222 100644
--- a/core/camel-core-engine/src/generated/java/org/apache/camel/impl/ExtendedCamelContextConfigurer.java
+++ b/core/camel-core-engine/src/generated/java/org/apache/camel/impl/ExtendedCamelContextConfigurer.java
@@ -57,8 +57,6 @@ public class ExtendedCamelContextConfigurer extends org.apache.camel.support.com
         case "InternalProcessorFactory": target.setInternalProcessorFactory(property(camelContext, org.apache.camel.spi.InternalProcessorFactory.class, value)); return true;
         case "lightweight":
         case "Lightweight": target.setLightweight(property(camelContext, boolean.class, value)); return true;
-        case "modeljaxbcontextfactory":
-        case "ModelJAXBContextFactory": target.setModelJAXBContextFactory(property(camelContext, org.apache.camel.spi.ModelJAXBContextFactory.class, value)); return true;
         case "modeltoxmldumper":
         case "ModelToXMLDumper": target.setModelToXMLDumper(property(camelContext, org.apache.camel.spi.ModelToXMLDumper.class, value)); return true;
         case "modelinefactory":
@@ -134,8 +132,6 @@ public class ExtendedCamelContextConfigurer extends org.apache.camel.support.com
         case "InternalProcessorFactory": return org.apache.camel.spi.InternalProcessorFactory.class;
         case "lightweight":
         case "Lightweight": return boolean.class;
-        case "modeljaxbcontextfactory":
-        case "ModelJAXBContextFactory": return org.apache.camel.spi.ModelJAXBContextFactory.class;
         case "modeltoxmldumper":
         case "ModelToXMLDumper": return org.apache.camel.spi.ModelToXMLDumper.class;
         case "modelinefactory":
@@ -212,8 +208,6 @@ public class ExtendedCamelContextConfigurer extends org.apache.camel.support.com
         case "InternalProcessorFactory": return target.getInternalProcessorFactory();
         case "lightweight":
         case "Lightweight": return target.isLightweight();
-        case "modeljaxbcontextfactory":
-        case "ModelJAXBContextFactory": return target.getModelJAXBContextFactory();
         case "modeltoxmldumper":
         case "ModelToXMLDumper": return target.getModelToXMLDumper();
         case "modelinefactory":
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/impl/lw/LightweightCamelContextExtension.java b/core/camel-core-engine/src/main/java/org/apache/camel/impl/lw/LightweightCamelContextExtension.java
index fed1fa2282f..40717ac7f95 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/impl/lw/LightweightCamelContextExtension.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/impl/lw/LightweightCamelContextExtension.java
@@ -57,7 +57,6 @@ import org.apache.camel.spi.InterceptStrategy;
 import org.apache.camel.spi.InternalProcessorFactory;
 import org.apache.camel.spi.LogListener;
 import org.apache.camel.spi.ManagementMBeanAssembler;
-import org.apache.camel.spi.ModelJAXBContextFactory;
 import org.apache.camel.spi.ModelToXMLDumper;
 import org.apache.camel.spi.ModelineFactory;
 import org.apache.camel.spi.NormalizedEndpointUri;
@@ -109,16 +108,6 @@ class LightweightCamelContextExtension implements ExtendedCamelContext {
         throw new UnsupportedOperationException();
     }
 
-    @Override
-    public ModelJAXBContextFactory getModelJAXBContextFactory() {
-        return camelContext.getCamelContextExtension().getModelJAXBContextFactory();
-    }
-
-    @Override
-    public void setModelJAXBContextFactory(ModelJAXBContextFactory modelJAXBContextFactory) {
-        throw new UnsupportedOperationException();
-    }
-
     @Override
     public DataFormatResolver getDataFormatResolver() {
         return camelContext.getCamelContextExtension().getDataFormatResolver();
diff --git a/core/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java b/core/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java
index 7ada9d2f3c2..e09166f34c2 100644
--- a/core/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java
+++ b/core/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java
@@ -1478,7 +1478,7 @@ public abstract class AbstractCamelContextFactoryBean<T extends ModelCamelContex
         ModelJAXBContextFactory modelJAXBContextFactory = getBeanForType(ModelJAXBContextFactory.class);
         if (modelJAXBContextFactory != null) {
             LOG.info("Using custom ModelJAXBContextFactory: {}", modelJAXBContextFactory);
-            getContext().getCamelContextExtension().setModelJAXBContextFactory(modelJAXBContextFactory);
+            getContext().getCamelContextExtension().addContextPlugin(ModelJAXBContextFactory.class, modelJAXBContextFactory);
         }
         ClassResolver classResolver = getBeanForType(ClassResolver.class);
         if (classResolver != null) {
diff --git a/core/camel-core/src/test/java/org/apache/camel/impl/CamelContextAddRestDefinitionsFromXmlTest.java b/core/camel-core/src/test/java/org/apache/camel/impl/CamelContextAddRestDefinitionsFromXmlTest.java
index a6484d9bd0e..627e9d34bec 100644
--- a/core/camel-core/src/test/java/org/apache/camel/impl/CamelContextAddRestDefinitionsFromXmlTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/impl/CamelContextAddRestDefinitionsFromXmlTest.java
@@ -31,6 +31,7 @@ import org.apache.camel.component.rest.DummyRestProcessorFactory;
 import org.apache.camel.model.RouteDefinition;
 import org.apache.camel.model.rest.RestDefinition;
 import org.apache.camel.spi.Registry;
+import org.apache.camel.support.PluginHelper;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
@@ -52,7 +53,7 @@ public class CamelContextAddRestDefinitionsFromXmlTest extends ContextTestSuppor
     @BeforeEach
     public void setUp() throws Exception {
         super.setUp();
-        jaxbContext = (JAXBContext) context.getCamelContextExtension().getModelJAXBContextFactory().newJAXBContext();
+        jaxbContext = (JAXBContext) PluginHelper.getModelJAXBContextFactory(context).newJAXBContext();
     }
 
     protected Object parseUri(String uri) throws JAXBException {
diff --git a/core/camel-core/src/test/java/org/apache/camel/impl/CamelContextAddRouteDefinitionsFromXmlTest.java b/core/camel-core/src/test/java/org/apache/camel/impl/CamelContextAddRouteDefinitionsFromXmlTest.java
index ce80418ac57..a90bd6aee3e 100644
--- a/core/camel-core/src/test/java/org/apache/camel/impl/CamelContextAddRouteDefinitionsFromXmlTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/impl/CamelContextAddRouteDefinitionsFromXmlTest.java
@@ -27,6 +27,7 @@ import org.apache.camel.Exchange;
 import org.apache.camel.Processor;
 import org.apache.camel.model.ProcessorDefinition;
 import org.apache.camel.model.RouteDefinition;
+import org.apache.camel.support.PluginHelper;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
@@ -40,7 +41,7 @@ public class CamelContextAddRouteDefinitionsFromXmlTest extends ContextTestSuppo
     @BeforeEach
     public void setUp() throws Exception {
         super.setUp();
-        jaxbContext = (JAXBContext) context.getCamelContextExtension().getModelJAXBContextFactory().newJAXBContext();
+        jaxbContext = (JAXBContext) PluginHelper.getModelJAXBContextFactory(context).newJAXBContext();
     }
 
     protected Object parseUri(String uri) throws JAXBException {
diff --git a/core/camel-main/src/main/java/org/apache/camel/main/DefaultConfigurationConfigurer.java b/core/camel-main/src/main/java/org/apache/camel/main/DefaultConfigurationConfigurer.java
index bd652f48584..00aed04324e 100644
--- a/core/camel-main/src/main/java/org/apache/camel/main/DefaultConfigurationConfigurer.java
+++ b/core/camel-main/src/main/java/org/apache/camel/main/DefaultConfigurationConfigurer.java
@@ -407,7 +407,7 @@ public final class DefaultConfigurationConfigurer {
         }
         ModelJAXBContextFactory mjcf = getSingleBeanOfType(registry, ModelJAXBContextFactory.class);
         if (mjcf != null) {
-            ecc.getCamelContextExtension().setModelJAXBContextFactory(mjcf);
+            ecc.getCamelContextExtension().addContextPlugin(ModelJAXBContextFactory.class, mjcf);
         }
         ClassResolver cr = getSingleBeanOfType(registry, ClassResolver.class);
         if (cr != null) {
diff --git a/core/camel-support/src/main/java/org/apache/camel/support/PluginHelper.java b/core/camel-support/src/main/java/org/apache/camel/support/PluginHelper.java
index 12655450c28..b41d67f8e49 100644
--- a/core/camel-support/src/main/java/org/apache/camel/support/PluginHelper.java
+++ b/core/camel-support/src/main/java/org/apache/camel/support/PluginHelper.java
@@ -28,6 +28,7 @@ import org.apache.camel.spi.ComponentResolver;
 import org.apache.camel.spi.ConfigurerResolver;
 import org.apache.camel.spi.FactoryFinderResolver;
 import org.apache.camel.spi.LanguageResolver;
+import org.apache.camel.spi.ModelJAXBContextFactory;
 import org.apache.camel.spi.PackageScanClassResolver;
 import org.apache.camel.spi.PackageScanResourceResolver;
 import org.apache.camel.spi.UriFactoryResolver;
@@ -224,4 +225,22 @@ public final class PluginHelper {
     public static PackageScanResourceResolver getPackageScanResourceResolver(ExtendedCamelContext extendedCamelContext) {
         return extendedCamelContext.getContextPlugin(PackageScanResourceResolver.class);
     }
+
+    /**
+     * Returns the JAXB Context factory used to create Models.
+     *
+     * @return the JAXB Context factory used to create Models.
+     */
+    public static ModelJAXBContextFactory getModelJAXBContextFactory(CamelContext camelContext) {
+        return getModelJAXBContextFactory(camelContext.getCamelContextExtension());
+    }
+
+    /**
+     * Returns the JAXB Context factory used to create Models.
+     *
+     * @return the JAXB Context factory used to create Models.
+     */
+    public static ModelJAXBContextFactory getModelJAXBContextFactory(ExtendedCamelContext extendedCamelContext) {
+        return extendedCamelContext.getContextPlugin(ModelJAXBContextFactory.class);
+    }
 }
diff --git a/core/camel-xml-jaxb/src/main/java/org/apache/camel/xml/jaxb/JaxbHelper.java b/core/camel-xml-jaxb/src/main/java/org/apache/camel/xml/jaxb/JaxbHelper.java
index 843c4fe0f81..68c9e7d4be3 100644
--- a/core/camel-xml-jaxb/src/main/java/org/apache/camel/xml/jaxb/JaxbHelper.java
+++ b/core/camel-xml-jaxb/src/main/java/org/apache/camel/xml/jaxb/JaxbHelper.java
@@ -57,6 +57,7 @@ import org.apache.camel.model.language.ExpressionDefinition;
 import org.apache.camel.model.rest.RestDefinition;
 import org.apache.camel.model.rest.RestsDefinition;
 import org.apache.camel.spi.NamespaceAware;
+import org.apache.camel.support.PluginHelper;
 import org.apache.camel.util.KeyValueHolder;
 
 import static org.apache.camel.model.ProcessorDefinitionHelper.filterTypeInOutputs;
@@ -68,7 +69,7 @@ public final class JaxbHelper {
     }
 
     public static JAXBContext getJAXBContext(CamelContext context) throws Exception {
-        return (JAXBContext) context.getCamelContextExtension().getModelJAXBContextFactory().newJAXBContext();
+        return (JAXBContext) PluginHelper.getModelJAXBContextFactory(context).newJAXBContext();
     }
 
     /**


[camel] 02/03: CAMEL-15105: added support for lazy initialization of plugins

Posted by or...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

orpiske pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git

commit 0f6bcbed35ca6505081f8fd229734d97edb57a2f
Author: Otavio Rodolfo Piske <an...@gmail.com>
AuthorDate: Fri Mar 31 17:29:46 2023 +0200

    CAMEL-15105: added support for lazy initialization of plugins
---
 .../src/main/java/org/apache/camel/ExtendedCamelContext.java  |  8 ++++++++
 .../src/main/java/org/apache/camel/spi/PluginManager.java     |  8 ++++++++
 .../camel/impl/engine/DefaultCamelContextExtension.java       | 11 +++++++++++
 .../camel/impl/lw/LightweightCamelContextExtension.java       |  5 +++++
 4 files changed, 32 insertions(+)

diff --git a/core/camel-api/src/main/java/org/apache/camel/ExtendedCamelContext.java b/core/camel-api/src/main/java/org/apache/camel/ExtendedCamelContext.java
index 7e08346dd92..291a324b3bc 100644
--- a/core/camel-api/src/main/java/org/apache/camel/ExtendedCamelContext.java
+++ b/core/camel-api/src/main/java/org/apache/camel/ExtendedCamelContext.java
@@ -751,4 +751,12 @@ public interface ExtendedCamelContext {
      * @param module the instance of the extension
      */
     <T> void addContextPlugin(Class<T> type, T module);
+
+    /**
+     * Allows lazy installation of custom plugins to the Camel context.
+     *
+     * @param type   the type of the extension
+     * @param module the instance of the extension
+     */
+    <T> void lazyAddContextPlugin(Class<T> type, Supplier<T> module);
 }
diff --git a/core/camel-api/src/main/java/org/apache/camel/spi/PluginManager.java b/core/camel-api/src/main/java/org/apache/camel/spi/PluginManager.java
index 0b21cee566b..11043f7092b 100644
--- a/core/camel-api/src/main/java/org/apache/camel/spi/PluginManager.java
+++ b/core/camel-api/src/main/java/org/apache/camel/spi/PluginManager.java
@@ -37,4 +37,12 @@ public interface PluginManager {
      * @param module the instance of the extension
      */
     <T> void addContextPlugin(Class<T> type, T module);
+
+    /**
+     * Allows lazy installation of custom plugins to the Camel context.
+     *
+     * @param type   the type of the extension
+     * @param module the instance of the extension
+     */
+    <T> void lazyAddContextPlugin(Class<T> type, Supplier<T> module);
 }
diff --git a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultCamelContextExtension.java b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultCamelContextExtension.java
index 21c0d1f15cc..54715bbb700 100644
--- a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultCamelContextExtension.java
+++ b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultCamelContextExtension.java
@@ -925,4 +925,15 @@ class DefaultCamelContextExtension implements ExtendedCamelContext {
         final T addedModule = camelContext.getInternalServiceManager().addService(module);
         pluginManager.addContextPlugin(type, addedModule);
     }
+
+    @Override
+    public <T> void lazyAddContextPlugin(Class<T> type, Supplier<T> module) {
+        pluginManager.lazyAddContextPlugin(type, () -> lazyInitAndAdd(module));
+    }
+
+    private <T> T lazyInitAndAdd(Supplier<T> supplier) {
+        T module = supplier.get();
+
+        return camelContext.getInternalServiceManager().addService(module);
+    }
 }
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/impl/lw/LightweightCamelContextExtension.java b/core/camel-core-engine/src/main/java/org/apache/camel/impl/lw/LightweightCamelContextExtension.java
index 40717ac7f95..4975be42564 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/impl/lw/LightweightCamelContextExtension.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/impl/lw/LightweightCamelContextExtension.java
@@ -750,6 +750,11 @@ class LightweightCamelContextExtension implements ExtendedCamelContext {
         camelContext.getCamelContextExtension().addContextPlugin(type, module);
     }
 
+    @Override
+    public <T> void lazyAddContextPlugin(Class<T> type, Supplier<T> module) {
+        camelContext.getCamelContextExtension().lazyAddContextPlugin(type, module);
+    }
+
     Endpoint doGetEndpoint(String uri, boolean normalized, boolean prototype) {
         StringHelper.notEmpty(uri, "uri");
         // in case path has property placeholders then try to let property


[camel] 03/03: CAMEL-15105: make the ModelineFactory a plugin of the context

Posted by or...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

orpiske pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git

commit 078b00ae3fa0a48134cdc72887dc0a30c0b365de
Author: Otavio Rodolfo Piske <an...@gmail.com>
AuthorDate: Fri Mar 31 17:41:26 2023 +0200

    CAMEL-15105: make the ModelineFactory a plugin of the context
---
 .../java/org/apache/camel/ExtendedCamelContext.java   | 12 +-----------
 .../main/java/org/apache/camel/spi/PluginManager.java |  2 ++
 .../camel/impl/engine/AbstractCamelContext.java       |  3 ++-
 .../impl/engine/DefaultCamelContextExtension.java     | 19 +------------------
 .../impl/engine/DefaultContextPluginManager.java      |  7 +++++++
 .../apache/camel/impl/engine/DefaultRoutesLoader.java |  3 ++-
 .../apache/camel/impl/engine/SimpleCamelContext.java  |  1 -
 .../camel/impl/ExtendedCamelContextConfigurer.java    |  6 ------
 .../impl/lw/LightweightCamelContextExtension.java     | 12 +-----------
 .../java/org/apache/camel/main/RoutesConfigurer.java  |  4 +---
 .../java/org/apache/camel/support/PluginHelper.java   | 16 ++++++++++++++++
 .../apache/camel/dsl/modeline/ModelineParserTest.java |  3 ++-
 12 files changed, 35 insertions(+), 53 deletions(-)

diff --git a/core/camel-api/src/main/java/org/apache/camel/ExtendedCamelContext.java b/core/camel-api/src/main/java/org/apache/camel/ExtendedCamelContext.java
index 291a324b3bc..466d114b60b 100644
--- a/core/camel-api/src/main/java/org/apache/camel/ExtendedCamelContext.java
+++ b/core/camel-api/src/main/java/org/apache/camel/ExtendedCamelContext.java
@@ -19,6 +19,7 @@ package org.apache.camel;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.function.Supplier;
 
 import org.apache.camel.catalog.RuntimeCamelCatalog;
 import org.apache.camel.console.DevConsoleResolver;
@@ -44,7 +45,6 @@ import org.apache.camel.spi.LifecycleStrategy;
 import org.apache.camel.spi.LogListener;
 import org.apache.camel.spi.ManagementMBeanAssembler;
 import org.apache.camel.spi.ModelToXMLDumper;
-import org.apache.camel.spi.ModelineFactory;
 import org.apache.camel.spi.NormalizedEndpointUri;
 import org.apache.camel.spi.PeriodTaskResolver;
 import org.apache.camel.spi.PeriodTaskScheduler;
@@ -692,16 +692,6 @@ public interface ExtendedCamelContext {
      */
     void setBasePackageScan(String basePackageScan);
 
-    /**
-     * Gets the {@link ModelineFactory}.
-     */
-    ModelineFactory getModelineFactory();
-
-    /**
-     * Sets a custom {@link ModelineFactory}.
-     */
-    void setModelineFactory(ModelineFactory modelineFactory);
-
     /**
      * The {@link CamelContext} have additional phases that are not defined in {@link ServiceStatus} and this method
      * provides the phase ordinal value.
diff --git a/core/camel-api/src/main/java/org/apache/camel/spi/PluginManager.java b/core/camel-api/src/main/java/org/apache/camel/spi/PluginManager.java
index 11043f7092b..c2601d0c6b3 100644
--- a/core/camel-api/src/main/java/org/apache/camel/spi/PluginManager.java
+++ b/core/camel-api/src/main/java/org/apache/camel/spi/PluginManager.java
@@ -17,6 +17,8 @@
 
 package org.apache.camel.spi;
 
+import java.util.function.Supplier;
+
 /**
  * A manager for internal plugins. This is part of the internal Camel API and not meant for public usage.
  */
diff --git a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java
index cf55bfc9aec..986b9c3a233 100644
--- a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java
+++ b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java
@@ -224,7 +224,6 @@ public abstract class AbstractCamelContext extends BaseService
     volatile ModelToXMLDumper modelToXMLDumper;
     volatile RestBindingJaxbDataFormatFactory restBindingJaxbDataFormatFactory;
     volatile RuntimeCamelCatalog runtimeCamelCatalog;
-    volatile ModelineFactory modelineFactory;
     volatile ProcessorFactory processorFactory;
     volatile PeriodTaskResolver periodTaskResolver;
     volatile PeriodTaskScheduler periodTaskScheduler;
@@ -379,6 +378,8 @@ public abstract class AbstractCamelContext extends BaseService
         camelContextExtension.addContextPlugin(FactoryFinderResolver.class, createFactoryFinderResolver());
         camelContextExtension.addContextPlugin(PackageScanClassResolver.class, createPackageScanClassResolver());
         camelContextExtension.addContextPlugin(PackageScanResourceResolver.class, createPackageScanResourceResolver());
+        camelContextExtension.lazyAddContextPlugin(ModelineFactory.class, this::createModelineFactory);
+        camelContextExtension.lazyAddContextPlugin(ModelJAXBContextFactory.class, this::createModelJAXBContextFactory);
 
         if (build) {
             try {
diff --git a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultCamelContextExtension.java b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultCamelContextExtension.java
index 54715bbb700..d7df27f3cc2 100644
--- a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultCamelContextExtension.java
+++ b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultCamelContextExtension.java
@@ -23,6 +23,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.function.Supplier;
 
 import org.apache.camel.CamelContextAware;
 import org.apache.camel.Endpoint;
@@ -63,7 +64,6 @@ import org.apache.camel.spi.ManagementMBeanAssembler;
 import org.apache.camel.spi.ManagementStrategy;
 import org.apache.camel.spi.ManagementStrategyFactory;
 import org.apache.camel.spi.ModelToXMLDumper;
-import org.apache.camel.spi.ModelineFactory;
 import org.apache.camel.spi.NormalizedEndpointUri;
 import org.apache.camel.spi.PeriodTaskResolver;
 import org.apache.camel.spi.PeriodTaskScheduler;
@@ -367,23 +367,6 @@ class DefaultCamelContextExtension implements ExtendedCamelContext {
         return factories.computeIfAbsent(path, camelContext::createFactoryFinder);
     }
 
-    @Override
-    public ModelineFactory getModelineFactory() {
-        if (camelContext.modelineFactory == null) {
-            synchronized (camelContext.lock) {
-                if (camelContext.modelineFactory == null) {
-                    setModelineFactory(camelContext.createModelineFactory());
-                }
-            }
-        }
-        return camelContext.modelineFactory;
-    }
-
-    @Override
-    public void setModelineFactory(ModelineFactory modelineFactory) {
-        camelContext.modelineFactory = camelContext.getInternalServiceManager().addService(modelineFactory);
-    }
-
     @Override
     public PeriodTaskResolver getPeriodTaskResolver() {
         if (camelContext.periodTaskResolver == null) {
diff --git a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultContextPluginManager.java b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultContextPluginManager.java
index 090078ba97d..79b9e06ca5a 100644
--- a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultContextPluginManager.java
+++ b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultContextPluginManager.java
@@ -60,4 +60,11 @@ public class DefaultContextPluginManager implements PluginManager {
             }
         }
     }
+
+    @Override
+    public <T> void lazyAddContextPlugin(Class<T> type, Supplier<T> module) {
+        if (module != null) {
+            extensions.put(type, module);
+        }
+    }
 }
diff --git a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultRoutesLoader.java b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultRoutesLoader.java
index 0d766a8a5d2..b6bee7885a4 100644
--- a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultRoutesLoader.java
+++ b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultRoutesLoader.java
@@ -36,6 +36,7 @@ import org.apache.camel.spi.ModelineFactory;
 import org.apache.camel.spi.Resource;
 import org.apache.camel.spi.RoutesBuilderLoader;
 import org.apache.camel.spi.RoutesLoader;
+import org.apache.camel.support.PluginHelper;
 import org.apache.camel.support.ResolverHelper;
 import org.apache.camel.support.service.ServiceHelper;
 import org.apache.camel.support.service.ServiceSupport;
@@ -90,7 +91,7 @@ public class DefaultRoutesLoader extends ServiceSupport implements RoutesLoader,
 
         // first we need to parse for modeline to gather all the configurations
         if (camelContext.isModeline()) {
-            ModelineFactory factory = camelContext.getCamelContextExtension().getModelineFactory();
+            ModelineFactory factory = PluginHelper.getModelineFactory(camelContext);
             for (Resource resource : resources) {
                 RoutesBuilderLoader loader = resolveRoutesBuilderLoader(resource);
                 // gather resources for modeline
diff --git a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/SimpleCamelContext.java b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/SimpleCamelContext.java
index c9e400502da..cf3b57f29b6 100644
--- a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/SimpleCamelContext.java
+++ b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/SimpleCamelContext.java
@@ -135,7 +135,6 @@ public class SimpleCamelContext extends AbstractCamelContext {
 
         getCamelContextExtension().addContextPlugin(CliConnectorFactory.class, createCliConnectorFactory());
         getCamelContextExtension().addContextPlugin(ScheduledExecutorService.class, createErrorHandlerExecutorService());
-        getCamelContextExtension().addContextPlugin(ModelJAXBContextFactory.class, createModelJAXBContextFactory());
     }
 
     @Override
diff --git a/core/camel-core-engine/src/generated/java/org/apache/camel/impl/ExtendedCamelContextConfigurer.java b/core/camel-core-engine/src/generated/java/org/apache/camel/impl/ExtendedCamelContextConfigurer.java
index 82291031222..43a98f6e428 100644
--- a/core/camel-core-engine/src/generated/java/org/apache/camel/impl/ExtendedCamelContextConfigurer.java
+++ b/core/camel-core-engine/src/generated/java/org/apache/camel/impl/ExtendedCamelContextConfigurer.java
@@ -59,8 +59,6 @@ public class ExtendedCamelContextConfigurer extends org.apache.camel.support.com
         case "Lightweight": target.setLightweight(property(camelContext, boolean.class, value)); return true;
         case "modeltoxmldumper":
         case "ModelToXMLDumper": target.setModelToXMLDumper(property(camelContext, org.apache.camel.spi.ModelToXMLDumper.class, value)); return true;
-        case "modelinefactory":
-        case "ModelineFactory": target.setModelineFactory(property(camelContext, org.apache.camel.spi.ModelineFactory.class, value)); return true;
         case "name":
         case "Name": target.setName(property(camelContext, java.lang.String.class, value)); return true;
         case "periodtaskresolver":
@@ -134,8 +132,6 @@ public class ExtendedCamelContextConfigurer extends org.apache.camel.support.com
         case "Lightweight": return boolean.class;
         case "modeltoxmldumper":
         case "ModelToXMLDumper": return org.apache.camel.spi.ModelToXMLDumper.class;
-        case "modelinefactory":
-        case "ModelineFactory": return org.apache.camel.spi.ModelineFactory.class;
         case "name":
         case "Name": return java.lang.String.class;
         case "periodtaskresolver":
@@ -210,8 +206,6 @@ public class ExtendedCamelContextConfigurer extends org.apache.camel.support.com
         case "Lightweight": return target.isLightweight();
         case "modeltoxmldumper":
         case "ModelToXMLDumper": return target.getModelToXMLDumper();
-        case "modelinefactory":
-        case "ModelineFactory": return target.getModelineFactory();
         case "name":
         case "Name": return target.getName();
         case "periodtaskresolver":
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/impl/lw/LightweightCamelContextExtension.java b/core/camel-core-engine/src/main/java/org/apache/camel/impl/lw/LightweightCamelContextExtension.java
index 4975be42564..715acbd1100 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/impl/lw/LightweightCamelContextExtension.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/impl/lw/LightweightCamelContextExtension.java
@@ -22,6 +22,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.TimeUnit;
+import java.util.function.Supplier;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.Endpoint;
@@ -58,7 +59,6 @@ import org.apache.camel.spi.InternalProcessorFactory;
 import org.apache.camel.spi.LogListener;
 import org.apache.camel.spi.ManagementMBeanAssembler;
 import org.apache.camel.spi.ModelToXMLDumper;
-import org.apache.camel.spi.ModelineFactory;
 import org.apache.camel.spi.NormalizedEndpointUri;
 import org.apache.camel.spi.PeriodTaskResolver;
 import org.apache.camel.spi.PeriodTaskScheduler;
@@ -288,16 +288,6 @@ class LightweightCamelContextExtension implements ExtendedCamelContext {
         throw new UnsupportedOperationException();
     }
 
-    @Override
-    public ModelineFactory getModelineFactory() {
-        return camelContext.getCamelContextExtension().getModelineFactory();
-    }
-
-    @Override
-    public void setModelineFactory(ModelineFactory modelineFactory) {
-        throw new UnsupportedOperationException();
-    }
-
     @Override
     public InternalProcessorFactory getInternalProcessorFactory() {
         return camelContext.getCamelContextExtension().getInternalProcessorFactory();
diff --git a/core/camel-main/src/main/java/org/apache/camel/main/RoutesConfigurer.java b/core/camel-main/src/main/java/org/apache/camel/main/RoutesConfigurer.java
index 1434ac72c47..450b1f1c747 100644
--- a/core/camel-main/src/main/java/org/apache/camel/main/RoutesConfigurer.java
+++ b/core/camel-main/src/main/java/org/apache/camel/main/RoutesConfigurer.java
@@ -22,7 +22,6 @@ import java.util.List;
 import java.util.Set;
 
 import org.apache.camel.CamelContext;
-import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.RouteConfigurationsBuilder;
 import org.apache.camel.RoutesBuilder;
 import org.apache.camel.RuntimeCamelException;
@@ -262,8 +261,7 @@ public class RoutesConfigurer {
             throw RuntimeCamelException.wrapRuntimeException(e);
         }
 
-        ExtendedCamelContext ecc = camelContext.getCamelContextExtension();
-        ModelineFactory factory = ecc.getModelineFactory();
+        ModelineFactory factory = PluginHelper.getModelineFactory(camelContext);
 
         for (Resource resource : resources) {
             LOG.debug("Parsing modeline: {}", resource);
diff --git a/core/camel-support/src/main/java/org/apache/camel/support/PluginHelper.java b/core/camel-support/src/main/java/org/apache/camel/support/PluginHelper.java
index b41d67f8e49..ba022f4546e 100644
--- a/core/camel-support/src/main/java/org/apache/camel/support/PluginHelper.java
+++ b/core/camel-support/src/main/java/org/apache/camel/support/PluginHelper.java
@@ -29,6 +29,7 @@ import org.apache.camel.spi.ConfigurerResolver;
 import org.apache.camel.spi.FactoryFinderResolver;
 import org.apache.camel.spi.LanguageResolver;
 import org.apache.camel.spi.ModelJAXBContextFactory;
+import org.apache.camel.spi.ModelineFactory;
 import org.apache.camel.spi.PackageScanClassResolver;
 import org.apache.camel.spi.PackageScanResourceResolver;
 import org.apache.camel.spi.UriFactoryResolver;
@@ -243,4 +244,19 @@ public final class PluginHelper {
     public static ModelJAXBContextFactory getModelJAXBContextFactory(ExtendedCamelContext extendedCamelContext) {
         return extendedCamelContext.getContextPlugin(ModelJAXBContextFactory.class);
     }
+
+    /**
+     * Gets the {@link ModelineFactory}.
+     */
+    public static ModelineFactory getModelineFactory(CamelContext camelContext) {
+        return getModelineFactory(camelContext.getCamelContextExtension());
+    }
+
+    /**
+     * Gets the {@link ModelineFactory}.
+     */
+    public static ModelineFactory getModelineFactory(ExtendedCamelContext extendedCamelContext) {
+        return extendedCamelContext.getContextPlugin(ModelineFactory.class);
+    }
+
 }
diff --git a/dsl/camel-dsl-modeline/src/test/java/org/apache/camel/dsl/modeline/ModelineParserTest.java b/dsl/camel-dsl-modeline/src/test/java/org/apache/camel/dsl/modeline/ModelineParserTest.java
index 17ff56d428c..fcc8fc3eece 100644
--- a/dsl/camel-dsl-modeline/src/test/java/org/apache/camel/dsl/modeline/ModelineParserTest.java
+++ b/dsl/camel-dsl-modeline/src/test/java/org/apache/camel/dsl/modeline/ModelineParserTest.java
@@ -22,6 +22,7 @@ import java.util.List;
 import org.apache.camel.CamelContext;
 import org.apache.camel.spi.DependencyStrategy;
 import org.apache.camel.spi.ModelineFactory;
+import org.apache.camel.support.PluginHelper;
 import org.apache.camel.support.ResourceHelper;
 import org.apache.camel.test.junit5.CamelTestSupport;
 import org.junit.jupiter.api.Assertions;
@@ -32,7 +33,7 @@ public class ModelineParserTest extends CamelTestSupport {
     private final List<String> deps = new ArrayList<>();
 
     private ModelineFactory resolveModelineFactory(CamelContext camelContext) {
-        return camelContext.getCamelContextExtension().getModelineFactory();
+        return PluginHelper.getModelineFactory(camelContext);
     }
 
     @Override