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 2023/03/09 15:02:53 UTC

[camel] 01/04: CAMEL-18983: camel-jbang - Automatic detect atlassian maven repo when using camel-jira

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

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

commit e6f5b2aa88844204dd2e419a4a70b4c8759b0c40
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Mon Mar 6 08:57:50 2023 +0100

    CAMEL-18983: camel-jbang - Automatic detect atlassian maven repo when using camel-jira
---
 .../java/org/apache/camel/main/KameletMain.java    |  4 ++
 .../camel/main/download/DependencyDownloader.java  | 10 ++++
 .../camel/main/download/KnownReposResolver.java    | 64 ++++++++++++++++++++++
 .../main/download/MavenDependencyDownloader.java   | 56 +++++++++++++++++--
 .../resources/camel-main-known-repos.properties    | 18 ++++++
 5 files changed, 147 insertions(+), 5 deletions(-)

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 3d486c8ac48..96764e89c5a 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
@@ -48,6 +48,7 @@ import org.apache.camel.main.download.DownloadListener;
 import org.apache.camel.main.download.DownloadModelineParser;
 import org.apache.camel.main.download.KameletMainInjector;
 import org.apache.camel.main.download.KnownDependenciesResolver;
+import org.apache.camel.main.download.KnownReposResolver;
 import org.apache.camel.main.download.MavenDependencyDownloader;
 import org.apache.camel.main.download.TypeConverterLoaderDownloadListener;
 import org.apache.camel.main.http.VertxHttpServer;
