This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch rl in repository https://gitbox.apache.org/repos/asf/camel.git
commit 1b03b8bb13b54b0513c916690167a0565209d915 Author: Claus Ibsen <[email protected]> AuthorDate: Thu Sep 25 11:13:09 2025 +0200 CAMEL-22442: camel-core - Add fallback resource resolver to load from file as well as classpath --- .../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);
