fix(bcmethod): make bcmethod abstract
This commit is contained in:
		| @@ -1,44 +1,23 @@ | |||||||
| package net.tomatentum.cutin.method; | package net.tomatentum.cutin.method; | ||||||
|  |  | ||||||
| import java.lang.reflect.Method; | import java.lang.reflect.Method; | ||||||
|  | import java.util.ArrayList; | ||||||
| import java.util.Arrays; | import java.util.Arrays; | ||||||
| import java.util.List; | import java.util.List; | ||||||
| import java.util.Objects; | import java.util.Objects; | ||||||
| import java.util.Optional; | import java.util.Optional; | ||||||
| import java.util.stream.Stream; |  | ||||||
|  |  | ||||||
| import net.tomatentum.cutin.ReflectedMethodFactory; | import net.tomatentum.cutin.ReflectedMethodFactory; | ||||||
| import net.tomatentum.cutin.container.MethodContainer; | import net.tomatentum.cutin.container.MethodContainer; | ||||||
| import net.tomatentum.cutin.util.ReflectionUtil; | import net.tomatentum.cutin.util.ReflectionUtil; | ||||||
|  |  | ||||||
| public class BestCandidateMethod<I extends Object, C extends Object> extends ReflectedMethod<I, C> { | public abstract class BestCandidateMethod<I extends Object, C extends Object> extends ReflectedMethod<I, C> { | ||||||
|  |  | ||||||
|     private String methodName; |     private String methodName; | ||||||
|     private I identifier; |  | ||||||
|     private List<Object> additionalParameters; |  | ||||||
|      |      | ||||||
|     public BestCandidateMethod(String methodName, Object containingObject, I identifier, Object... additionalParameters) { |     protected BestCandidateMethod(String methodName, Object containingObject) { | ||||||
|         super(getMethod(containingObject, methodName), containingObject); |         super(getMethod(containingObject, methodName), containingObject); | ||||||
|         this.methodName = methodName; |         this.methodName = methodName; | ||||||
|         this.identifier = identifier; |  | ||||||
|         this.additionalParameters = Arrays.asList(additionalParameters); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     public BestCandidateMethod(String methodName, Object containingObject, Object... additionalParameters) { |  | ||||||
|         super(getMethod(containingObject, methodName), containingObject); |  | ||||||
|         this.methodName = methodName; |  | ||||||
|         this.identifier = null; |  | ||||||
|         this.additionalParameters = Arrays.asList(additionalParameters); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     @Override |  | ||||||
|     public Object getParameter(Object context, int index) { |  | ||||||
|         return additionalParameters.get(index); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     @Override |  | ||||||
|     public I identifier() { |  | ||||||
|         return this.identifier; |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
| @@ -47,10 +26,9 @@ public class BestCandidateMethod<I extends Object, C extends Object> extends Ref | |||||||
|             .filter(x -> x.getName().equals(methodName)) |             .filter(x -> x.getName().equals(methodName)) | ||||||
|             .filter(x -> !x.isBridge()) |             .filter(x -> !x.isBridge()) | ||||||
|             .toArray(Method[]::new); |             .toArray(Method[]::new); | ||||||
|         Class<?>[] parameters = Stream.concat( |         Class<?>[] parameters = getCurrentParameterList(context).stream() | ||||||
|                 Stream.of(context.getClass()), |             .map(Object::getClass) | ||||||
|                 additionalParameters.stream().map(Object::getClass) |             .toArray(Class<?>[]::new); | ||||||
|             ).toArray(Class<?>[]::new); |  | ||||||
|         super.method = ReflectionUtil.getMostSpecificMethod(methods, parameters); |         super.method = ReflectionUtil.getMostSpecificMethod(methods, parameters); | ||||||
|         return super.run(context); |         return super.run(context); | ||||||
|     } |     } | ||||||
| @@ -61,11 +39,6 @@ public class BestCandidateMethod<I extends Object, C extends Object> extends Ref | |||||||
|             .findFirst().orElse(null); |             .findFirst().orElse(null); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     //TODO add result Doc based Parser (which run before produce) |  | ||||||
|     public void identifier(I identifier) { |  | ||||||
|         this.identifier = identifier; |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     public boolean equals(Object obj) { |     public boolean equals(Object obj) { | ||||||
|         if (obj instanceof BestCandidateMethod<?, ?> bcMethod) { |         if (obj instanceof BestCandidateMethod<?, ?> bcMethod) { | ||||||
| @@ -80,27 +53,37 @@ public class BestCandidateMethod<I extends Object, C extends Object> extends Ref | |||||||
|         return Objects.hash(containingObject.getClass(), methodName); |         return Objects.hash(containingObject.getClass(), methodName); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     private List<Object> getCurrentParameterList(C context) { | ||||||
|  |         List<Object> parameters = new ArrayList<>(); | ||||||
|  |         int c = 0; | ||||||
|  |         Object last; | ||||||
|  |         while ((last = getParameter(context, c)) != null) { | ||||||
|  |             parameters.add(last); | ||||||
|  |             c++; | ||||||
|  |         } | ||||||
|  |         return parameters; | ||||||
|  |     } | ||||||
|  |  | ||||||
|     public abstract static class Factory<I extends Object, C extends Object> implements ReflectedMethodFactory.Factory<I, C> { |     public abstract static class Factory<I extends Object, C extends Object> implements ReflectedMethodFactory.Factory<I, C> { | ||||||
|  |  | ||||||
|         private MethodContainer<I, C> methodContainer; |         private MethodContainer<I, C> methodContainer; | ||||||
|         private String methodName; |         private String methodName; | ||||||
|         private Object[] additionalParameters; |  | ||||||
|  |  | ||||||
|         protected Factory(MethodContainer<I, C> methodContainer, String methodName, Object... additionalParameters) { |         protected Factory(MethodContainer<I, C> methodContainer, String methodName) { | ||||||
|             this.methodContainer = methodContainer; |             this.methodContainer = methodContainer; | ||||||
|             this.methodName = methodName; |             this.methodName = methodName; | ||||||
|             this.additionalParameters = additionalParameters; |  | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         @Override |         @Override | ||||||
|         public Optional<ReflectedMethod<I, C>> produce(Method method, Object containingObject) { |         public Optional<ReflectedMethod<I, C>> produce(Method method, Object containingObject) { | ||||||
|             BestCandidateMethod<I, C> bcMethod = new BestCandidateMethod<>( |             Optional<BestCandidateMethod<I, C>> bcMethod = bcProduce(methodName, containingObject); | ||||||
|                 methodName, containingObject, additionalParameters); |             if (bcMethod.isEmpty() || methodContainer.methods().contains(bcMethod.get())) | ||||||
|             if (methodContainer.methods().contains(bcMethod)) |  | ||||||
|                 return Optional.empty(); |                 return Optional.empty(); | ||||||
|             return Optional.of(bcMethod); |             return Optional.of(bcMethod.get()); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  |         protected abstract Optional<BestCandidateMethod<I, C>> bcProduce(String methodName, Object containingObject); | ||||||
|  |  | ||||||
|     } |     } | ||||||
|      |      | ||||||
| } | } | ||||||
|   | |||||||
| @@ -53,7 +53,7 @@ public abstract class ReflectedMethod<I extends Object, C extends Object> { | |||||||
|         List<Object> parameters = new ArrayList<>(); |         List<Object> parameters = new ArrayList<>(); | ||||||
|          |          | ||||||
|         for (int i = 0; i < parameterCount; i++) { |         for (int i = 0; i < parameterCount; i++) { | ||||||
|             Object parameter = getParameter(context, i-1); |             Object parameter = getParameter(context, i); | ||||||
|             logger.trace("Found parameter {}={} for method {}", parameter != null ? parameter.getClass().toString() : " ", parameter, ReflectionUtil.getFullMethodName(method)); |             logger.trace("Found parameter {}={} for method {}", parameter != null ? parameter.getClass().toString() : " ", parameter, ReflectionUtil.getFullMethodName(method)); | ||||||
|             parameters.add(parameter);    |             parameters.add(parameter);    | ||||||
|         } |         } | ||||||
|   | |||||||
| @@ -4,7 +4,6 @@ import static org.junit.jupiter.api.Assertions.assertTrue; | |||||||
|  |  | ||||||
| import org.junit.jupiter.api.Test; | import org.junit.jupiter.api.Test; | ||||||
|  |  | ||||||
| import net.tomatentum.cutin.method.BestCandidateMethod; |  | ||||||
| import net.tomatentum.cutin.method.ReflectedMethod; | import net.tomatentum.cutin.method.ReflectedMethod; | ||||||
|  |  | ||||||
| class ReflectedMethodTest { | class ReflectedMethodTest { | ||||||
| @@ -14,16 +13,16 @@ class ReflectedMethodTest { | |||||||
|         ReflectedMethod<String, String> method = new TestReflectedMethod(new TestMethodClass()); |         ReflectedMethod<String, String> method = new TestReflectedMethod(new TestMethodClass()); | ||||||
|         Object result = method.run("testContext"); |         Object result = method.run("testContext"); | ||||||
|         assertTrue((boolean)result); |         assertTrue((boolean)result); | ||||||
|  |         System.out.println("Success"); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Test |     @Test | ||||||
|     void testBCMethod() { |     void testBCMethod() { | ||||||
|         ReflectedMethod<String, Double> method = new BestCandidateMethod<String, Double>( |         ReflectedMethod<String, Double> method = new TestBestCandidateMethod( | ||||||
|             "test",  |             "test",  | ||||||
|             new TestMethodClass(), |             new TestMethodClass()); | ||||||
|             "ident", |  | ||||||
|              "testString"); |  | ||||||
|         Object result = method.run((double)4); |         Object result = method.run((double)4); | ||||||
|         assertTrue((boolean)result); |         assertTrue((boolean)result); | ||||||
|  |         System.out.println("Success"); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -0,0 +1,28 @@ | |||||||
|  | package net.tomatentum.cutin; | ||||||
|  |  | ||||||
|  | import net.tomatentum.cutin.method.BestCandidateMethod; | ||||||
|  |  | ||||||
|  | public class TestBestCandidateMethod extends BestCandidateMethod<String, Double> { | ||||||
|  |  | ||||||
|  |     protected TestBestCandidateMethod(String methodName, Object containingObject) { | ||||||
|  |         super(methodName, containingObject); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public Object getParameter(Double context, int index) { | ||||||
|  |         switch (index) { | ||||||
|  |             case 0: | ||||||
|  |                 return context; | ||||||
|  |             case 1: | ||||||
|  |                 return "testString"; | ||||||
|  |             default: | ||||||
|  |                 return null; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public String identifier() { | ||||||
|  |         return "ident"; | ||||||
|  |     } | ||||||
|  |      | ||||||
|  | } | ||||||
| @@ -13,7 +13,14 @@ public class TestReflectedMethod extends ReflectedMethod<String, String> { | |||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|     public Object getParameter(String context, int index) { |     public Object getParameter(String context, int index) { | ||||||
|         return 2; |         switch (index) { | ||||||
|  |             case 0: | ||||||
|  |                 return context; | ||||||
|  |             case 1: | ||||||
|  |                 return 2; | ||||||
|  |             default: | ||||||
|  |                 return null; | ||||||
|  |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Override |     @Override | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user