From 980acd0f240cd167d35c0a79291e2fce7878178e Mon Sep 17 00:00:00 2001 From: Thom van den Akker Date: Tue, 29 Aug 2023 22:07:41 +0200 Subject: [PATCH] Allow tracking uptime of the internal web server similar to tracking API availability --- .../src/main/java/org/dynmap/DynmapCore.java | 3 + .../dynmap/DynmapWebserverStateListener.java | 87 +++++++++++++++++++ 2 files changed, 90 insertions(+) create mode 100644 DynmapCoreAPI/src/main/java/org/dynmap/DynmapWebserverStateListener.java diff --git a/DynmapCore/src/main/java/org/dynmap/DynmapCore.java b/DynmapCore/src/main/java/org/dynmap/DynmapCore.java index 6bb2beb8..a39eb91a 100644 --- a/DynmapCore/src/main/java/org/dynmap/DynmapCore.java +++ b/DynmapCore/src/main/java/org/dynmap/DynmapCore.java @@ -679,6 +679,7 @@ public class DynmapCore implements DynmapCommonAPI { Log.warning("Using external server, but " + JsonFileClientUpdateComponent.class.toString() + " is DISABLED!"); webserverCompConfigWarn = true; } + DynmapWebserverStateListener.stateWebServerDisabled(); } if (webserverCompConfigWarn) { Log.warning("If the website is missing files or not loading/updating, this might be why."); @@ -1075,6 +1076,7 @@ public class DynmapCore implements DynmapCommonAPI { try { if(webServer != null) { webServer.start(); + DynmapWebserverStateListener.stateWebserverStarted(); Log.info("Web server started on address " + webhostname + ":" + webport); } } catch (Exception e) { @@ -1100,6 +1102,7 @@ public class DynmapCore implements DynmapCommonAPI { Log.severe("Failed to stop WebServer!", e); } webServer = null; + DynmapWebserverStateListener.stateWebserverStopped(); } if (componentManager != null) { diff --git a/DynmapCoreAPI/src/main/java/org/dynmap/DynmapWebserverStateListener.java b/DynmapCoreAPI/src/main/java/org/dynmap/DynmapWebserverStateListener.java new file mode 100644 index 00000000..5d3ef07e --- /dev/null +++ b/DynmapCoreAPI/src/main/java/org/dynmap/DynmapWebserverStateListener.java @@ -0,0 +1,87 @@ +package org.dynmap; + +import java.util.concurrent.CopyOnWriteArrayList; + +/** + * Listener class for the Dynmap integrated web server lifecycle, will only work if the internal webserver is actually being used. + */ +public abstract class DynmapWebserverStateListener +{ + /** + * Status flag indicating if the web server is online or offline. + */ + private static boolean webserverStarted = false; + + private static final CopyOnWriteArrayList listeners = new CopyOnWriteArrayList<>(); + + /** + * Called when API becomes enabled, or during call to register listener if API is already enabled + */ + public abstract void webserverStarted(); + + /** + * Called when API becomes enabled, or during call to register listener if API is already enabled + */ + public abstract void webserverStopped(); + + /** + * This method is fired to indicate the listener that the internal web server is not enabled, thus indicating that {@link DynmapWebserverStateListener#webserverStarted()} and {@link DynmapWebserverStateListener#webserverStopped()} will not fire. + */ + public void webserverDisabled() {} + + /** + * Register listener instance + * + * @param listener - listener to register + */ + public static void register(DynmapWebserverStateListener listener) + { + listeners.add(listener); + if (webserverStarted) + { + listener.webserverStarted(); + } + } + + /** + * Unregister listener instance + * + * @param listener - listener to unregister + */ + public static void unregister(DynmapWebserverStateListener listener) { + listeners.remove(listener); + } + + // Internal call - MODS/PLUGINS MUST NOT USE + public static void stateWebserverStarted() + { + if (webserverStarted) + { + stateWebserverStopped(); + } + webserverStarted = true; + for (DynmapWebserverStateListener l : listeners) + { + l.webserverStarted(); + } + } + + // Internal call - MODS/PLUGINS MUST NOT USE + public static void stateWebserverStopped() + { + for (DynmapWebserverStateListener l : listeners) + { + l.webserverStopped(); + } + webserverStarted = false; + } + + // Internal call - MODS/PLUGINS MUST NOT USE + public static void stateWebServerDisabled() + { + for (DynmapWebserverStateListener l : listeners) + { + l.webserverDisabled(); + } + } +}