Compare commits
No commits in common. "8821e39a24888e1f19f16774823e7cbc12b9cfbf" and "526a0035335367e398a8864ed6dc10b934998276" have entirely different histories.
8821e39a24
...
526a003533
@ -5,7 +5,6 @@
|
|||||||
antlr = '4.13.2'
|
antlr = '4.13.2'
|
||||||
asm = '9.8'
|
asm = '9.8'
|
||||||
di = '0.1.0'
|
di = '0.1.0'
|
||||||
extensible = '0.1.0'
|
|
||||||
groovy = '4.0.27'
|
groovy = '4.0.27'
|
||||||
jakarta-inject = '2.0.1'
|
jakarta-inject = '2.0.1'
|
||||||
jansi = '2.4.2'
|
jansi = '2.4.2'
|
||||||
@ -23,7 +22,6 @@ antlr = { module = 'org.antlr:antlr4', version.ref = 'antlr' }
|
|||||||
antlr-runtime = { module = 'org.antlr:antlr4-runtime', version.ref = 'antlr' }
|
antlr-runtime = { module = 'org.antlr:antlr4-runtime', version.ref = 'antlr' }
|
||||||
asm = { module = 'org.ow2.asm:asm', version.ref = 'asm' }
|
asm = { module = 'org.ow2.asm:asm', version.ref = 'asm' }
|
||||||
di = { module = 'com.jessebrault.di:di', version.ref = 'di' }
|
di = { module = 'com.jessebrault.di:di', version.ref = 'di' }
|
||||||
extensible = { module = 'com.jessebrault.extensible:extensible', version.ref = 'extensible' }
|
|
||||||
groovy = { module = 'org.apache.groovy:groovy', version.ref = 'groovy' }
|
groovy = { module = 'org.apache.groovy:groovy', version.ref = 'groovy' }
|
||||||
groovy-console = { module = 'org.apache.groovy:groovy-console', version.ref = 'groovy' }
|
groovy-console = { module = 'org.apache.groovy:groovy-console', version.ref = 'groovy' }
|
||||||
groovy-templates = { module = 'org.apache.groovy:groovy-templates', version.ref = 'groovy' }
|
groovy-templates = { module = 'org.apache.groovy:groovy-templates', version.ref = 'groovy' }
|
||||||
|
@ -7,3 +7,8 @@ pluginManagement {
|
|||||||
rootProject.name = 'groowt'
|
rootProject.name = 'groowt'
|
||||||
|
|
||||||
include 'views', 'view-components', 'web-view-components', 'web-view-components-compiler'
|
include 'views', 'view-components', 'web-view-components', 'web-view-components-compiler'
|
||||||
|
|
||||||
|
file('util').eachDir {
|
||||||
|
include it.name
|
||||||
|
project(":$it.name").projectDir = it
|
||||||
|
}
|
||||||
|
26
util/extensible/build.gradle
Normal file
26
util/extensible/build.gradle
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
plugins {
|
||||||
|
id 'groowt-conventions'
|
||||||
|
id 'groowt-publish'
|
||||||
|
id 'java-library'
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
compileOnlyApi libs.jetbrains.anotations
|
||||||
|
}
|
||||||
|
|
||||||
|
java {
|
||||||
|
withSourcesJar()
|
||||||
|
}
|
||||||
|
|
||||||
|
jar {
|
||||||
|
archiveBaseName = 'groowt-util-extensible'
|
||||||
|
}
|
||||||
|
|
||||||
|
publishing {
|
||||||
|
publications {
|
||||||
|
create('extensible', MavenPublication) {
|
||||||
|
artifactId = 'util-extensible'
|
||||||
|
from components.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<E, F> implements ExtensionContainer<E, F> {
|
||||||
|
|
||||||
|
private final F extensionFactory;
|
||||||
|
private final Collection<E> extensions = new ArrayList<>();
|
||||||
|
|
||||||
|
public AbstractExtensionContainer(F extensionFactory) {
|
||||||
|
this.extensionFactory = extensionFactory;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return A <strong>copy</strong> of the registered extensions.
|
||||||
|
*/
|
||||||
|
protected Collection<E> getRegisteredExtensions() {
|
||||||
|
return new ArrayList<>(this.extensions);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void registerExtension(E extension) {
|
||||||
|
this.extensions.add(extension);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <T extends E> @Nullable T findExtension(Class<T> 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 <T extends E> void configureExtension(Class<T> extensionClass, Consumer<? super T> configure) {
|
||||||
|
configure.accept(this.getExtension(extensionClass));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <T extends E> T getExtension(Class<T> 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<? extends E> extensionClass) {
|
||||||
|
return this.extensions.stream().anyMatch(extensionClass::isInstance);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public F getExtensionFactory() {
|
||||||
|
return this.extensionFactory;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -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<E, F, C extends ExtensionContainer<E, F>> extends ExtensionAware<E> {
|
||||||
|
<T extends E> T createExtension(Class<T> extensionClass, Object... constructorArgs);
|
||||||
|
C getExtensionContainer();
|
||||||
|
}
|
@ -0,0 +1,12 @@
|
|||||||
|
package groowt.util.extensible;
|
||||||
|
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
|
public interface ExtensionAware<E> {
|
||||||
|
@Nullable <T extends E> T findExtension(Class<T> extensionClass);
|
||||||
|
<T extends E> void configureExtension(Class<T> extensionClass, Consumer<? super T> configure);
|
||||||
|
<T extends E> T getExtension(Class<T> extensionClass);
|
||||||
|
boolean hasExtension(Class<? extends E> extensionClass);
|
||||||
|
}
|
@ -0,0 +1,5 @@
|
|||||||
|
package groowt.util.extensible;
|
||||||
|
|
||||||
|
public interface ExtensionContainer<E, F> extends ExtensionAware<E> {
|
||||||
|
F getExtensionFactory();
|
||||||
|
}
|
@ -63,7 +63,7 @@ dependencies {
|
|||||||
implementation libs.jansi
|
implementation libs.jansi
|
||||||
implementation libs.asm
|
implementation libs.asm
|
||||||
implementation libs.di
|
implementation libs.di
|
||||||
implementation libs.extensible
|
implementation project(':extensible')
|
||||||
|
|
||||||
groowtAntlr libs.antlr
|
groowtAntlr libs.antlr
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
package groowt.view.component.web.ast.extension;
|
package groowt.view.component.web.ast.extension;
|
||||||
|
|
||||||
import com.jessebrault.extensible.ExtensionContainer;
|
import groowt.util.extensible.ExtensionContainer;
|
||||||
import groowt.view.component.web.ast.node.Node;
|
import groowt.view.component.web.ast.node.Node;
|
||||||
|
|
||||||
public interface NodeExtensionContainer extends ExtensionContainer<NodeExtension, NodeExtensionFactory> {
|
public interface NodeExtensionContainer extends ExtensionContainer<NodeExtension, NodeExtensionFactory> {
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
package groowt.view.component.web.ast.extension;
|
package groowt.view.component.web.ast.extension;
|
||||||
|
|
||||||
import com.jessebrault.extensible.AbstractExtensionContainer;
|
import groowt.util.extensible.AbstractExtensionContainer;
|
||||||
import groowt.view.component.web.ast.node.Node;
|
import groowt.view.component.web.ast.node.Node;
|
||||||
|
|
||||||
public class SimpleNodeExtensionContainer extends AbstractExtensionContainer<NodeExtension, NodeExtensionFactory>
|
public class SimpleNodeExtensionContainer extends AbstractExtensionContainer<NodeExtension, NodeExtensionFactory>
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
package groowt.view.component.web.ast.node;
|
package groowt.view.component.web.ast.node;
|
||||||
|
|
||||||
import com.jessebrault.extensible.Extensible;
|
import groowt.util.extensible.Extensible;
|
||||||
import groowt.view.component.web.antlr.TokenList;
|
import groowt.view.component.web.antlr.TokenList;
|
||||||
import groowt.view.component.web.ast.extension.NodeExtension;
|
import groowt.view.component.web.ast.extension.NodeExtension;
|
||||||
import groowt.view.component.web.ast.extension.NodeExtensionContainer;
|
import groowt.view.component.web.ast.extension.NodeExtensionContainer;
|
||||||
|
Loading…
Reference in New Issue
Block a user