@@ -311,7 +312,10 @@ public class KameletMain extends MainCommandLineSupport {
             answer.getPackageScanClassResolver().addClassLoader(dynamicCL);
             answer.getPackageScanResourceResolver().addClassLoader(dynamicCL);
 
+            KnownReposResolver known = new KnownReposResolver(camelContext);
+            known.loadKnownDependencies();
             MavenDependencyDownloader downloader = new MavenDependencyDownloader();
+            downloader.setKnownReposResolver(known);
             downloader.setClassLoader(dynamicCL);
             downloader.setCamelContext(answer);
             downloader.setRepos(repos);
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 cce2e991f6e..1ebf173e5a3 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
@@ -81,6 +81,16 @@ public interface DependencyDownloader extends CamelContextAware, StaticService {
      */
     void downloadDependency(String groupId, String artifactId, String version);
 
+    /**
+     * Downloads the dependency incl transitive dependencies
+     *
+     * @param groupId    maven group id
+     * @param artifactId maven artifact id
+     * @param version    maven version
+     * @param extraRepos additional remote maven repositories to use when downloading
+     */
+    void downloadDependency(String groupId, String artifactId, String version, String extraRepos);
+
     /**
      * Downloads the dependency
      *
diff --git a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/KnownReposResolver.java b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/KnownReposResolver.java
new file mode 100644
index 00000000000..fc5626010f1
--- /dev/null
+++ b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/download/KnownReposResolver.java
@@ -0,0 +1,64 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.main.download;
+
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+
+import org.apache.camel.CamelContext;
+
+public final class KnownReposResolver {
+
+    private final Map<String, String> repos = new HashMap<>();
+    private final CamelContext camelContext;
+
+    public KnownReposResolver(CamelContext camelContext) {
+        this.camelContext = camelContext;
+    }
+
+    public void loadKnownDependencies() {
+        doLoadKnownRepos("/camel-main-known-repos.properties");
+    }
+
+    private void doLoadKnownRepos(String name) {
+        try {
+            InputStream is = getClass().getResourceAsStream(name);
+            if (is != null) {
+                Properties prop = new Properties();
+                prop.load(is);
+                Map<String, String> map = new HashMap<>();
+                for (String key : prop.stringPropertyNames()) {
+                    String value = prop.getProperty(key);
+                    map.put(key, value);
+                }
+                addRepos(map);
+            }
+        } catch (Throwable e) {
+            // ignore
+        }
+    }
+
+    public void addRepos(Map<String, String> repos) {
+        this.repos.putAll(repos);
+    }
+
+    public String getRepo(String key) {
+        return repos.get(key);
+    }
+}
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 55a04316ce6..2f941705588 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
@@ -214,6 +214,7 @@ public class MavenDependencyDownloader extends ServiceSupport implements Depende
     private static final RepositoryPolicy POLICY_DISABLED = new RepositoryPolicy(
             false, RepositoryPolicy.UPDATE_POLICY_NEVER, RepositoryPolicy.CHECKSUM_POLICY_IGNORE);
 
+    int customCount = 1;
     private String[] bootClasspath;
     private DownloadThreadPool threadPool;
     private DIRegistry registry;
@@ -221,13 +222,14 @@ public class MavenDependencyDownloader extends ServiceSupport implements Depende
     private CamelContext camelContext;
     private final Set<DownloadListener> downloadListeners = new LinkedHashSet<>();
     private final Set<ArtifactDownloadListener> artifactDownloadListeners = new LinkedHashSet<>();
+    private KnownReposResolver knownReposResolver;
 
     // repository URLs set from "camel.jbang.repos" property or --repos option.
     private String repos;
     private boolean fresh;
 
     private String mavenSettings;
-    private String mavenSettingsSecurity;
+    private String mavenSettingsSecurity;7
     private RepositorySystem repositorySystem;
     private RepositorySystemSession repositorySystemSession;
     // actual repositories to be used with maven-resolver
@@ -253,6 +255,14 @@ public class MavenDependencyDownloader extends ServiceSupport implements Depende
         this.classLoader = classLoader;
     }
 
+    public KnownReposResolver getKnownReposResolver() {
+        return knownReposResolver;
+    }
+
+    public void setKnownReposResolver(KnownReposResolver knownReposResolver) {
+        this.knownReposResolver = knownReposResolver;
+    }
+
     @Override
     public void addDownloadListener(DownloadListener downloadListener) {
         CamelContextAware.trySetCamelContext(downloadListener, getCamelContext());
@@ -310,19 +320,24 @@ public class MavenDependencyDownloader extends ServiceSupport implements Depende
         downloadDependency(groupId, artifactId, version, true);
     }
 
+    @Override
+    public void downloadDependency(String groupId, String artifactId, String version, String extraRepos) {
+        doDownloadDependency(groupId, artifactId, version, true, false, extraRepos);
+    }
+
     @Override
     public void downloadHiddenDependency(String groupId, String artifactId, String version) {
-        doDownloadDependency(groupId, artifactId, version, true, true);
+        doDownloadDependency(groupId, artifactId, version, true, true, null);
     }
 
     @Override
     public void downloadDependency(String groupId, String artifactId, String version, boolean transitively) {
-        doDownloadDependency(groupId, artifactId, version, transitively, false);
+        doDownloadDependency(groupId, artifactId, version, transitively, false, null);
     }
 
     protected void doDownloadDependency(
             String groupId, String artifactId, String version, boolean transitively,
-            boolean hidden) {
+            boolean hidden, String extraRepos) {
 
         if (!hidden) {
             // trigger listener
@@ -501,6 +516,38 @@ public class MavenDependencyDownloader extends ServiceSupport implements Depende
         }
     }
 
+    private List<RemoteRepository> resolveExtraRepositories(String extraRepos) {
+        List<RemoteRepository> repositories = new ArrayList<>();
+        if (extraRepos != null) {
+            Set<URL> repositoryURLs = new HashSet<>();
+            for (String repo : extraRepos.split(",")) {
+                try {
+                    URL url = new URL(repo);
+                    if (url.getHost().equals("repo1.maven.org")) {
+                        continue;
+                    }
+                    String id = "custom" + customCount++;
+                    RepositoryPolicy releasePolicy = fresh ? POLICY_FRESH : POLICY_DEFAULT;
+                    if (repositoryURLs.add(url)) {
+                        if (url.getHost().equals("repository.apache.org") && url.getPath().contains("/snapshots")) {
+                            apacheSnapshotsIncluded = true;
+                            repositories.add(apacheSnapshots);
+                        } else {
+                            // both snapshots and releases allowed for custom repos
+                            repositories.add(new RemoteRepository.Builder(id, "default", repo)
+                                    .setReleasePolicy(releasePolicy)
+                                    .setSnapshotPolicy(fresh ? POLICY_FRESH : POLICY_DEFAULT)
+                                    .build());
+                        }
+                    }
+                } catch (MalformedURLException e) {
+                    LOG.warn("Can't use {} URL: {}. Skipping.", repo, e.getMessage(), e);
+                }
+            }
+        }
+        return repositories;
+    }
+
     @Override
     protected void doBuild() throws Exception {
         if (classLoader == null && camelContext != null) {
@@ -1113,7 +1160,6 @@ public class MavenDependencyDownloader extends ServiceSupport implements Depende
                 .build();
 
         // and custom repos and remember URLs to not duplicate the repositories from the settings
-        int customCount = 1;
         if (repos != null) {
             for (String repo : repos.split(",")) {
                 try {
diff --git a/dsl/camel-kamelet-main/src/main/resources/camel-main-known-repos.properties b/dsl/camel-kamelet-main/src/main/resources/camel-main-known-repos.properties
new file mode 100644
index 00000000000..3f3ed62a496
--- /dev/null
+++ b/dsl/camel-kamelet-main/src/main/resources/camel-main-known-repos.properties
@@ -0,0 +1,18 @@
+## ---------------------------------------------------------------------------
+## Licensed to the Apache Software Foundation (ASF) under one or more
+## contributor license agreements.  See the NOTICE file distributed with
+## this work for additional information regarding copyright ownership.
+## The ASF licenses this file to You under the Apache License, Version 2.0
+## (the "License"); you may not use this file except in compliance with
+## the License.  You may obtain a copy of the License at
+##
+##      http://www.apache.org/licenses/LICENSE-2.0
+##
+## Unless required by applicable law or agreed to in writing, software
+## distributed under the License is distributed on an "AS IS" BASIS,
+## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+## See the License for the specific language governing permissions and
+## limitations under the License.
+## ---------------------------------------------------------------------------
+
+camel-jira = https://packages.atlassian.com/maven-external
\ No newline at end of file