From d4558db40ccc62eefaf7157fc67708081a686fcc Mon Sep 17 00:00:00 2001 From: Auxilor Date: Thu, 23 Feb 2023 18:33:28 +0000 Subject: [PATCH] Added registry --- .../willfp/eco/core/registry/Registrable.java | 32 ++++++ .../willfp/eco/core/registry/Registry.java | 102 ++++++++++++++++++ 2 files changed, 134 insertions(+) create mode 100644 eco-api/src/main/java/com/willfp/eco/core/registry/Registrable.java create mode 100644 eco-api/src/main/java/com/willfp/eco/core/registry/Registry.java diff --git a/eco-api/src/main/java/com/willfp/eco/core/registry/Registrable.java b/eco-api/src/main/java/com/willfp/eco/core/registry/Registrable.java new file mode 100644 index 00000000..da3a4c0c --- /dev/null +++ b/eco-api/src/main/java/com/willfp/eco/core/registry/Registrable.java @@ -0,0 +1,32 @@ +package com.willfp.eco.core.registry; + +import org.jetbrains.annotations.NotNull; + +/** + * An object that can be registered. + * + * @see Registry + */ +public interface Registrable { + /** + * Get the ID of the element. + * + * @return The ID. + */ + @NotNull + String getID(); + + /** + * Called when the element is registered. + */ + default void onRegister() { + // Do nothing by default. + } + + /** + * Called when the element is removed. + */ + default void onRemove() { + // Do nothing by default. + } +} diff --git a/eco-api/src/main/java/com/willfp/eco/core/registry/Registry.java b/eco-api/src/main/java/com/willfp/eco/core/registry/Registry.java new file mode 100644 index 00000000..e9dab8a1 --- /dev/null +++ b/eco-api/src/main/java/com/willfp/eco/core/registry/Registry.java @@ -0,0 +1,102 @@ +package com.willfp.eco.core.registry; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; + +/** + * A registry for {@link Registrable}s. + * + * @param The type of {@link Registrable}. + */ +public abstract class Registry { + /** + * The registry. + */ + private final Map registry = new ConcurrentHashMap<>(); + + /** + * Instantiate a new registry. + */ + protected Registry() { + + } + + /** + * Register a new element. + * + * @param element The element to register. + * @return The element. + */ + @NotNull + public T register(@NotNull final T element) { + registry.put(element.getID(), element); + + element.onRegister(); + + return element; + } + + /** + * Remove an element. + * + * @param element The element. + * @return The element. + */ + public T remove(@NotNull final T element) { + element.onRemove(); + + registry.remove(element.getID()); + + return element; + } + + /** + * Remove an element by ID. + * + * @param id The ID. + * @return The element. + */ + @Nullable + public T remove(@NotNull final String id) { + T element = registry.get(id); + + if (element != null) { + element.onRemove(); + } + + return registry.remove(id); + } + + /** + * Get an element by ID. + * + * @param id The ID. + * @return The element, or null if not found. + */ + @Nullable + public T get(@NotNull final String id) { + return registry.get(id); + } + + /** + * Clear the registry. + */ + public void clear() { + for (T value : registry.values()) { + remove(value); + } + } + + /** + * Get all elements. + * + * @return All elements. + */ + public Set values() { + return Set.copyOf(registry.values()); + } +}