This is an automated email from the ASF dual-hosted git repository.
lburgazzoli pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/master by this push:
new 863a87f CAMEL-16285: fallback resource resolver
863a87f is described below
commit 863a87fe371b0157cab3144a1d129d7c3c029658
Author: Luca Burgazzoli <[email protected]>
AuthorDate: Thu Mar 4 17:13:44 2021 +0100
CAMEL-16285: fallback resource resolver
---
.../camel/impl/engine/DefaultResourceLoader.java | 36 ++++++++++++--
.../impl/engine/DefaultResourceResolvers.java | 8 ++--
.../org/apache/camel/util/ResourceLoaderTest.java | 56 +++++++++++++++++++---
3 files changed, 84 insertions(+), 16 deletions(-)
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 4af5f3f..0cf16a8 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
@@ -44,6 +44,7 @@ public class DefaultResourceLoader extends ServiceSupport
implements ResourceLoa
private final Map<String, ResourceResolver> resolvers;
private CamelContext camelContext;
+ private ResourceResolver fallbackResolver;
public DefaultResourceLoader() {
this(null);
@@ -52,6 +53,20 @@ public class DefaultResourceLoader extends ServiceSupport
implements ResourceLoa
public DefaultResourceLoader(CamelContext camelContext) {
this.camelContext = camelContext;
this.resolvers = new ConcurrentHashMap<>();
+ this.fallbackResolver = new
DefaultResourceResolvers.ClasspathResolver() {
+ @Override
+ public Resource resolve(String location) {
+ return
super.resolve(DefaultResourceResolvers.ClasspathResolver.SCHEME + ":" +
location);
+ }
+ };
+ }
+
+ @Override
+ public void doStart() throws Exception {
+ super.doStart();
+
+ CamelContextAware.trySetCamelContext(this.fallbackResolver,
getCamelContext());
+ ServiceHelper.startService(this.fallbackResolver);
}
@Override
@@ -63,6 +78,14 @@ public class DefaultResourceLoader extends ServiceSupport
implements ResourceLoa
resolvers.clear();
}
+ public ResourceResolver getFallbackResolver() {
+ return fallbackResolver;
+ }
+
+ public void setFallbackResolver(ResourceResolver fallbackResolver) {
+ this.fallbackResolver = fallbackResolver;
+ }
+
@Override
public CamelContext getCamelContext() {
return camelContext;
@@ -77,11 +100,14 @@ public class DefaultResourceLoader extends ServiceSupport
implements ResourceLoa
public Resource resolveResource(final String uri) {
ObjectHelper.notNull(uri, "Resource uri must not be null");
- String location = uri;
- String scheme = StringHelper.before(location, ":");
+ //
+ // If the scheme is not set, use a fallback resolver which by default
uses the classpath
+ // resolver but a custom implementation can be provided. This is
useful when as example
+ // resources need to be discovered on a set of location through a
dedicated resolver.
+ //
+ String scheme = StringHelper.before(uri, ":");
if (scheme == null) {
- scheme = DefaultResourceResolvers.ClasspathResolver.SCHEME;
- location = DefaultResourceResolvers.ClasspathResolver.SCHEME + ":"
+ location;
+ return this.fallbackResolver.resolve(uri);
}
ResourceResolver rr = getResourceResolver(scheme);
@@ -90,7 +116,7 @@ public class DefaultResourceLoader extends ServiceSupport
implements ResourceLoa
"Cannot find a ResourceResolver in classpath supporting
the scheme: " + scheme);
}
- return rr.resolve(location);
+ return rr.resolve(uri);
}
/**
diff --git
a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultResourceResolvers.java
b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultResourceResolvers.java
index e4d298b..ea9db30 100644
---
a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultResourceResolvers.java
+++
b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultResourceResolvers.java
@@ -44,7 +44,7 @@ public final class DefaultResourceResolvers {
}
@ResourceResolver(FileResolver.SCHEME)
- public static final class FileResolver extends ResourceResolverSupport {
+ public static class FileResolver extends ResourceResolverSupport {
public static final String SCHEME = "file";
private static final Logger LOGGER =
LoggerFactory.getLogger(FileResolver.class);
@@ -98,7 +98,7 @@ public final class DefaultResourceResolvers {
}
@ResourceResolver(HttpResolver.SCHEME)
- public static final class HttpResolver extends ResourceResolverSupport {
+ public static class HttpResolver extends ResourceResolverSupport {
public static final String SCHEME = "http";
private static final Logger LOGGER =
LoggerFactory.getLogger(HttpResolver.class);
@@ -167,7 +167,7 @@ public final class DefaultResourceResolvers {
}
@ResourceResolver(ClasspathResolver.SCHEME)
- public static final class ClasspathResolver extends
ResourceResolverSupport {
+ public static class ClasspathResolver extends ResourceResolverSupport {
public static final String SCHEME = "classpath";
private static final Logger LOGGER =
LoggerFactory.getLogger(ClasspathResolver.class);
@@ -234,7 +234,7 @@ public final class DefaultResourceResolvers {
}
@ResourceResolver(RefResolver.SCHEME)
- public static final class RefResolver extends ResourceResolverSupport {
+ public static class RefResolver extends ResourceResolverSupport {
public static final String SCHEME = "ref";
private static final Logger LOGGER =
LoggerFactory.getLogger(RefResolver.class);
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 89c084e..1df8c89 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
@@ -24,7 +24,10 @@ import java.util.concurrent.atomic.AtomicReference;
import org.apache.camel.TestSupport;
import org.apache.camel.impl.DefaultCamelContext;
+import org.apache.camel.impl.engine.DefaultResourceLoader;
import org.apache.camel.spi.Resource;
+import org.apache.camel.support.ResourceHelper;
+import org.apache.camel.support.ResourceResolverSupport;
import org.junit.jupiter.api.Test;
import static org.apache.camel.util.FileUtil.copyFile;
@@ -82,15 +85,54 @@ public class ResourceLoaderTest extends TestSupport {
@Test
public void testLoadClasspathDefault() throws Exception {
- DefaultCamelContext context = new DefaultCamelContext();
- Resource resource =
context.getResourceLoader().resolveResource("log4j2.properties");
+ try (DefaultCamelContext context = new DefaultCamelContext()) {
+ Resource resource =
context.getResourceLoader().resolveResource("log4j2.properties");
- try (InputStream is = resource.getInputStream()) {
- assertNotNull(is);
+ // need to be started as it triggers the fallback
+ // resolver
+ context.start();
- String text = context.getTypeConverter().convertTo(String.class,
is);
- assertNotNull(text);
- assertTrue(text.contains("rootLogger"));
+ try (InputStream is = resource.getInputStream()) {
+ assertNotNull(is);
+
+ String text =
context.getTypeConverter().convertTo(String.class, is);
+ assertNotNull(text);
+ assertTrue(text.contains("rootLogger"));
+ }
+ }
+ }
+
+ @Test
+ public void testLoadFallback() throws Exception {
+ try (DefaultCamelContext context = new DefaultCamelContext()) {
+ DefaultResourceLoader loader = new DefaultResourceLoader();
+ loader.setFallbackResolver(new ResourceResolverSupport("custom") {
+ @Override
+ public Resource resolve(String location) {
+ return ResourceHelper.fromString("custom", "fallback");
+ }
+
+ @Override
+ protected Resource createResource(String location) {
+ throw new UnsupportedOperationException();
+ }
+ });
+
+ context.setResourceLoader(loader);
+
+ Resource resource =
context.getResourceLoader().resolveResource("log4j2.properties");
+
+ // need to be started as it triggers the fallback
+ // resolver
+ context.start();
+
+ try (InputStream is = resource.getInputStream()) {
+ assertNotNull(is);
+
+ String text =
context.getTypeConverter().convertTo(String.class, is);
+ assertNotNull(text);
+ assertTrue(text.equals("fallback"));
+ }
}
}