001package com.dev9.mvnwatcher;
002
003import java.nio.file.Path;
004import java.util.ArrayList;
005import java.util.List;
006import java.util.Objects;
007
008/**
009 * Responsible for managing the lifecycle of the MvnMonitor.
010 *
011 * @see MvnMonitor
012 */
013public class MvnRunner {
014
015    Path projectPath;
016    Path targetDirectory;
017
018    public MvnRunner(Path projectPath, Path targetDirectory, List<Task> tasks) {
019        this.projectPath = Objects.requireNonNull(projectPath);
020        this.targetDirectory = Objects.requireNonNull(targetDirectory);
021        this.tasks = Objects.requireNonNull(tasks);
022    }
023
024    private MvnMonitor monitor;
025
026    private List<Task> tasks;
027
028    public boolean running() {
029        return !monitor.shutdown;
030    }
031
032    public String status() {
033        return monitor.status();
034    }
035
036    public void start() {
037
038        List<ProcessBuilder> configs = new ArrayList<>();
039
040        for (Task task : tasks) {
041            ProcessBuilder pb = task.toProcessBuilder();
042            configs.add(pb);
043        }
044
045        monitor = new MvnMonitor(configs);
046
047        new Thread(monitor, "mvnmonitor").start();
048
049        Thread reaper = new Thread(new MvnTerminate(monitor), "mvnmonitor-reaper");
050
051        Runtime.getRuntime().addShutdownHook(reaper);
052    }
053
054    public void changeEvent() {
055        monitor.dirty = true;
056    }
057
058    public void stop() {
059        monitor.shutdown = true;
060    }
061
062    private class MvnTerminate implements Runnable {
063
064        private MvnMonitor monitor;
065
066        MvnTerminate(MvnMonitor monitor) {
067            this.monitor = monitor;
068        }
069
070        @Override
071        public void run() {
072            monitor.kill();
073        }
074    }
075
076
077}