package kafka;

import java.io.File;
import java.io.IOException;
import java.util.Arrays;

public class JavaProcess {

    public Process process;
    Class classWithMain;

    public JavaProcess(Class classWithmain) {
        this.classWithMain = classWithmain;
    }

    public void exec(String... args) throws IOException, InterruptedException {
        String java = System.getProperty("java.home") + File.separator + "bin" + File.separator + "java";
        String classpath = System.getProperty("java.class.path");
        String className = classWithMain.getName();

        ProcessBuilder builder = new ProcessBuilder(
                java, "-cp", classpath, className, convertArgsToString(args));

        process = builder.inheritIO().start();
    }

    private String convertArgsToString(String... args) {
        String string = "";
        for(String arg: args) {
            string += arg;
        }
        return string;
    }

    public void waitFor() throws InterruptedException {
        process.waitFor();
    }

    public void destroy() {
        process.destroy();
    }



}