This is an automated email from the ASF dual-hosted git repository. fmariani pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/camel.git
commit ec53360a31287778780321d35c02a95a31df0113 Author: Croway <[email protected]> AuthorDate: Tue Feb 17 09:43:27 2026 +0100 Add QuarkusHelper --- .../jbang/core/commands/version/VersionList.java | 66 +---------- .../camel/dsl/jbang/core/common/QuarkusHelper.java | 121 +++++++++++++++++++++ 2 files changed, 124 insertions(+), 63 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 82ee0cb73afd..5669fa5fa90c 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 @@ -46,6 +46,7 @@ import org.apache.camel.catalog.DefaultCamelCatalog; 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.CommandLineHelper; +import org.apache.camel.dsl.jbang.core.common.QuarkusHelper; import org.apache.camel.dsl.jbang.core.common.RuntimeCompletionCandidates; import org.apache.camel.dsl.jbang.core.common.RuntimeType; import org.apache.camel.dsl.jbang.core.common.RuntimeTypeConverter; @@ -76,8 +77,6 @@ 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,7 +180,8 @@ public class VersionList extends CamelCommand { // resolve actual Quarkus platform versions from registry if (RuntimeType.quarkus == runtime) { - resolveQuarkusPlatformVersions(rows); + QuarkusHelper.resolveQuarkusPlatformVersions( + rows, r -> r.runtimeVersion, (r, v) -> r.quarkusVersion = v); } if (lts) { @@ -609,66 +609,6 @@ 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; diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/common/QuarkusHelper.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/common/QuarkusHelper.java new file mode 100644 index 000000000000..8831774ffeb6 --- /dev/null +++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/common/QuarkusHelper.java @@ -0,0 +1,121 @@ +/* + * 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.dsl.jbang.core.common; + +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.time.Duration; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.function.BiConsumer; +import java.util.function.BinaryOperator; +import java.util.function.Function; +import java.util.stream.Collectors; + +import org.apache.camel.util.json.JsonArray; +import org.apache.camel.util.json.JsonObject; +import org.apache.camel.util.json.Jsoner; + +/** + * Helper for resolving Quarkus platform information from the Quarkus registry. + */ +public final class QuarkusHelper { + + public static final String QUARKUS_PLATFORM_URL_PROPERTY = "camel.jbang.quarkus.platform.url"; + public static final String DEFAULT_QUARKUS_PLATFORM_URL = "https://registry.quarkus.io/client/platforms"; + + private QuarkusHelper() { + } + + /** + * Returns the Quarkus platform registry URL, honoring the system property {@value #QUARKUS_PLATFORM_URL_PROPERTY} + * if set. + */ + public static String getQuarkusPlatformUrl() { + return System.getProperty(QUARKUS_PLATFORM_URL_PROPERTY, DEFAULT_QUARKUS_PLATFORM_URL); + } + + /** + * 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. + * + * @param rows the list of rows to enrich with Quarkus platform versions + * @param runtimeVersionFunc function to extract the runtime (Camel Quarkus) version from a row + * @param quarkusVersionSetter consumer to set the resolved Quarkus platform version on a row + */ + public static <T> void resolveQuarkusPlatformVersions( + List<T> rows, + Function<T, String> runtimeVersionFunc, + BiConsumer<T, String> quarkusVersionSetter) { + + try { + HttpClient hc = HttpClient.newHttpClient(); + HttpResponse<String> res = hc.send( + HttpRequest.newBuilder(new URI(getQuarkusPlatformUrl())) + .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()) { + return; + } + JsonObject platform = platforms.getMap(0); + JsonArray streams = platform.getCollection("streams"); + if (streams == null) { + return; + } + + // keep the row with the highest runtime version per major.minor stream + BinaryOperator<T> keepLatest = (a, b) -> VersionHelper.compare( + runtimeVersionFunc.apply(a), runtimeVersionFunc.apply(b)) >= 0 ? a : b; + + Map<String, T> latestPerStream = rows.stream() + .filter(row -> runtimeVersionFunc.apply(row) != null) + .collect(Collectors.toMap( + row -> VersionHelper.getMajorMinorVersion(runtimeVersionFunc.apply(row)), + Function.identity(), + keepLatest)); + + // match each major.minor against registry streams and set the quarkus version + latestPerStream.forEach((majorMinor, row) -> findQuarkusCoreVersion(streams, majorMinor) + .ifPresent(version -> quarkusVersionSetter.accept(row, version))); + } + } catch (Exception e) { + // ignore - if the registry is not reachable within 2 seconds, skip + } + } + + /** + * Finds the quarkus-core-version from the registry streams that matches the given major.minor stream ID. + */ + private static Optional<String> findQuarkusCoreVersion(JsonArray streams, String majorMinor) { + return streams.stream() + .map(s -> (JsonObject) s) + .filter(stream -> majorMinor.equals(stream.getString("id"))) + .findFirst() + .map(stream -> (JsonArray) stream.getCollection("releases")) + .filter(releases -> !releases.isEmpty()) + .map(releases -> (JsonObject) releases.getMap(0)) + .map(release -> release.getString("quarkus-core-version")); + } +}
