From 4dd7b70f40615031949cb9b90a2c90e860926e47 Mon Sep 17 00:00:00 2001 From: tueem Date: Wed, 30 Apr 2025 12:56:48 +0200 Subject: [PATCH 1/3] refactor(factory): move to own package and add factories getter --- .../cutin/container/LoneMethodContainer.java | 2 +- .../cutin/container/MultiMethodContainer.java | 2 +- .../{ => factory}/ReflectedMethodFactory.java | 4 +++- .../ReflectedMethodFactoryImpl.java | 17 ++++++++++------- .../cutin/method/BestCandidateMethod.java | 4 ++-- 5 files changed, 17 insertions(+), 12 deletions(-) rename lib/src/main/java/net/tomatentum/cutin/{ => factory}/ReflectedMethodFactory.java (90%) rename lib/src/main/java/net/tomatentum/cutin/{ => factory}/ReflectedMethodFactoryImpl.java (85%) 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 b0807db..86bae1b 100644 --- a/lib/src/main/java/net/tomatentum/cutin/container/LoneMethodContainer.java +++ b/lib/src/main/java/net/tomatentum/cutin/container/LoneMethodContainer.java @@ -12,7 +12,7 @@ import java.util.Set; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import net.tomatentum.cutin.ReflectedMethodFactory; +import net.tomatentum.cutin.factory.ReflectedMethodFactory; import net.tomatentum.cutin.method.ReflectedMethod; public class LoneMethodContainer implements MethodContainer { 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 ce7cadb..a1968b7 100644 --- a/lib/src/main/java/net/tomatentum/cutin/container/MultiMethodContainer.java +++ b/lib/src/main/java/net/tomatentum/cutin/container/MultiMethodContainer.java @@ -10,7 +10,7 @@ import java.util.stream.Collectors; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import net.tomatentum.cutin.ReflectedMethodFactory; +import net.tomatentum.cutin.factory.ReflectedMethodFactory; import net.tomatentum.cutin.method.ReflectedMethod; import net.tomatentum.cutin.util.ReflectionUtil; diff --git a/lib/src/main/java/net/tomatentum/cutin/ReflectedMethodFactory.java b/lib/src/main/java/net/tomatentum/cutin/factory/ReflectedMethodFactory.java similarity index 90% rename from lib/src/main/java/net/tomatentum/cutin/ReflectedMethodFactory.java rename to lib/src/main/java/net/tomatentum/cutin/factory/ReflectedMethodFactory.java index bf2e060..e7f1d5c 100644 --- a/lib/src/main/java/net/tomatentum/cutin/ReflectedMethodFactory.java +++ b/lib/src/main/java/net/tomatentum/cutin/factory/ReflectedMethodFactory.java @@ -1,16 +1,18 @@ -package net.tomatentum.cutin; +package net.tomatentum.cutin.factory; import java.lang.reflect.Method; import java.util.HashMap; import java.util.Optional; import java.util.Set; +import net.tomatentum.cutin.MethodParser; import net.tomatentum.cutin.method.ReflectedMethod; public interface ReflectedMethodFactory { Optional> produce(Method method, Object containingClass); ReflectedMethodFactory addFactory(Factory factory); + Set> factories(); public interface Factory { diff --git a/lib/src/main/java/net/tomatentum/cutin/ReflectedMethodFactoryImpl.java b/lib/src/main/java/net/tomatentum/cutin/factory/ReflectedMethodFactoryImpl.java similarity index 85% rename from lib/src/main/java/net/tomatentum/cutin/ReflectedMethodFactoryImpl.java rename to lib/src/main/java/net/tomatentum/cutin/factory/ReflectedMethodFactoryImpl.java index ccde22d..48bdb12 100644 --- a/lib/src/main/java/net/tomatentum/cutin/ReflectedMethodFactoryImpl.java +++ b/lib/src/main/java/net/tomatentum/cutin/factory/ReflectedMethodFactoryImpl.java @@ -1,30 +1,28 @@ -package net.tomatentum.cutin; +package net.tomatentum.cutin.factory; import java.lang.reflect.Method; -import java.util.ArrayList; import java.util.HashSet; -import java.util.List; import java.util.Optional; import java.util.Set; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import net.tomatentum.cutin.MethodParser; import net.tomatentum.cutin.method.ReflectedMethod; import net.tomatentum.cutin.util.ReflectionUtil; - public class ReflectedMethodFactoryImpl implements ReflectedMethodFactory { private Logger logger = LoggerFactory.getLogger(getClass()); - private List> factories; + private Set> factories; public ReflectedMethodFactoryImpl() { - this(new ArrayList<>()); + this(new HashSet<>()); } - public ReflectedMethodFactoryImpl(List> factories) { + public ReflectedMethodFactoryImpl(Set> factories) { this.factories = factories; } @@ -51,6 +49,11 @@ public class ReflectedMethodFactoryImpl impl return this; } + @Override + public Set> factories() { + return this.factories; + } + private Optional> factoryProduce(Factory factory, Method method, Object containingClass) { Set parser = new HashSet<>(); factory.addParser(parser); diff --git a/lib/src/main/java/net/tomatentum/cutin/method/BestCandidateMethod.java b/lib/src/main/java/net/tomatentum/cutin/method/BestCandidateMethod.java index 722157e..56f5574 100644 --- a/lib/src/main/java/net/tomatentum/cutin/method/BestCandidateMethod.java +++ b/lib/src/main/java/net/tomatentum/cutin/method/BestCandidateMethod.java @@ -10,9 +10,9 @@ import java.util.Optional; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import net.tomatentum.cutin.ReflectedMethodFactory; -import net.tomatentum.cutin.ReflectedMethodFactory.ParserResults; import net.tomatentum.cutin.container.MethodContainer; +import net.tomatentum.cutin.factory.ReflectedMethodFactory; +import net.tomatentum.cutin.factory.ReflectedMethodFactory.ParserResults; import net.tomatentum.cutin.util.ReflectionUtil; public abstract class BestCandidateMethod extends ReflectedMethod { -- 2.47.2 From ad2c4c00f615d7d1098c35f17124a9ebe5f0ea43 Mon Sep 17 00:00:00 2001 From: tueem Date: Fri, 2 May 2025 12:57:02 +0200 Subject: [PATCH 2/3] refactor(bcmethod): move duplicate checking out of factory --- .../cutin/container/LoneMethodContainer.java | 4 +++ .../cutin/method/BestCandidateMethod.java | 26 ------------------- 2 files changed, 4 insertions(+), 26 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 86bae1b..9d78472 100644 --- a/lib/src/main/java/net/tomatentum/cutin/container/LoneMethodContainer.java +++ b/lib/src/main/java/net/tomatentum/cutin/container/LoneMethodContainer.java @@ -29,6 +29,10 @@ public class LoneMethodContainer implements @Override public MethodContainer addMethod(ReflectedMethod method) { + if (this.methodStore.keySet().contains(method.identifier())) { + logger.warn("Could not add {} to container because the same identifier was already present.", method); + return this; + } this.methodStore.put(method.identifier(), method); logger.debug("Added {} to container", method); return this; diff --git a/lib/src/main/java/net/tomatentum/cutin/method/BestCandidateMethod.java b/lib/src/main/java/net/tomatentum/cutin/method/BestCandidateMethod.java index 56f5574..22e3d2c 100644 --- a/lib/src/main/java/net/tomatentum/cutin/method/BestCandidateMethod.java +++ b/lib/src/main/java/net/tomatentum/cutin/method/BestCandidateMethod.java @@ -5,14 +5,10 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Objects; -import java.util.Optional; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import net.tomatentum.cutin.container.MethodContainer; -import net.tomatentum.cutin.factory.ReflectedMethodFactory; -import net.tomatentum.cutin.factory.ReflectedMethodFactory.ParserResults; import net.tomatentum.cutin.util.ReflectionUtil; public abstract class BestCandidateMethod extends ReflectedMethod { @@ -70,27 +66,5 @@ public abstract class BestCandidateMethod ex } return parameters; } - - public abstract static class Factory implements ReflectedMethodFactory.Factory { - - private MethodContainer methodContainer; - private String methodName; - - protected Factory(MethodContainer methodContainer, String methodName) { - this.methodContainer = methodContainer; - this.methodName = methodName; - } - - @Override - public Optional> produce(Method method, Object containingObject, ParserResults results) { - Optional> bcMethod = bcProduce(methodName, containingObject, results); - if (bcMethod.isEmpty() || methodContainer.methods().contains(bcMethod.get())) - return Optional.empty(); - return Optional.of(bcMethod.get()); - } - - protected abstract Optional> bcProduce(String methodName, Object containingObject, ParserResults results); - - } } -- 2.47.2 From a2bdb549f9084a0e6786e1be64f69e5fc12986f4 Mon Sep 17 00:00:00 2001 From: tueem Date: Fri, 2 May 2025 13:00:28 +0200 Subject: [PATCH 3/3] feat(factory): introduce Mutable and Immutable methodfactory and change parser pipeline --- .../cutin/factory/ImmutableMethodFactory.java | 20 +++++++++++++++++++ .../cutin/factory/MutableMethodFactory.java | 17 ++++++++++++++++ .../cutin/factory/ReflectedMethodFactory.java | 2 +- .../factory/ReflectedMethodFactoryImpl.java | 3 +-- 4 files changed, 39 insertions(+), 3 deletions(-) create mode 100644 lib/src/main/java/net/tomatentum/cutin/factory/ImmutableMethodFactory.java create mode 100644 lib/src/main/java/net/tomatentum/cutin/factory/MutableMethodFactory.java diff --git a/lib/src/main/java/net/tomatentum/cutin/factory/ImmutableMethodFactory.java b/lib/src/main/java/net/tomatentum/cutin/factory/ImmutableMethodFactory.java new file mode 100644 index 0000000..6555efb --- /dev/null +++ b/lib/src/main/java/net/tomatentum/cutin/factory/ImmutableMethodFactory.java @@ -0,0 +1,20 @@ +package net.tomatentum.cutin.factory; + +import java.util.Set; + +import net.tomatentum.cutin.MethodParser; + +public abstract class ImmutableMethodFactory implements ReflectedMethodFactory.Factory { + + protected Set parser; + + protected ImmutableMethodFactory(MethodParser... parser) { + this.parser = Set.of(parser); + } + + @Override + public Set parser() { + return this.parser; + } + +} diff --git a/lib/src/main/java/net/tomatentum/cutin/factory/MutableMethodFactory.java b/lib/src/main/java/net/tomatentum/cutin/factory/MutableMethodFactory.java new file mode 100644 index 0000000..5318a38 --- /dev/null +++ b/lib/src/main/java/net/tomatentum/cutin/factory/MutableMethodFactory.java @@ -0,0 +1,17 @@ +package net.tomatentum.cutin.factory; + +import net.tomatentum.cutin.MethodParser; + +public abstract class MutableMethodFactory extends ImmutableMethodFactory { + + public MutableMethodFactory addParser(MethodParser parser) { + super.parser.add(parser); + return this; + } + + public MutableMethodFactory removeParser(MethodParser parser) { + super.parser.remove(parser); + return this; + } + +} diff --git a/lib/src/main/java/net/tomatentum/cutin/factory/ReflectedMethodFactory.java b/lib/src/main/java/net/tomatentum/cutin/factory/ReflectedMethodFactory.java index e7f1d5c..01b20d2 100644 --- a/lib/src/main/java/net/tomatentum/cutin/factory/ReflectedMethodFactory.java +++ b/lib/src/main/java/net/tomatentum/cutin/factory/ReflectedMethodFactory.java @@ -17,7 +17,7 @@ public interface ReflectedMethodFactory { public interface Factory { Optional> produce(Method method, Object containingObject, ParserResults parserResults); - void addParser(Set parser); + Set parser(); } diff --git a/lib/src/main/java/net/tomatentum/cutin/factory/ReflectedMethodFactoryImpl.java b/lib/src/main/java/net/tomatentum/cutin/factory/ReflectedMethodFactoryImpl.java index 48bdb12..87e0f26 100644 --- a/lib/src/main/java/net/tomatentum/cutin/factory/ReflectedMethodFactoryImpl.java +++ b/lib/src/main/java/net/tomatentum/cutin/factory/ReflectedMethodFactoryImpl.java @@ -55,8 +55,7 @@ public class ReflectedMethodFactoryImpl impl } private Optional> factoryProduce(Factory factory, Method method, Object containingClass) { - Set parser = new HashSet<>(); - factory.addParser(parser); + Set parser = factory.parser(); ParserResults results = ParserResults.create(parser, method, containingClass); return factory.produce(method, containingClass, results); } -- 2.47.2