From 9212d128c3d7647a741e7cdb41e599e001369009 Mon Sep 17 00:00:00 2001 From: JesseBrault0709 <62299747+JesseBrault0709@users.noreply.github.com> Date: Thu, 16 May 2024 17:25:36 +0200 Subject: [PATCH] Helping out ssg. --- util/di/build.gradle | 4 + .../main/java/groowt/util/di/BindingUtil.java | 4 + .../util/di/NamedRegistryExtension.java | 8 +- .../groowt/util/di/RegistryObjectFactory.java | 19 +++-- .../di/DefaultRegistryObjectFactoryTests.java | 1 - util/extensible/build.gradle | 5 ++ util/fp/build.gradle | 4 + .../util/fp/property/DefaultListProperty.java | 47 +++++++---- ...mpleProperty.java => DefaultProperty.java} | 52 +++++++++++-- .../groowt/util/fp/property/ListProperty.java | 23 ++++++ .../groowt/util/fp/property/Property.java | 24 ------ .../util/fp/provider/DefaultListProvider.java | 72 +++++++++-------- .../fp/provider/DefaultNamedProvider.java | 15 +++- .../fp/provider/DefaultNamedSetProvider.java | 53 +++++++++++++ .../util/fp/provider/DefaultProvider.java | 43 ++++++++++ .../util/fp/provider/DefaultSetProvider.java | 78 +++++++++++++++++++ .../groowt/util/fp/provider/ListProvider.java | 15 ++-- .../util/fp/provider/NamedProvider.java | 3 +- .../util/fp/provider/NamedSetProvider.java | 12 +++ .../groowt/util/fp/provider/Provider.java | 45 ++++++----- .../groowt/util/fp/provider/SetProvider.java | 22 ++++++ view-components/build.gradle | 5 ++ views/build.gradle | 4 + web-views/build.gradle | 4 + ...faultWebViewComponentTemplateCompiler.java | 8 +- .../WebViewComponentTemplateCompileUnit.java | 2 +- .../transpile/DefaultGroovyTranspiler.java | 2 +- .../DefaultTranspilerConfiguration.java | 10 +-- 28 files changed, 453 insertions(+), 131 deletions(-) rename util/fp/src/main/java/groowt/util/fp/property/{SimpleProperty.java => DefaultProperty.java} (54%) create mode 100644 util/fp/src/main/java/groowt/util/fp/provider/DefaultNamedSetProvider.java create mode 100644 util/fp/src/main/java/groowt/util/fp/provider/DefaultProvider.java create mode 100644 util/fp/src/main/java/groowt/util/fp/provider/DefaultSetProvider.java create mode 100644 util/fp/src/main/java/groowt/util/fp/provider/NamedSetProvider.java create mode 100644 util/fp/src/main/java/groowt/util/fp/provider/SetProvider.java diff --git a/util/di/build.gradle b/util/di/build.gradle index 63ae173..c8c2829 100644 --- a/util/di/build.gradle +++ b/util/di/build.gradle @@ -13,6 +13,10 @@ dependencies { implementation libs.slf4j.api, libs.groovy } +java { + withSourcesJar() +} + jar { archiveBaseName = 'groowt-util-di' } diff --git a/util/di/src/main/java/groowt/util/di/BindingUtil.java b/util/di/src/main/java/groowt/util/di/BindingUtil.java index 8c4fcf0..b6a2dd1 100644 --- a/util/di/src/main/java/groowt/util/di/BindingUtil.java +++ b/util/di/src/main/java/groowt/util/di/BindingUtil.java @@ -27,6 +27,10 @@ public final class BindingUtil { return bc -> {}; } + public static KeyHolder named(String name, Class type) { + return new SimpleKeyHolder<>(NamedRegistryExtension.class, type, name); + } + private BindingUtil() {} } diff --git a/util/di/src/main/java/groowt/util/di/NamedRegistryExtension.java b/util/di/src/main/java/groowt/util/di/NamedRegistryExtension.java index 86be96f..e4cc93d 100644 --- a/util/di/src/main/java/groowt/util/di/NamedRegistryExtension.java +++ b/util/di/src/main/java/groowt/util/di/NamedRegistryExtension.java @@ -1,9 +1,3 @@ package groowt.util.di; -public interface NamedRegistryExtension extends RegistryExtension, KeyBinder, QualifierHandlerContainer { - - static KeyHolder named(String name, Class type) { - return new SimpleKeyHolder<>(NamedRegistryExtension.class, type, name); - } - -} +public interface NamedRegistryExtension extends RegistryExtension, KeyBinder, QualifierHandlerContainer {} diff --git a/util/di/src/main/java/groowt/util/di/RegistryObjectFactory.java b/util/di/src/main/java/groowt/util/di/RegistryObjectFactory.java index d79d7a7..2ff25e8 100644 --- a/util/di/src/main/java/groowt/util/di/RegistryObjectFactory.java +++ b/util/di/src/main/java/groowt/util/di/RegistryObjectFactory.java @@ -2,8 +2,6 @@ package groowt.util.di; import groovy.lang.Closure; import groovy.lang.DelegatesTo; -import groovy.transform.stc.ClosureParams; -import groovy.transform.stc.FromString; import groowt.util.di.filters.FilterHandler; import groowt.util.di.filters.IterableFilterHandler; import jakarta.inject.Provider; @@ -20,10 +18,22 @@ import java.util.function.Consumer; public interface RegistryObjectFactory extends ObjectFactory { interface Builder { + void configureRegistry(Consumer configure); + + default void configureRegistry(@DelegatesTo(Registry.class) Closure configureClosure) { + this.configureRegistry(registry -> { + configureClosure.setDelegate(registry); + configureClosure.call(); + }); + } + void addFilterHandler(FilterHandler handler); + void addIterableFilterHandler(IterableFilterHandler handler); + T build(); + } Registry getRegistry(); @@ -33,13 +43,12 @@ public interface RegistryObjectFactory extends ObjectFactory { } default void configureRegistry( - @DelegatesTo(Registry.class) - @ClosureParams(value = FromString.class, options = "groowt.util.di.Registry") + @DelegatesTo(value = Registry.class) Closure configureClosure ) { final Registry registry = this.getRegistry(); configureClosure.setDelegate(registry); - configureClosure.call(registry); + configureClosure.call(); } @Nullable ScopeHandler findScopeHandler(Class scopeType); diff --git a/util/di/src/test/java/groowt/util/di/DefaultRegistryObjectFactoryTests.java b/util/di/src/test/java/groowt/util/di/DefaultRegistryObjectFactoryTests.java index aed45cb..1ee62bf 100644 --- a/util/di/src/test/java/groowt/util/di/DefaultRegistryObjectFactoryTests.java +++ b/util/di/src/test/java/groowt/util/di/DefaultRegistryObjectFactoryTests.java @@ -5,7 +5,6 @@ import jakarta.inject.Named; import org.junit.jupiter.api.Test; import static groowt.util.di.BindingUtil.*; -import static groowt.util.di.NamedRegistryExtension.named; import static org.junit.jupiter.api.Assertions.*; public class DefaultRegistryObjectFactoryTests { diff --git a/util/extensible/build.gradle b/util/extensible/build.gradle index 989bd2d..6e5faf7 100644 --- a/util/extensible/build.gradle +++ b/util/extensible/build.gradle @@ -8,6 +8,10 @@ dependencies { compileOnlyApi libs.jetbrains.anotations } +java { + withSourcesJar() +} + jar { archiveBaseName = 'groowt-util-extensible' } @@ -16,6 +20,7 @@ publishing { publications { create('extensible', MavenPublication) { artifactId = 'groowt-util-extensible' + from components.java } } } diff --git a/util/fp/build.gradle b/util/fp/build.gradle index 02fbfbb..4272e1f 100644 --- a/util/fp/build.gradle +++ b/util/fp/build.gradle @@ -13,6 +13,10 @@ dependencies { compileOnlyApi libs.jetbrains.anotations } +java { + withSourcesJar() +} + jar { archiveBaseName = 'groowt-util-fp' } diff --git a/util/fp/src/main/java/groowt/util/fp/property/DefaultListProperty.java b/util/fp/src/main/java/groowt/util/fp/property/DefaultListProperty.java index 5e9cb9a..558da9a 100644 --- a/util/fp/src/main/java/groowt/util/fp/property/DefaultListProperty.java +++ b/util/fp/src/main/java/groowt/util/fp/property/DefaultListProperty.java @@ -1,6 +1,7 @@ package groowt.util.fp.property; import groowt.util.fp.provider.DefaultListProvider; +import groowt.util.fp.provider.DefaultProvider; import groowt.util.fp.provider.ListProvider; import groowt.util.fp.provider.Provider; @@ -8,15 +9,28 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.function.Function; -import java.util.function.Predicate; public class DefaultListProperty implements ListProperty { + public static ListProperty ofType(Class type) { + return new DefaultListProperty<>(type); + } + + private final Class type; private final List> elementProviders = new ArrayList<>(); + protected DefaultListProperty(Class type) { + this.type = type; + } + + @Override + public Class getType() { + return this.type; + } + @Override public void addElement(T element) { - this.elementProviders.add(Provider.of(element)); + this.elementProviders.add(DefaultProvider.of(element)); } @SuppressWarnings("unchecked") @@ -36,26 +50,31 @@ public class DefaultListProperty implements ListProperty { } @Override - public ListProvider mapElements(Function mapper) { - return new DefaultListProvider<>( - this.elementProviders.stream() - .>map(elementProvider -> elementProvider.map(mapper)) - .toList() + public ListProvider map(Class targetType, Function mapper) { + return DefaultListProvider.ofElementProviders(targetType, this.elementProviders.stream() + .map(elementProvider -> elementProvider.map(targetType, mapper)) + .toList() ); } @Override - public ListProvider flatMapElements(Function> flatMapper) { - return new DefaultListProvider<>( - this.elementProviders.stream() - .map(elementProvider -> elementProvider.flatMap(flatMapper)) - .toList() + public ListProvider flatMap( + Class targetType, + Function> flatMapper + ) { + return DefaultListProvider.ofElementProviders(targetType, this.elementProviders.stream() + .map(elementProvider -> elementProvider.flatMap(targetType, flatMapper)) + .toList() ); } @Override - public ListProvider filterElements(Predicate predicate) { - return new DefaultListProvider<>(this.elementProviders, List.of(predicate)); + public ListProvider withType(Class desiredType) { + return DefaultListProvider.ofElementProviders(desiredType, this.elementProviders.stream() + .filter(elementProvider -> desiredType.isAssignableFrom(elementProvider.getType())) + .map(elementProvider -> elementProvider.map(desiredType, desiredType::cast)) + .toList() + ); } @Override diff --git a/util/fp/src/main/java/groowt/util/fp/property/SimpleProperty.java b/util/fp/src/main/java/groowt/util/fp/property/DefaultProperty.java similarity index 54% rename from util/fp/src/main/java/groowt/util/fp/property/SimpleProperty.java rename to util/fp/src/main/java/groowt/util/fp/property/DefaultProperty.java index b54680a..a228f0a 100644 --- a/util/fp/src/main/java/groowt/util/fp/property/SimpleProperty.java +++ b/util/fp/src/main/java/groowt/util/fp/property/DefaultProperty.java @@ -1,19 +1,55 @@ package groowt.util.fp.property; import groovy.lang.Closure; +import groowt.util.fp.provider.DefaultProvider; import groowt.util.fp.provider.Provider; import java.util.ArrayList; import java.util.List; -import java.util.Objects; +import java.util.function.Supplier; -final class SimpleProperty implements Property { +import static java.util.Objects.requireNonNull; +public class DefaultProperty implements Property { + + public static Property empty(Class type) { + return new DefaultProperty<>(type); + } + + @SuppressWarnings("unchecked") + public static Property of(T t) { + final Property property = new DefaultProperty<>((Class) t.getClass()); + property.set(t); + return property; + } + + public static Property ofProvider(Class type, Provider tProvider) { + final Property property = new DefaultProperty<>(type); + property.set(tProvider); + return property; + } + + public static Property ofLazy(Class type, Supplier tSupplier) { + final Property property = new DefaultProperty<>(type); + property.set(DefaultProvider.ofLazy(type, tSupplier)); + return property; + } + + private final Class type; private final List> configureClosures = new ArrayList<>(); private Provider provider; private Provider convention; + protected DefaultProperty(Class type) { + this.type = type; + } + + @Override + public Class getType() { + return this.type; + } + @Override public boolean isPresent() { return this.provider != null || this.convention != null; @@ -26,25 +62,25 @@ final class SimpleProperty implements Property { @Override public void set(T t) { - Objects.requireNonNull(t); - this.provider = Provider.of(t); + requireNonNull(t); + this.provider = DefaultProvider.of(t); } @Override public void set(Provider tProvider) { - Objects.requireNonNull(tProvider); + requireNonNull(tProvider); this.provider = tProvider; } @Override public void setConvention(T convention) { - Objects.requireNonNull(convention); - this.convention = Provider.of(convention); + requireNonNull(convention); + this.convention = DefaultProvider.of(convention); } @Override public void setConvention(Provider convention) { - Objects.requireNonNull(convention); + requireNonNull(convention); this.convention = convention; } diff --git a/util/fp/src/main/java/groowt/util/fp/property/ListProperty.java b/util/fp/src/main/java/groowt/util/fp/property/ListProperty.java index 9f76bd2..50bc26e 100644 --- a/util/fp/src/main/java/groowt/util/fp/property/ListProperty.java +++ b/util/fp/src/main/java/groowt/util/fp/property/ListProperty.java @@ -4,10 +4,33 @@ import groowt.util.fp.provider.ListProvider; import groowt.util.fp.provider.Provider; import java.util.Collection; +import java.util.Objects; public interface ListProperty extends ListProvider { + void addElement(T element); void addProvider(Provider elementProvider); void addAllElements(Collection elements); void addAllProviders(Collection> elementProviders); + + @SuppressWarnings("unchecked") + default void leftShift(Object object) { + Objects.requireNonNull(object); + if (object instanceof Provider provider) { + if (!this.getType().isAssignableFrom(provider.getType())) { + throw new IllegalArgumentException( + "The type of the given Provider (" + provider.getType().getName() + ") is not compatible with" + + "the type of this ListProperty (" + this.getType().getName() + ")." + ); + } + this.addProvider((Provider) provider); + } else if (this.getType().isAssignableFrom(object.getClass())) { + this.addElement((T) object); + } else { + throw new IllegalArgumentException("The type of the given object (" + object.getClass().getName() + + ") is not compatible with the type of this ListProperty (" + this.getType().getName() + ")." + ); + } + } + } diff --git a/util/fp/src/main/java/groowt/util/fp/property/Property.java b/util/fp/src/main/java/groowt/util/fp/property/Property.java index 6b1fbb7..dd6c69b 100644 --- a/util/fp/src/main/java/groowt/util/fp/property/Property.java +++ b/util/fp/src/main/java/groowt/util/fp/property/Property.java @@ -7,32 +7,8 @@ import groovy.transform.stc.FromString; import groowt.util.fp.provider.Provider; import org.jetbrains.annotations.Nullable; -import java.util.function.Supplier; - public interface Property extends Provider { - static Property empty() { - return new SimpleProperty<>(); - } - - static Property of(T t) { - final Property property = new SimpleProperty<>(); - property.set(t); - return property; - } - - static Property ofProvider(Provider tProvider) { - final Property property = new SimpleProperty<>(); - property.set(tProvider); - return property; - } - - static Property ofLazy(Supplier tSupplier) { - final Property property = new SimpleProperty<>(); - property.set(Provider.ofLazy(tSupplier)); - return property; - } - void set(T t); void set(Provider tProvider); void setConvention(T t); diff --git a/util/fp/src/main/java/groowt/util/fp/provider/DefaultListProvider.java b/util/fp/src/main/java/groowt/util/fp/provider/DefaultListProvider.java index a2f6a5f..d4b5eaf 100644 --- a/util/fp/src/main/java/groowt/util/fp/provider/DefaultListProvider.java +++ b/util/fp/src/main/java/groowt/util/fp/provider/DefaultListProvider.java @@ -3,65 +3,71 @@ package groowt.util.fp.provider; import java.util.ArrayList; import java.util.List; import java.util.function.Function; -import java.util.function.Predicate; public class DefaultListProvider implements ListProvider { - private final List> elementProviders; - private final List> filters; - - public DefaultListProvider(List> elementProviders) { - this.elementProviders = new ArrayList<>(elementProviders); - this.filters = List.of(); + public static ListProvider ofElements(Class elementType, List elements) { + return new DefaultListProvider<>( + elementType, + elements.stream() + .>map(DefaultProvider::of) + .toList() + ); } - public DefaultListProvider( - List> elementProviders, - List> filters + public static ListProvider ofElementProviders( + Class elementType, + List> elementProviders ) { + return new DefaultListProvider<>(elementType, elementProviders); + } + + private final Class elementType; + private final List> elementProviders; + + private DefaultListProvider(Class elementType, List> elementProviders) { + this.elementType = elementType; this.elementProviders = new ArrayList<>(elementProviders); - this.filters = new ArrayList<>(filters); - } - - private DefaultListProvider(DefaultListProvider old, Predicate filterToAdd) { - this.elementProviders = new ArrayList<>(old.elementProviders); - this.filters = new ArrayList<>(old.filters); - this.filters.add(filterToAdd); } @Override - public ListProvider filterElements(Predicate predicate) { - return new DefaultListProvider<>(this, predicate); + public Class getType() { + return this.elementType; } @Override - public ListProvider mapElements(Function mapper) { + public ListProvider map(Class targetType, Function mapper) { final List> uProviders = this.elementProviders.stream() - .>map(elementProvider -> elementProvider.map(mapper)) + .map(elementProvider -> elementProvider.map(targetType, mapper)) .toList(); - return new DefaultListProvider<>(uProviders); + return new DefaultListProvider<>(targetType, uProviders); } @Override - public ListProvider flatMapElements(Function> flatMapper) { + public ListProvider flatMap( + Class targetType, + Function> flatMapper + ) { final List> uProviders = this.elementProviders.stream() - .map(elementProvider -> elementProvider.flatMap(flatMapper)) + .map(elementProvider -> elementProvider.flatMap(targetType, flatMapper)) .toList(); - return new DefaultListProvider<>(uProviders); + return new DefaultListProvider<>(targetType, uProviders); + } + + @Override + public ListProvider withType(Class desiredType) { + return new DefaultListProvider<>(desiredType, this.elementProviders.stream() + .filter(elementProvider -> desiredType.isAssignableFrom(elementProvider.getType())) + .map(elementProvider -> elementProvider.map(desiredType, desiredType::cast)) + .toList() + ); } @Override public List get() { final List filtered = this.elementProviders.stream() .map(Provider::get) - .filter(element -> { - for (final var filter : this.filters) { - if (!filter.test(element)) { - return false; - } - } - return true; - }).toList(); + .toList(); return new ArrayList<>(filtered); } diff --git a/util/fp/src/main/java/groowt/util/fp/provider/DefaultNamedProvider.java b/util/fp/src/main/java/groowt/util/fp/provider/DefaultNamedProvider.java index b35f234..362c4b7 100644 --- a/util/fp/src/main/java/groowt/util/fp/provider/DefaultNamedProvider.java +++ b/util/fp/src/main/java/groowt/util/fp/provider/DefaultNamedProvider.java @@ -1,20 +1,29 @@ package groowt.util.fp.provider; -public class DefaultNamedProvider implements NamedProvider { +class DefaultNamedProvider implements NamedProvider { + private final Class type; private final String name; private final Provider delegate; + @SuppressWarnings("unchecked") public DefaultNamedProvider(String name, T element) { + this.type = (Class) element.getClass(); this.name = name; - this.delegate = Provider.of(element); + this.delegate = DefaultProvider.of(element); } - public DefaultNamedProvider(String name, Provider delegate) { + public DefaultNamedProvider(Class type, String name, Provider delegate) { + this.type = type; this.name = name; this.delegate = delegate; } + @Override + public Class getType() { + return this.type; + } + @Override public String getName() { return this.name; diff --git a/util/fp/src/main/java/groowt/util/fp/provider/DefaultNamedSetProvider.java b/util/fp/src/main/java/groowt/util/fp/provider/DefaultNamedSetProvider.java new file mode 100644 index 0000000..67032e0 --- /dev/null +++ b/util/fp/src/main/java/groowt/util/fp/provider/DefaultNamedSetProvider.java @@ -0,0 +1,53 @@ +package groowt.util.fp.provider; + +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.function.Predicate; +import java.util.stream.Collectors; + +class DefaultNamedSetProvider extends DefaultSetProvider implements NamedSetProvider { + + public static NamedSetProvider ofElementsAndNames(Class type, Map namesAndElements) { + return new DefaultNamedSetProvider<>(type, namesAndElements.entrySet().stream() + .map(entry -> new DefaultNamedProvider<>(entry.getKey(), entry.getValue())) + .collect(Collectors.toSet()) + ); + } + + public static NamedSetProvider ofNamedProviders(Class type, Set> providers) { + return new DefaultNamedSetProvider<>(type, providers); + } + + protected DefaultNamedSetProvider(Class type, Set> elementProviders) { + super(type, elementProviders); + } + + @Override + public NamedSetProvider withNames(Predicate namePredicate) { + return new DefaultNamedSetProvider<>(this.getType(), this.getProviders().stream() + .map(provider -> (NamedProvider) provider) + .filter(namedProvider -> namePredicate.test(namedProvider.getName())) + .collect(Collectors.toSet()) + ); + } + + @Override + public NamedProvider withName(String name) { + return this.getProviders().stream() + .map(provider -> (NamedProvider) provider) + .filter(namedProvider -> name.equals(namedProvider.getName())) + .findFirst() + .orElseThrow(() -> new NullPointerException("There is no NamedProvider present with name " + name)); + } + + @SuppressWarnings("unchecked") + @Override + public NamedSetProvider zipWithNames(NamedSetProvider other) { + final Set> combined = new HashSet<>(); + this.getProviders().forEach(provider -> combined.add((NamedProvider) provider)); + other.getProviders().forEach(provider -> combined.add((NamedProvider) provider)); + return new DefaultNamedSetProvider<>(this.getType(), combined); + } + +} diff --git a/util/fp/src/main/java/groowt/util/fp/provider/DefaultProvider.java b/util/fp/src/main/java/groowt/util/fp/provider/DefaultProvider.java new file mode 100644 index 0000000..b85e318 --- /dev/null +++ b/util/fp/src/main/java/groowt/util/fp/provider/DefaultProvider.java @@ -0,0 +1,43 @@ +package groowt.util.fp.provider; + +import java.util.Objects; +import java.util.function.Supplier; + +public class DefaultProvider implements Provider { + + public static Provider of(T t) { + Objects.requireNonNull(t); + return new DefaultProvider<>(t); + } + + public static Provider ofLazy(Class type, Supplier tSupplier) { + Objects.requireNonNull(type); + Objects.requireNonNull(tSupplier); + return new DefaultProvider<>(type, tSupplier); + } + + private final Class type; + private final Supplier tSupplier; + + @SuppressWarnings("unchecked") + protected DefaultProvider(T t) { + this.tSupplier = () -> t; + this.type = (Class) t.getClass(); + } + + protected DefaultProvider(Class type, Supplier tSupplier) { + this.type = type; + this.tSupplier = tSupplier::get; + } + + @Override + public Class getType() { + return this.type; + } + + @Override + public T get() { + return Objects.requireNonNull(this.tSupplier.get()); + } + +} diff --git a/util/fp/src/main/java/groowt/util/fp/provider/DefaultSetProvider.java b/util/fp/src/main/java/groowt/util/fp/provider/DefaultSetProvider.java new file mode 100644 index 0000000..13fb83a --- /dev/null +++ b/util/fp/src/main/java/groowt/util/fp/provider/DefaultSetProvider.java @@ -0,0 +1,78 @@ +package groowt.util.fp.provider; + +import java.util.HashSet; +import java.util.Set; +import java.util.function.Function; +import java.util.stream.Collectors; + +public class DefaultSetProvider implements SetProvider { + + public static SetProvider ofElements(Class type, Set elements) { + return new DefaultSetProvider<>(type, elements.stream() + .>map(DefaultProvider::of) + .collect(Collectors.toSet()) + ); + } + + public static SetProvider ofElementProviders(Class type, Set> providers) { + return new DefaultSetProvider<>(type, providers); + } + + private final Class type; + private final Set> elementProviders; + + protected DefaultSetProvider(Class type, Set> elementProviders) { + this.type = type; + this.elementProviders = new HashSet<>(elementProviders); + } + + @Override + public Class getType() { + return this.type; + } + + @Override + public Set> getProviders() { + return this.elementProviders; + } + + @Override + public SetProvider map(Class targetType, Function mapper) { + return new DefaultSetProvider<>(targetType, this.elementProviders.stream() + .map(elementProvider -> elementProvider.map(targetType, mapper)) + .collect(Collectors.toSet()) + ); + } + + @Override + public SetProvider flatMap(Class targetType, Function> mapper) { + return new DefaultSetProvider<>(targetType, this.elementProviders.stream() + .map(elementProvider -> elementProvider.flatMap(targetType, mapper)) + .collect(Collectors.toSet()) + ); + } + + @Override + public SetProvider withType(Class desiredType) { + return new DefaultSetProvider<>(desiredType, this.elementProviders.stream() + .filter(elementProvider -> desiredType.isAssignableFrom(elementProvider.getType())) + .map(elementProvider -> elementProvider.map(desiredType, desiredType::cast)) + .collect(Collectors.toSet()) + ); + } + + @SuppressWarnings("unchecked") + @Override + public SetProvider zip(SetProvider other) { + final Set> combined = new HashSet<>(); + combined.addAll(this.elementProviders); + other.getProviders().forEach(provider -> combined.add((Provider) provider)); + return new DefaultSetProvider<>(this.getType(), combined); + } + + @Override + public Set get() { + return this.elementProviders.stream().map(Provider::get).collect(Collectors.toSet()); + } + +} diff --git a/util/fp/src/main/java/groowt/util/fp/provider/ListProvider.java b/util/fp/src/main/java/groowt/util/fp/provider/ListProvider.java index c56a89e..daa9ef3 100644 --- a/util/fp/src/main/java/groowt/util/fp/provider/ListProvider.java +++ b/util/fp/src/main/java/groowt/util/fp/provider/ListProvider.java @@ -2,17 +2,16 @@ package groowt.util.fp.provider; import java.util.List; import java.util.function.Function; -import java.util.function.Predicate; -public interface ListProvider extends Provider> { +public interface ListProvider { - ListProvider mapElements(Function mapper); - ListProvider flatMapElements(Function> flatMapper); + Class getType(); - ListProvider filterElements(Predicate predicate); + ListProvider map(Class targetType, Function mapper); + ListProvider flatMap(Class targetType, Function> flatMapper); - default ListProvider filterElementsByType(Class type) { - return this.filterElements(type::isInstance).mapElements(type::cast); - } + ListProvider withType(Class desiredType); + + List get(); } diff --git a/util/fp/src/main/java/groowt/util/fp/provider/NamedProvider.java b/util/fp/src/main/java/groowt/util/fp/provider/NamedProvider.java index f5147fb..c590911 100644 --- a/util/fp/src/main/java/groowt/util/fp/provider/NamedProvider.java +++ b/util/fp/src/main/java/groowt/util/fp/provider/NamedProvider.java @@ -12,8 +12,9 @@ public interface NamedProvider extends Provider { NamedProvider other ) { return new DefaultNamedProvider<>( + this.getType(), nameSemiGroup.concat(this.getName(), other.getName()), - Provider.ofLazy(() -> tSemiGroup.concat(this.get(), other.get())) + DefaultProvider.ofLazy(this.getType(), () -> tSemiGroup.concat(this.get(), other.get())) ); } diff --git a/util/fp/src/main/java/groowt/util/fp/provider/NamedSetProvider.java b/util/fp/src/main/java/groowt/util/fp/provider/NamedSetProvider.java new file mode 100644 index 0000000..2bb254c --- /dev/null +++ b/util/fp/src/main/java/groowt/util/fp/provider/NamedSetProvider.java @@ -0,0 +1,12 @@ +package groowt.util.fp.provider; + +import java.util.function.Predicate; + +public interface NamedSetProvider extends SetProvider { + + NamedSetProvider withNames(Predicate namePredicate); + NamedProvider withName(String name); + + NamedSetProvider zipWithNames(NamedSetProvider other); + +} diff --git a/util/fp/src/main/java/groowt/util/fp/provider/Provider.java b/util/fp/src/main/java/groowt/util/fp/provider/Provider.java index 03a25b3..b499b0f 100644 --- a/util/fp/src/main/java/groowt/util/fp/provider/Provider.java +++ b/util/fp/src/main/java/groowt/util/fp/provider/Provider.java @@ -13,18 +13,9 @@ import java.util.function.Supplier; * * @param The type of the value contained within. */ -@FunctionalInterface public interface Provider { - static Provider of(T t) { - Objects.requireNonNull(t); - return () -> t; - } - - static Provider ofLazy(Supplier tSupplier) { - Objects.requireNonNull(tSupplier); - return () -> Objects.requireNonNull(tSupplier.get(), "This Provider is empty."); - } + Class getType(); /** * @implSpec Must throw {@link NullPointerException} if the value is null. @@ -34,32 +25,48 @@ public interface Provider { */ T get(); + default T get(Supplier onEmpty) { + try { + return this.get(); + } catch (NullPointerException nullPointerException) { + final RuntimeException onEmptyException = onEmpty.get(); + onEmptyException.initCause(nullPointerException); + throw onEmptyException; + } + } + default Provider filter(Predicate filter) { Objects.requireNonNull(filter); - return () -> { + return new DefaultProvider<>(this.getType(), () -> { final T t = this.get(); if (filter.test(t)) { return t; } else { - throw new NullPointerException("This Provider is empty."); + throw new NullPointerException("This Provider is empty (did not pass filter)."); } - }; + }); } - default Provider map(Function mapper) { + default Provider map(Class targetType, Function mapper) { Objects.requireNonNull(mapper); - return () -> mapper.apply(this.get()); + return new DefaultProvider<>(targetType, () -> mapper.apply(this.get())); } - default Provider flatMap(Function> flatMapper) { + default Provider flatMap( + Class targetType, + Function> flatMapper + ) { Objects.requireNonNull(flatMapper); - return () -> flatMapper.apply(this.get()).get(); + return new DefaultProvider<>(targetType, () -> flatMapper.apply(this.get()).get()); } - default Provider zip(SemiGroup semiGroup, Provider other) { + default Provider zip( + SemiGroup semiGroup, + Provider other + ) { Objects.requireNonNull(semiGroup); Objects.requireNonNull(other); - return () -> semiGroup.concat(this.get(), other.get()); + return new DefaultProvider<>(this.getType(), () -> semiGroup.concat(this.get(), other.get())); } } diff --git a/util/fp/src/main/java/groowt/util/fp/provider/SetProvider.java b/util/fp/src/main/java/groowt/util/fp/provider/SetProvider.java new file mode 100644 index 0000000..7797b54 --- /dev/null +++ b/util/fp/src/main/java/groowt/util/fp/provider/SetProvider.java @@ -0,0 +1,22 @@ +package groowt.util.fp.provider; + +import java.util.Set; +import java.util.function.Function; + +public interface SetProvider { + + Class getType(); + + Set> getProviders(); + + SetProvider map(Class targetType, Function mapper); + + SetProvider flatMap(Class targetType, Function> mapper); + + SetProvider withType(Class desiredType); + + Set get(); + + SetProvider zip(SetProvider other); + +} diff --git a/view-components/build.gradle b/view-components/build.gradle index 294c107..2581009 100644 --- a/view-components/build.gradle +++ b/view-components/build.gradle @@ -18,10 +18,15 @@ dependencies { implementation libs.slf4j.api } +java { + withSourcesJar() +} + publishing { publications { create('viewComponents', MavenPublication) { artifactId = 'groowt-view-components' + from components.java } } } diff --git a/views/build.gradle b/views/build.gradle index 2d48ceb..5a31c17 100644 --- a/views/build.gradle +++ b/views/build.gradle @@ -21,6 +21,10 @@ test { testLogging.showStandardStreams = true } +java { + withSourcesJar() +} + publishing { publications { create('views', MavenPublication) { diff --git a/web-views/build.gradle b/web-views/build.gradle index 04bf656..989a1bb 100644 --- a/web-views/build.gradle +++ b/web-views/build.gradle @@ -195,6 +195,10 @@ test { jvmArgs '-XX:+EnableDynamicAgentLoading' // for mockito/bytebuddy } +java { + withSourcesJar() +} + publishing { publications { create('webViews', MavenPublication) { diff --git a/web-views/src/main/java/groowt/view/web/compiler/DefaultWebViewComponentTemplateCompiler.java b/web-views/src/main/java/groowt/view/web/compiler/DefaultWebViewComponentTemplateCompiler.java index ca66c36..2a07f6e 100644 --- a/web-views/src/main/java/groowt/view/web/compiler/DefaultWebViewComponentTemplateCompiler.java +++ b/web-views/src/main/java/groowt/view/web/compiler/DefaultWebViewComponentTemplateCompiler.java @@ -163,7 +163,13 @@ public class DefaultWebViewComponentTemplateCompiler final var allClasses = compileUnit.getGroovyCompilationUnit().getClasses(); GroovyClass templateGroovyClass = null; final Set otherClasses = new HashSet<>(); - final String templateClassFqn = sourceUnit.getAST().getPackageName() + "." + templateClassSimpleName; + final String actualPackageName = sourceUnit.getAST().getPackageName(); + final String templateClassFqn; + if (actualPackageName.endsWith(".")) { + templateClassFqn = actualPackageName + templateClassSimpleName; + } else { + templateClassFqn = actualPackageName + "." + templateClassSimpleName; + } for (final GroovyClass groovyClass : allClasses) { if (groovyClass.getName().equals(templateClassFqn)) { if (templateGroovyClass != null) { diff --git a/web-views/src/main/java/groowt/view/web/compiler/WebViewComponentTemplateCompileUnit.java b/web-views/src/main/java/groowt/view/web/compiler/WebViewComponentTemplateCompileUnit.java index b9ebcd9..4d94d49 100644 --- a/web-views/src/main/java/groowt/view/web/compiler/WebViewComponentTemplateCompileUnit.java +++ b/web-views/src/main/java/groowt/view/web/compiler/WebViewComponentTemplateCompileUnit.java @@ -63,7 +63,7 @@ public class WebViewComponentTemplateCompileUnit extends AbstractComponentTempla @Override public @Nullable String getLine(int lineNumber, Janitor janitor) { - if (this.getSource().canReopen()) { + if (lineNumber > -1 && this.getSource().canReopen()) { return this.getSource().getLines().get(lineNumber); } else { return null; diff --git a/web-views/src/main/java/groowt/view/web/transpile/DefaultGroovyTranspiler.java b/web-views/src/main/java/groowt/view/web/transpile/DefaultGroovyTranspiler.java index 59d1ae2..860f4b9 100644 --- a/web-views/src/main/java/groowt/view/web/transpile/DefaultGroovyTranspiler.java +++ b/web-views/src/main/java/groowt/view/web/transpile/DefaultGroovyTranspiler.java @@ -106,7 +106,7 @@ public class DefaultGroovyTranspiler implements GroovyTranspiler { if (convertResult.moduleNode().hasPackage()) { moduleNode.setPackage(convertResult.moduleNode().getPackage()); - mainClassNode.setName(moduleNode.getPackageName() + "." + templateClassName); + mainClassNode.setName(moduleNode.getPackageName() + templateClassName); } final BlockStatement preambleBlock = convertResult.blockStatement(); diff --git a/web-views/src/main/java/groowt/view/web/transpile/DefaultTranspilerConfiguration.java b/web-views/src/main/java/groowt/view/web/transpile/DefaultTranspilerConfiguration.java index 130f0a4..e9d1833 100644 --- a/web-views/src/main/java/groowt/view/web/transpile/DefaultTranspilerConfiguration.java +++ b/web-views/src/main/java/groowt/view/web/transpile/DefaultTranspilerConfiguration.java @@ -1,6 +1,6 @@ package groowt.view.web.transpile; -import groowt.util.fp.provider.Provider; +import groowt.util.fp.provider.DefaultProvider; import groowt.view.web.transpile.resolve.ComponentClassNodeResolver; public class DefaultTranspilerConfiguration implements TranspilerConfiguration { @@ -14,10 +14,10 @@ public class DefaultTranspilerConfiguration implements TranspilerConfiguration { final var jStringTranspiler = new DefaultJStringTranspiler(positionSetter); final var gStringTranspiler = new DefaultGStringTranspiler(positionSetter, jStringTranspiler); final var componentTranspiler = new DefaultComponentTranspiler( - Provider.of(this.appendOrAddStatementFactory), - Provider.of(classNodeResolver), - Provider.ofLazy(this::getValueNodeTranspiler), - Provider.ofLazy(this::getBodyTranspiler) + DefaultProvider.of(this.appendOrAddStatementFactory), + DefaultProvider.of(classNodeResolver), + DefaultProvider.ofLazy(ValueNodeTranspiler.class, this::getValueNodeTranspiler), + DefaultProvider.ofLazy(BodyTranspiler.class, this::getBodyTranspiler) ); this.valueNodeTranspiler = new DefaultValueNodeTranspiler(componentTranspiler); this.bodyTranspiler = new DefaultBodyTranspiler(gStringTranspiler, jStringTranspiler, componentTranspiler);