Added containsType and getChildrenOfType methods to CollectionProvider.

This commit is contained in:
JesseBrault0709 2023-06-06 12:30:09 +02:00
parent 0e260a45a1
commit 40cfacf646
11 changed files with 150 additions and 23 deletions

View File

@ -40,6 +40,29 @@ abstract class AbstractCollectionProvider<T> implements CollectionProvider<T> {
collectionProvider in this collectionProvider in this
} }
@Override
<C extends CollectionProvider<T>> boolean containsType(Class<C> childCollectionProviderClass) {
if (childCollectionProviderClass.isAssignableFrom(this.class)) {
true
} else {
this.collectionProviderChildren.inject(false) { acc, childProvider ->
acc || childCollectionProviderClass.isAssignableFrom(childProvider.class)
|| childProvider.containsType(childCollectionProviderClass)
}
}
}
@Override
<C extends CollectionProvider<T>> Collection<C> getChildrenOfType(Class<C> childCollectionProviderClass) {
this.collectionProviderChildren.inject([] as Collection<C>) { acc, childProvider ->
if (childCollectionProviderClass.isAssignableFrom(childProvider.class)) {
acc + childProvider.getChildrenOfType(childCollectionProviderClass) + (childProvider as C)
} else {
acc + childProvider.getChildrenOfType(childCollectionProviderClass)
}
}
}
@Override @Override
CollectionProvider<T> plus(Provider<T> other) { CollectionProvider<T> plus(Provider<T> other) {
concat(this, other) concat(this, other)
@ -50,11 +73,24 @@ abstract class AbstractCollectionProvider<T> implements CollectionProvider<T> {
concat(this, other) concat(this, other)
} }
private boolean searchProviderChildrenFor(Provider<T> descendant) {
this.providerChildren.inject(false) { acc, childProvider ->
acc || descendant in childProvider
}
}
private boolean searchCollectionProviderChildrenFor(Provider<T> descendant) {
this.collectionProviderChildren.inject(false) { acc, childProvider ->
acc || descendant in childProvider
}
}
@Override @Override
boolean isCase(Provider<T> provider) { boolean isCase(Provider<T> provider) {
provider in this.providerChildren || this.providerChildren.inject(false) { acc, childProvider -> provider in this.providerChildren
acc || provider in childProvider || this.searchProviderChildrenFor(provider)
} || this.searchCollectionProviderChildrenFor(provider)
} }
@Override @Override

View File

@ -6,16 +6,30 @@ abstract class AbstractProvider<T> implements Provider<T> {
Provider<T> p0, Provider<T> p0,
Provider<T> p1 Provider<T> p1
) { ) {
new SupplierBasedCollectionProvider<>({ new SupplierBasedCollectionProvider<>([], [p0, p1], {
[p0.provide(), p1.provide()] [p0.provide(), p1.provide()]
}) })
} }
static <T> CollectionProvider<T> concat(
Provider<T> p0,
CollectionProvider<T> p1
) {
new SupplierBasedCollectionProvider<>([p1], [p0], {
[p0.provide(), *p1.provide()]
})
}
@Override @Override
CollectionProvider<T> plus(Provider<T> other) { CollectionProvider<T> plus(Provider<T> other) {
concat(this, other) concat(this, other)
} }
@Override
CollectionProvider<T> plus(CollectionProvider<T> other) {
concat(this, other)
}
@Override @Override
CollectionProvider<T> asType(Class<CollectionProvider> collectionProviderClass) { CollectionProvider<T> asType(Class<CollectionProvider> collectionProviderClass) {
new SupplierBasedCollectionProvider<>({ new SupplierBasedCollectionProvider<>({

View File

@ -1,14 +0,0 @@
package com.jessebrault.ssg.provider
interface CollectionProvider<T> {
Collection<T> provide()
boolean contains(Provider<T> provider)
boolean contains(CollectionProvider<T> collectionProvider)
CollectionProvider<T> plus(Provider<T> other)
CollectionProvider<T> plus(CollectionProvider<T> other)
boolean isCase(Provider<T> provider)
boolean isCase(CollectionProvider<T> collectionProvider)
}

View File

@ -0,0 +1,19 @@
package com.jessebrault.ssg.provider;
import java.util.Collection;
public interface CollectionProvider<T> {
Collection<T> provide();
boolean contains(Provider<T> provider);
boolean contains(CollectionProvider<T> collectionProvider);
<C extends CollectionProvider<T>> boolean containsType(Class<C> childCollectionProviderClass);
<C extends CollectionProvider<T>> Collection<C> getChildrenOfType(Class<C> childCollectionProviderClass);
CollectionProvider<T> plus(Provider<T> other);
CollectionProvider<T> plus(CollectionProvider<T> other);
boolean isCase(Provider<T> provider);
boolean isCase(CollectionProvider<T> collectionProvider);
}

View File

@ -19,7 +19,7 @@ final class CollectionProviders {
new SupplierBasedCollectionProvider<>(supplier) new SupplierBasedCollectionProvider<>(supplier)
} }
static <T> CollectionProvider<T> fromDirectory( static <T> DirectoryCollectionProvider<T> fromDirectory(
File baseDirectory, File baseDirectory,
BiFunction<File, String, @Nullable T> elementFunction BiFunction<File, String, @Nullable T> elementFunction
) { ) {

View File

@ -0,0 +1,11 @@
package com.jessebrault.ssg.provider;
import org.jetbrains.annotations.Nullable;
import java.io.File;
import java.util.function.BiFunction;
public interface DirectoryCollectionProvider<T> extends CollectionProvider<T> {
File getBaseDirectory();
BiFunction<File, String, @Nullable T> getMapper();
}

View File

@ -14,6 +14,13 @@ final class EmptyProvider<T> implements Provider<T> {
throw new NullPointerException('EmptyProvider cannot provide a value.') throw new NullPointerException('EmptyProvider cannot provide a value.')
} }
@Override
CollectionProvider<T> plus(CollectionProvider<T> other) {
CollectionProviders.fromSupplier {
other.provide()
}
}
@Override @Override
CollectionProvider<T> plus(Provider<T> other) { CollectionProvider<T> plus(Provider<T> other) {
CollectionProviders.fromSupplier { CollectionProviders.fromSupplier {

View File

@ -14,7 +14,7 @@ import java.util.function.BiFunction
@PackageScope @PackageScope
@NullCheck @NullCheck
@EqualsAndHashCode(includeFields = true, callSuper = true) @EqualsAndHashCode(includeFields = true, callSuper = true)
final class FileBasedCollectionProvider<T> extends AbstractCollectionProvider<T> { final class FileBasedCollectionProvider<T> extends AbstractCollectionProvider<T> implements DirectoryCollectionProvider<T> {
private static final Logger logger = LoggerFactory.getLogger(FileBasedCollectionProvider) private static final Logger logger = LoggerFactory.getLogger(FileBasedCollectionProvider)
@ -27,6 +27,16 @@ final class FileBasedCollectionProvider<T> extends AbstractCollectionProvider<T>
this.elementFunction = elementFunction this.elementFunction = elementFunction
} }
@Override
File getBaseDirectory() {
this.baseDirectory
}
@Override
BiFunction<File, String, T> getMapper() {
this.elementFunction
}
@Override @Override
Collection<T> provide() { Collection<T> provide() {
if (!this.baseDirectory.isDirectory()) { if (!this.baseDirectory.isDirectory()) {

View File

@ -3,5 +3,6 @@ package com.jessebrault.ssg.provider
interface Provider<T> { interface Provider<T> {
T provide() T provide()
CollectionProvider<T> plus(Provider<T> other) CollectionProvider<T> plus(Provider<T> other)
CollectionProvider<T> plus(CollectionProvider<T> other)
CollectionProvider<T> asType(Class<CollectionProvider> collectionProviderClass) CollectionProvider<T> asType(Class<CollectionProvider> collectionProviderClass)
} }

View File

@ -1,5 +1,9 @@
package com.jessebrault.ssg.provider package com.jessebrault.ssg.provider
import org.junit.jupiter.api.Test
import static org.junit.jupiter.api.Assertions.assertTrue
final class FileBasedCollectionProviderTests extends AbstractCollectionProviderTests { final class FileBasedCollectionProviderTests extends AbstractCollectionProviderTests {
@Override @Override
@ -18,4 +22,10 @@ final class FileBasedCollectionProviderTests extends AbstractCollectionProviderT
}) })
} }
@Test
void containsSelfType() {
def p = new FileBasedCollectionProvider<String>(new File(''), { f -> '' })
assertTrue(p.containsType(DirectoryCollectionProvider))
}
} }

View File

@ -3,17 +3,28 @@ package com.jessebrault.ssg.provider
import org.junit.jupiter.api.DynamicTest import org.junit.jupiter.api.DynamicTest
import org.junit.jupiter.api.Test import org.junit.jupiter.api.Test
import org.junit.jupiter.api.TestFactory import org.junit.jupiter.api.TestFactory
import org.mockito.Answers
import org.mockito.Mockito
import org.slf4j.Logger import org.slf4j.Logger
import org.slf4j.LoggerFactory import org.slf4j.LoggerFactory
import java.util.function.Consumer import java.util.function.Consumer
import static org.junit.jupiter.api.Assertions.assertEquals
import static org.junit.jupiter.api.Assertions.assertTrue import static org.junit.jupiter.api.Assertions.assertTrue
import static org.mockito.ArgumentMatchers.any
import static org.mockito.Mockito.mock
import static org.mockito.Mockito.when
abstract class AbstractCollectionProviderTests { abstract class AbstractCollectionProviderTests {
protected static final Logger logger = LoggerFactory.getLogger(AbstractCollectionProviderTests) protected static final Logger logger = LoggerFactory.getLogger(AbstractCollectionProviderTests)
@SuppressWarnings('GrMethodMayBeStatic')
protected Provider<Integer> getProvider(Integer t) {
Providers.of(t)
}
protected abstract CollectionProvider<Integer> getCollectionProvider(Collection<Integer> ts) protected abstract CollectionProvider<Integer> getCollectionProvider(Collection<Integer> ts)
@Test @Test
@ -43,7 +54,6 @@ abstract class AbstractCollectionProviderTests {
}) })
} }
@SuppressWarnings('GrMethodMayBeStatic')
@TestFactory @TestFactory
Collection<DynamicTest> containsAndIsCaseCollectionProviderChildren() { Collection<DynamicTest> containsAndIsCaseCollectionProviderChildren() {
def p0 = this.getCollectionProvider([]) def p0 = this.getCollectionProvider([])
@ -63,10 +73,9 @@ abstract class AbstractCollectionProviderTests {
} }
} }
@SuppressWarnings('GrMethodMayBeStatic')
@TestFactory @TestFactory
Collection<DynamicTest> containsAndIsCaseProviderChildren() { Collection<DynamicTest> containsAndIsCaseProviderChildren() {
def p0 = this.getCollectionProvider([]) def p0 = this.getProvider(0)
def p1 = this.getCollectionProvider([]) def p1 = this.getCollectionProvider([])
def sum = p0 + p1 def sum = p0 + p1
([ ([
@ -83,4 +92,28 @@ abstract class AbstractCollectionProviderTests {
} }
} }
@Test
void containsDirectoryCollectionProvider() {
final CollectionProvider<Integer> dirProvider = CollectionProviders.fromDirectory(
new File(''),
{ 0 }
)
final CollectionProvider<Integer> dummy = CollectionProviders.getEmpty()
def sum = dirProvider + dummy
assertTrue(sum.containsType(DirectoryCollectionProvider))
}
@Test
void getDirectoryCollectionProviderChild() {
final CollectionProvider<Integer> dirProvider = CollectionProviders.fromDirectory(
new File(''),
{ 0 }
)
final CollectionProvider<Integer> dummy = CollectionProviders.getEmpty()
def sum = dirProvider + dummy
def children =
sum.<DirectoryCollectionProvider<Integer>>getChildrenOfType(DirectoryCollectionProvider)
assertTrue(dirProvider in children)
}
} }