diff --git a/DynmapCore/src/main/java/org/dynmap/DynmapCore.java b/DynmapCore/src/main/java/org/dynmap/DynmapCore.java index bd0e12d5..aebc1d42 100644 --- a/DynmapCore/src/main/java/org/dynmap/DynmapCore.java +++ b/DynmapCore/src/main/java/org/dynmap/DynmapCore.java @@ -688,6 +688,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."); @@ -1084,6 +1085,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) { @@ -1109,6 +1111,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..77cf4db6 --- /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(); + } + } +}