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

Croway 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 834637ab4778 camel-jbang: honour the configured Maven environment in 
doctor (#28515)
834637ab4778 is described below

commit 834637ab47784fa1addc11ce3007316f4e6b70bd
Author: Federico Mariani <[email protected]>
AuthorDate: Mon Oct 26 14:46:29 2026 +0100

    camel-jbang: honour the configured Maven environment in doctor (#28515)
    
    * fix: camel-jbang doctor honours the configured Maven environment
    
    * docs: remove doctor upgrade guide additions
---
 .../ROOT/pages/camel-jbang-getting-started.adoc    | 10 +++
 .../camel/dsl/jbang/core/commands/Doctor.java      | 10 +++
 .../jbang/core/commands/DoctorRepositoryTest.java  | 92 ++++++++++++++++++++++
 .../camel/dsl/jbang/core/commands/DoctorTest.java  | 80 +++++++++++++++++++
 4 files changed, 192 insertions(+)

diff --git 
a/docs/user-manual/modules/ROOT/pages/camel-jbang-getting-started.adoc 
b/docs/user-manual/modules/ROOT/pages/camel-jbang-getting-started.adoc
index da6c1c4bbcfc..790feaa6c834 100644
--- a/docs/user-manual/modules/ROOT/pages/camel-jbang-getting-started.adoc
+++ b/docs/user-manual/modules/ROOT/pages/camel-jbang-getting-started.adoc
@@ -242,6 +242,16 @@ camel doctor
 This checks Camel and Java versions, JBang availability, Maven repository 
connectivity,
 container runtime (Docker/Podman), and disk space.
 
+The Maven check resolves `camel-api` for the bundled Camel version using the 
default Maven settings and repositories.
+It also honours the `camel.jbang.repos`, `camel.jbang.maven-settings`, 
`camel.jbang.maven-settings-security`,
+`camel.jbang.maven-central-enabled`, 
`camel.jbang.maven-apache-snapshot-enabled`, `camel.jbang.download`, and
+`camel.jbang.fresh` JVM system properties. Additional repositories configured 
through `camel.extra.repos`
+are also used.
+
+The command returns a non-zero exit code when a required check fails, 
including Maven artifact resolution.
+Missing optional tools, occupied ports, and low temporary disk space do not 
fail the command.
+
+
 == Explore commands
 
 Every command supports `--help`:
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Doctor.java
 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Doctor.java
index 856df9bca23b..cdcac4b626d2 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Doctor.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/main/java/org/apache/camel/dsl/jbang/core/commands/Doctor.java
@@ -26,6 +26,7 @@ import java.util.Set;
 
 import org.apache.camel.catalog.CamelCatalog;
 import org.apache.camel.catalog.DefaultCamelCatalog;
+import org.apache.camel.dsl.jbang.core.common.CamelJBangConstants;
 import org.apache.camel.dsl.jbang.core.common.CliExitCode;
 import org.apache.camel.dsl.jbang.core.common.ExternalCommand;
 import org.apache.camel.dsl.jbang.core.common.InstallDetector;
@@ -171,6 +172,15 @@ public class Doctor extends CamelCommand {
 
     private void checkMavenRepository() {
         try (MavenDownloaderImpl downloader = new MavenDownloaderImpl()) {
+            downloader.setRepos(System.getProperty(CamelJBangConstants.REPOS));
+            
downloader.setMavenSettingsLocation(System.getProperty(CamelJBangConstants.MAVEN_SETTINGS));
+            
downloader.setMavenSettingsSecurityLocation(System.getProperty(CamelJBangConstants.MAVEN_SETTINGS_SECURITY));
+            downloader.setMavenCentralEnabled(Boolean.parseBoolean(
+                    
System.getProperty(CamelJBangConstants.MAVEN_CENTRAL_ENABLED, "true")));
+            downloader.setMavenApacheSnapshotEnabled(Boolean.parseBoolean(
+                    
System.getProperty(CamelJBangConstants.MAVEN_APACHE_SNAPSHOTS, "true")));
+            
downloader.setOffline(!Boolean.parseBoolean(System.getProperty(CamelJBangConstants.DOWNLOAD,
 "true")));
+            
downloader.setFresh(Boolean.parseBoolean(System.getProperty(CamelJBangConstants.FRESH,
 "false")));
             downloader.build();
             CamelCatalog catalog = new DefaultCamelCatalog();
             String version = catalog.getCatalogVersion();
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/DoctorRepositoryTest.java
 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/DoctorRepositoryTest.java
new file mode 100644
index 000000000000..8804d314945f
--- /dev/null
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/DoctorRepositoryTest.java
@@ -0,0 +1,92 @@
+/*
+ * 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.commands;
+
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.jar.JarEntry;
+import java.util.jar.JarOutputStream;
+
+import org.apache.camel.catalog.DefaultCamelCatalog;
+import org.apache.camel.dsl.jbang.core.common.CamelJBangConstants;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.io.TempDir;
+import org.junitpioneer.jupiter.ClearSystemProperty;
+import org.junitpioneer.jupiter.SetSystemProperty;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+@SetSystemProperty(key = CamelJBangConstants.MAVEN_CENTRAL_ENABLED, value = 
"false")
+@SetSystemProperty(key = CamelJBangConstants.MAVEN_APACHE_SNAPSHOTS, value = 
"false")
+@SetSystemProperty(key = CamelJBangConstants.DOWNLOAD, value = "true")
+@SetSystemProperty(key = CamelJBangConstants.FRESH, value = "false")
+@ClearSystemProperty(key = CamelJBangConstants.REPOS)
+@ClearSystemProperty(key = CamelJBangConstants.MAVEN_SETTINGS)
+@ClearSystemProperty(key = CamelJBangConstants.MAVEN_SETTINGS_SECURITY)
+@ClearSystemProperty(key = "camel.extra.repos")
+@ClearSystemProperty(key = "camel.default.extra.repos.default.value")
+@ClearSystemProperty(key = "maven.repo.local")
+@ClearSystemProperty(key = "camel.launcher")
+class DoctorRepositoryTest extends CamelCommandBaseTestSupport {
+
+    @TempDir
+    Path directory;
+
+    private Path repository;
+
+    @BeforeEach
+    void configureRepository() throws Exception {
+        Path settings = directory.resolve("settings.xml");
+        Files.writeString(settings,
+                "<settings><localRepository>" + directory.resolve("cache") + 
"</localRepository></settings>");
+        System.setProperty(CamelJBangConstants.MAVEN_SETTINGS, 
settings.toString());
+
+        repository = directory.resolve("repository");
+        String version = new DefaultCamelCatalog().getCatalogVersion();
+        Path artifactDirectory = 
repository.resolve("org/apache/camel/camel-api").resolve(version);
+        Files.createDirectories(artifactDirectory);
+        Path artifact = artifactDirectory.resolve("camel-api-" + version + 
".jar");
+        try (JarOutputStream jar = new 
JarOutputStream(Files.newOutputStream(artifact))) {
+            jar.putNextEntry(new JarEntry("META-INF/MANIFEST.MF"));
+            jar.write("Manifest-Version: 
1.0\n\n".getBytes(StandardCharsets.UTF_8));
+            jar.closeEntry();
+        }
+    }
+
+    @Test
+    void resolvesArtifactFromConfiguredRepositoryWithEmptyCache() throws 
Exception {
+        System.setProperty(CamelJBangConstants.REPOS, "product=" + 
repository.toUri());
+        Doctor command = new Doctor(new CamelJBangMain().withPrinter(printer));
+
+        assertThat(command.doCall()).isZero();
+        assertThat(printer.getOutput()).contains("Artifact resolution (OK)");
+        String version = new DefaultCamelCatalog().getCatalogVersion();
+        assertThat(
+                
directory.resolve("cache/org/apache/camel/camel-api").resolve(version).resolve("camel-api-"
 + version + ".jar"))
+                .exists();
+    }
+
+    @Test
+    void missingArtifactFailsWithEmptyCache() throws Exception {
+        Doctor command = new Doctor(new CamelJBangMain().withPrinter(printer));
+
+        assertThat(command.doCall()).isEqualTo(1);
+        assertThat(printer.getOutput()).contains("Artifact resolution failed", 
"Disk Space:");
+    }
+}
diff --git 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/DoctorTest.java
 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/DoctorTest.java
index cd8d9809a175..539b14a8deff 100644
--- 
a/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/DoctorTest.java
+++ 
b/dsl/camel-jbang/camel-jbang-core/src/test/java/org/apache/camel/dsl/jbang/core/commands/DoctorTest.java
@@ -19,20 +19,100 @@ package org.apache.camel.dsl.jbang.core.commands;
 import java.nio.file.Path;
 import java.util.List;
 import java.util.Optional;
+import java.util.Set;
 
+import org.apache.camel.catalog.DefaultCamelCatalog;
+import org.apache.camel.dsl.jbang.core.common.CamelJBangConstants;
 import org.apache.camel.dsl.jbang.core.common.CliExitCode;
 import org.apache.camel.dsl.jbang.core.common.InstallDetector;
 import org.apache.camel.dsl.jbang.core.common.OllamaDoctorSupport;
+import org.apache.camel.tooling.maven.MavenDownloaderImpl;
+import org.apache.camel.tooling.maven.MavenResolutionException;
 import org.apache.camel.util.json.JsonArray;
 import org.apache.camel.util.json.JsonObject;
 import org.apache.camel.util.json.Jsoner;
+import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
+import org.junitpioneer.jupiter.SetSystemProperty;
+import org.mockito.MockedConstruction;
 
 import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.ArgumentMatchers.anyList;
+import static org.mockito.ArgumentMatchers.anySet;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.mockConstruction;
+import static org.mockito.Mockito.verify;
 
 class DoctorTest extends CamelCommandBaseTestSupport {
 
+    private MockedConstruction<MavenDownloaderImpl> downloaders;
+    private MavenResolutionException resolutionFailure;
+    private boolean initializationFailure;
+
+    @BeforeEach
+    void mockDownloader() {
+        downloaders = mockConstruction(MavenDownloaderImpl.class, (downloader, 
context) -> {
+            if (initializationFailure) {
+                doThrow(new IllegalStateException("Invalid Maven 
settings")).when(downloader).build();
+            }
+            if (resolutionFailure != null) {
+                
doThrow(resolutionFailure).when(downloader).resolveArtifacts(anyList(), 
anySet(), anyBoolean(), anyBoolean());
+            }
+        });
+    }
+
+    @AfterEach
+    void closeDownloaderMocks() {
+        downloaders.close();
+    }
+
+    @Test
+    void mavenResolutionFailureFailsCommand() throws Exception {
+        resolutionFailure = new MavenResolutionException("Product artifact 
unavailable");
+        Doctor command = new Doctor(new CamelJBangMain().withPrinter(printer));
+
+        assertThat(command.doCall()).isEqualTo(1);
+        assertThat(printer.getOutput()).contains("Artifact resolution failed", 
"Product artifact unavailable", "Disk Space:");
+    }
+
+    @Test
+    void mavenInitializationFailureFailsCommand() throws Exception {
+        initializationFailure = true;
+        Doctor command = new Doctor(new CamelJBangMain().withPrinter(printer));
+
+        assertThat(command.doCall()).isEqualTo(1);
+        assertThat(printer.getOutput()).contains("Invalid Maven settings", 
"Disk Space:");
+    }
+
+    @Test
+    @SetSystemProperty(key = CamelJBangConstants.REPOS, value = 
"product=file:/product-repository")
+    @SetSystemProperty(key = CamelJBangConstants.MAVEN_SETTINGS, value = 
"custom-settings.xml")
+    @SetSystemProperty(key = CamelJBangConstants.MAVEN_SETTINGS_SECURITY, 
value = "custom-settings-security.xml")
+    @SetSystemProperty(key = CamelJBangConstants.MAVEN_CENTRAL_ENABLED, value 
= "false")
+    @SetSystemProperty(key = CamelJBangConstants.MAVEN_APACHE_SNAPSHOTS, value 
= "false")
+    @SetSystemProperty(key = CamelJBangConstants.DOWNLOAD, value = "false")
+    @SetSystemProperty(key = CamelJBangConstants.FRESH, value = "true")
+    void usesConfiguredMavenEnvironment() throws Exception {
+        Doctor command = new Doctor(new CamelJBangMain().withPrinter(printer));
+
+        assertThat(command.doCall()).isZero();
+        assertThat(downloaders.constructed()).hasSize(1);
+        MavenDownloaderImpl downloader = downloaders.constructed().get(0);
+        verify(downloader).setRepos("product=file:/product-repository");
+        verify(downloader).setMavenSettingsLocation("custom-settings.xml");
+        
verify(downloader).setMavenSettingsSecurityLocation("custom-settings-security.xml");
+        verify(downloader).setMavenCentralEnabled(false);
+        verify(downloader).setMavenApacheSnapshotEnabled(false);
+        verify(downloader).setOffline(true);
+        verify(downloader).setFresh(true);
+        verify(downloader).resolveArtifacts(
+                List.of("org.apache.camel:camel-api:" + new 
DefaultCamelCatalog().getCatalogVersion()),
+                Set.of(), false, false);
+    }
+
     @Test
     public void exitCodeFollowsTheChecks() throws Exception {
         Doctor command = new Doctor(new CamelJBangMain().withPrinter(printer));

Reply via email to