diff --git a/Partner-Core/src/main/java/work/slhaf/partner/core/action/runner/LocalRunnerClient.java b/Partner-Core/src/main/java/work/slhaf/partner/core/action/runner/LocalRunnerClient.java index a90c94f9..8cffd691 100644 --- a/Partner-Core/src/main/java/work/slhaf/partner/core/action/runner/LocalRunnerClient.java +++ b/Partner-Core/src/main/java/work/slhaf/partner/core/action/runner/LocalRunnerClient.java @@ -8,7 +8,6 @@ import work.slhaf.partner.core.action.entity.MetaAction; import work.slhaf.partner.core.action.entity.MetaActionInfo; import work.slhaf.partner.core.action.exception.ActionInitFailedException; import work.slhaf.partner.core.action.runner.execution.CommandExecutionService; -import work.slhaf.partner.core.action.runner.execution.LocalProcessCommandExecutionService; import work.slhaf.partner.core.action.runner.execution.McpActionExecutor; import work.slhaf.partner.core.action.runner.execution.OriginExecutionService; import work.slhaf.partner.core.action.runner.mcp.*; @@ -59,7 +58,7 @@ public class LocalRunnerClient extends RunnerClient implements AutoCloseable { McpClientRegistry clientRegistry = new McpClientRegistry(); McpTransportFactory transportFactory = new McpTransportFactory(); - CommandExecutionService commandService = new LocalProcessCommandExecutionService(); + CommandExecutionService commandService = new CommandExecutionService(); ActionSerializer serializer = new ActionSerializer(tmpActionPath, dynamicActionPath); OriginExecutionService originService = new OriginExecutionService(commandService); McpActionExecutor actionExecutor = new McpActionExecutor(clientRegistry); diff --git a/Partner-Core/src/main/java/work/slhaf/partner/core/action/runner/execution/CommandExecutionService.java b/Partner-Core/src/main/java/work/slhaf/partner/core/action/runner/execution/CommandExecutionService.java index e302741e..e7c0598f 100644 --- a/Partner-Core/src/main/java/work/slhaf/partner/core/action/runner/execution/CommandExecutionService.java +++ b/Partner-Core/src/main/java/work/slhaf/partner/core/action/runner/execution/CommandExecutionService.java @@ -2,17 +2,85 @@ package work.slhaf.partner.core.action.runner.execution; import lombok.Data; +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.concurrent.atomic.AtomicInteger; -public interface CommandExecutionService { +public class CommandExecutionService { - String[] buildCommands(String ext, Map params, String absolutePath); + public String[] buildCommands(String ext, Map params, String absolutePath) { + String command = switch (ext) { + case "py" -> "python"; + case "sh" -> "bash"; + default -> null; + }; + if (command == null) { + return null; + } + int paramSize = params == null ? 0 : params.size(); + String[] commands = new String[paramSize + 2]; + commands[0] = command; + commands[1] = absolutePath; + AtomicInteger paramCount = new AtomicInteger(2); + if (params != null) { + params.forEach((param, value) -> commands[paramCount.getAndIncrement()] = "--" + param + "=" + value); + } + return commands; + } - Result exec(String... command); + public Result exec(String... command) { + Result result = new Result(); + List output = new ArrayList<>(); + List error = new ArrayList<>(); + + try { + Process process = new ProcessBuilder(command) + .redirectErrorStream(false) + .start(); + + Thread stdoutThread = new Thread(() -> { + try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))) { + String line; + while ((line = reader.readLine()) != null) { + output.add(line); + } + } catch (Exception ignored) { + } + }); + + Thread stderrThread = new Thread(() -> { + try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getErrorStream()))) { + String line; + while ((line = reader.readLine()) != null) { + error.add(line); + } + } catch (Exception ignored) { + } + }); + + stdoutThread.start(); + stderrThread.start(); + + int exitCode = process.waitFor(); + stdoutThread.join(); + stderrThread.join(); + + result.setOk(exitCode == 0); + result.setResultList(output.isEmpty() ? error : output); + result.setTotal(String.join("\n", output.isEmpty() ? error : output)); + } catch (Exception e) { + result.setOk(false); + result.setTotal(e.getMessage()); + } + + return result; + } @Data - class Result { + public static class Result { private boolean ok; private String total; private List resultList; diff --git a/Partner-Core/src/main/java/work/slhaf/partner/core/action/runner/execution/LocalProcessCommandExecutionService.java b/Partner-Core/src/main/java/work/slhaf/partner/core/action/runner/execution/LocalProcessCommandExecutionService.java deleted file mode 100644 index 35b13a34..00000000 --- a/Partner-Core/src/main/java/work/slhaf/partner/core/action/runner/execution/LocalProcessCommandExecutionService.java +++ /dev/null @@ -1,81 +0,0 @@ -package work.slhaf.partner.core.action.runner.execution; - -import java.io.BufferedReader; -import java.io.InputStreamReader; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.concurrent.atomic.AtomicInteger; - -public class LocalProcessCommandExecutionService implements CommandExecutionService { - - @Override - public String[] buildCommands(String ext, Map params, String absolutePath) { - String command = switch (ext) { - case "py" -> "python"; - case "sh" -> "bash"; - default -> null; - }; - if (command == null) { - return null; - } - int paramSize = params == null ? 0 : params.size(); - String[] commands = new String[paramSize + 2]; - commands[0] = command; - commands[1] = absolutePath; - AtomicInteger paramCount = new AtomicInteger(2); - if (params != null) { - params.forEach((param, value) -> commands[paramCount.getAndIncrement()] = "--" + param + "=" + value); - } - return commands; - } - - @Override - public Result exec(String... command) { - Result result = new Result(); - List output = new ArrayList<>(); - List error = new ArrayList<>(); - - try { - Process process = new ProcessBuilder(command) - .redirectErrorStream(false) - .start(); - - Thread stdoutThread = new Thread(() -> { - try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))) { - String line; - while ((line = reader.readLine()) != null) { - output.add(line); - } - } catch (Exception ignored) { - } - }); - - Thread stderrThread = new Thread(() -> { - try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getErrorStream()))) { - String line; - while ((line = reader.readLine()) != null) { - error.add(line); - } - } catch (Exception ignored) { - } - }); - - stdoutThread.start(); - stderrThread.start(); - - int exitCode = process.waitFor(); - stdoutThread.join(); - stderrThread.join(); - - result.setOk(exitCode == 0); - result.setResultList(output.isEmpty() ? error : output); - result.setTotal(String.join("\n", output.isEmpty() ? error : output)); - } catch (Exception e) { - result.setOk(false); - result.setTotal(e.getMessage()); - } - - return result; - } -}