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/05/31 17:09:01 UTC

[camel] branch main updated: CAMEL-19405: Loading custom dev console should be able to hot-reload such as via camel-jbang

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

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


The following commit(s) were added to refs/heads/main by this push:
     new 5f672e435cf CAMEL-19405: Loading custom dev console should be able to hot-reload such as via camel-jbang
5f672e435cf is described below

commit 5f672e435cf868a51132a843af1014fe59729773
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Wed May 31 19:08:44 2023 +0200

    CAMEL-19405: Loading custom dev console should be able to hot-reload such as via camel-jbang
---
 .../org/apache/camel/console/DevConsoleResolver.java     |  3 ++-
 .../main/java/org/apache/camel/spi/FactoryFinder.java    |  5 +++++
 .../apache/camel/impl/engine/BootstrapFactoryFinder.java | 16 ++++------------
 .../camel/impl/engine/DefaultDevConsoleResolver.java     | 15 ++++++++++++++-
 .../apache/camel/impl/engine/DefaultFactoryFinder.java   | 15 +++++++++++++--
 .../camel/impl/console/DefaultDevConsoleRegistry.java    |  2 +-
 .../camel/impl/console/DefaultDevConsolesLoader.java     | 13 +++++++++++--
 .../camel/impl/console/DefaultDevConsolesLoaderTest.java |  8 ++++++++
 8 files changed, 58 insertions(+), 19 deletions(-)

diff --git a/core/camel-api/src/main/java/org/apache/camel/console/DevConsoleResolver.java b/core/camel-api/src/main/java/org/apache/camel/console/DevConsoleResolver.java
index 8894bd942da..4ff39eff4ec 100644
--- a/core/camel-api/src/main/java/org/apache/camel/console/DevConsoleResolver.java
+++ b/core/camel-api/src/main/java/org/apache/camel/console/DevConsoleResolver.java
@@ -19,11 +19,12 @@ package org.apache.camel.console;
 import java.util.Optional;
 
 import org.apache.camel.CamelContextAware;
+import org.apache.camel.StaticService;
 
 /**
  * A pluggable strategy for resolving dev consoles in a loosely coupled manner
  */
-public interface DevConsoleResolver extends CamelContextAware {
+public interface DevConsoleResolver extends CamelContextAware, StaticService {
 
     /**
      * Resolves the given {@link DevConsole}.
diff --git a/core/camel-api/src/main/java/org/apache/camel/spi/FactoryFinder.java b/core/camel-api/src/main/java/org/apache/camel/spi/FactoryFinder.java
index dec47d2a486..91af20a08a4 100644
--- a/core/camel-api/src/main/java/org/apache/camel/spi/FactoryFinder.java
+++ b/core/camel-api/src/main/java/org/apache/camel/spi/FactoryFinder.java
@@ -65,4 +65,9 @@ public interface FactoryFinder {
      */
     Optional<Class<?>> findOptionalClass(String key);
 
+    /**
+     * Clear the resolver state from previous scans.
+     */
+    void clear();
+
 }
diff --git a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/BootstrapFactoryFinder.java b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/BootstrapFactoryFinder.java
index cd595c38064..06d415a2aba 100644
--- a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/BootstrapFactoryFinder.java
+++ b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/BootstrapFactoryFinder.java
@@ -30,18 +30,10 @@ public class BootstrapFactoryFinder extends DefaultFactoryFinder implements Boot
 
     @Override
     public void close() {
+        clear();
         classResolver = null;
-        if (classMap != null) {
-            classMap.clear();
-            classMap = null;
-        }
-        if (classesNotFound != null) {
-            classesNotFound.clear();
-            classesNotFound = null;
-        }
-        if (classesNotFoundExceptions != null) {
-            classesNotFoundExceptions.clear();
-            classesNotFoundExceptions = null;
-        }
+        classMap = null;
+        classesNotFound = null;
+        classesNotFoundExceptions = null;
     }
 }
diff --git a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultDevConsoleResolver.java b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultDevConsoleResolver.java
index f1ff725b2e8..17fda0ea627 100644
--- a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultDevConsoleResolver.java
+++ b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultDevConsoleResolver.java
@@ -25,12 +25,13 @@ import org.apache.camel.console.DevConsole;
 import org.apache.camel.console.DevConsoleRegistry;
 import org.apache.camel.console.DevConsoleResolver;
 import org.apache.camel.spi.FactoryFinder;
+import org.apache.camel.support.service.ServiceSupport;
 
 /**
  * Default dev console resolver that looks for dev consoles factories in
  * <b>META-INF/services/org/apache/camel/dev-console/</b>.
  */
-public class DefaultDevConsoleResolver implements DevConsoleResolver, CamelContextAware {
+public class DefaultDevConsoleResolver extends ServiceSupport implements DevConsoleResolver, CamelContextAware {
 
     public static final String DEV_CONSOLE_RESOURCE_PATH = "META-INF/services/org/apache/camel/dev-console/";
 
@@ -97,4 +98,16 @@ public class DefaultDevConsoleResolver implements DevConsoleResolver, CamelConte
             return Optional.empty();
         }
     }
+
+    @Override
+    protected void doStart() throws Exception {
+        // noop
+    }
+
+    @Override
+    protected void doStop() throws Exception {
+        if (devConsoleFactory != null) {
+            devConsoleFactory.clear();
+        }
+    }
 }
