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"));
+            }
         }
     }
 

Reply via email to