You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2021/12/14 06:27:13 UTC

[camel] branch main updated: CAMEL-17310: Reload routes should match resources that are the same when loaded via classpath or file scheme. Added getScheme to Resource API. mvn camel:dev now works.

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 f477092  CAMEL-17310: Reload routes should match resources that are the same when loaded via classpath or file scheme. Added getScheme to Resource API. mvn camel:dev now works.
f477092 is described below

commit f4770921a344f26dacdccebd41577b222e62fc13
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Tue Dec 14 07:10:13 2021 +0100

    CAMEL-17310: Reload routes should match resources that are the same when loaded via classpath or file scheme. Added getScheme to Resource API. mvn camel:dev now works.
---
 .../camel/language/bean/BeanResourceResolver.java  | 12 ++++------
 .../org/apache/camel/github/GitHubResource.java    |  2 +-
 .../main/java/org/apache/camel/spi/Resource.java   |  5 +++++
 .../impl/engine/DefaultResourceResolvers.java      | 18 +++++++--------
 .../apache/camel/urlhandler/custom/Handler.java    |  8 ++-----
 .../org/apache/camel/urlhandler/pd/Handler.java    |  8 ++-----
 .../support/FileWatcherResourceReloadStrategy.java |  4 ++++
 .../org/apache/camel/support/ResourceHelper.java   |  7 +-----
 .../org/apache/camel/support/ResourceSupport.java  | 13 +++++++----
 .../camel/support/RouteWatcherReloadStrategy.java  | 26 +++++++++++++++++++++-
 .../ROOT/pages/camel-3x-upgrade-guide-3_15.adoc    | 11 +++++++++
 .../modules/ROOT/pages/camel-3x-upgrade-guide.adoc |  1 +
 .../camel/dsl/yaml/support/YamlTestSupport.groovy  |  6 +++++
 .../main/java/org/apache/camel/maven/DevMojo.java  |  5 +++++
 14 files changed, 84 insertions(+), 42 deletions(-)

diff --git a/components/camel-bean/src/main/java/org/apache/camel/language/bean/BeanResourceResolver.java b/components/camel-bean/src/main/java/org/apache/camel/language/bean/BeanResourceResolver.java
index cb72f23..216c9ae 100644
--- a/components/camel-bean/src/main/java/org/apache/camel/language/bean/BeanResourceResolver.java
+++ b/components/camel-bean/src/main/java/org/apache/camel/language/bean/BeanResourceResolver.java
@@ -26,13 +26,14 @@ import org.apache.camel.spi.Resource;
 import org.apache.camel.spi.annotations.ResourceResolver;
 import org.apache.camel.support.DefaultExchange;
 import org.apache.camel.support.ResourceResolverSupport;
