From 093a73d04639fea8dac3e925d759d362ffff517a Mon Sep 17 00:00:00 2001 From: JesseBrault0709 <62299747+JesseBrault0709@users.noreply.github.com> Date: Fri, 3 May 2024 12:01:45 +0200 Subject: [PATCH] Initial commit. Woot! --- build.gradle | 8 +++ .../AbstractExtensionContainer.java | 68 +++++++++++++++++++ .../groowt/util/extensible/Extensible.java | 11 +++ .../util/extensible/ExtensionAware.java | 12 ++++ .../util/extensible/ExtensionContainer.java | 5 ++ 5 files changed, 104 insertions(+) create mode 100644 build.gradle create mode 100644 src/main/java/groowt/util/extensible/AbstractExtensionContainer.java create mode 100644 src/main/java/groowt/util/extensible/Extensible.java create mode 100644 src/main/java/groowt/util/extensible/ExtensionAware.java create mode 100644 src/main/java/groowt/util/extensible/ExtensionContainer.java diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..d6d4388 --- /dev/null +++ b/build.gradle @@ -0,0 +1,8 @@ +plugins { + id 'GroowtConventions' + id 'java-library' +} + +dependencies { + compileOnlyApi libs.jetbrains.anotations +} diff --git a/src/main/java/groowt/util/extensible/AbstractExtensionContainer.java b/src/main/java/groowt/util/extensible/AbstractExtensionContainer.java new file mode 100644 index 0000000..14ed5a6 --- /dev/null +++ b/src/main/java/groowt/util/extensible/AbstractExtensionContainer.java @@ -0,0 +1,68 @@ +package groowt.util.extensible; + +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.function.Consumer; + +public abstract class AbstractExtensionContainer implements ExtensionContainer { + + private final F extensionFactory; + private final Collection extensions = new ArrayList<>(); + + public AbstractExtensionContainer(F extensionFactory) { + this.extensionFactory = extensionFactory; + } + + /** + * @return A copy of the registered extensions. + */ + protected Collection getRegisteredExtensions() { + return new ArrayList<>(this.extensions); + } + + protected void registerExtension(E extension) { + this.extensions.add(extension); + } + + @Override + public @Nullable T findExtension(Class extensionClass) { + return this.extensions.stream() + .filter(extensionClass::isInstance) + .findFirst() + .map(extensionClass::cast) + .orElse(null); + } + + /** + * @implNote While this {@link AbstractExtensionContainer} calls + * {@link #getExtension}, which will throw if there is no registered + * extension, this method may be overridden to not use {@link #getExtension} + * and instead implement custom handling logic to avoid throwing, etc. + */ + @Override + public void configureExtension(Class extensionClass, Consumer configure) { + configure.accept(this.getExtension(extensionClass)); + } + + @Override + public T getExtension(Class extensionClass) { + return this.extensions.stream() + .filter(extensionClass::isInstance) + .findFirst() + .map(extensionClass::cast) + .orElseThrow(() -> new IllegalArgumentException("There is no registered extension for " + extensionClass.getName())); + } + + @Override + public boolean hasExtension(Class extensionClass) { + return this.extensions.stream().anyMatch(extensionClass::isInstance); + } + + @Override + public F getExtensionFactory() { + return this.extensionFactory; + } + +} diff --git a/src/main/java/groowt/util/extensible/Extensible.java b/src/main/java/groowt/util/extensible/Extensible.java new file mode 100644 index 0000000..53eea32 --- /dev/null +++ b/src/main/java/groowt/util/extensible/Extensible.java @@ -0,0 +1,11 @@ +package groowt.util.extensible; + +import org.jetbrains.annotations.Nullable; + +import java.util.function.Consumer; + +// TODO: groovy methods to handle getting extensions via property accessors +public interface Extensible> extends ExtensionAware { + T createExtension(Class extensionClass, Object... constructorArgs); + C getExtensionContainer(); +} diff --git a/src/main/java/groowt/util/extensible/ExtensionAware.java b/src/main/java/groowt/util/extensible/ExtensionAware.java new file mode 100644 index 0000000..3a41106 --- /dev/null +++ b/src/main/java/groowt/util/extensible/ExtensionAware.java @@ -0,0 +1,12 @@ +package groowt.util.extensible; + +import org.jetbrains.annotations.Nullable; + +import java.util.function.Consumer; + +public interface ExtensionAware { + @Nullable T findExtension(Class extensionClass); + void configureExtension(Class extensionClass, Consumer configure); + T getExtension(Class extensionClass); + boolean hasExtension(Class extensionClass); +} diff --git a/src/main/java/groowt/util/extensible/ExtensionContainer.java b/src/main/java/groowt/util/extensible/ExtensionContainer.java new file mode 100644 index 0000000..1d85527 --- /dev/null +++ b/src/main/java/groowt/util/extensible/ExtensionContainer.java @@ -0,0 +1,5 @@ +package groowt.util.extensible; + +public interface ExtensionContainer extends ExtensionAware { + F getExtensionFactory(); +}