This is an automated email from the ASF dual-hosted git repository. cdeppisch pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/camel.git
commit 1b10c64135514c8d14c42e174ddc5262789ab916 Author: Thomas Diesler <tdies...@redhat.com> AuthorDate: Fri Jul 12 19:05:45 2024 +0200 [CAMEL-20976] camel-jbang: Consolidate export dependencies --- .../camel/dsl/jbang/core/commands/Export.java | 2 +- .../dsl/jbang/core/commands/ExportBaseCommand.java | 41 +++++++---- .../apache/camel/dsl/jbang/core/commands/Run.java | 81 ++++++++++------------ .../camel/dsl/jbang/core/common/RuntimeUtil.java | 9 +-- .../core/commands/kubernetes/KubernetesExport.java | 61 ++++++++-------- 5 files changed, 101 insertions(+), 93 deletions(-) diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Export.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Export.java index 4c12302608f..a984cdc4748 100644 --- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Export.java +++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Export.java @@ -113,7 +113,7 @@ public class Export extends ExportBaseCommand { // copy properties from this to cmd cmd.files = this.files; cmd.repos = this.repos; - cmd.dependencies = this.dependencies; + cmd.addDependencies(this.dependencies()); cmd.runtime = this.runtime; cmd.gav = this.gav; cmd.mavenSettings = this.mavenSettings; diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportBaseCommand.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportBaseCommand.java index 5add2d4ad56..d1b9e0cbca1 100644 --- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportBaseCommand.java +++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/ExportBaseCommand.java @@ -94,8 +94,8 @@ public abstract class ExportBaseCommand extends CamelCommand { protected String repos; @CommandLine.Option(names = { - "--dep", "--deps" }, description = "Add additional dependencies (Use commas to separate multiple dependencies).") - protected String dependencies; + "--dep", "--deps" }, arity = "*", description = "Add additional dependencies") + private String[] _dependencies; // [TODO] make less protected when we ditch --deps @CommandLine.Option(names = { "--runtime" }, completionCandidates = RuntimeCompletionCandidates.class, @@ -294,7 +294,7 @@ public abstract class ExportBaseCommand extends CamelCommand { protected Integer runSilently(boolean ignoreLoadingError) throws Exception { Run run = new Run(getMain()); // need to declare the profile to use for run - run.dependencies = dependencies; + run.addDependencies(dependencies()); run.files = files; run.exclude = exclude; run.openapi = openapi; @@ -307,6 +307,28 @@ public abstract class ExportBaseCommand extends CamelCommand { return run.runExport(ignoreLoadingError); } + // [TODO] Remove when we ditch --deps + // For backward compatibility, we expands comma separated --deps + // https://issues.apache.org/jira/browse/CAMEL-20976 + String[] dependencies() { + if (_dependencies != null && _dependencies.length == 1) { + String[] toks = _dependencies[0].split(","); + _dependencies = Arrays.stream(toks).map(String::trim).toArray(String[]::new); + } + return _dependencies; + } + + protected void addDependencies(String... deps) { + var depsList = new ArrayList<>(getDependenciesList()); + depsList.addAll(Arrays.asList(deps)); + _dependencies = depsList.toArray(new String[0]); + } + + protected List<String> getDependenciesList() { + var depsArray = Optional.ofNullable(dependencies()).orElse(new String[0]); + return Arrays.asList(depsArray); + } + protected Set<String> resolveDependencies(File settings, File profile) throws Exception { Set<String> answer = new TreeSet<>((o1, o2) -> { // favour org.apache.camel first @@ -325,10 +347,8 @@ public abstract class ExportBaseCommand extends CamelCommand { } // custom dependencies - if (dependencies != null) { - for (String d : dependencies.split(",")) { - answer.add(normalizeDependency(d.trim())); - } + for (String d : dependencies()) { + answer.add(normalizeDependency(d)); } List<String> lines = RuntimeUtil.loadPropertiesLines(settings); @@ -409,11 +429,8 @@ public abstract class ExportBaseCommand extends CamelCommand { if (profile != null && profile.exists()) { Properties prop = new CamelCaseOrderedProperties(); RuntimeUtil.loadProperties(prop, profile); - String deps = RuntimeUtil.getDependencies(prop); - if (!deps.isBlank()) { - for (String d : deps.split(",")) { - answer.add(d.trim()); - } + for (String d : RuntimeUtil.getDependenciesAsArray(prop)) { + answer.add(d.trim()); } } 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 d8d4fea117c..f4fc4aecbfa 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 @@ -32,15 +32,7 @@ import java.nio.file.FileSystems; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashSet; -import java.util.List; -import java.util.Locale; -import java.util.Properties; -import java.util.Set; -import java.util.Stack; -import java.util.StringJoiner; +import java.util.*; import java.util.function.Supplier; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -161,8 +153,8 @@ public class Run extends CamelCommand { String profile = "dev"; @Option(names = { - "--dep", "--deps" }, description = "Add additional dependencies (Use commas to separate multiple dependencies)") - String dependencies; + "--dep", "--deps" }, arity = "*", description = "Add additional dependencies") + private String[] _dependencies; // [TODO] make less protected when we ditch --deps @Option(names = { "--repos" }, description = "Additional maven repositories for download on-demand (Use commas to separate multiple repositories)") @@ -633,17 +625,8 @@ public class Run extends CamelCommand { // find source files files = RunHelper.scanMavenOrGradleProject(); // include extra dependencies from pom.xml - List<String> deps = RunHelper.scanMavenDependenciesFromPom(); - for (String d : deps) { - if (dependencies == null) { - dependencies = ""; - } - if (dependencies.isBlank()) { - dependencies = d; - } else { - dependencies += "," + d; - } - } + var pomDependencies = RunHelper.scanMavenDependenciesFromPom(); + addDependencies(pomDependencies.toArray(new String[0])); } if (profile != null) { @@ -825,15 +808,11 @@ public class Run extends CamelCommand { } // merge existing dependencies with --deps - String deps = RuntimeUtil.getDependencies(profileProperties); - if (deps.isBlank()) { - deps = dependencies != null ? dependencies : ""; - } else if (dependencies != null && !dependencies.equals(deps)) { - deps += "," + dependencies; - } - if (!deps.isBlank()) { - main.addInitialProperty("camel.jbang.dependencies", deps); - writeSettings("camel.jbang.dependencies", deps); + addDependencies(RuntimeUtil.getDependenciesAsArray(profileProperties)); + if (dependencies().length > 0) { + var joined = String.join(",", dependencies()); + main.addInitialProperty("camel.jbang.dependencies", joined); + writeSettings("camel.jbang.dependencies", joined); } // if we have a specific camel version then make sure we really need to switch @@ -877,6 +856,28 @@ public class Run extends CamelCommand { } } + // [TODO] Remove when we ditch --deps + // For backward compatibility, we expands comma separated --deps + // https://issues.apache.org/jira/browse/CAMEL-20976 + String[] dependencies() { + if (_dependencies != null && _dependencies.length == 1) { + String[] toks = _dependencies[0].split(","); + _dependencies = Arrays.stream(toks).map(String::trim).toArray(String[]::new); + } + return _dependencies; + } + + protected void addDependencies(String... deps) { + var depsList = new ArrayList<>(getDependenciesList()); + depsList.addAll(Arrays.asList(deps)); + _dependencies = depsList.toArray(new String[0]); + } + + protected List<String> getDependenciesList() { + var depsArray = Optional.ofNullable(dependencies()).orElse(new String[0]); + return Arrays.asList(depsArray); + } + protected int runQuarkus() throws Exception { // create temp run dir File runDir = new File(RUN_PLATFORM_DIR, Long.toString(System.currentTimeMillis())); @@ -900,12 +901,8 @@ public class Run extends CamelCommand { if (eq.gav == null) { eq.gav = "org.example.project:jbang-run-dummy:1.0-SNAPSHOT"; } - eq.dependencies = this.dependencies; - if (eq.dependencies == null) { - eq.dependencies = "camel:cli-connector"; - } else { - eq.dependencies += ",camel:cli-connector"; - } + eq.addDependencies(this.dependencies()); + eq.addDependencies("camel:cli-connector"); eq.fresh = this.fresh; eq.download = this.download; eq.quiet = true; @@ -968,15 +965,11 @@ public class Run extends CamelCommand { if (eq.gav == null) { eq.gav = "org.example.project:jbang-run-dummy:1.0-SNAPSHOT"; } - eq.dependencies = this.dependencies; - if (eq.dependencies == null) { - eq.dependencies = "camel:cli-connector"; - } else { - eq.dependencies += ",camel:cli-connector"; - } + eq.addDependencies(dependencies()); + eq.addDependencies("camel:cli-connector"); if (this.dev) { // hot-reload of spring-boot - eq.dependencies += ",mvn:org.springframework.boot:spring-boot-devtools"; + eq.addDependencies("mvn:org.springframework.boot:spring-boot-devtools"); } eq.fresh = this.fresh; eq.download = this.download; diff --git a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/common/RuntimeUtil.java b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/common/RuntimeUtil.java index 8d505eb5bec..da04fb58059 100644 --- a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/common/RuntimeUtil.java +++ b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/common/RuntimeUtil.java @@ -24,10 +24,7 @@ import java.io.StringReader; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.ArrayList; -import java.util.List; -import java.util.Properties; -import java.util.StringJoiner; +import java.util.*; import java.util.concurrent.atomic.AtomicBoolean; import org.apache.camel.util.IOHelper; @@ -186,6 +183,10 @@ public final class RuntimeUtil { return deps; } + public static String[] getDependenciesAsArray(Properties properties) { + return getDependencies(properties).split(","); + } + public static String getPid() { return String.valueOf(ProcessHandle.current().pid()); } diff --git a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesExport.java b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesExport.java index 0eed255ee67..7d0335f4d06 100644 --- a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesExport.java +++ b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesExport.java @@ -20,7 +20,6 @@ package org.apache.camel.dsl.jbang.core.commands.kubernetes; import java.io.ByteArrayInputStream; import java.io.File; import java.nio.charset.StandardCharsets; -import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; @@ -137,38 +136,12 @@ class KubernetesExport extends Export { runtime = RuntimeType.quarkus; } - List<String> exportDependencies = new ArrayList<>(); - if (dependencies != null) { - String[] deps = dependencies.split(","); - exportDependencies.addAll(Arrays.asList(deps)); - - } - exportDependencies.add("camel:cli-connector"); - exportDependencies.add("io.quarkus:quarkus-kubernetes"); - - // Mutually exclusive image build plugins - use Jib by default - if (!exportDependencies.contains("io.quarkus:quarkus-container-image-docker")) { - exportDependencies.add("io.quarkus:quarkus-container-image-jib"); - } - - // TODO: remove when fixed kubernetes-client version is part of the Quarkus platform - // pin kubernetes-client to this version because of https://github.com/fabric8io/kubernetes-client/issues/6059 - exportDependencies.add("io.fabric8:kubernetes-client:6.13.1"); - - dependencies = String.join(",", exportDependencies); - - additionalProperties = Optional.ofNullable(additionalProperties).orElse(""); - Map<String, String> exportProps = new HashMap<>(); - String resolvedImageRegistry = resolveImageRegistry(); - if (resolvedImageRegistry != null) { - exportProps.put("quarkus.container-image.registry", resolvedImageRegistry); - if (resolvedImageRegistry.startsWith("localhost")) { - exportProps.put("quarkus.container-image.insecure", "true"); - } - } + // TODO: remove when fixed kubernetes-client version is part of the Quarkus platform + // pin kubernetes-client to this version because of https://github.com/fabric8io/kubernetes-client/issues/6059 + addDependencies("camel:cli-connector", "io.fabric8:kubernetes-client:6.13.1"); String resolvedImageGroup = null; if (image != null) { @@ -177,10 +150,34 @@ class KubernetesExport extends Export { resolvedImageGroup = imageGroup; } - if (resolvedImageGroup != null) { - exportProps.put("quarkus.container-image.group", resolvedImageGroup); + if (runtime == RuntimeType.quarkus) { + + // Quarkus specific dependencies + addDependencies("io.quarkus:quarkus-kubernetes"); + + // Mutually exclusive image build plugins - use Jib by default + if (!getDependenciesList().contains("io.quarkus:quarkus-container-image-docker")) { + addDependencies("io.quarkus:quarkus-container-image-jib"); + } + + // Quarkus specific properties + exportProps.put("quarkus.container-image.build", "true"); + + if (resolvedImageRegistry != null) { + exportProps.put("quarkus.container-image.registry", resolvedImageRegistry); + if (resolvedImageRegistry.startsWith("localhost")) { + exportProps.put("quarkus.container-image.insecure", "true"); + } + } + + if (resolvedImageGroup != null) { + exportProps.put("quarkus.container-image.group", resolvedImageGroup); + } + } else { + printer().println("Kubernetes export for runtime '" + runtime + "' not supported"); } + additionalProperties = Optional.ofNullable(additionalProperties).orElse(""); if (additionalProperties.isEmpty()) { additionalProperties = exportProps.entrySet().stream() .map(entry -> "%s=%s".formatted(entry.getKey(), entry.getValue())).collect(Collectors.joining(","));