diff --git a/src/main/java/de/ph87/mc/server/ServerController.java b/src/main/java/de/ph87/mc/server/ServerController.java index c8e7a51..4970573 100644 --- a/src/main/java/de/ph87/mc/server/ServerController.java +++ b/src/main/java/de/ph87/mc/server/ServerController.java @@ -22,6 +22,12 @@ public class ServerController { private final ServerService serverService; + @NonNull + @GetMapping("stopAll") + public List stopAll() { + return serverService.stopAll(); + } + @NonNull @GetMapping("findAll") public List findAll() { diff --git a/src/main/java/de/ph87/mc/server/ServerService.java b/src/main/java/de/ph87/mc/server/ServerService.java index 45d4a40..48549f5 100644 --- a/src/main/java/de/ph87/mc/server/ServerService.java +++ b/src/main/java/de/ph87/mc/server/ServerService.java @@ -25,15 +25,15 @@ public class ServerService { private final ServerConfig serverConfig; - private final Object lock = new Object(); + private final Object serversLock = new Object(); - private List list = new ArrayList<>(); + private List servers = new ArrayList<>(); @PostConstruct public void startup() { final File ROOT = new File(serverConfig.getPath()); - synchronized (lock) { - list = Arrays.stream(Objects.requireNonNull(ROOT.listFiles())).map(this::_tryLoadingFromDir).filter(Optional::isPresent).map(Optional::get).toList(); + synchronized (serversLock) { + servers = Arrays.stream(Objects.requireNonNull(ROOT.listFiles())).map(this::_tryLoadingFromDir).filter(Optional::isPresent).map(Optional::get).toList(); } } @@ -41,7 +41,7 @@ public class ServerService { private Optional _tryLoadingFromDir(@NonNull final File directory) { try { final Server server = new Server(directory); - list.stream().filter(server::eq).findFirst().ifPresent(old -> server.process = old.process); + servers.stream().filter(server::eq).findFirst().ifPresent(old -> server.process = old.process); return Optional.of(server); } catch (NoMinecraftServer e) { log.warn(e.getMessage()); @@ -65,6 +65,7 @@ public class ServerService { log.warn("Server is already running: name={}", server.properties.name); return; } + stopAll(); log.info("Starting server: name={}", server.properties.name); final ProcessBuilder builder = new ProcessBuilder("java", "-jar", "server.jar"); builder.directory(server.directory); @@ -129,23 +130,30 @@ public class ServerService { @NonNull private Server getByName(@NonNull final String name) { - synchronized (lock) { - return list.stream().filter(server -> server.properties.name.equals(name)).findFirst().orElseThrow(); + synchronized (serversLock) { + return servers.stream().filter(server -> server.properties.name.equals(name)).findFirst().orElseThrow(); } } @NonNull public List findAll() { - synchronized (lock) { - return list.stream().map(ServerDto::new).toList(); + synchronized (serversLock) { + return servers.stream().map(ServerDto::new).toList(); } } @NonNull public File getIconFileByName(@NonNull final String name) { - synchronized (lock) { + synchronized (serversLock) { return getByName(name).iconFile; } } + @NonNull + public List stopAll() { + synchronized (serversLock) { + return servers.stream().peek(this::stop).map(ServerDto::new).toList(); + } + } + }