All Downloads are FREE. Search and download functionalities are using the official Maven repository.

shz.CmdHelp Maven / Gradle / Ivy

package shz;

import java.io.File;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.stream.Collectors;

public final class CmdHelp {
    private CmdHelp() {
        throw new IllegalStateException();
    }

    private static final Map PID = new ConcurrentHashMap<>();

    private static final BiConsumer END = (t, u) -> {
        try {
            if (u == null || u <= 0) t.waitFor();
            else t.waitFor(u, TimeUnit.MILLISECONDS);
        } catch (InterruptedException e) {
            throw PRException.of(e);
        }
    };

    private static final String OK = "ok";

    public static final class ExecuteParam {
        private String[] envp;
        private File file;
        private Consumer consumer;
        private Function pid;
        private Consumer end;
        private String path;
        private long timeout;
        private boolean silent = true;
        private String[] args;

        private ExecuteParam() {
        }

        public static ExecuteParam of() {
            return new ExecuteParam();
        }

        public ExecuteParam envp(String[] envp) {
            this.envp = envp;
            return this;
        }

        public ExecuteParam file(File file) {
            this.file = file;
            return this;
        }

        public ExecuteParam consumer(Consumer consumer) {
            this.consumer = consumer;
            return this;
        }

        public ExecuteParam pid(Function pid) {
            this.pid = pid;
            return this;
        }

        public ExecuteParam end(Consumer end) {
            this.end = end;
            return this;
        }

        public ExecuteParam path(String path) {
            this.path = path;
            return this;
        }

        public ExecuteParam timeout(long timeout) {
            this.timeout = timeout;
            return this;
        }

        public ExecuteParam silent(boolean silent) {
            this.silent = silent;
            return this;
        }

        public ExecuteParam args(String... args) {
            this.args = args;
            return this;
        }
    }

    public static void execute(String command, ExecuteParam param) {
        try {
            Process process = Runtime.getRuntime().exec("cmd /c " + command, param.envp, param.file == null ? null : param.file.getParentFile());
            if (param.consumer != null) IOHelp.read(IOHelp.getBr(process.getInputStream()), param.consumer);
            if (param.pid != null && param.file != null)
                PID.put(param.file.getAbsolutePath(), param.pid.apply(process));
            if (param.end != null) param.end.accept(process);
        } catch (Throwable t) {
            throw PRException.of(t);
        }
    }

    public static void execute(String command) {
        execute(command, ExecuteParam.of());
    }

    public static Future isStarted(String name, long timeout) {
        return CompletableFuture.supplyAsync(() -> {
            if (Validator.isBlank(name)) return false;
            AtomicBoolean result = new AtomicBoolean();
            try {
                execute("tasklist", ExecuteParam.of().consumer(t -> {
                    if (ToSet.asSet(t.split("\\s+")).contains(name)) result.set(true);
                }).end(t -> END.accept(t, timeout)));
            } catch (Throwable e) {
                throw PRException.of(e);
            }
            return result.get();
        });
    }

    public static Future isStarted(String name) {
        return isStarted(name, 1500);
    }

    public static Future start(ExecuteParam param) {
        if (param.file == null) param.file = FileHelp.findFile(param.path, param.timeout);
        return CompletableFuture.supplyAsync(() -> {
            String validFile = validFile(param.file);
            if (validFile != null) return validFile;
            String name = param.file.getName();
            Future started = isStarted(name);
            try {
                if (started.get()) return "[" + name + "] already running";
            } catch (InterruptedException | ExecutionException e) {
                return e.getMessage();
            }
            String params = name;
            if (Validator.nonBlank(param.args))
                params += Arrays.stream(param.args).collect(Collectors.joining(" ", " ", ""));
            try {
                if (param.silent) execute(params, param);
                else execute("start " + params, param);
            } catch (Throwable t) {
                return t.getMessage();
            }
            return OK;
        });
    }

    private static String validFile(File execute) {
        if (execute == null) return "the program is not exist";
        if (!execute.isFile()) return "[" + execute.getName() + "] is not file";
        if (!execute.canExecute()) return "[" + execute.getName() + "] is can't execute";
        return null;
    }

    public static List> start(ExecuteParam... ps) {
        return ToList.explicitCollect(Arrays.stream(ps).map(CmdHelp::start), ps.length);
    }

    public static Future close(ExecuteParam param) {
        if (param.file == null) param.file = FileHelp.findFile(param.path, param.timeout);
        return CompletableFuture.supplyAsync(() -> {
            String validFile = validFile(param.file);
            if (validFile != null) return validFile;
            String name = param.file.getName();
            Future started = isStarted(name);
            try {
                if (!started.get()) return "[" + name + "] not in running";
            } catch (InterruptedException | ExecutionException e) {
                return e.getMessage();
            }
            String path = param.file.getAbsolutePath();
            boolean flag = PID.containsKey(path);
            String command = flag ? "taskkill /pid " + PID.get(path) + " /f /t " : "taskkill /f /im " + name;
            try {
                execute(command, param);
            } catch (Throwable t) {
                return t.getMessage();
            }
            if (flag) PID.remove(path);
            return OK;
        });
    }

    public static Future close(String path) {
        return close(ExecuteParam.of().path(path).end(t -> {
            END.accept(t, null);
            t.destroyForcibly();
        }));
    }

    public static List> close(ExecuteParam... ps) {
        return ToList.explicitCollect(Arrays.stream(ps).map(CmdHelp::close), ps.length);
    }

    public static List> close(String... ps) {
        return ToList.explicitCollect(Arrays.stream(ps).map(CmdHelp::close), ps.length);
    }

    public static Future restart(ExecuteParam param) {
        if (param.file == null) param.file = FileHelp.findFile(param.path, param.timeout);
        return CompletableFuture.supplyAsync(() -> {
            try {
                Consumer end = param.end;
                String result = close(param.end(t -> {
                    END.accept(t, null);
                    t.destroyForcibly();
                    if (t.isAlive()) throw new RuntimeException("the program is alive");
                })).get();
                if (OK.equals(result)) return restart(param.end(end)).get();
                return result;
            } catch (InterruptedException | ExecutionException e) {
                return e.getMessage();
            }
        });
    }

    public static List> restart(ExecuteParam... ps) {
        return ToList.explicitCollect(Arrays.stream(ps).map(CmdHelp::restart), ps.length);
    }

    /**
     * 显示dns缓存
     */
    public static void displaydns() {
        execute("ipconfig /displaydns");
    }

    /**
     * 刷新DNS记录
     */
    public static void flushdns() {
        execute("ipconfig /flushdns");
    }

    /**
     * 重新从DHCP服务器获得IP
     */
    public static void renew() {
        execute("ipconfig /renew");
    }

    /**
     * maven 安装依赖
     */
    public static void mvnInstall(String groupId, String artifactId, String version, String packaging, String file) {
        execute("mvn install:install-file" +
                " -DgroupId=" + groupId +
                " -DartifactId=" + artifactId +
                " -Dversion=" + version +
                " -Dpackaging=" + packaging +
                " -Dfile=" + file);
    }

    /**
     * 定时关机
     */
    public static void shutdown(int seconds) {
        execute("shutdown -s -t " + seconds);
    }

    /**
     * 取消定时关机
     */
    public static void cancelShutdown() {
        execute("shutdown -a");
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy