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}