+import org.apache.camel.support.ResourceSupport;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @ResourceResolver(BeanResourceResolver.SCHEME)
 public class BeanResourceResolver extends ResourceResolverSupport {
     public static final String SCHEME = "bean";
-    private static final Logger LOGGER = LoggerFactory.getLogger(BeanResourceResolver.class);
+    private static final Logger LOG = LoggerFactory.getLogger(BeanResourceResolver.class);
 
     public BeanResourceResolver() {
         super(SCHEME);
@@ -40,14 +41,9 @@ public class BeanResourceResolver extends ResourceResolverSupport {
 
     @Override
     public Resource createResource(String location, String remaining) {
-        LOGGER.trace("Creating resource from expression {}", remaining);
-
-        return new Resource() {
-            @Override
-            public String getLocation() {
-                return location;
-            }
+        LOG.trace("Creating resource from calling bean: {}", remaining);
 
+        return new ResourceSupport(SCHEME, location) {
             @Override
             public boolean exists() {
                 return false;
diff --git a/components/camel-resourceresolver-github/src/main/java/org/apache/camel/github/GitHubResource.java b/components/camel-resourceresolver-github/src/main/java/org/apache/camel/github/GitHubResource.java
index 25b44ba..2b76e71 100644
--- a/components/camel-resourceresolver-github/src/main/java/org/apache/camel/github/GitHubResource.java
+++ b/components/camel-resourceresolver-github/src/main/java/org/apache/camel/github/GitHubResource.java
@@ -31,7 +31,7 @@ public final class GitHubResource extends ResourceSupport {
     private boolean init;
 
     public GitHubResource(CamelContext camelContext, String location) {
-        super(location);
+        super("github", location);
         this.camelContext = camelContext;
     }
 
diff --git a/core/camel-api/src/main/java/org/apache/camel/spi/Resource.java b/core/camel-api/src/main/java/org/apache/camel/spi/Resource.java
index feac689..b5c04bb 100644
--- a/core/camel-api/src/main/java/org/apache/camel/spi/Resource.java
+++ b/core/camel-api/src/main/java/org/apache/camel/spi/Resource.java
@@ -32,6 +32,11 @@ import java.nio.charset.StandardCharsets;
 public interface Resource {
 
     /**
+     * The scheme of the resource such as file, classpath, http
+     */
+    String getScheme();
+
+    /**
      * The location of the resource.
      */
     String getLocation();
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 7d451a9..21ec8fe 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
@@ -59,7 +59,7 @@ public final class DefaultResourceResolvers {
         public Resource createResource(String location, String remaining) {
             final File path = new File(tryDecodeUri(remaining));
 
-            return new ResourceSupport(location) {
+            return new ResourceSupport(SCHEME, location) {
                 @Override
                 public boolean exists() {
                     return path.exists();
@@ -110,7 +110,7 @@ public final class DefaultResourceResolvers {
 
         @Override
         public Resource createResource(String location, String remaining) {
-            return new ResourceSupport(location) {
+            return new ResourceSupport(SCHEME, location) {
                 @Override
                 public boolean exists() {
                     URLConnection connection = null;
@@ -169,7 +169,7 @@ public final class DefaultResourceResolvers {
         public Resource createResource(String location, String remaining) {
             final String path = getPath(remaining);
 
-            return new ResourceSupport(location) {
+            return new ResourceSupport(SCHEME, location) {
                 @Override
                 public boolean exists() {
                     return getURI() != null;
@@ -234,7 +234,7 @@ public final class DefaultResourceResolvers {
         public Resource createResource(String location, String remaining) {
             final String val = CamelContextHelper.lookup(getCamelContext(), remaining, String.class);
 
-            return new ResourceSupport(location) {
+            return new ResourceSupport(SCHEME, location) {
                 @Override
                 public boolean exists() {
                     return val != null;
@@ -265,7 +265,7 @@ public final class DefaultResourceResolvers {
 
         @Override
         public Resource createResource(String location, String remaining) {
-            return new ResourceSupport(location) {
+            return new ResourceSupport(SCHEME, location) {
                 @Override
                 public boolean exists() {
                     return remaining != null;
@@ -278,9 +278,7 @@ public final class DefaultResourceResolvers {
                     }
 
                     final byte[] decoded = Base64.getDecoder().decode(remaining);
-                    final InputStream is = new ByteArrayInputStream(decoded);
-
-                    return is;
+                    return new ByteArrayInputStream(decoded);
                 }
             };
         }
@@ -300,7 +298,7 @@ public final class DefaultResourceResolvers {
 
         @Override
         public Resource createResource(String location, String remaining) {
-            return new ResourceSupport(location) {
+            return new ResourceSupport(SCHEME, location) {
                 @Override
                 public boolean exists() {
                     return remaining != null;
@@ -334,7 +332,7 @@ public final class DefaultResourceResolvers {
 
         @Override
         public Resource createResource(String location, String remaining) {
-            return new ResourceSupport(location) {
+            return new ResourceSupport(SCHEME, location) {
                 @Override
                 public boolean exists() {
                     return remaining != null;
diff --git a/core/camel-core/src/test/java/org/apache/camel/urlhandler/custom/Handler.java b/core/camel-core/src/test/java/org/apache/camel/urlhandler/custom/Handler.java
index c0f5295..dd70e36 100644
--- a/core/camel-core/src/test/java/org/apache/camel/urlhandler/custom/Handler.java
+++ b/core/camel-core/src/test/java/org/apache/camel/urlhandler/custom/Handler.java
@@ -23,6 +23,7 @@ import java.nio.charset.StandardCharsets;
 
 import org.apache.camel.spi.Resource;
 import org.apache.camel.support.ResourceResolverSupport;
+import org.apache.camel.support.ResourceSupport;
 
 public class Handler extends ResourceResolverSupport {
     public Handler() {
@@ -31,12 +32,7 @@ public class Handler extends ResourceResolverSupport {
 
     @Override
     protected Resource createResource(String location, String remaining) {
-        return new Resource() {
-            @Override
-            public String getLocation() {
-                return location;
-            }
-
+        return new ResourceSupport("mem", location) {
             @Override
             public boolean exists() {
                 return true;
diff --git a/core/camel-core/src/test/java/org/apache/camel/urlhandler/pd/Handler.java b/core/camel-core/src/test/java/org/apache/camel/urlhandler/pd/Handler.java
index 92a43b5..9f243eb 100644
--- a/core/camel-core/src/test/java/org/apache/camel/urlhandler/pd/Handler.java
+++ b/core/camel-core/src/test/java/org/apache/camel/urlhandler/pd/Handler.java
@@ -24,6 +24,7 @@ import java.util.concurrent.atomic.AtomicInteger;
 
 import org.apache.camel.spi.Resource;
 import org.apache.camel.support.ResourceResolverSupport;
+import org.apache.camel.support.ResourceSupport;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -62,12 +63,7 @@ public class Handler extends ResourceResolverSupport {
 
     @Override
     protected Resource createResource(String location, String remaining) {
-        return new Resource() {
-            @Override
-            public String getLocation() {
-                return location;
-            }
-
+        return new ResourceSupport("mem", location) {
             @Override
             public boolean exists() {
                 return true;
diff --git a/core/camel-support/src/main/java/org/apache/camel/support/FileWatcherResourceReloadStrategy.java b/core/camel-support/src/main/java/org/apache/camel/support/FileWatcherResourceReloadStrategy.java
index b1f3ffa..970aff8 100644
--- a/core/camel-support/src/main/java/org/apache/camel/support/FileWatcherResourceReloadStrategy.java
+++ b/core/camel-support/src/main/java/org/apache/camel/support/FileWatcherResourceReloadStrategy.java
@@ -85,6 +85,10 @@ public class FileWatcherResourceReloadStrategy extends ResourceReloadStrategySup
     }
 
     public void setFolder(String folder) {
+        // clip file: prefix if mistakenly specified
+        if (folder != null && folder.startsWith("file:")) {
+            folder = folder.substring(5);
+        }
         this.folder = folder;
     }
 
diff --git a/core/camel-support/src/main/java/org/apache/camel/support/ResourceHelper.java b/core/camel-support/src/main/java/org/apache/camel/support/ResourceHelper.java
index 519caa0..30a1585 100644
--- a/core/camel-support/src/main/java/org/apache/camel/support/ResourceHelper.java
+++ b/core/camel-support/src/main/java/org/apache/camel/support/ResourceHelper.java
@@ -264,12 +264,7 @@ public final class ResourceHelper {
      * @return          a resource wrapping the given byte array
      */
     public static Resource fromBytes(String location, byte[] content) {
-        return new Resource() {
-            @Override
-            public String getLocation() {
-                return location;
-            }
-
+        return new ResourceSupport("mem", location) {
             @Override
             public boolean exists() {
                 return true;
diff --git a/core/camel-support/src/main/java/org/apache/camel/support/ResourceSupport.java b/core/camel-support/src/main/java/org/apache/camel/support/ResourceSupport.java
index d277f8a..cbab7dd 100644
--- a/core/camel-support/src/main/java/org/apache/camel/support/ResourceSupport.java
+++ b/core/camel-support/src/main/java/org/apache/camel/support/ResourceSupport.java
@@ -22,21 +22,26 @@ import org.apache.camel.spi.Resource;
  * Base class for {@link Resource} implementations.
  */
 public abstract class ResourceSupport implements Resource {
+    private final String scheme;
     private final String location;
 
-    protected ResourceSupport(String location) {
+    protected ResourceSupport(String scheme, String location) {
+        this.scheme = scheme;
         this.location = location;
     }
 
     @Override
+    public String getScheme() {
+        return scheme;
+    }
+
+    @Override
     public String getLocation() {
         return location;
     }
 
     @Override
     public String toString() {
-        return getClass().getSimpleName() + "{" +
-               "location=" + getLocation() +
-               '}';
+        return "Resource[" + scheme + ":" + location + "]";
     }
 }
diff --git a/core/camel-support/src/main/java/org/apache/camel/support/RouteWatcherReloadStrategy.java b/core/camel-support/src/main/java/org/apache/camel/support/RouteWatcherReloadStrategy.java
index f2d84be..0b1b204 100644
--- a/core/camel-support/src/main/java/org/apache/camel/support/RouteWatcherReloadStrategy.java
+++ b/core/camel-support/src/main/java/org/apache/camel/support/RouteWatcherReloadStrategy.java
@@ -17,6 +17,7 @@
 package org.apache.camel.support;
 
 import java.io.File;
+import java.net.URI;
 import java.nio.file.Files;
 import java.nio.file.Paths;
 import java.util.ArrayList;
@@ -156,7 +157,7 @@ public class RouteWatcherReloadStrategy extends FileWatcherResourceReloadStrateg
                 // remember all the sources of the current routes (except the updated)
                 getCamelContext().getRoutes().forEach(r -> {
                     Resource rs = r.getSourceResource();
-                    if (rs != null && (resource == null || !rs.getLocation().equals(resource.getLocation()))) {
+                    if (rs != null && !equalResourceLocation(resource, rs)) {
                         sources.add(rs);
                     }
                 });
@@ -230,4 +231,27 @@ public class RouteWatcherReloadStrategy extends FileWatcherResourceReloadStrateg
         }
     }
 
+    /**
+     * Whether the two resources are loading the same resource
+     */
+    private static boolean equalResourceLocation(Resource source, Resource target) {
+        if (source == null || target == null) {
+            return false;
+        }
+
+        // use URI to match as file/classpath resources may refer to the same uri
+        URI u1 = source.getURI();
+        URI u2 = target.getURI();
+        boolean answer = u1.equals(u2);
+        if (!answer) {
+            // file and classpath may refer to the same when they have src/main/resources && target/classes
+            String s1 = u1.toString().replace("src/main/resources/", "").replace("src/test/resources/", "")
+                    .replace("target/classes/", "");
+            String s2 = u2.toString().replace("src/main/resources/", "").replace("src/test/resources/", "")
+                    .replace("target/classes/", "");
+            answer = s1.equals(s2);
+        }
+        return answer;
+    }
+
 }
diff --git a/docs/user-manual/modules/ROOT/pages/camel-3x-upgrade-guide-3_15.adoc b/docs/user-manual/modules/ROOT/pages/camel-3x-upgrade-guide-3_15.adoc
new file mode 100644
index 0000000..8bad4c5
--- /dev/null
+++ b/docs/user-manual/modules/ROOT/pages/camel-3x-upgrade-guide-3_15.adoc
@@ -0,0 +1,11 @@
+= Apache Camel 3.x Upgrade Guide
+
+This document is for helping you upgrade your Apache Camel application
+from Camel 3.x to 3.y. For example if you are upgrading Camel 3.0 to 3.2, then you should follow the guides
+from both 3.0 to 3.1 and 3.1 to 3.2.
+
+== Upgrading Camel 3.14 to 3.15
+
+=== API changes
+
+Added `getScheme` method to `org.apache.camel.spi.Resource`.
diff --git a/docs/user-manual/modules/ROOT/pages/camel-3x-upgrade-guide.adoc b/docs/user-manual/modules/ROOT/pages/camel-3x-upgrade-guide.adoc
index d413e78..b7dff7f 100644
--- a/docs/user-manual/modules/ROOT/pages/camel-3x-upgrade-guide.adoc
+++ b/docs/user-manual/modules/ROOT/pages/camel-3x-upgrade-guide.adoc
@@ -23,3 +23,4 @@ You can find upgrade guide for each release in the following pages:
 - xref:camel-3x-upgrade-guide-3_12.adoc[Upgrade guide 3.11 -> 3.12]
 - xref:camel-3x-upgrade-guide-3_13.adoc[Upgrade guide 3.12 -> 3.13]
 - xref:camel-3x-upgrade-guide-3_14.adoc[Upgrade guide 3.13 -> 3.14]
+- xref:camel-3x-upgrade-guide-3_15.adoc[Upgrade guide 3.14 -> 3.15]
diff --git a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/support/YamlTestSupport.groovy b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/support/YamlTestSupport.groovy
index 78c81da..bfd3b77 100644
--- a/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/support/YamlTestSupport.groovy
+++ b/dsl/camel-yaml-dsl/camel-yaml-dsl/src/test/groovy/org/apache/camel/dsl/yaml/support/YamlTestSupport.groovy
@@ -149,6 +149,12 @@ class YamlTestSupport extends Specification implements HasCamelContext {
 
     static Resource asResource(String location, String content) {
         return new Resource() {
+
+            @Override
+            String getScheme() {
+                return "mem"
+            }
+
             @Override
             String getLocation() {
                 return location.endsWith('.yaml') ? location : location + '.yaml'
diff --git a/tooling/maven/camel-maven-plugin/src/main/java/org/apache/camel/maven/DevMojo.java b/tooling/maven/camel-maven-plugin/src/main/java/org/apache/camel/maven/DevMojo.java
index b4316d4..ffa8086 100644
--- a/tooling/maven/camel-maven-plugin/src/main/java/org/apache/camel/maven/DevMojo.java
+++ b/tooling/maven/camel-maven-plugin/src/main/java/org/apache/camel/maven/DevMojo.java
@@ -16,6 +16,8 @@
  */
 package org.apache.camel.maven;
 
+import java.io.File;
+
 import org.apache.maven.plugins.annotations.LifecyclePhase;
 import org.apache.maven.plugins.annotations.Mojo;
 import org.apache.maven.plugins.annotations.Parameter;
@@ -47,6 +49,9 @@ public class DevMojo extends RunMojo {
             dir = "src/main/resources";
         }
 
+        // use absolute path for dir
+        dir = new File(dir).getAbsolutePath();
+
         System.setProperty("camel.main.routesReloadEnabled", "true");
         System.setProperty("camel.main.routesReloadDirectory", dir);
         System.setProperty("camel.main.routesReloadDirectoryRecursive", "true");