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:08 UTC

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

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