diff --git a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultFactoryFinder.java b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultFactoryFinder.java
index 01649342f6d..0e2d3a25eaf 100644
--- a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultFactoryFinder.java
+++ b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultFactoryFinder.java
@@ -65,7 +65,6 @@ public class DefaultFactoryFinder implements FactoryFinder {
 
     @Override
     public Optional<Class<?>> findClass(String key) {
-
         Class<?> clazz = addToClassMap(key, () -> {
             Properties prop = doFindFactoryProperties(key);
             if (prop != null) {
@@ -79,7 +78,6 @@ public class DefaultFactoryFinder implements FactoryFinder {
 
     @Override
     public Optional<Class<?>> findOptionalClass(String key) {
-
         Class<?> clazz = addToClassMap(key, () -> {
             Properties prop = doFindFactoryProperties(key);
             if (prop != null) {
@@ -91,6 +89,19 @@ public class DefaultFactoryFinder implements FactoryFinder {
         return Optional.ofNullable(clazz);
     }
 
+    @Override
+    public void clear() {
+        if (classMap != null) {
+            classMap.clear();
+        }
+        if (classesNotFound != null) {
+            classesNotFound.clear();
+        }
+        if (classesNotFoundExceptions != null) {
+            classesNotFoundExceptions.clear();
+        }
+    }
+
     private Object doNewInstance(String key) {
         Optional<Class<?>> clazz = findClass(key);
         return clazz.map(ObjectHelper::newInstance).orElse(null);
diff --git a/core/camel-console/src/main/java/org/apache/camel/impl/console/DefaultDevConsoleRegistry.java b/core/camel-console/src/main/java/org/apache/camel/impl/console/DefaultDevConsoleRegistry.java
index ad59c206b3f..fe949636fdb 100644
--- a/core/camel-console/src/main/java/org/apache/camel/impl/console/DefaultDevConsoleRegistry.java
+++ b/core/camel-console/src/main/java/org/apache/camel/impl/console/DefaultDevConsoleRegistry.java
@@ -177,7 +177,7 @@ public class DefaultDevConsoleRegistry extends ServiceSupport implements DevCons
             loadDevConsolesDone = true;
 
             DefaultDevConsolesLoader loader = new DefaultDevConsolesLoader(camelContext);
-            Collection<DevConsole> col = loader.loadDevConsoles();
+            Collection<DevConsole> col = loader.loadDevConsoles(force);
 
             if (!col.isEmpty()) {
                 int added = 0;
diff --git a/core/camel-console/src/main/java/org/apache/camel/impl/console/DefaultDevConsolesLoader.java b/core/camel-console/src/main/java/org/apache/camel/impl/console/DefaultDevConsolesLoader.java
index 7c640a59894..5390804347d 100644
--- a/core/camel-console/src/main/java/org/apache/camel/impl/console/DefaultDevConsolesLoader.java
+++ b/core/camel-console/src/main/java/org/apache/camel/impl/console/DefaultDevConsolesLoader.java
@@ -25,6 +25,7 @@ import org.apache.camel.console.DevConsoleResolver;
 import org.apache.camel.spi.PackageScanResourceResolver;
 import org.apache.camel.spi.Resource;
 import org.apache.camel.support.PluginHelper;
+import org.apache.camel.support.service.ServiceHelper;
 import org.apache.camel.util.StringHelper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -48,11 +49,19 @@ public class DefaultDevConsolesLoader {
     }
 
     public Collection<DevConsole> loadDevConsoles() {
-        Collection<DevConsole> answer = new ArrayList<>();
+        return loadDevConsoles(false);
+    }
 
-        LOG.trace("Searching for {} dev consoles", META_INF_SERVICES);
+    public Collection<DevConsole> loadDevConsoles(boolean force) {
+        Collection<DevConsole> answer = new ArrayList<>();
 
+        if (force) {
+            // when forcing then restart resolver, so we can do a re-scan
+            ServiceHelper.stopService(devConsoleResolver);
+            ServiceHelper.startService(devConsoleResolver);
+        }
         try {
+            LOG.trace("Searching for {} dev consoles", META_INF_SERVICES);
             Collection<Resource> resources = resolver.findResources(META_INF_SERVICES + "/*");
             if (LOG.isDebugEnabled()) {
                 LOG.debug("Discovered {} dev consoles from classpath scanning", resources.size());
diff --git a/core/camel-console/src/test/java/org/apache/camel/impl/console/DefaultDevConsolesLoaderTest.java b/core/camel-console/src/test/java/org/apache/camel/impl/console/DefaultDevConsolesLoaderTest.java
index 3f768ed11e7..cba66da74d8 100644
--- a/core/camel-console/src/test/java/org/apache/camel/impl/console/DefaultDevConsolesLoaderTest.java
+++ b/core/camel-console/src/test/java/org/apache/camel/impl/console/DefaultDevConsolesLoaderTest.java
@@ -31,4 +31,12 @@ public class DefaultDevConsolesLoaderTest extends ContextTestSupport {
         Collection<DevConsole> col = loader.loadDevConsoles();
         Assertions.assertTrue(col.size() > 3);
     }
+
+    @Test
+    public void testLoaderForce() throws Exception {
+        DefaultDevConsolesLoader loader = new DefaultDevConsolesLoader(context);
+        Collection<DevConsole> col = loader.loadDevConsoles(true);
+        Assertions.assertTrue(col.size() > 3);
+    }
+
 }