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 <lburgazz...@gmail.com> 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")); + } } }