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 03a1a006f5e CAMEL-22442: camel-core - Add fallback resource resolver 
to load from file as well as classpath (#19323)
03a1a006f5e is described below

commit 03a1a006f5edf0937923e04d6379b95f8020761e
Author: Claus Ibsen <[email protected]>
AuthorDate: Thu Sep 25 12:52:29 2025 +0200

    CAMEL-22442: camel-core - Add fallback resource resolver to load from file 
as well as classpath (#19323)
---
 .../engine/DefaultFallbackResourceResolver.java    | 38 +++++++++-------------
 .../camel/impl/engine/DefaultResourceLoader.java   | 12 +------
 .../camel/impl/engine/SimpleCamelContext.java      |  2 +-
 .../org/apache/camel/util/ResourceLoaderTest.java  | 21 ++++++++++--
 .../java/org/apache/camel/main/KameletMain.java    |  5 ---
 5 files changed, 36 insertions(+), 42 deletions(-)

diff --git 
a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/KameletFallbackResourceResolver.java
 
b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultFallbackResourceResolver.java
similarity index 66%
rename from 
dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/KameletFallbackResourceResolver.java
rename to 
core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultFallbackResourceResolver.java
index 90f4cf52c06..e328bd5304b 100644
--- 
a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/KameletFallbackResourceResolver.java
+++ 
b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultFallbackResourceResolver.java
@@ -14,25 +14,22 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.main.download;
+package org.apache.camel.impl.engine;
 
 import org.apache.camel.CamelContext;
-import org.apache.camel.impl.engine.DefaultResourceResolvers;
 import org.apache.camel.spi.Resource;
 import org.apache.camel.spi.ResourceResolver;
 import org.apache.camel.support.ResourceResolverSupport;
-import org.apache.camel.support.service.ServiceHelper;
 
 /**
- * A fallback {@link ResourceResolver} that camel-jbang uses to be able to 
load resources from both classpath and file,
- * which is needed when users use camel run * and have files that should be 
loaded via Camels resource loader.
+ * A fallback {@link ResourceResolver} to be able to load resources from both 
classpath and file.
  */
-public class KameletFallbackResourceResolver extends ResourceResolverSupport {
+public class DefaultFallbackResourceResolver extends ResourceResolverSupport {
 
     private final ResourceResolver classpath;
     private final ResourceResolver file;
 
-    public KameletFallbackResourceResolver(CamelContext camelContext) {
+    public DefaultFallbackResourceResolver(CamelContext camelContext) {
         super("");
         setCamelContext(camelContext);
         classpath = new DefaultResourceResolvers.ClasspathResolver();
@@ -41,18 +38,6 @@ public class KameletFallbackResourceResolver extends 
ResourceResolverSupport {
         file.setCamelContext(camelContext);
     }
 
-    @Override
-    protected void doStart() throws Exception {
-        super.doStart();
-        ServiceHelper.startService(classpath, file);
-    }
-
-    @Override
-    protected void doStop() throws Exception {
-        super.doStop();
-        ServiceHelper.startService(classpath, file);
-    }
-
     @Override
     public Resource resolve(String location) {
         if (location.contains("{{") && location.contains("}}")) {
@@ -64,12 +49,21 @@ public class KameletFallbackResourceResolver extends 
ResourceResolverSupport {
     @Override
     protected Resource createResource(String location, String remaining) {
         Resource answer = classpath.resolve(classpath.getSupportedScheme() + 
":" + location);
+        if (answer == null || !answer.exists() && 
location.endsWith(".groovy")) {
+            // special for groovy sources as they can be located in 
src/main/resources/camel-groovy
+            Resource special = super.resolve(classpath.getSupportedScheme() + 
":camel-groovy/" + location);
+            if (special != null && special.exists()) {
+                answer = special;
+            }
+        }
+        // fallback to file location
         if (answer == null || !answer.exists()) {
-            answer = file.resolve(file.getSupportedScheme() + ":" + location);
-            if (answer != null && !answer.exists()) {
-                answer = null;
+            Resource special = file.resolve(file.getSupportedScheme() + ":" + 
location);
+            if (special != null && special.exists()) {
+                answer = special;
             }
         }
         return answer;
     }
+
 }
diff --git 
a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultResourceLoader.java
 
b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultResourceLoader.java
index 58a30ba3351..0ddc2ee399a 100644
--- 
a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultResourceLoader.java
+++ 
b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultResourceLoader.java
@@ -60,17 +60,7 @@ public class DefaultResourceLoader extends ServiceSupport 
implements ResourceLoa
                     ResourceResolver.class);
         }
         if (this.fallbackResolver == null) {
-            this.fallbackResolver = new 
DefaultResourceResolvers.ClasspathResolver() {
-                @Override
-                public Resource resolve(String location) {
-                    Resource answer = 
super.resolve(DefaultResourceResolvers.ClasspathResolver.SCHEME + ":" + 
location);
-                    if (answer == null || !answer.exists() && 
location.endsWith(".groovy")) {
-                        // special for groovy sources as they can be located 
in src/main/resources/camel-groovy
-                        answer = 
super.resolve(DefaultResourceResolvers.ClasspathResolver.SCHEME + 
":camel-groovy/" + location);
-                    }
-                    return answer;
-                }
-            };
+            this.fallbackResolver = new 
DefaultFallbackResourceResolver(camelContext);
         }
         this.fallbackResolver.setCamelContext(camelContext);
     }
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 0430cfdc7fe..586db3d6ffa 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
@@ -588,7 +588,7 @@ public class SimpleCamelContext extends 
AbstractCamelContext {
                 ResourceLoader.FACTORY,
                 ResourceLoader.class);
 
-        return result.orElseGet(DefaultResourceLoader::new);
+        return result.orElseGet(() -> new DefaultResourceLoader(this));
     }
 
     @Override
diff --git 
a/core/camel-core/src/test/java/org/apache/camel/util/ResourceLoaderTest.java 
b/core/camel-core/src/test/java/org/apache/camel/util/ResourceLoaderTest.java
index 559e96c8fce..d6806502b00 100644
--- 
a/core/camel-core/src/test/java/org/apache/camel/util/ResourceLoaderTest.java
+++ 
b/core/camel-core/src/test/java/org/apache/camel/util/ResourceLoaderTest.java
@@ -96,18 +96,33 @@ public class ResourceLoaderTest extends TestSupport {
     @Test
     public void testLoadClasspathDefault() throws Exception {
         try (DefaultCamelContext context = new DefaultCamelContext()) {
+            // need to be started as it triggers the fallback resolver
+            context.start();
+
             Resource resource = 
PluginHelper.getResourceLoader(context).resolveResource("log4j2.properties");
+            try (InputStream is = resource.getInputStream()) {
+                assertNotNull(is);
 
-            // need to be started as it triggers the fallback
-            // resolver
+                String text = 
context.getTypeConverter().convertTo(String.class, is);
+                assertNotNull(text);
+                assertTrue(text.contains("rootLogger"));
+            }
+        }
+    }
+
+    @Test
+    public void testLoadFileDefault() throws Exception {
+        try (DefaultCamelContext context = new DefaultCamelContext()) {
+            // need to be started as it triggers the fallback resolver
             context.start();
 
+            Resource resource = 
PluginHelper.getResourceLoader(context).resolveResource("src/test/data/bar.xml");
             try (InputStream is = resource.getInputStream()) {
                 assertNotNull(is);
 
                 String text = 
context.getTypeConverter().convertTo(String.class, is);
                 assertNotNull(text);
-                assertTrue(text.contains("rootLogger"));
+                assertTrue(text.contains("<hello>bar</hello>"));
             }
         }
     }
diff --git 
a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/KameletMain.java 
b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/KameletMain.java
index ec596295b32..c067ea345a2 100644
--- 
a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/KameletMain.java
+++ 
b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/KameletMain.java
@@ -64,7 +64,6 @@ import org.apache.camel.main.download.ExportPropertiesParser;
 import org.apache.camel.main.download.ExportTypeConverter;
 import org.apache.camel.main.download.JavaKnownImportsDownloader;
 import org.apache.camel.main.download.KameletAutowiredLifecycleStrategy;
-import org.apache.camel.main.download.KameletFallbackResourceResolver;
 import org.apache.camel.main.download.KameletMainInjector;
 import org.apache.camel.main.download.KnownDependenciesResolver;
 import org.apache.camel.main.download.KnownReposResolver;
@@ -101,7 +100,6 @@ import org.apache.camel.spi.PeriodTaskResolver;
 import org.apache.camel.spi.PeriodTaskScheduler;
 import org.apache.camel.spi.Registry;
 import org.apache.camel.spi.ResourceLoader;
-import org.apache.camel.spi.ResourceResolver;
 import org.apache.camel.spi.RoutesLoader;
 import org.apache.camel.spi.TransformerResolver;
 import org.apache.camel.spi.UriFactoryResolver;
@@ -637,9 +635,6 @@ public class KameletMain extends MainCommandLineSupport {
             // add support for automatic downloaded needed JARs from java 
imports
             new JavaKnownImportsDownloader(answer, knownDeps);
 
-            // resource resolver fallback that can load from file and classpath
-            
answer.getRegistry().bind(ResourceResolver.FALLBACK_RESOURCE_RESOLVER, new 
KameletFallbackResourceResolver(answer));
-
             // download class-resolver
             ClassResolver classResolver = new 
DependencyDownloaderClassResolver(answer, knownDeps, silent);
             answer.setClassResolver(classResolver);

Reply via email to