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

davsclaus pushed a commit to branch feature/CAMEL-23857-tui-runtime-chooser
in repository https://gitbox.apache.org/repos/asf/camel.git

commit d87ff187fff1a91c2ecef426247d883d2e2a7e95
Author: Claus Ibsen <[email protected]>
AuthorDate: Mon Jun 29 21:44:02 2026 +0200

    CAMEL-23857: camel export pass profile to exported application.properties 
and TUI restart for Spring Boot/Quarkus
    
    Co-Authored-By: Claude Opus 4.6 <[email protected]>
    Signed-off-by: Claus Ibsen <[email protected]>
---
 .../dsl/jbang/core/commands/ExportBaseCommand.java |  5 ++
 .../apache/camel/dsl/jbang/core/commands/Run.java  |  2 +
 .../dsl/jbang/core/commands/tui/CamelMonitor.java  | 85 ++++++++++++++++++++++
 3 files changed, 92 insertions(+)

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 d6bf27e829e1..4465ccc09146 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
@@ -1011,6 +1011,11 @@ public abstract class ExportBaseCommand extends 
CamelCommand {
             customize.apply(profileProps);
         }
 
+        // include camel profile if set (so exported runtimes like Spring Boot 
and Quarkus know the profile)
+        if (this.profile != null && 
!profileProps.containsKey("camel.main.profile")) {
+            profileProps.put("camel.main.profile", this.profile);
+        }
+
         StringBuilder content = new StringBuilder();
         for (Map.Entry<Object, Object> entry : profileProps.entrySet()) {
             String k = entry.getKey().toString();
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 a1781a745a3a..f6c852b81348 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
@@ -1362,6 +1362,7 @@ public class Run extends CamelCommand {
         eq.loggingLevel = "off";
         eq.ignoreLoadingError = this.ignoreLoadingError;
         eq.lazyBean = this.lazyBean;
+        eq.profile = this.profile;
         eq.applicationProperties = this.property;
 
         printer().println("Running using Quarkus (preparing and downloading 
files)");
@@ -1478,6 +1479,7 @@ public class Run extends CamelCommand {
         eq.loggingLevel = "off";
         eq.ignoreLoadingError = this.ignoreLoadingError;
         eq.lazyBean = this.lazyBean;
+        eq.profile = this.profile;
         eq.applicationProperties = this.property;
 
         printer().println("Running using Spring Boot (preparing and 
downloading files)");
diff --git 
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/CamelMonitor.java
 
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/CamelMonitor.java
index 1d38c39ac4c1..7fdddbce43a7 100644
--- 
a/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/CamelMonitor.java
+++ 
b/dsl/camel-jbang/camel-jbang-plugin-tui/src/main/java/org/apache/camel/dsl/jbang/core/commands/tui/CamelMonitor.java
@@ -1195,6 +1195,91 @@ public class CamelMonitor extends CamelCommand {
             return;
         }
 
+        String platform = info.platform;
+        boolean isSpringBoot = "Spring Boot".equals(platform);
+        boolean isQuarkus = "Quarkus".equals(platform);
+
+        if (isSpringBoot || isQuarkus) {
+            restartMavenBasedProcess(ph, info, isSpringBoot);
+        } else {
+            restartCamelMainProcess(ph, info);
+        }
+    }
+
+    private void restartMavenBasedProcess(ProcessHandle ph, IntegrationInfo 
info, boolean springBoot) {
+        String directory = info.directory;
+        if (directory == null || directory.isEmpty()) {
+            setNotification("Cannot restart: directory not available", true);
+            return;
+        }
+
+        Path dirPath = Path.of(directory);
+        boolean windows = System.getProperty("os.name", 
"").toLowerCase(Locale.ROOT).contains("win");
+        String mvnw = windows ? "mvnw.cmd" : "mvnw";
+        Path mvnwPath = dirPath.resolve(mvnw);
+        if (!Files.isRegularFile(mvnwPath)) {
+            setNotification("Cannot restart: Maven wrapper not found", true);
+            return;
+        }
+
+        String name = info.name;
+        ctx.lastSelectedName = name;
+
+        // kill the process (Maven parent will also exit)
+        ph.destroy();
+        setNotification("Restarting: " + name, false);
+
+        if (runner != null) {
+            runner.scheduler().execute(() -> {
+                try {
+                    // wait for process termination
+                    try {
+                        ph.onExit().toCompletableFuture().get(10, 
TimeUnit.SECONDS);
+                    } catch (Exception e) {
+                        ph.destroyForcibly();
+                        Thread.sleep(500);
+                    }
+                    // also wait for parent (Maven) to exit
+                    ProcessHandle parent = ph.parent().orElse(null);
+                    if (parent != null && parent.isAlive()) {
+                        try {
+                            parent.onExit().toCompletableFuture().get(5, 
TimeUnit.SECONDS);
+                        } catch (Exception e) {
+                            parent.destroyForcibly();
+                        }
+                    }
+
+                    // re-launch via Maven wrapper
+                    List<String> cmd = new ArrayList<>();
+                    cmd.add(mvnwPath.toString());
+                    cmd.add("--quiet");
+                    cmd.add("--file");
+                    cmd.add(dirPath.resolve("pom.xml").toString());
+                    if (springBoot) {
+                        cmd.add("spring-boot:run");
+                    } else {
+                        cmd.add("package");
+                        cmd.add("quarkus:dev");
+                    }
+
+                    ProcessBuilder pb = new ProcessBuilder(cmd);
+                    pb.directory(dirPath.toFile());
+                    pb.redirectErrorStream(true);
+                    Path outputFile = Files.createTempFile("camel-restart-", 
".log");
+                    outputFile.toFile().deleteOnExit();
+                    pb.redirectOutput(outputFile.toFile());
+                    pb.start();
+
+                    runner.runOnRenderThread(() -> setNotification("Restarted: 
" + name, false));
+                } catch (Exception e) {
+                    runner.runOnRenderThread(
+                            () -> setNotification("Restart failed: " + 
e.getMessage(), true));
+                }
+            });
+        }
+    }
+
+    private void restartCamelMainProcess(ProcessHandle ph, IntegrationInfo 
info) {
         // capture command line before stopping
         Optional<String> cmdOpt = ph.info().command();
         Optional<String[]> argsOpt = ph.info().arguments();

Reply via email to