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);