This is an automated email from the ASF dual-hosted git repository. ppalaga pushed a commit to branch camel-4.18.x in repository https://gitbox.apache.org/repos/asf/camel.git
commit b927a3516e2ed2adef2d701c512a9620b0b548cd Author: Croway <[email protected]> AuthorDate: Mon Feb 16 18:17:50 2026 +0100 camel-jbang version list - include Quarkus and Camel Quarkus versions --- .../jbang/camel-jbang-configuration-metadata.json | 4 +- .../dsl/jbang/core/commands/update/UpdateList.java | 11 +--- .../jbang/core/commands/version/VersionList.java | 75 +++++++++++++++++++++- .../camel/dsl/jbang/core/common/VersionHelper.java | 5 ++ .../camel/dsl/jbang/core/model/VersionListDTO.java | 15 ++++- .../dsl/jbang/core/commands/mcp/VersionTools.java | 2 + 6 files changed, 98 insertions(+), 14 deletions(-) diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/jbang/camel-jbang-configuration-metadata.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/jbang/camel-jbang-configuration-metadata.json index 22ca438bb84d..7249ffadeb29 100644 --- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/jbang/camel-jbang-configuration-metadata.json +++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/jbang/camel-jbang-configuration-metadata.json @@ -3,7 +3,6 @@ { "name": "camel.jbang", "description": "Camel JBang configurations" } ], "properties": [ - { "name": "camel.jbang.buildTool", "required": false, "description": "Build tool to use (Maven or Gradle)", "type": "string", "javaType": "String", "defaultValue": "Maven", "secret": false }, { "name": "camel.jbang.camel-version", "required": false, "description": "The version of Apache Camel to use", "type": "string", "javaType": "String", "secret": false }, { "name": "camel.jbang.camelSpringBootVersion", "required": false, "description": "To use a custom Camel version when running or export to Spring Boot", "label": "spring-boot", "type": "string", "javaType": "String", "secret": false }, { "name": "camel.jbang.classpathFiles", "required": false, "description": "Additional files to add to classpath (Use commas to separate multiple files).", "type": "string", "javaType": "String", "secret": false }, @@ -17,11 +16,10 @@ { "name": "camel.jbang.excludes", "required": false, "description": "Exclude files by name or pattern (Use commas to separate multiple files)", "type": "string", "javaType": "String", "secret": false }, { "name": "camel.jbang.exportDir", "required": false, "description": "Directory where the project will be exported", "type": "string", "javaType": "String", "defaultValue": ".", "secret": false }, { "name": "camel.jbang.gav", "required": false, "description": "Maven coordinate (groupId:artifactId:version)", "type": "string", "javaType": "String", "secret": false }, - { "name": "camel.jbang.gradleWrapper", "required": false, "description": "Include Gradle Wrapper files in the exported project", "type": "boolean", "javaType": "boolean", "defaultValue": true, "secret": false }, { "name": "camel.jbang.groovyFiles", "required": false, "description": "Additional groovy source files to export to src\/main\/resources\/camel-groovy directory (Use commas to separate multiple files)", "type": "string", "javaType": "String", "secret": false }, { "name": "camel.jbang.health", "required": false, "description": "Health check at \/observe\/health on local HTTP server (port 8080 by default)", "type": "boolean", "javaType": "boolean", "defaultValue": false, "secret": false, "deprecated": true }, { "name": "camel.jbang.ignoreLoadingError", "required": false, "description": "Whether to ignore route loading and compilation errors (use this with care!)", "label": "advanced", "type": "boolean", "javaType": "boolean", "defaultValue": false, "secret": false }, - { "name": "camel.jbang.javaVersion", "required": false, "description": "Java version (17 or 21)", "type": "enum", "javaType": "String", "defaultValue": "21", "secret": false, "enum": [ "17", "21" ] }, + { "name": "camel.jbang.javaVersion", "required": false, "description": "Java version", "type": "enum", "javaType": "String", "defaultValue": "21", "secret": false, "enum": [ "21" ] }, { "name": "camel.jbang.jfr", "required": false, "description": "Enables Java Flight Recorder saving recording to disk on exit", "type": "boolean", "javaType": "boolean", "defaultValue": false, "secret": false }, { "name": "camel.jbang.jfr-profile", "required": false, "description": "Java Flight Recorder profile to use (such as default or profile)", "type": "string", "javaType": "String", "defaultValue": "default", "secret": false }, { "name": "camel.jbang.jib-maven-plugin-version", "required": false, "description": "Version to use for jib-maven-plugin if exporting to camel-main and have Kubernetes enabled (jkube.xxx options)", "label": "kubernetes", "type": "string", "javaType": "String", "defaultValue": "3.4.5", "secret": false }, diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/update/UpdateList.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/update/UpdateList.java index 5f6226442b58..ccbc6470c144 100644 --- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/update/UpdateList.java +++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/update/UpdateList.java @@ -38,6 +38,7 @@ 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.RuntimeType; +import org.apache.camel.dsl.jbang.core.common.VersionHelper; import org.apache.camel.dsl.jbang.core.model.UpdateListDTO; import org.apache.camel.main.download.MavenDependencyDownloader; import org.apache.camel.tooling.maven.MavenArtifact; @@ -133,12 +134,12 @@ public class UpdateList extends CamelCommand { // upgrade recipes 4.12.1 was released, but only Camel 4.12.0 is released, in this case, // consider the major.minor only if (runtimeVersion == null) { - String majorMinorVersion = getMajorMinorVersion(l[0]); + String majorMinorVersion = VersionHelper.getMajorMinorVersion(l[0]); runtimeVersion = recipesVersions.sbVersions().stream() .filter(v -> { // Handle micro Camel Upgrade Recipes versions like 4.14.0.1 - String actualMajorMinorVersion = getMajorMinorVersion(v[0]); + String actualMajorMinorVersion = VersionHelper.getMajorMinorVersion(v[0]); return actualMajorMinorVersion.equals(majorMinorVersion); }) .findFirst() @@ -192,12 +193,6 @@ public class UpdateList extends CamelCommand { return 0; } - private static String getMajorMinorVersion(String l) { - String[] versions = l.split("\\."); - String majorMinorVersion = versions[0] + "." + versions[1]; - return majorMinorVersion; - } - /** * Download camel, camel-spring-boot and quarkus upgrade-recipes dependencies and collect existing versions * 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 8ae9d858687b..b2c2ec3b3936 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 @@ -76,6 +76,8 @@ public class VersionList extends CamelCommand { private static final String GIT_CAMEL_QUARKUS_URL = "https://raw.githubusercontent.com/apache/camel-website/main/content/releases/q/release-%s.md"; + private static final String QUARKUS_PLATFORM_URL = "https://registry.quarkus.io/client/platforms"; + private static final String DEFAULT_DATE_FORMAT = "MMMM yyyy"; @CommandLine.Option(names = { "--runtime" }, @@ -181,6 +183,11 @@ public class VersionList extends CamelCommand { List<Row> rows = new ArrayList<>(); filterVersions(versions, rows, releases); + // resolve actual Quarkus platform versions from registry + if (RuntimeType.quarkus == runtime) { + resolveQuarkusPlatformVersions(rows); + } + filterVendor(vendor, rows); if (lts) { @@ -233,7 +240,7 @@ public class VersionList extends CamelCommand { rows.stream() .map(row -> new VersionListDTO( row.coreVersion, runtime.runtime(), row.runtimeVersion, - vendor, row.jdks, row.kind, + row.quarkusVersion, vendor, row.jdks, row.kind, row.releaseDate, row.eolDate)) .map(VersionListDTO::toMap) .collect(Collectors.toList()))); @@ -241,8 +248,11 @@ public class VersionList extends CamelCommand { printer().println(AsciiTable.getTable(AsciiTable.NO_BORDERS, rows, Arrays.asList( new Column().header("CAMEL VERSION") .headerAlign(HorizontalAlign.CENTER).dataAlign(HorizontalAlign.CENTER).with(r -> r.coreVersion), - new Column().header("QUARKUS").visible(RuntimeType.quarkus == runtime) + new Column().header("CAMEL_QUARKUS").visible(RuntimeType.quarkus == runtime) .headerAlign(HorizontalAlign.CENTER).dataAlign(HorizontalAlign.CENTER).with(r -> r.runtimeVersion), + new Column().header("QUARKUS").visible(RuntimeType.quarkus == runtime) + .headerAlign(HorizontalAlign.CENTER).dataAlign(HorizontalAlign.CENTER) + .with(r -> r.quarkusVersion != null ? r.quarkusVersion : ""), new Column().header("SPRING-BOOT").visible(RuntimeType.springBoot == runtime) .headerAlign(HorizontalAlign.CENTER).dataAlign(HorizontalAlign.CENTER).with(r -> r.runtimeVersion), new Column().header("JDK") @@ -611,9 +621,70 @@ public class VersionList extends CamelCommand { return null; } + /** + * Resolves the actual Quarkus platform version for each row by fetching the Quarkus platform registry and matching + * the Camel Quarkus major.minor version against stream IDs. + */ + private void resolveQuarkusPlatformVersions(List<Row> rows) { + try { + HttpClient hc = HttpClient.newHttpClient(); + HttpResponse<String> res = hc.send( + HttpRequest.newBuilder(new URI(QUARKUS_PLATFORM_URL)) + .timeout(Duration.ofSeconds(2)) + .build(), + HttpResponse.BodyHandlers.ofString()); + + if (res.statusCode() == 200) { + JsonObject json = (JsonObject) Jsoner.deserialize(res.body()); + JsonArray platforms = json.getCollection("platforms"); + if (platforms != null && !platforms.isEmpty()) { + JsonObject platform = platforms.getMap(0); + JsonArray streams = platform.getCollection("streams"); + if (streams != null) { + // find the latest camel quarkus version per major.minor + java.util.Map<String, Row> latestPerStream = new java.util.LinkedHashMap<>(); + for (Row row : rows) { + if (row.runtimeVersion != null) { + String majorMinor = VersionHelper.getMajorMinorVersion(row.runtimeVersion); + Row existing = latestPerStream.get(majorMinor); + if (existing == null + || VersionHelper.compare(row.runtimeVersion, existing.runtimeVersion) > 0) { + latestPerStream.put(majorMinor, row); + } + } + } + // only set quarkus version on the latest row per stream + for (var entry : latestPerStream.entrySet()) { + String majorMinor = entry.getKey(); + for (int i = 0; i < streams.size(); i++) { + JsonObject stream = streams.getMap(i); + String streamId = stream.getString("id"); + if (majorMinor.equals(streamId)) { + JsonArray releases = stream.getCollection("releases"); + if (releases != null && !releases.isEmpty()) { + JsonObject release = releases.getMap(0); + String quarkusCoreVersion + = release.getString("quarkus-core-version"); + if (quarkusCoreVersion != null) { + entry.getValue().quarkusVersion = quarkusCoreVersion; + } + } + break; + } + } + } + } + } + } + } catch (Exception e) { + // ignore - if the registry is not reachable within 2 seconds, skip + } + } + private static class Row { String coreVersion; String runtimeVersion; + String quarkusVersion; String releaseDate; long daysSince = -1; String eolDate; diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/common/VersionHelper.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/common/VersionHelper.java index b7832e95dc58..0cd53f4e7435 100644 --- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/common/VersionHelper.java +++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/common/VersionHelper.java @@ -130,6 +130,11 @@ public final class VersionHelper { return s.compareTo(t); } + public static String getMajorMinorVersion(String version) { + String[] parts = version.split("\\."); + return parts[0] + "." + parts[1]; + } + public static String extractCamelVersion() { return org.apache.camel.main.util.VersionHelper.extractCamelVersion(); } diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/model/VersionListDTO.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/model/VersionListDTO.java index 3ee26e3f6b22..bd90e1474344 100644 --- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/model/VersionListDTO.java +++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/model/VersionListDTO.java @@ -25,6 +25,7 @@ public class VersionListDTO { private String camelVersion; private String runtime; private String runtimeVersion; + private String quarkusVersion; private String vendor; private String jdkVersion; private String kind; @@ -34,12 +35,13 @@ public class VersionListDTO { public VersionListDTO() { } - public VersionListDTO(String camelVersion, String runtime, String runtimeVersion, + public VersionListDTO(String camelVersion, String runtime, String runtimeVersion, String quarkusVersion, String vendor, String jdkVersion, String kind, String releaseDate, String eolDate) { this.camelVersion = camelVersion; this.runtime = runtime; this.runtimeVersion = runtimeVersion; + this.quarkusVersion = quarkusVersion; this.vendor = vendor; this.jdkVersion = jdkVersion; this.kind = kind; @@ -71,6 +73,14 @@ public class VersionListDTO { this.runtimeVersion = runtimeVersion; } + public String getQuarkusVersion() { + return quarkusVersion; + } + + public void setQuarkusVersion(String quarkusVersion) { + this.quarkusVersion = quarkusVersion; + } + public String getVendor() { return vendor; } @@ -118,6 +128,9 @@ public class VersionListDTO { if (runtimeVersion != null) { jo.put("runtimeVersion", runtimeVersion); } + if (quarkusVersion != null) { + jo.put("quarkusVersion", quarkusVersion); + } if (vendor != null) { jo.put("vendor", vendor); } diff --git a/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/VersionTools.java b/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/VersionTools.java index eaced47c0bba..c3d27efaefbb 100644 --- a/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/VersionTools.java +++ b/dsl/camel-jbang/camel-jbang-mcp/src/main/java/org/apache/camel/dsl/jbang/core/commands/mcp/VersionTools.java @@ -83,6 +83,7 @@ public class VersionTools { v.getString("camelVersion"), v.getString("runtime"), v.getString("runtimeVersion"), + v.getString("quarkusVersion"), v.getString("jdkVersion"), v.getString("kind"), v.getString("releaseDate"), @@ -114,6 +115,7 @@ public class VersionTools { String camelVersion, String runtime, String runtimeVersion, + String quarkusVersion, String jdkVersion, String kind, String releaseDate,
