/* * Copyright (c) 2013-2016 Chris Newland. * Licensed under https://github.com/AdoptOpenJDK/jitwatch/blob/master/LICENSE-BSD * Instructions: https://github.com/AdoptOpenJDK/jitwatch/wiki */ package org.adoptopenjdk.jitwatch.process; import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.C_SPACE; import static org.adoptopenjdk.jitwatch.core.JITWatchConstants.S_EMPTY; import java.io.File; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.util.List; import java.util.Map; import org.adoptopenjdk.jitwatch.logger.ILogListener; import org.adoptopenjdk.jitwatch.process.runtime.RuntimeJava; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public abstract class AbstractProcess implements IExternalProcess { protected static final Logger logger = LoggerFactory.getLogger(RuntimeJava.class); private Path stdErr; private Path stdOut; public AbstractProcess() { try { stdErr = Files.createTempFile("stream", ".err"); stdOut = Files.createTempFile("stream", ".out"); } catch (IOException ioe) { ioe.printStackTrace(); } } public String getExecutableSuffix() { return isWindows() ? ".exe" : ""; } public String getLaunchScriptSuffix() { return isWindows() ? ".bat" : ".sh"; } public boolean isWindows() { return System.getProperty("os.name", S_EMPTY).contains("Windows"); } @Override public String getOutputStream() { String result = null; if (stdOut.toFile().exists()) { try { result = new String(Files.readAllBytes(stdOut), StandardCharsets.UTF_8); } catch (IOException ioe) { ioe.printStackTrace(); } } return result; } @Override public String getErrorStream() { String result = null; if (stdErr.toFile().exists()) { try { result = new String(Files.readAllBytes(stdErr), StandardCharsets.UTF_8); } catch (IOException ioe) { ioe.printStackTrace(); } } return result; } protected String makeClassPath(List<String> classpathEntries) { StringBuilder cpBuilder = new StringBuilder(); for (String cp : classpathEntries) { cpBuilder.append(cp).append(File.pathSeparatorChar); } if (cpBuilder.length() > 0) { cpBuilder.deleteCharAt(cpBuilder.length() - 1); } return cpBuilder.toString(); } protected boolean runCommands(List<String> commands, ILogListener logListener) { return runCommands(commands, null, null, logListener); } protected boolean runCommands(List<String> commands, File workingDirectory, Map<String, String> environment, ILogListener logListener) { StringBuilder cmdBuilder = new StringBuilder(); for (String part : commands) { cmdBuilder.append(part).append(C_SPACE); } if (logListener != null) { logListener.handleLogEntry("Running: " + cmdBuilder.toString()); } int result = -1; try { ProcessBuilder pb = new ProcessBuilder(commands); if (environment != null) { Map<String, String> processEnvironment = pb.environment(); for (Map.Entry<String, String> entry : environment.entrySet()) { processEnvironment.put(entry.getKey(), entry.getValue()); } } if (workingDirectory != null) { pb.directory(workingDirectory); } pb.redirectError(stdErr.toFile()); pb.redirectOutput(stdOut.toFile()); Process proc = pb.start(); result = proc.waitFor(); } catch (Exception e) { if (logListener != null) { logListener.handleErrorEntry("Could not run external process:" + e); } logger.error("Could not run external process:", e); } return result == 0; // normal completion } }