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/13 08:56:08 UTC

[camel] branch main updated: CAMEL-19128: camel-jbang - Add version command

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 f9e6d0cc223 CAMEL-19128: camel-jbang - Add version command
f9e6d0cc223 is described below

commit f9e6d0cc223dd46ddf2776b06f71d7efecb9f8f7
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Mon Mar 13 09:55:47 2023 +0100

    CAMEL-19128: camel-jbang - Add version command
---
 .../jbang/core/commands/version/VersionList.java   | 39 +++++----
 .../camel/main/download/DependencyDownloader.java  |  7 +-
 .../main/download/MavenDependencyDownloader.java   | 97 ++++++++++++++++++++--
 .../org/apache/camel/main/util/VersionHelper.java  | 86 +++++++++++++++++++
 4 files changed, 201 insertions(+), 28 deletions(-)

diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/version/VersionList.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/version/VersionList.java
index 7e6ab2be88c..0c9a85f76de 100644
--- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/version/VersionList.java
+++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/version/VersionList.java
@@ -23,6 +23,7 @@ import java.util.stream.Collectors;
 
 import com.github.freva.asciitable.AsciiTable;
 import com.github.freva.asciitable.Column;
+import com.github.freva.asciitable.HorizontalAlign;
 import org.apache.camel.dsl.jbang.core.commands.CamelCommand;
 import org.apache.camel.dsl.jbang.core.commands.CamelJBangMain;
 import org.apache.camel.dsl.jbang.core.common.RuntimeCompletionCandidates;
