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 <claus.ib...@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");