diff --git a/gradle.properties b/gradle.properties index 09056aa..60572bc 100644 --- a/gradle.properties +++ b/gradle.properties @@ -12,7 +12,7 @@ loader_version=0.14.22 # Mod Properties mod_id=bluemapsignmarkers mod_name=BlueMap Sign Markers -mod_version=1.20.1-0.2.3 +mod_version=1.20.1-0.2.4 mod_description=A plugin for BlueMap that creates markers from signs maven_group=com.tpwalke2.bluemapsignmarkers archives_base_name=bluemapsignmarkers diff --git a/src/main/java/com/tpwalke2/bluemapsignmarkers/core/bluemap/BlueMapAPIConnector.java b/src/main/java/com/tpwalke2/bluemapsignmarkers/core/bluemap/BlueMapAPIConnector.java index 4cf5b52..4842e6d 100644 --- a/src/main/java/com/tpwalke2/bluemapsignmarkers/core/bluemap/BlueMapAPIConnector.java +++ b/src/main/java/com/tpwalke2/bluemapsignmarkers/core/bluemap/BlueMapAPIConnector.java @@ -8,7 +8,6 @@ import com.tpwalke2.bluemapsignmarkers.core.markers.MarkerGroupType; import com.tpwalke2.bluemapsignmarkers.core.markers.MarkerSetIdentifier; import com.tpwalke2.bluemapsignmarkers.core.reactive.ReactiveQueue; -import com.tpwalke2.bluemapsignmarkers.core.signs.SignManager; import de.bluecolored.bluemap.api.BlueMapAPI; import de.bluecolored.bluemap.api.BlueMapMap; import de.bluecolored.bluemap.api.markers.MarkerSet; @@ -16,6 +15,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.util.ArrayList; +import java.util.List; import java.util.Map; import java.util.Optional; import java.util.concurrent.ConcurrentHashMap; @@ -28,6 +29,7 @@ public class BlueMapAPIConnector { private ReactiveQueue markerActionQueue; private Map markerSets; private BlueMapAPI blueMapAPI; + private List resetHandlers = new ArrayList<>(); public BlueMapAPIConnector() { resetQueue(); @@ -45,6 +47,14 @@ public void dispatch(MarkerAction action) { markerActionQueue.enqueue(action); } + public void addResetHandler(IResetHandler handler) { + resetHandlers.add(handler); + } + + private void fireReset() { + resetHandlers.forEach(IResetHandler::reset); + } + private void resetQueue() { markerActionQueue = new ReactiveQueue<>( () -> BlueMapAPI.getInstance().isPresent(), @@ -108,7 +118,7 @@ private void onEnable(BlueMapAPI api) { if (markerActionQueue.isShutdown()) { resetQueue(); - SignManager.reload(); + fireReset(); } this.blueMapAPI = api; diff --git a/src/main/java/com/tpwalke2/bluemapsignmarkers/core/bluemap/IResetHandler.java b/src/main/java/com/tpwalke2/bluemapsignmarkers/core/bluemap/IResetHandler.java new file mode 100644 index 0000000..f812e88 --- /dev/null +++ b/src/main/java/com/tpwalke2/bluemapsignmarkers/core/bluemap/IResetHandler.java @@ -0,0 +1,5 @@ +package com.tpwalke2.bluemapsignmarkers.core.bluemap; + +public interface IResetHandler { + void reset(); +} diff --git a/src/main/java/com/tpwalke2/bluemapsignmarkers/core/signs/SignManager.java b/src/main/java/com/tpwalke2/bluemapsignmarkers/core/signs/SignManager.java index 34f6610..58fb13c 100644 --- a/src/main/java/com/tpwalke2/bluemapsignmarkers/core/signs/SignManager.java +++ b/src/main/java/com/tpwalke2/bluemapsignmarkers/core/signs/SignManager.java @@ -3,6 +3,7 @@ import com.tpwalke2.bluemapsignmarkers.Constants; import com.tpwalke2.bluemapsignmarkers.config.ConfigManager; import com.tpwalke2.bluemapsignmarkers.core.bluemap.BlueMapAPIConnector; +import com.tpwalke2.bluemapsignmarkers.core.bluemap.IResetHandler; import com.tpwalke2.bluemapsignmarkers.core.bluemap.actions.ActionFactory; import com.tpwalke2.bluemapsignmarkers.core.markers.MarkerGroup; import com.tpwalke2.bluemapsignmarkers.core.markers.MarkerGroupType; @@ -17,25 +18,36 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; -public class SignManager { - private static final SignManager INSTANCE = new SignManager(); +public class SignManager implements IResetHandler { + private static SignManager instance; + private static final Object mutex = new Object(); + + private static SignManager getInstance() { + SignManager result = instance; + if (result == null) { + synchronized (mutex) { + result = instance; + if (result == null) { + instance = result = new SignManager(); + } + } + } + return result; + } + private static final Logger LOGGER = LoggerFactory.getLogger(Constants.MOD_ID); public static void addOrUpdate(SignEntry signEntry) { - INSTANCE.addOrUpdateSign(signEntry); + getInstance().addOrUpdateSign(signEntry); } public static void remove(SignEntryKey key) { - INSTANCE.removeByKey(key); + getInstance().removeByKey(key); } public static List getAll() { - return INSTANCE.getAllSigns(); + return getInstance().getAllSigns(); } public static void stop() { - INSTANCE.shutdown(); - } - - public static void reload() { - INSTANCE.reloadSigns(); + getInstance().shutdown(); } private final BlueMapAPIConnector blueMapAPIConnector; @@ -56,8 +68,9 @@ private SignManager() { } MarkerSetIdentifierCollection markerSetIdentifierCollection = new MarkerSetIdentifierCollection(); - blueMapAPIConnector = new BlueMapAPIConnector(); actionFactory = new ActionFactory(markerSetIdentifierCollection); + blueMapAPIConnector = new BlueMapAPIConnector(); + blueMapAPIConnector.addResetHandler(this); } private List getAllSigns() { @@ -161,4 +174,9 @@ private void removeByKey(SignEntryKey key) { private void removeEntry(SignEntry signEntry) { removeByKey(signEntry.key()); } + + @Override + public void reset() { + reloadSigns(); + } }