From c0da5ee75daca8794b67f63a42772b374ad079f7 Mon Sep 17 00:00:00 2001 From: tueem Date: Thu, 10 Apr 2025 14:44:57 +0200 Subject: [PATCH] feat(container): add chaining, single method add method for overriding, key getter and protected entries getter --- .../cutin/container/LoneMethodContainer.java | 18 +++++++++---- .../cutin/container/MethodContainer.java | 17 +++++++++--- .../cutin/container/MultiMethodContainer.java | 27 ++++++++++++++----- 3 files changed, 46 insertions(+), 16 deletions(-) diff --git a/lib/src/main/java/net/tomatentum/cutin/container/LoneMethodContainer.java b/lib/src/main/java/net/tomatentum/cutin/container/LoneMethodContainer.java index 11a4e59..63de214 100644 --- a/lib/src/main/java/net/tomatentum/cutin/container/LoneMethodContainer.java +++ b/lib/src/main/java/net/tomatentum/cutin/container/LoneMethodContainer.java @@ -6,6 +6,7 @@ import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.Optional; +import java.util.Set; import net.tomatentum.cutin.ReflectedMethod; import net.tomatentum.cutin.ReflectedMethodFactory; @@ -21,15 +22,22 @@ public class LoneMethodContainer implements MethodContainer } @Override - public void addMethods(ReflectedMethod... methods) { - for (ReflectedMethod reflectedMethod : methods) - this.methodStore.put(reflectedMethod.identifier(), reflectedMethod); + public MethodContainer addMethod(ReflectedMethod method) { + this.methodStore.put(method.identifier(), method); + return this; } @Override - public void addMethods(Object containingObject, Method... methods) { + public MethodContainer addMethods(Object containingObject, Method... methods) { for (Method method : methods) - this.addMethods(this.factory.produce(method, containingObject)); + this.factory.produce(method, containingObject) + .ifPresent(this::addMethod); + return this; + } + + @Override + public Set identifiers() { + return methodStore.keySet(); } @Override diff --git a/lib/src/main/java/net/tomatentum/cutin/container/MethodContainer.java b/lib/src/main/java/net/tomatentum/cutin/container/MethodContainer.java index 62f64e0..81c0353 100644 --- a/lib/src/main/java/net/tomatentum/cutin/container/MethodContainer.java +++ b/lib/src/main/java/net/tomatentum/cutin/container/MethodContainer.java @@ -3,17 +3,26 @@ package net.tomatentum.cutin.container; import java.lang.reflect.Method; import java.util.Collection; import java.util.Optional; +import java.util.Set; import net.tomatentum.cutin.ReflectedMethod; public interface MethodContainer { - void addMethods(ReflectedMethod... methods); - void addMethods(Object containingObject, Method... methods); - default void addAllMethods(Object containingObject) { + MethodContainer addMethod(ReflectedMethod method); + default MethodContainer addMethods(ReflectedMethod[] methods) { + for (ReflectedMethod reflectedMethod : methods) { + this.addMethod(reflectedMethod); + } + return this; + } + MethodContainer addMethods(Object containingObject, Method... methods); + default MethodContainer addAllMethods(Object containingObject) { this.addMethods(containingObject, containingObject.getClass().getDeclaredMethods()); - }; + return this; + } + Set identifiers(); Collection> methods(); Collection> findFor(I identifier); Optional> findFirstFor(I identifier); diff --git a/lib/src/main/java/net/tomatentum/cutin/container/MultiMethodContainer.java b/lib/src/main/java/net/tomatentum/cutin/container/MultiMethodContainer.java index 3838c41..1dd13b5 100644 --- a/lib/src/main/java/net/tomatentum/cutin/container/MultiMethodContainer.java +++ b/lib/src/main/java/net/tomatentum/cutin/container/MultiMethodContainer.java @@ -5,6 +5,7 @@ import java.util.Collection; import java.util.HashSet; import java.util.Optional; import java.util.Set; +import java.util.stream.Collectors; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -24,20 +25,28 @@ public class MultiMethodContainer implements MethodContainer... methods) { - for (ReflectedMethod rMethod : methods) { + public MethodContainer addMethod(ReflectedMethod method) { Optional> oentry = this.entries.stream() - .filter(e -> rMethod.identifier().equals(e.identifier())) + .filter(e -> method.identifier().equals(e.identifier())) .findFirst(); - Entry entry = oentry.orElse(new Entry<>(rMethod.identifier())).addMethod(rMethod); + Entry entry = oentry.orElse(new Entry<>(method.identifier())).addMethod(method); if (oentry.isEmpty()) this.entries.add(entry); - } + return this; } @Override - public void addMethods(Object containingObject, Method... methods) { + public MethodContainer addMethods(Object containingObject, Method... methods) { for (Method method : methods) - this.addMethods(this.factory.produce(method, containingObject)); + this.factory.produce(method, containingObject) + .ifPresent(this::addMethod); + return this; + } + + @Override + public Set identifiers() { + return entries().stream() + .map(Entry::identifier) + .collect(Collectors.toSet()); } @Override @@ -63,6 +72,10 @@ public class MultiMethodContainer implements MethodContainer> entries() { + return this.entries; + } + public static record Entry(I identifier, Set> methods) { public Entry(I identifier) {