/******************************************************************************* * Copyright (c) 2012-2017 Codenvy, S.A. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Codenvy, S.A. - initial API and implementation *******************************************************************************/ package org.eclipse.che.plugin.maven.server.execution; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; /** * Manages command line options and create native OS process. * Also manages creating {@link Process} object by {@link CommandLine#createProcess()}. * All options represented as-is, without any escaping or encoding. * * @author Evgen Vidolob */ public class CommandLine { private String executablePath; private boolean redirectErrorStream; private File workingDirectory; private Map<String, String> environment = new HashMap<>(); private List<String> parameters = new ArrayList<>(); public CommandLine() { } public CommandLine(String... command) { this(Arrays.asList(command)); } public CommandLine(List<String> command) { if (command.size() > 0) { executablePath = command.get(0); if (command.size() > 1) { addParameters(command.subList(0, command.size())); } } } public String getExecutablePath() { return executablePath; } public void setExecutablePath(String executablePath) { this.executablePath = executablePath; } public void addParameters(List<String> parameters) { this.parameters.addAll(parameters); } public File getWorkingDirectory() { return workingDirectory; } public void setWorkingDirectory(File workingDirectory) { this.workingDirectory = workingDirectory; } public void setWorkingDirectory(String path) { if (path != null && !path.isEmpty()) { workingDirectory = new File(path); } } public Map<String, String> getEnvironment() { return environment; } public boolean isRedirectErrorStream() { return redirectErrorStream; } public void setRedirectErrorStream(boolean redirectErrorStream) { this.redirectErrorStream = redirectErrorStream; } public Process createProcess() throws ExecutionException { List<String> commandLine = createCommandLine(); try { return runProcess(commandLine); } catch (IOException e) { throw new ExecutionException(e); } } private Process runProcess(List<String> commandLine) throws IOException { ProcessBuilder processBuilder = new ProcessBuilder(commandLine); Map<String, String> environment = processBuilder.environment(); environment.clear(); environment.putAll(this.environment); processBuilder.directory(workingDirectory); processBuilder.redirectErrorStream(redirectErrorStream); return processBuilder.start(); } private List<String> createCommandLine() { List<String> commandLine = new ArrayList<>(parameters.size() + 1); commandLine.add(executablePath); commandLine.addAll(parameters); return commandLine; } public void addParameter(String parameter) { parameters.add(parameter); } }