This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch central
in repository https://gitbox.apache.org/repos/asf/camel.git

commit b2edaadd8387819288326f072af9a2c18f2fee6f
Author: Claus Ibsen <claus.ib...@gmail.com>
AuthorDate: Fri Mar 8 12:10:17 2024 +0100

    CAMEL-20539: camel-jbang - Make it possible to turn off maven central so 
its easier to ensure all downloads can be done via maven proxy/mirror
---
 .../modules/ROOT/pages/camel-jbang.adoc            |  6 ++
 .../apache/camel/dsl/jbang/core/commands/Run.java  | 14 ++++
 .../java/org/apache/camel/main/KameletMain.java    | 26 ++++++++
 .../camel/main/download/DependencyDownloader.java  | 20 ++++++
 .../main/download/MavenDependencyDownloader.java   | 31 ++++++++-
 .../camel/tooling/maven/MavenDownloader.java       | 24 +++++++
 .../camel/tooling/maven/MavenDownloaderImpl.java   | 75 ++++++++++++++++------
 7 files changed, 175 insertions(+), 21 deletions(-)

diff --git a/docs/user-manual/modules/ROOT/pages/camel-jbang.adoc 
b/docs/user-manual/modules/ROOT/pages/camel-jbang.adoc
index 25d0283e7f7..d50e92f81a4 100644
--- a/docs/user-manual/modules/ROOT/pages/camel-jbang.adoc
+++ b/docs/user-manual/modules/ROOT/pages/camel-jbang.adoc
@@ -3394,6 +3394,12 @@ The follow options related to _exporting_, can be 
configured in `application.pro
 |`camel.jbang.mavenSettingsSecurity`
 |Optional location of Maven settings-security.xml file to decrypt settings.xml
 
+|`camel.jbang.mavenCentralEnabled`
+|Whether downloading JARs from Maven Central repository is enabled
+
+|`camel.jbang.mavenApacheSnapshotEnabled`
+|Whether downloading JARs from ASF Maven Snapshot repository is enabled
+
 |`camel.jbang.exportDir`
 |Directory where the project will be exported
 
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java
index 221259ad051..ee4a23b1bfc 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Run.java
@@ -167,6 +167,14 @@ public class Run extends CamelCommand {
             description = "Optional location of Maven settings-security.xml 
file to decrypt settings.xml")
     String mavenSettingsSecurity;
 
+    @Option(names = { "--maven-central-enabled" },
+            description = "Whether downloading JARs from Maven Central 
repository is enabled")
+    boolean mavenCentralEnabled = true;
+
+    @Option(names = { "--maven-apache-snapshot-enabled" },
+            description = "Whether downloading JARs from ASF Maven Snapshot 
repository is enabled")
+    boolean mavenApacheSnapshotEnabled = true;
+
     @Option(names = { "--fresh" }, description = "Make sure we use fresh (i.e. 
non-cached) resources")
     boolean fresh;
 
@@ -441,6 +449,8 @@ public class Run extends CamelCommand {
         main.setFresh(fresh);
         main.setMavenSettings(mavenSettings);
         main.setMavenSettingsSecurity(mavenSettingsSecurity);
+        main.setMavenCentralEnabled(mavenCentralEnabled);
+        main.setMavenApacheSnapshotEnabled(mavenApacheSnapshotEnabled);
         main.setDownloadListener(new RunDownloadListener());
         main.setAppName("Apache Camel (JBang)");
 
@@ -858,6 +868,10 @@ public class Run extends CamelCommand {
             repos = answer.getProperty("camel.jbang.repos", repos);
             mavenSettings = answer.getProperty("camel.jbang.maven-settings", 
mavenSettings);
             mavenSettingsSecurity = 
answer.getProperty("camel.jbang.maven-settings-security", 
mavenSettingsSecurity);
+            mavenCentralEnabled = "true"
+                    
.equals(answer.getProperty("camel.jbang.maven-central-enabled", 
mavenCentralEnabled ? "true" : "false"));
+            mavenApacheSnapshotEnabled = 
"true".equals(answer.getProperty("camel.jbang.maven-apache-snapshot-enabled",
+                    mavenApacheSnapshotEnabled ? "true" : "false"));
             openapi = answer.getProperty("camel.jbang.open-api", openapi);
             download = 
"true".equals(answer.getProperty("camel.jbang.download", download ? "true" : 
"false"));
             background = 
"true".equals(answer.getProperty("camel.jbang.background", background ? "true" 
: "false"));
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 5b51d0d6f78..b22fe375f9e 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
@@ -110,6 +110,8 @@ public class KameletMain extends MainCommandLineSupport {
     private boolean verbose;
     private String mavenSettings;
     private String mavenSettingsSecurity;
+    boolean mavenCentralEnabled = true;
+    boolean mavenApacheSnapshotEnabled = true;
     private String stubPattern;
     private boolean silent;
     private DownloadListener downloadListener;
@@ -267,6 +269,28 @@ public class KameletMain extends MainCommandLineSupport {
         return downloadListener;
     }
 
+    public boolean isMavenCentralEnabled() {
+        return mavenCentralEnabled;
+    }
+
+    /**
+     * Whether downloading JARs from Maven Central repository is enabled
+     */
+    public void setMavenCentralEnabled(boolean mavenCentralEnabled) {
+        this.mavenCentralEnabled = mavenCentralEnabled;
+    }
+
+    public boolean isMavenApacheSnapshotEnabled() {
+        return mavenApacheSnapshotEnabled;
+    }
+
+    /**
+     * Whether downloading JARs from ASF Maven Snapshot repository is enabled
+     */
+    public void setMavenApacheSnapshotEnabled(boolean 
mavenApacheSnapshotEnabled) {
+        this.mavenApacheSnapshotEnabled = mavenApacheSnapshotEnabled;
+    }
+
     /**
      * Sets a custom download listener
      */
@@ -384,6 +408,8 @@ public class KameletMain extends MainCommandLineSupport {
         downloader.setFresh(fresh);
         downloader.setMavenSettings(mavenSettings);
         downloader.setMavenSettingsSecurity(mavenSettingsSecurity);
+        downloader.setMavenCentralEnabled(mavenCentralEnabled);
+        downloader.setMavenApacheSnapshotEnabled(mavenApacheSnapshotEnabled);
         if (downloadListener != null) {
             downloader.addDownloadListener(downloadListener);
         }
diff --git 
a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloader.java
 
b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloader.java
index d8917437293..d325513c6e9 100644
--- 
a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloader.java
+++ 
b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/DependencyDownloader.java
@@ -87,6 +87,26 @@ public interface DependencyDownloader extends 
CamelContextAware, StaticService {
      */
     void setMavenSettingsSecurity(String mavenSettingsSecurity);
 
+    /**
+     * Whether downloading JARs from Maven Central repository is enabled
+     */
+    boolean isMavenCentralEnabled();
+
+    /**
+     * Whether downloading JARs from Maven Central repository is enabled
+     */
+    void setMavenCentralEnabled(boolean mavenCentralEnabled);
+
+    /**
+     * Whether downloading JARs from ASF Maven Snapshot repository is enabled
+     */
+    boolean isMavenApacheSnapshotEnabled();
+
+    /**
+     * Whether downloading JARs from ASF Maven Snapshot repository is enabled
+     */
+    void setMavenApacheSnapshotEnabled(boolean mavenApacheSnapshotEnabled);
+
     /**
      * Downloads the dependency incl transitive dependencies
      *
diff --git 
a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/MavenDependencyDownloader.java
 
b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/MavenDependencyDownloader.java
index 4e8f113fb09..de93bfd112d 100644
--- 
a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/MavenDependencyDownloader.java
+++ 
b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/MavenDependencyDownloader.java
@@ -83,6 +83,9 @@ public class MavenDependencyDownloader extends ServiceSupport 
implements Depende
     // settings.xml and settings-security.xml locations to be passed to 
MavenDownloader from camel-tooling-maven
     private String mavenSettings;
     private String mavenSettingsSecurity;
+    // to make it easy to turn off maven central/snapshot
+    boolean mavenCentralEnabled = true;
+    boolean mavenApacheSnapshotEnabled = true;
 
     @Override
     public CamelContext getCamelContext() {
@@ -187,6 +190,26 @@ public class MavenDependencyDownloader extends 
ServiceSupport implements Depende
         this.mavenSettingsSecurity = mavenSettingsSecurity;
     }
 
+    @Override
+    public boolean isMavenCentralEnabled() {
+        return mavenCentralEnabled;
+    }
+
+    @Override
+    public void setMavenCentralEnabled(boolean mavenCentralEnabled) {
+        this.mavenCentralEnabled = mavenCentralEnabled;
+    }
+
+    @Override
+    public boolean isMavenApacheSnapshotEnabled() {
+        return mavenApacheSnapshotEnabled;
+    }
+
+    @Override
+    public void setMavenApacheSnapshotEnabled(boolean 
mavenApacheSnapshotEnabled) {
+        this.mavenApacheSnapshotEnabled = mavenApacheSnapshotEnabled;
+    }
+
     @Override
     public void downloadDependency(String groupId, String artifactId, String 
version) {
         downloadDependency(groupId, artifactId, version, true);
@@ -243,7 +266,7 @@ public class MavenDependencyDownloader extends 
ServiceSupport implements Depende
             List<String> deps = List.of(gav);
 
             // include Apache snapshot to make it easy to use upcoming releases
-            boolean useApacheSnaphots = "org.apache.camel".equals(groupId) && 
version.contains("SNAPSHOT");
+            boolean useApacheSnapshots = "org.apache.camel".equals(groupId) && 
version.contains("SNAPSHOT");
 
             // include extra repositories (if any) - these will be used in 
addition
             // to the ones detected from ~/.m2/settings.xml and configured in
@@ -256,7 +279,7 @@ public class MavenDependencyDownloader extends 
ServiceSupport implements Depende
             }
 
             List<MavenArtifact> artifacts = resolveDependenciesViaAether(deps, 
extraRepositories,
-                    transitively, useApacheSnaphots);
+                    transitively, useApacheSnapshots);
             List<File> files = new ArrayList<>();
             if (verbose) {
                 LOG.info("Resolved: {} -> [{}]", gav, artifacts);
@@ -480,6 +503,8 @@ public class MavenDependencyDownloader extends 
ServiceSupport implements Depende
         MavenDownloaderImpl mavenDownloaderImpl = new MavenDownloaderImpl();
         mavenDownloaderImpl.setMavenSettingsLocation(mavenSettings);
         
mavenDownloaderImpl.setMavenSettingsSecurityLocation(mavenSettingsSecurity);
+        mavenDownloaderImpl.setMavenCentralEnabled(mavenCentralEnabled);
+        
mavenDownloaderImpl.setMavenApacheSnapshotEnabled(mavenApacheSnapshotEnabled);
         mavenDownloaderImpl.setRepos(repos);
         mavenDownloaderImpl.setFresh(fresh);
         mavenDownloaderImpl.setOffline(!download);
@@ -534,7 +559,7 @@ public class MavenDependencyDownloader extends 
ServiceSupport implements Depende
         try {
             return mavenDownloader.resolveArtifacts(depIds, extraRepositories, 
transitively, useApacheSnapshots);
         } catch (MavenResolutionException e) {
-            String repos = e.getRepositories() == null
+            String repos = (e.getRepositories() == null || 
e.getRepositories().isEmpty())
                     ? "(empty URL list)"
                     : String.join(", ", e.getRepositories());
             String msg = "Cannot resolve dependencies in " + repos;
diff --git 
a/tooling/camel-tooling-maven/src/main/java/org/apache/camel/tooling/maven/MavenDownloader.java
 
b/tooling/camel-tooling-maven/src/main/java/org/apache/camel/tooling/maven/MavenDownloader.java
index edae817ebb9..5dc197584bf 100644
--- 
a/tooling/camel-tooling-maven/src/main/java/org/apache/camel/tooling/maven/MavenDownloader.java
+++ 
b/tooling/camel-tooling-maven/src/main/java/org/apache/camel/tooling/maven/MavenDownloader.java
@@ -101,4 +101,28 @@ public interface MavenDownloader {
      */
     void setRepositoryResolver(RepositoryResolver repositoryResolver);
 
+    /**
+     * Sets whether maven central repository should be included and as first 
in the list of repositories. This can be
+     * used to turn of maven central for users that may use their own maven 
proxy.
+     */
+    void setMavenCentralEnabled(boolean mavenCentralEnabled);
+
+    /**
+     * Sets whether maven central repository should be included and as first 
in the list of repositories. This can be
+     * used to turn of maven central for users that may use their own maven 
proxy.
+     */
+    boolean isMavenCentralEnabled();
+
+    /**
+     * Sets whether using SNAPSHOT versions of Apache Camel is enabled. If 
enabled then SNAPSHOT can be downloaded from
+     * the ASF SNAPSHOT maven repository.
+     */
+    void setMavenApacheSnapshotEnabled(boolean mavenApacheSnapshotEnabled);
+
+    /**
+     * Sets whether using SNAPSHOT versions of Apache Camel is enabled. If 
enabled then SNAPSHOT can be downloaded from
+     * the ASF SNAPSHOT maven repository.
+     */
+    boolean isMavenApacheSnapshotEnabled();
+
 }
diff --git 
a/tooling/camel-tooling-maven/src/main/java/org/apache/camel/tooling/maven/MavenDownloaderImpl.java
 
b/tooling/camel-tooling-maven/src/main/java/org/apache/camel/tooling/maven/MavenDownloaderImpl.java
index 3851955f771..0870e35e55c 100644
--- 
a/tooling/camel-tooling-maven/src/main/java/org/apache/camel/tooling/maven/MavenDownloaderImpl.java
+++ 
b/tooling/camel-tooling-maven/src/main/java/org/apache/camel/tooling/maven/MavenDownloaderImpl.java
@@ -233,6 +233,9 @@ public class MavenDownloaderImpl extends ServiceSupport 
implements MavenDownload
     private static final RepositoryPolicy POLICY_DISABLED = new 
RepositoryPolicy(
             false, RepositoryPolicy.UPDATE_POLICY_NEVER, 
RepositoryPolicy.CHECKSUM_POLICY_IGNORE);
 
+    private boolean mavenCentralEnabled = true;
+    private boolean mavenApacheSnapshotEnabled = true;
+
     private RepositoryResolver repositoryResolver;
 
     private RepositorySystem repositorySystem;
@@ -326,9 +329,19 @@ public class MavenDownloaderImpl extends ServiceSupport 
implements MavenDownload
                 originalRepositories));
 
         // mirroring/proxying Maven Central
-        centralResolutionRepository = remoteRepositories.get(0);
+        if (centralRepository == null && !remoteRepositories.isEmpty()) {
+            for (RemoteRepository repo : remoteRepositories) {
+                if ("central".equals(repo.getId())) {
+                    centralRepository = repo;
+                    break;
+                } else if (repo.getHost().startsWith("repo1.maven.org") || 
repo.getHost().startsWith("repo2.maven.org")) {
+                    centralRepository = repo;
+                    break;
+                }
+            }
+        }
 
-        if (!apacheSnapshotsIncluded) {
+        if (mavenApacheSnapshotEnabled && !apacheSnapshotsIncluded) {
             // process apache snapshots even if it's not present in 
remoteRepositories, because it
             // may be used on demand for each download/resolution request
             apacheSnapshotsResolutionRepository = 
repositorySystem.newResolutionRepositories(repositorySystemSession,
@@ -371,7 +384,7 @@ public class MavenDownloaderImpl extends ServiceSupport 
implements MavenDownload
             
repositories.addAll(repositorySystem.newResolutionRepositories(repositorySystemSession,
                     extraRemoteRepositories));
         }
-        if (useApacheSnapshots && !apacheSnapshotsIncluded) {
+        if (mavenApacheSnapshotEnabled && useApacheSnapshots && 
!apacheSnapshotsIncluded) {
             repositories.add(apacheSnapshotsResolutionRepository);
         }
 
@@ -1171,18 +1184,22 @@ public class MavenDownloaderImpl extends ServiceSupport 
implements MavenDownload
         // a set to prevent duplicates, but do not store URLs directly 
(hashCode() may lead to DNS resolution!)
         Set<String> repositoryURLs = new HashSet<>();
 
-        // add maven central first - always
-        centralRepository = new RemoteRepository.Builder("central", "default", 
MAVEN_CENTRAL_REPO)
-                .setReleasePolicy(defaultPolicy)
-                .setSnapshotPolicy(POLICY_DISABLED)
-                .build();
-        repositories.add(centralRepository);
+        if (mavenCentralEnabled) {
+            // add maven central first - always
+            centralRepository = new RemoteRepository.Builder("central", 
"default", MAVEN_CENTRAL_REPO)
+                    .setReleasePolicy(defaultPolicy)
+                    .setSnapshotPolicy(POLICY_DISABLED)
+                    .build();
+            repositories.add(centralRepository);
+        }
 
-        // configure Apache snapshots - to be used if needed
-        apacheSnapshotsRepository = new 
RemoteRepository.Builder("apache-snapshot", "default", APACHE_SNAPSHOT_REPO)
-                .setReleasePolicy(POLICY_DISABLED)
-                .setSnapshotPolicy(defaultPolicy)
-                .build();
+        if (mavenApacheSnapshotEnabled) {
+            // configure Apache snapshots - to be used if needed
+            apacheSnapshotsRepository = new 
RemoteRepository.Builder("apache-snapshot", "default", APACHE_SNAPSHOT_REPO)
+                    .setReleasePolicy(POLICY_DISABLED)
+                    .setSnapshotPolicy(defaultPolicy)
+                    .build();
+        }
 
         // and custom repos and remember URLs to not duplicate the 
repositories from the settings
         if (repos != null) {
@@ -1206,7 +1223,8 @@ public class MavenDownloaderImpl extends ServiceSupport 
implements MavenDownload
                 try {
                     URL url = new URL(r.getUrl());
                     if (repositoryURLs.add(r.getUrl())) {
-                        if (url.getHost().equals("repository.apache.org") && 
url.getPath().startsWith("/snapshots")) {
+                        if (mavenApacheSnapshotEnabled && 
url.getHost().equals("repository.apache.org")
+                                && url.getPath().startsWith("/snapshots")) {
                             // record that Apache Snapshots repository is 
included in default (always used)
                             // repositories and used preconfigured instance of 
o.e.aether.repository.RemoteRepository
                             apacheSnapshotsIncluded = true;
@@ -1252,7 +1270,7 @@ public class MavenDownloaderImpl extends ServiceSupport 
implements MavenDownload
 
     /**
      * Helper method to translate a collection of Strings for remote 
repository URLs into actual instances of
-     * {@link RemoteRepository} added to the passed {@code repositories}. We 
don't detected duplicates here and we don't
+     * {@link RemoteRepository} added to the passed {@code repositories}. We 
don't detect duplicates here, and we don't
      * do mirror/proxy processing of the repositories.
      */
     private void configureRepositories(List<RemoteRepository> repositories, 
Set<String> urls) {
@@ -1260,11 +1278,12 @@ public class MavenDownloaderImpl extends ServiceSupport 
implements MavenDownload
             try {
                 repo = repositoryResolver.resolveRepository(repo);
                 URL url = new URL(repo);
-                if (url.getHost().equals("repo1.maven.org")) {
+                if (mavenCentralEnabled && 
url.getHost().equals("repo1.maven.org")) {
                     // Maven Central is always used, so skip it
                     return;
                 }
-                if (url.getHost().equals("repository.apache.org") && 
url.getPath().contains("/snapshots")) {
+                if (mavenApacheSnapshotEnabled && 
url.getHost().equals("repository.apache.org")
+                        && url.getPath().contains("/snapshots")) {
                     // Apache Snapshots added, so we'll use our own definition 
of this repository
                     repositories.add(apacheSnapshotsRepository);
                 } else {
@@ -1316,6 +1335,26 @@ public class MavenDownloaderImpl extends ServiceSupport 
implements MavenDownload
         this.offline = offline;
     }
 
+    @Override
+    public boolean isMavenCentralEnabled() {
+        return mavenCentralEnabled;
+    }
+
+    @Override
+    public void setMavenCentralEnabled(boolean mavenCentralEnabled) {
+        this.mavenCentralEnabled = mavenCentralEnabled;
+    }
+
+    @Override
+    public boolean isMavenApacheSnapshotEnabled() {
+        return mavenApacheSnapshotEnabled;
+    }
+
+    @Override
+    public void setMavenApacheSnapshotEnabled(boolean 
mavenApacheSnapshotEnabled) {
+        this.mavenApacheSnapshotEnabled = mavenApacheSnapshotEnabled;
+    }
+
     private static class AcceptAllDependencyFilter implements DependencyFilter 
{
         @Override
         public boolean accept(DependencyNode node, List<DependencyNode> 
parents) {

Reply via email to