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 2024/01/25 10:36:26 UTC

(camel) 01/02: CAMEL-20354: camel-jbang - Using camel run --source-dir component should be able to load from classpath

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

commit 73807747e5ff94ee72e1c16dbc2de02306f851e5
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Thu Jan 25 11:10:18 2024 +0100

    CAMEL-20354: camel-jbang - Using camel run --source-dir component should be able to load from classpath
---
 .../impl/engine/DefaultResourceResolvers.java      |  4 ++++
 .../main/java/org/apache/camel/util/FileUtil.java  |  1 -
 .../java/org/apache/camel/main/KameletMain.java    |  6 ++++--
 .../DependencyDownloaderResourceLoader.java        | 24 ++++++++++++++++++++--
 4 files changed, 30 insertions(+), 5 deletions(-)

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 4caca72c06a..21e29e19c55 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
@@ -176,6 +176,10 @@ public final class DefaultResourceResolvers {
         }
 
         private String getPath(String location) {
+            // skip leading double slashes
+            if (location.startsWith("//")) {
+                location = location.substring(2);
+            }
             String uri = tryDecodeUri(location);
             return FileUtil.compactPath(uri, '/');
         }
diff --git a/core/camel-util/src/main/java/org/apache/camel/util/FileUtil.java b/core/camel-util/src/main/java/org/apache/camel/util/FileUtil.java
index 22e9b732a95..a5df404576f 100644
--- a/core/camel-util/src/main/java/org/apache/camel/util/FileUtil.java
+++ b/core/camel-util/src/main/java/org/apache/camel/util/FileUtil.java
@@ -275,7 +275,6 @@ public final class FileUtil {
 
     /**
      * Compacts a path by stacking it and reducing <tt>..</tt>, and uses the given separator.
-     *
      */
     public static String compactPath(String path, char separator) {
         return compactPath(path, String.valueOf(separator));
diff --git a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/KameletMain.java b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/KameletMain.java
index f9480d9747e..28f8a6825f4 100644
--- a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/KameletMain.java
+++ b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/KameletMain.java
@@ -526,6 +526,9 @@ public class KameletMain extends MainCommandLineSupport {
             }
         }
 
+        // source-dir
+        String sourceDir = getInitialProperties().getProperty("camel.jbang.sourceDir");
+
         try {
             // dependencies from CLI
             Object dependencies = getInitialProperties().get("camel.jbang.dependencies");
@@ -561,7 +564,7 @@ public class KameletMain extends MainCommandLineSupport {
             answer.getCamelContextExtension().addContextPlugin(UriFactoryResolver.class,
                     new DependencyDownloaderUriFactoryResolver(answer));
             answer.getCamelContextExtension().addContextPlugin(ResourceLoader.class,
-                    new DependencyDownloaderResourceLoader(answer));
+                    new DependencyDownloaderResourceLoader(answer, sourceDir));
 
             answer.setInjector(new KameletMainInjector(answer.getInjector(), stubPattern, silent));
             Object kameletsVersion = getInitialProperties().get("camel.jbang.kameletsVersion");
@@ -574,7 +577,6 @@ public class KameletMain extends MainCommandLineSupport {
                     new DownloadModelineParser(answer));
 
             // reloader
-            String sourceDir = getInitialProperties().getProperty("camel.jbang.sourceDir");
             if (sourceDir != null) {
                 if (console || health) {
                     // allow to upload source via http when HTTP console enabled
diff --git a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloaderResourceLoader.java b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloaderResourceLoader.java
index ca9a133c0be..280384a383a 100644
--- a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloaderResourceLoader.java
+++ b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloaderResourceLoader.java
@@ -16,6 +16,8 @@
  */
 package org.apache.camel.main.download;
 
+import java.io.File;
+
 import org.apache.camel.CamelContext;
 import org.apache.camel.impl.engine.DefaultResourceLoader;
 import org.apache.camel.spi.Resource;
@@ -24,9 +26,11 @@ import org.apache.camel.util.StringHelper;
 public class DependencyDownloaderResourceLoader extends DefaultResourceLoader {
 
     private final DependencyDownloader downloader;
+    private final String sourceDir;
 
-    public DependencyDownloaderResourceLoader(CamelContext camelContext) {
+    public DependencyDownloaderResourceLoader(CamelContext camelContext, String sourceDir) {
         super(camelContext);
+        this.sourceDir = sourceDir;
         this.downloader = camelContext.hasService(DependencyDownloader.class);
     }
 
@@ -45,7 +49,23 @@ public class DependencyDownloaderResourceLoader extends DefaultResourceLoader {
                 }
             }
         }
-        return super.resolveResource(uri);
+        Resource answer = super.resolveResource(uri);
+        if (sourceDir != null) {
+            boolean exists = answer != null && answer.exists();
+            // if not found then we need to look again inside the source-dir which we can do
+            // for file and classpath resources
+            if (!exists && ("classpath".equals(scheme) || "file".equals(scheme))) {
+                String path = StringHelper.after(uri, ":");
+                // strip leading double slash
+                if (path.startsWith("//")) {
+                    path = path.substring(2);
+                }
+                // force to load from file system when using source-dir
+                uri = "file" + ":" + sourceDir + File.separator + path;
+                answer = super.resolveResource(uri);
+            }
+        }
+        return answer;
     }
 
 }