From 56eaec522f6d7d23814da3f8aa77f9e7bad1ab1d Mon Sep 17 00:00:00 2001 From: OLEGSHA Date: Tue, 17 Nov 2020 16:49:31 +0300 Subject: [PATCH] Renamed NamespacedRegistry and added NamespacedFactoryRegistry - NamespacedRegistry moved to NamespacedInstanceRegistry - Added NamespacedFactoryRegistry --- .../controls/ControlTriggerRegistry.java | 4 +- .../world/block/BlockRenderRegistry.java | 4 +- .../world/entity/EntityRenderRegistry.java | 4 +- .../client/world/tile/TileRenderRegistry.java | 4 +- .../comms/controls/ControlDataRegistry.java | 4 +- .../common/state/StatefulObjectRegistry.java | 6 +- .../namespaces/NamespacedFactoryRegistry.java | 114 ++++++++++++++++++ ...y.java => NamespacedInstanceRegistry.java} | 11 +- .../common/world/block/BlockDataRegistry.java | 4 +- .../common/world/tile/TileDataRegistry.java | 4 +- .../comms/controls/ControlLogicRegistry.java | 4 +- .../world/block/BlockLogicRegistry.java | 4 +- .../world/entity/EntityLogicRegistry.java | 4 +- .../server/world/tile/TileLogicRegistry.java | 4 +- 14 files changed, 146 insertions(+), 29 deletions(-) create mode 100644 src/main/java/ru/windcorp/progressia/common/util/namespaces/NamespacedFactoryRegistry.java rename src/main/java/ru/windcorp/progressia/common/util/namespaces/{NamespacedRegistry.java => NamespacedInstanceRegistry.java} (79%) diff --git a/src/main/java/ru/windcorp/progressia/client/comms/controls/ControlTriggerRegistry.java b/src/main/java/ru/windcorp/progressia/client/comms/controls/ControlTriggerRegistry.java index d0c01c8..65f5d43 100644 --- a/src/main/java/ru/windcorp/progressia/client/comms/controls/ControlTriggerRegistry.java +++ b/src/main/java/ru/windcorp/progressia/client/comms/controls/ControlTriggerRegistry.java @@ -1,8 +1,8 @@ package ru.windcorp.progressia.client.comms.controls; -import ru.windcorp.progressia.common.util.namespaces.NamespacedRegistry; +import ru.windcorp.progressia.common.util.namespaces.NamespacedInstanceRegistry; -public class ControlTriggerRegistry extends NamespacedRegistry { +public class ControlTriggerRegistry extends NamespacedInstanceRegistry { private static final ControlTriggerRegistry INSTANCE = new ControlTriggerRegistry(); diff --git a/src/main/java/ru/windcorp/progressia/client/world/block/BlockRenderRegistry.java b/src/main/java/ru/windcorp/progressia/client/world/block/BlockRenderRegistry.java index dac4099..7392986 100644 --- a/src/main/java/ru/windcorp/progressia/client/world/block/BlockRenderRegistry.java +++ b/src/main/java/ru/windcorp/progressia/client/world/block/BlockRenderRegistry.java @@ -22,9 +22,9 @@ import ru.windcorp.progressia.client.graphics.texture.Atlases.AtlasGroup; import ru.windcorp.progressia.client.graphics.texture.SimpleTexture; import ru.windcorp.progressia.client.graphics.texture.Texture; import ru.windcorp.progressia.common.resource.ResourceManager; -import ru.windcorp.progressia.common.util.namespaces.NamespacedRegistry; +import ru.windcorp.progressia.common.util.namespaces.NamespacedInstanceRegistry; -public class BlockRenderRegistry extends NamespacedRegistry { +public class BlockRenderRegistry extends NamespacedInstanceRegistry { private static final BlockRenderRegistry INSTANCE = new BlockRenderRegistry(); diff --git a/src/main/java/ru/windcorp/progressia/client/world/entity/EntityRenderRegistry.java b/src/main/java/ru/windcorp/progressia/client/world/entity/EntityRenderRegistry.java index f4b8ccf..1737616 100644 --- a/src/main/java/ru/windcorp/progressia/client/world/entity/EntityRenderRegistry.java +++ b/src/main/java/ru/windcorp/progressia/client/world/entity/EntityRenderRegistry.java @@ -6,9 +6,9 @@ import ru.windcorp.progressia.client.graphics.texture.TextureLoader; import ru.windcorp.progressia.client.graphics.texture.TexturePrimitive; import ru.windcorp.progressia.client.graphics.texture.TextureSettings; import ru.windcorp.progressia.common.resource.ResourceManager; -import ru.windcorp.progressia.common.util.namespaces.NamespacedRegistry; +import ru.windcorp.progressia.common.util.namespaces.NamespacedInstanceRegistry; -public class EntityRenderRegistry extends NamespacedRegistry { +public class EntityRenderRegistry extends NamespacedInstanceRegistry { private static final EntityRenderRegistry INSTANCE = new EntityRenderRegistry(); diff --git a/src/main/java/ru/windcorp/progressia/client/world/tile/TileRenderRegistry.java b/src/main/java/ru/windcorp/progressia/client/world/tile/TileRenderRegistry.java index 8f63ed7..4c11c01 100644 --- a/src/main/java/ru/windcorp/progressia/client/world/tile/TileRenderRegistry.java +++ b/src/main/java/ru/windcorp/progressia/client/world/tile/TileRenderRegistry.java @@ -22,9 +22,9 @@ import ru.windcorp.progressia.client.graphics.texture.Atlases.AtlasGroup; import ru.windcorp.progressia.client.graphics.texture.SimpleTexture; import ru.windcorp.progressia.client.graphics.texture.Texture; import ru.windcorp.progressia.common.resource.ResourceManager; -import ru.windcorp.progressia.common.util.namespaces.NamespacedRegistry; +import ru.windcorp.progressia.common.util.namespaces.NamespacedInstanceRegistry; -public class TileRenderRegistry extends NamespacedRegistry { +public class TileRenderRegistry extends NamespacedInstanceRegistry { private static final TileRenderRegistry INSTANCE = new TileRenderRegistry(); diff --git a/src/main/java/ru/windcorp/progressia/common/comms/controls/ControlDataRegistry.java b/src/main/java/ru/windcorp/progressia/common/comms/controls/ControlDataRegistry.java index 4d817a5..eb787b3 100644 --- a/src/main/java/ru/windcorp/progressia/common/comms/controls/ControlDataRegistry.java +++ b/src/main/java/ru/windcorp/progressia/common/comms/controls/ControlDataRegistry.java @@ -1,8 +1,8 @@ package ru.windcorp.progressia.common.comms.controls; -import ru.windcorp.progressia.common.util.namespaces.NamespacedRegistry; +import ru.windcorp.progressia.common.util.namespaces.NamespacedInstanceRegistry; -public class ControlDataRegistry extends NamespacedRegistry { +public class ControlDataRegistry extends NamespacedInstanceRegistry { private static final ControlDataRegistry INSTANCE = new ControlDataRegistry(); diff --git a/src/main/java/ru/windcorp/progressia/common/state/StatefulObjectRegistry.java b/src/main/java/ru/windcorp/progressia/common/state/StatefulObjectRegistry.java index 52446cc..42028cf 100644 --- a/src/main/java/ru/windcorp/progressia/common/state/StatefulObjectRegistry.java +++ b/src/main/java/ru/windcorp/progressia/common/state/StatefulObjectRegistry.java @@ -6,7 +6,7 @@ import java.util.WeakHashMap; import java.util.concurrent.atomic.AtomicBoolean; import ru.windcorp.progressia.common.util.namespaces.Namespaced; -import ru.windcorp.progressia.common.util.namespaces.NamespacedRegistry; +import ru.windcorp.progressia.common.util.namespaces.NamespacedInstanceRegistry; /** * Registry-like object for identification of various {@link StatefulObject} @@ -45,8 +45,8 @@ public class StatefulObjectRegistry { } - private final NamespacedRegistry> registry = - new NamespacedRegistry>() { + private final NamespacedInstanceRegistry> registry = + new NamespacedInstanceRegistry>() { @Override public void register(Type element) { super.register(element); diff --git a/src/main/java/ru/windcorp/progressia/common/util/namespaces/NamespacedFactoryRegistry.java b/src/main/java/ru/windcorp/progressia/common/util/namespaces/NamespacedFactoryRegistry.java new file mode 100644 index 0000000..583ccd2 --- /dev/null +++ b/src/main/java/ru/windcorp/progressia/common/util/namespaces/NamespacedFactoryRegistry.java @@ -0,0 +1,114 @@ +package ru.windcorp.progressia.common.util.namespaces; + +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +public class NamespacedFactoryRegistry +implements Map> { + + @FunctionalInterface + public static interface Factory { + E build(String id); + } + + private final Map> backingMap = + Collections.synchronizedMap(new HashMap<>()); + + private final Logger logger = LogManager.getLogger(getClass()); + + public void register(String id, Factory element) { + if (get(id) != null) { + throw new IllegalArgumentException("ID " + id + " is already registered in " + getClass().getSimpleName()); + } + + logger.debug("Registering {} in {}", id, getClass().getSimpleName()); + backingMap.put(id, element); + } + + @Override + public int size() { + return backingMap.size(); + } + + @Override + public boolean isEmpty() { + return backingMap.isEmpty(); + } + + @Override + public boolean containsKey(Object key) { + return backingMap.containsKey(key); + } + + public boolean has(String id) { + return backingMap.containsKey(id); + } + + @Override + public boolean containsValue(Object value) { + return backingMap.containsValue(value); + } + + public boolean isRegistered(E element) { + return has(element.getId()); + } + + @Override + public Factory get(Object key) { + return backingMap.get(key); + } + + public E create(String id) { + Factory factory = get(id); + E result = factory.build(id); + if (!result.getId().equals(id)) { + throw new IllegalStateException("Requested ID " + id + " but factory " + factory + " returned an object with ID " + result.getId()); + } + return result; + } + + @Override + public Factory put(String id, Factory factory) { + register(id, factory); + return null; + } + + @Override + public void putAll(Map> m) { + synchronized (backingMap) { + m.entrySet().forEach(e -> register(e.getKey(), e.getValue())); + } + } + + @Override + public Factory remove(Object key) { + return backingMap.remove(key); + } + + @Override + public void clear() { + backingMap.clear(); + } + + @Override + public Set keySet() { + return backingMap.keySet(); + } + + @Override + public Collection> values() { + return backingMap.values(); + } + + @Override + public Set>> entrySet() { + return backingMap.entrySet(); + } + +} diff --git a/src/main/java/ru/windcorp/progressia/common/util/namespaces/NamespacedRegistry.java b/src/main/java/ru/windcorp/progressia/common/util/namespaces/NamespacedInstanceRegistry.java similarity index 79% rename from src/main/java/ru/windcorp/progressia/common/util/namespaces/NamespacedRegistry.java rename to src/main/java/ru/windcorp/progressia/common/util/namespaces/NamespacedInstanceRegistry.java index 7db2f41..ca4a56f 100644 --- a/src/main/java/ru/windcorp/progressia/common/util/namespaces/NamespacedRegistry.java +++ b/src/main/java/ru/windcorp/progressia/common/util/namespaces/NamespacedInstanceRegistry.java @@ -7,17 +7,20 @@ import java.util.Map; import java.util.Set; import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import com.google.errorprone.annotations.DoNotCall; -public class NamespacedRegistry +public class NamespacedInstanceRegistry implements Map { private final Map backingMap = Collections.synchronizedMap(new HashMap<>()); + private final Logger logger = LogManager.getLogger(getClass()); + public void register(E element) { - LogManager.getLogger(getClass()).debug("Registering " + element.getId()); + logger.debug("Registering {} in {}", element.getId(), getClass().getSimpleName()); backingMap.put(element.getId(), element); } @@ -67,7 +70,7 @@ implements Map { @DoNotCall @Deprecated public E put(String key, E value) { throw new UnsupportedOperationException( - "Use NamespacedRegistry.register(E)" + "Use NamespacedInstanceRegistry.register(E)" ); } @@ -83,7 +86,7 @@ implements Map { @DoNotCall @Deprecated public void putAll(Map m) { throw new UnsupportedOperationException( - "Use NamespacedRegistry.registerAll(Collection)" + "Use NamespacedInstanceRegistry.registerAll(Collection)" ); } diff --git a/src/main/java/ru/windcorp/progressia/common/world/block/BlockDataRegistry.java b/src/main/java/ru/windcorp/progressia/common/world/block/BlockDataRegistry.java index 51c562b..f3541a3 100644 --- a/src/main/java/ru/windcorp/progressia/common/world/block/BlockDataRegistry.java +++ b/src/main/java/ru/windcorp/progressia/common/world/block/BlockDataRegistry.java @@ -17,9 +17,9 @@ *******************************************************************************/ package ru.windcorp.progressia.common.world.block; -import ru.windcorp.progressia.common.util.namespaces.NamespacedRegistry; +import ru.windcorp.progressia.common.util.namespaces.NamespacedInstanceRegistry; -public class BlockDataRegistry extends NamespacedRegistry { +public class BlockDataRegistry extends NamespacedInstanceRegistry { private static final BlockDataRegistry INSTANCE = new BlockDataRegistry(); diff --git a/src/main/java/ru/windcorp/progressia/common/world/tile/TileDataRegistry.java b/src/main/java/ru/windcorp/progressia/common/world/tile/TileDataRegistry.java index 7ca3168..6a95eae 100644 --- a/src/main/java/ru/windcorp/progressia/common/world/tile/TileDataRegistry.java +++ b/src/main/java/ru/windcorp/progressia/common/world/tile/TileDataRegistry.java @@ -17,9 +17,9 @@ *******************************************************************************/ package ru.windcorp.progressia.common.world.tile; -import ru.windcorp.progressia.common.util.namespaces.NamespacedRegistry; +import ru.windcorp.progressia.common.util.namespaces.NamespacedInstanceRegistry; -public class TileDataRegistry extends NamespacedRegistry { +public class TileDataRegistry extends NamespacedInstanceRegistry { private static final TileDataRegistry INSTANCE = new TileDataRegistry(); diff --git a/src/main/java/ru/windcorp/progressia/server/comms/controls/ControlLogicRegistry.java b/src/main/java/ru/windcorp/progressia/server/comms/controls/ControlLogicRegistry.java index 94f4458..403644d 100644 --- a/src/main/java/ru/windcorp/progressia/server/comms/controls/ControlLogicRegistry.java +++ b/src/main/java/ru/windcorp/progressia/server/comms/controls/ControlLogicRegistry.java @@ -1,8 +1,8 @@ package ru.windcorp.progressia.server.comms.controls; -import ru.windcorp.progressia.common.util.namespaces.NamespacedRegistry; +import ru.windcorp.progressia.common.util.namespaces.NamespacedInstanceRegistry; -public class ControlLogicRegistry extends NamespacedRegistry { +public class ControlLogicRegistry extends NamespacedInstanceRegistry { private static final ControlLogicRegistry INSTANCE = new ControlLogicRegistry(); diff --git a/src/main/java/ru/windcorp/progressia/server/world/block/BlockLogicRegistry.java b/src/main/java/ru/windcorp/progressia/server/world/block/BlockLogicRegistry.java index aabf7fd..5cdb1f0 100644 --- a/src/main/java/ru/windcorp/progressia/server/world/block/BlockLogicRegistry.java +++ b/src/main/java/ru/windcorp/progressia/server/world/block/BlockLogicRegistry.java @@ -1,8 +1,8 @@ package ru.windcorp.progressia.server.world.block; -import ru.windcorp.progressia.common.util.namespaces.NamespacedRegistry; +import ru.windcorp.progressia.common.util.namespaces.NamespacedInstanceRegistry; -public class BlockLogicRegistry extends NamespacedRegistry { +public class BlockLogicRegistry extends NamespacedInstanceRegistry { private static final BlockLogicRegistry INSTANCE = new BlockLogicRegistry(); diff --git a/src/main/java/ru/windcorp/progressia/server/world/entity/EntityLogicRegistry.java b/src/main/java/ru/windcorp/progressia/server/world/entity/EntityLogicRegistry.java index 1517c8f..012ee09 100644 --- a/src/main/java/ru/windcorp/progressia/server/world/entity/EntityLogicRegistry.java +++ b/src/main/java/ru/windcorp/progressia/server/world/entity/EntityLogicRegistry.java @@ -1,8 +1,8 @@ package ru.windcorp.progressia.server.world.entity; -import ru.windcorp.progressia.common.util.namespaces.NamespacedRegistry; +import ru.windcorp.progressia.common.util.namespaces.NamespacedInstanceRegistry; -public class EntityLogicRegistry extends NamespacedRegistry { +public class EntityLogicRegistry extends NamespacedInstanceRegistry { private static final EntityLogicRegistry INSTANCE = new EntityLogicRegistry(); diff --git a/src/main/java/ru/windcorp/progressia/server/world/tile/TileLogicRegistry.java b/src/main/java/ru/windcorp/progressia/server/world/tile/TileLogicRegistry.java index b997702..2424e46 100644 --- a/src/main/java/ru/windcorp/progressia/server/world/tile/TileLogicRegistry.java +++ b/src/main/java/ru/windcorp/progressia/server/world/tile/TileLogicRegistry.java @@ -1,8 +1,8 @@ package ru.windcorp.progressia.server.world.tile; -import ru.windcorp.progressia.common.util.namespaces.NamespacedRegistry; +import ru.windcorp.progressia.common.util.namespaces.NamespacedInstanceRegistry; -public class TileLogicRegistry extends NamespacedRegistry { +public class TileLogicRegistry extends NamespacedInstanceRegistry { private static final TileLogicRegistry INSTANCE = new TileLogicRegistry();