/***** BEGIN LICENSE BLOCK *****
 * Version: EPL 2.0/GPL 2.0/LGPL 2.1
 *
 * The contents of this file are subject to the Eclipse Public
 * 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.eclipse.org/legal/cpl-v10.html
 *
 * Software distributed under the License is distributed on an "AS
 * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
 * implied. See the License for the specific language governing
 * rights and limitations under the License.
 *
 * Alternatively, the contents of this file may be used under the terms of
 * either of the GNU General Public License Version 2 or later (the "GPL"),
 * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
 * in which case the provisions of the GPL or the LGPL are applicable instead
 * of those above. If you wish to allow use of your version of this file only
 * under the terms of either the GPL or the LGPL, and not to allow others to
 * use your version of this file under the terms of the CPL, indicate your
 * decision by deleting the provisions above and replace them with the notice
 * and other provisions required by the GPL or the LGPL. If you do not delete
 * the provisions above, a recipient may use your version of this file under
 * the terms of any one of the CPL, the GPL or the LGPL.
 ***** END LICENSE BLOCK *****/

package jnr.posix.util;

import jnr.posix.POSIXHandler;

import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Map;

public class Java5ProcessMaker implements ProcessMaker {
    private final ProcessBuilder builder;
    private final POSIXHandler handler;

    public Java5ProcessMaker(POSIXHandler handler, String... command) {
        this.handler = handler;
        builder = new ProcessBuilder(command);
    }

    public Java5ProcessMaker(POSIXHandler handler) {
        this.handler = handler;
        builder = new ProcessBuilder();
    }

    public List<String> command() {
        return builder.command();
    }

    public ProcessMaker command(List<String> command) {
        builder.command(command);
        return this;
    }

    public ProcessMaker command(String... command) {
        builder.command(command);
        return this;
    }

    public File directory() {
        return builder.directory();
    }

    public ProcessMaker directory(File dir) {
        builder.directory(dir);
        return this;
    }

    public Map<String, String> environment() {
        return builder.environment();
    }

    public ProcessMaker environment(String[] envLines) {
        envIntoProcessBuilder(builder, envLines);
        return this;
    }

    public ProcessMaker inheritIO() {
        handler.unimplementedError("inheritIO");
        return this;
    }

    public Redirect redirectError() {
        return Redirect.PIPE; // only option on Java 5/6
    }

    public ProcessMaker redirectError(File file) {
        handler.unimplementedError("redirectError");
        return this;
    }

    public ProcessMaker redirectError(Redirect destination) {
        handler.unimplementedError("redirectError");
        return this;
    }

    public boolean redirectErrorStream() {
        return false;
    }

    public ProcessMaker redirectErrorStream(boolean redirectErrorStream) {
        handler.unimplementedError("redirectErrorStream");
        return this;
    }

    public Redirect redirectInput() {
        return Redirect.PIPE; // only option on Java 5/6
    }

    public ProcessMaker redirectInput(File file) {
        handler.unimplementedError("redirectInput");
        return this;
    }

    public ProcessMaker redirectInput(Redirect source) {
        handler.unimplementedError("redirectInput");
        return this;
    }

    public Redirect redirectOutput() {
        return Redirect.PIPE; // only option on Java 5/6
    }

    public ProcessMaker redirectOutput(File file) {
        handler.unimplementedError("redirectOutput");
        return this;
    }

    public ProcessMaker redirectOutput(Redirect destination) {
        handler.unimplementedError("redirectOutput");
        return this;
    }

    public Process start() throws IOException {
        return builder.start();
    }

    private static void envIntoProcessBuilder(ProcessBuilder pb, String[] env) {
        if (env == null) return;

        pb.environment().clear();
        for (String envLine : env) {
            if (envLine.indexOf(0) != -1) {
                envLine = envLine.replaceFirst("\u0000.*", "");
            }

            int index = envLine.indexOf('=');

            if (index != -1) {
                pb.environment().put(
                        envLine.substring(0, index),
                        envLine.substring(index + 1));
            }
        }
    }
}