@@ -35,7 +36,6 @@ import picocli.CommandLine;
 public class VersionList extends CamelCommand {
 
     private static final String MINIMUM_VERSION = "3.14.0";
-    private static final String MINIMUM_QUARKUS_VERSION = "2.13.0";
 
     // TODO: Filter for minimum camel version
     // TODO: grab Q and SB runtime version
@@ -46,11 +46,14 @@ public class VersionList extends CamelCommand {
 
     @CommandLine.Option(names = { "--runtime" }, completionCandidates = RuntimeCompletionCandidates.class,
                         description = "Runtime (spring-boot, quarkus, or camel-main)")
-    protected String runtime;
+    String runtime;
 
     @CommandLine.Option(names = { "--repo", "--repos" }, description = "Maven repository for downloading available versions")
     String repo;
 
+    @CommandLine.Option(names = { "--fresh" }, description = "Make sure we use fresh (i.e. non-cached) resources")
+    boolean fresh;
+
     public VersionList(CamelJBangMain main) {
         super(main);
     }
@@ -60,8 +63,10 @@ public class VersionList extends CamelCommand {
         configureLoggingOff();
         KameletMain main = new KameletMain();
 
-        List<String> versions;
+        List<String[]> versions;
         try {
+            main.setFresh(fresh);
+            main.setRepos(repo);
             main.start();
 
             // use kamelet-main to download from maven
@@ -77,8 +82,8 @@ public class VersionList extends CamelCommand {
                 a = "camel-quarkus-catalog";
             }
 
-            versions = downloader.downloadAvailableVersions(g, a, repo);
-            versions = versions.stream().filter(this::acceptVersion).collect(Collectors.toList());
+            versions = downloader.resolveAvailableVersions(g, a, repo);
+            versions = versions.stream().filter(v -> acceptVersion(v[0])).collect(Collectors.toList());
 
             main.stop();
         } catch (Exception e) {
@@ -87,20 +92,23 @@ public class VersionList extends CamelCommand {
         }
 
         List<Row> rows = new ArrayList<>();
-        for (String v : versions) {
+        for (String[] v : versions) {
             Row row = new Row();
             rows.add(row);
-            row.coreVersion = v;
+            row.coreVersion = v[0];
+            row.runtimeVersion = v[1];
         }
 
         // sort rows
         rows.sort(this::sortRow);
 
         System.out.println(AsciiTable.getTable(AsciiTable.NO_BORDERS, rows, Arrays.asList(
-                new Column().header("QUARKUS VERSION").visible("quarkus".equalsIgnoreCase(runtime)).with(r -> r.runtimeVersion),
-                new Column().header("SPRING BOOT VERSION").visible("spring-boot".equalsIgnoreCase(runtime))
-                        .with(r -> r.runtimeVersion),
-                new Column().header("CAMEL VERSION").with(r -> r.coreVersion))));
+                new Column().header("QUARKUS").visible("quarkus".equalsIgnoreCase(runtime))
+                        .headerAlign(HorizontalAlign.CENTER).dataAlign(HorizontalAlign.CENTER).with(r -> r.runtimeVersion),
+                new Column().header("SPRING-BOOT").visible("spring-boot".equalsIgnoreCase(runtime))
+                        .headerAlign(HorizontalAlign.CENTER).dataAlign(HorizontalAlign.CENTER).with(r -> r.runtimeVersion),
+                new Column().header("CAMEL VERSION")
+                        .headerAlign(HorizontalAlign.CENTER).dataAlign(HorizontalAlign.CENTER).with(r -> r.coreVersion))));
 
         return 0;
     }
@@ -123,16 +131,15 @@ public class VersionList extends CamelCommand {
     }
 
     private boolean acceptVersion(String version) {
-        String min = MINIMUM_VERSION;
-        if ("quarkus".equalsIgnoreCase(runtime)) {
-            min = MINIMUM_QUARKUS_VERSION;
+        if (version == null) {
+            return false;
         }
-        return VersionHelper.isGE(version, min);
+        return VersionHelper.isGE(version, MINIMUM_VERSION);
     }
 
     private static class Row {
-        String runtimeVersion;
         String coreVersion;
+        String runtimeVersion;
     }
 
 }
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 ccab96ea85f..bb8f94572ab 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
@@ -123,14 +123,15 @@ public interface DependencyDownloader extends CamelContextAware, StaticService {
     MavenArtifact downloadArtifact(String groupId, String artifactId, String version);
 
     /**
-     * Downloads the available versions for the given maven artifact
+     * Resolves the available versions for the given maven artifact
      *
      * @param  groupId    maven group id
      * @param  artifactId maven artifact id
      * @param  repo       to use specific maven repository instead of maven central
-     * @return            list of versions of the given artifact
+     * @return            list of versions of the given artifact (0=camel-core version, 1=runtime version, such as
+     *                    spring-boot or quarkus)
      */
-    List<String> downloadAvailableVersions(String groupId, String artifactId, String repo);
+    List<String[]> resolveAvailableVersions(String groupId, String artifactId, String repo);
 
     /**
      * Checks whether the dependency is already on the classpath
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 b0125b04f31..7078c37c8a1 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
@@ -47,6 +47,7 @@ import org.w3c.dom.NodeList;
 import org.apache.camel.CamelContext;
 import org.apache.camel.CamelContextAware;
 import org.apache.camel.main.injection.DIRegistry;
+import org.apache.camel.main.util.VersionHelper;
 import org.apache.camel.main.util.XmlHelper;
 import org.apache.camel.support.service.ServiceHelper;
 import org.apache.camel.support.service.ServiceSupport;
@@ -225,6 +226,9 @@ public class MavenDependencyDownloader extends ServiceSupport implements Depende
     private static final Logger LOG = LoggerFactory.getLogger(MavenDependencyDownloader.class);
     private static final String CP = System.getProperty("java.class.path");
 
+    private static final String MINIMUM_CAMEL_VERSION = "3.14.0";
+    private static final String MINIMUM_QUARKUS_VERSION = "2.13.0";
+
     private static final RepositoryPolicy POLICY_DEFAULT = new RepositoryPolicy(
             true, RepositoryPolicy.UPDATE_POLICY_NEVER, RepositoryPolicy.CHECKSUM_POLICY_WARN);
     private static final RepositoryPolicy POLICY_FRESH = new RepositoryPolicy(
@@ -465,7 +469,7 @@ public class MavenDependencyDownloader extends ServiceSupport implements Depende
     }
 
     @Override
-    public List<String> downloadAvailableVersions(String groupId, String artifactId, String repo) {
+    public List<String[]> resolveAvailableVersions(String groupId, String artifactId, String repo) {
         String gav = groupId + ":" + artifactId;
         LOG.debug("DownloadAvailableVersions: {}", gav);
 
@@ -477,11 +481,7 @@ public class MavenDependencyDownloader extends ServiceSupport implements Depende
                 repository = extra.get(0);
             }
         }
-        List<String> versions = resolveAvailableVersions(groupId, artifactId, repository);
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("DownloadAvailableVersions {} -> [{}]", gav, versions);
-        }
-
+        List<String[]> versions = resolveAvailableVersions(groupId, artifactId, repository);
         return versions;
     }
 
@@ -1323,10 +1323,10 @@ public class MavenDependencyDownloader extends ServiceSupport implements Depende
         }
     }
 
-    public List<String> resolveAvailableVersions(
+    public List<String[]> resolveAvailableVersions(
             String groupId, String artifactId, RemoteRepository repository) {
 
-        List<String> answer = new ArrayList<>();
+        List<String[]> answer = new ArrayList<>();
 
         try {
             MetadataRequest ar = new MetadataRequest();
@@ -1347,13 +1347,28 @@ public class MavenDependencyDownloader extends ServiceSupport implements Depende
                             Element node = (Element) nl.item(i);
                             String v = node.getTextContent();
                             if (v != null) {
-                                answer.add(v);
+                                if ("camel-catalog-provider-springboot".equals(artifactId)) {
+                                    String sbv = null;
+                                    if (VersionHelper.isGE(v, MINIMUM_CAMEL_VERSION)) {
+                                        sbv = resolveSpringBootVersionByCamelVersion(v, repository);
+                                    }
+                                    answer.add(new String[] { v, sbv });
+                                } else if ("camel-quarkus-catalog".equals(artifactId)) {
+                                    String cv = null;
+                                    if (VersionHelper.isGE(v, MINIMUM_QUARKUS_VERSION)) {
+                                        cv = resolveCamelVersionByQuarkusVersion(v, repository);
+                                    }
+                                    answer.add(new String[] { cv, v });
+                                } else {
+                                    answer.add(new String[] { v, null });
+                                }
                             }
                         }
                     }
                 }
             }
         } catch (Exception e) {
+            e.printStackTrace(); // TODO:
             String msg = "Cannot resolve available versions in " + repository.getUrl();
             throw new DownloadException(msg, e);
         }
@@ -1361,6 +1376,70 @@ public class MavenDependencyDownloader extends ServiceSupport implements Depende
         return answer;
     }
 
+    private String resolveCamelVersionByQuarkusVersion(String quarkusVersion, RemoteRepository repository) throws Exception {
+        String gav = "org.apache.camel.quarkus" + ":" + "camel-quarkus" + ":pom:" + quarkusVersion;
+        // always include maven central
+        List<RemoteRepository> repos;
+        if (repository == remoteRepositories.get(0)) {
+            repos = List.of(repository);
+        } else {
+            repos = List.of(remoteRepositories.get(0), repository);
+        }
+        List<MavenArtifact> artifacts = resolveDependenciesViaAether(List.of(gav), repos, false);
+        if (!artifacts.isEmpty()) {
+            MavenArtifact ma = artifacts.get(0);
+            if (ma != null && ma.getFile() != null) {
+                String name = ma.getFile().getAbsolutePath();
+                File file = new File(name);
+                if (file.exists()) {
+                    DocumentBuilderFactory dbf = XmlHelper.createDocumentBuilderFactory();
+                    DocumentBuilder db = dbf.newDocumentBuilder();
+                    Document dom = db.parse(file);
+                    // the camel version is in <parent>
+                    NodeList nl = dom.getElementsByTagName("parent");
+                    if (nl.getLength() == 1) {
+                        Element node = (Element) nl.item(0);
+                        return node.getElementsByTagName("version").item(0).getTextContent();
+                    }
+                }
+            }
+        }
+
+        return null;
+    }
+
+    private String resolveSpringBootVersionByCamelVersion(String camelVersion, RemoteRepository repository) throws Exception {
+        String gav = "org.apache.camel.springboot" + ":" + "spring-boot" + ":pom:" + camelVersion;
+        // always include maven central
+        List<RemoteRepository> repos;
+        if (repository == remoteRepositories.get(0)) {
+            repos = List.of(repository);
+        } else {
+            repos = List.of(remoteRepositories.get(0), repository);
+        }
+        List<MavenArtifact> artifacts = resolveDependenciesViaAether(List.of(gav), repos, false);
+        if (!artifacts.isEmpty()) {
+            MavenArtifact ma = artifacts.get(0);
+            if (ma != null && ma.getFile() != null) {
+                String name = ma.getFile().getAbsolutePath();
+                File file = new File(name);
+                if (file.exists()) {
+                    DocumentBuilderFactory dbf = XmlHelper.createDocumentBuilderFactory();
+                    DocumentBuilder db = dbf.newDocumentBuilder();
+                    Document dom = db.parse(file);
+                    // the camel version is in <properties>
+                    NodeList nl = dom.getElementsByTagName("properties");
+                    if (nl.getLength() > 0) {
+                        Element node = (Element) nl.item(0);
+                        return node.getElementsByTagName("spring-boot-version").item(0).getTextContent();
+                    }
+                }
+            }
+        }
+
+        return null;
+    }
+
     private static class AcceptAllDependencyFilter implements DependencyFilter {
         @Override
         public boolean accept(DependencyNode node, List<DependencyNode> parents) {
diff --git a/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/util/VersionHelper.java b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/util/VersionHelper.java
new file mode 100644
index 00000000000..5ada3e4c766
--- /dev/null
+++ b/dsl/camel-kamelet-main/src/main/java/org/apache/camel/main/util/VersionHelper.java
@@ -0,0 +1,86 @@
+/*
+ * 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.util;
+
+import org.apache.camel.util.StringHelper;
+
+public final class VersionHelper {
+
+    private VersionHelper() {
+    }
+
+    public static boolean isGE(String source, String target) {
+        return compare(source, target) >= 0;
+    }
+
+    public static int compare(String source, String target) {
+        if (source == null || target == null) {
+            return 0;
+        }
+        String s1 = StringHelper.before(source, ".");
+        String s2 = StringHelper.after(source, ".");
+        if (s1 == null) {
+            s1 = StringHelper.before(source, ",");
+            s2 = StringHelper.after(source, ",");
+        }
+        String t1 = StringHelper.before(target, ".");
+        String t2 = StringHelper.after(target, ".");
+        if (t1 == null) {
+            t1 = StringHelper.before(target, ",");
+            t2 = StringHelper.after(target, ",");
+        }
+        String s3 = StringHelper.after(s2, ".");
+        if (s3 != null) {
+            s2 = StringHelper.before(s2, ".");
+        } else {
+            s3 = "";
+        }
+        String t3 = StringHelper.after(t2, ".");
+        if (t3 != null) {
+            t2 = StringHelper.before(t2, ".");
+        } else {
+            t3 = "";
+        }
+        // convert to 2-digit numbers
+        if (s1.length() < 2) {
+            s1 = "0" + s1;
+        }
+        if (s2.length() < 2) {
+            s2 = "0" + s2;
+        }
+        if (s2.length() < 2) {
+            s2 = "0" + s2;
+        }
+        if (s3.length() < 2) {
+            s3 = "0" + s3;
+        }
+        if (t1.length() < 2) {
+            t1 = "0" + t1;
+        }
+        if (t2.length() < 2) {
+            t2 = "0" + t2;
+        }
+        if (t3.length() < 2) {
+            t3 = "0" + t3;
+        }
+
+        String s = s1 + s2 + s3;
+        String t = t1 + t2 + t3;
+        return s.compareTo(t);
+    }
+
+}