From 081afb425c8f5550792b2884b90c74de8eaea67b Mon Sep 17 00:00:00 2001 From: PtrMan <robertw89@googlemail.com> Date: Thu, 6 Sep 2018 19:58:17 +0200 Subject: [PATCH] Refactor: added parameter types and string specific handling --- .../MethodInvocationOperator.java | 65 +++++++++++++++++++ .../OperatorReflection.java | 7 +- .../MethodInvocationOperator.java | 44 ------------- 3 files changed, 69 insertions(+), 47 deletions(-) create mode 100644 src/main/java/org/opennars/middle/operatorreflection/MethodInvocationOperator.java rename src/main/{ => java}/org/opennars/middle/operatorreflection/OperatorReflection.java (73%) delete mode 100644 src/main/org/opennars/middle/operatorreflection/MethodInvocationOperator.java diff --git a/src/main/java/org/opennars/middle/operatorreflection/MethodInvocationOperator.java b/src/main/java/org/opennars/middle/operatorreflection/MethodInvocationOperator.java new file mode 100644 index 0000000..94ef4ee --- /dev/null +++ b/src/main/java/org/opennars/middle/operatorreflection/MethodInvocationOperator.java @@ -0,0 +1,65 @@ +package org.opennars.middle.operatorreflection; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.List; + +import org.opennars.entity.Task; +import org.opennars.interfaces.Timable; +import org.opennars.language.Term; +import org.opennars.operator.Operation; +import org.opennars.operator.Operator; +import org.opennars.storage.Memory; + + +/** + * Exposes a method of a object as a callable operator + */ +public class MethodInvocationOperator extends Operator { + private Method method; + private Object object; + private List<Class> argumentTypes; + + /** + * @param narsOperatorName name of the operator as called by NARS + * @param object object of method call + * @param method called method + */ + public MethodInvocationOperator(final String narsOperatorName, final Object object, final Method method, final List<Class> argumentTypes) { + super(narsOperatorName); + + this.object = object; + this.method = method; + this.argumentTypes = argumentTypes; + } + + @Override + protected List<Task> execute(Operation operation, Term[] args, Memory memory, Timable time) { + try { + if (argumentTypes.size() == 0) { + method.invoke(object); + } + else if (argumentTypes.size() == 1 && argumentTypes.get(0).equals(String.class) ) { + method.invoke(object, args[1].toString()); + } + else if (argumentTypes.size() == 2 && argumentTypes.get(0).equals(String.class) && argumentTypes.get(1).equals(String.class) ) { + method.invoke(object, args[1].toString(), args[2].toString()); + } + else if (argumentTypes.size() == 3 && argumentTypes.get(0).equals(String.class) && argumentTypes.get(1).equals(String.class) && argumentTypes.get(2).equals(String.class) ) { + method.invoke(object, args[1].toString(), args[2].toString(), args[3].toString()); + } + else { + // not handled + } + + } + catch (IllegalAccessException e) { + // ignore + } + catch (InvocationTargetException e) { + // ignore + } + + return null; + } +} diff --git a/src/main/org/opennars/middle/operatorreflection/OperatorReflection.java b/src/main/java/org/opennars/middle/operatorreflection/OperatorReflection.java similarity index 73% rename from src/main/org/opennars/middle/operatorreflection/OperatorReflection.java rename to src/main/java/org/opennars/middle/operatorreflection/OperatorReflection.java index 6be1e71..a2f3e3d 100644 --- a/src/main/org/opennars/middle/operatorreflection/OperatorReflection.java +++ b/src/main/java/org/opennars/middle/operatorreflection/OperatorReflection.java @@ -27,11 +27,12 @@ public class OperatorReflection { * @param narsOperatorName name of the operator as called by NARS * @param object object of method call * @param methodName name of the called method + * @param argumentTypes the types of the called method */ - public void appendAndRegisterMethodWithoutArguments(Pluggable pluggable, String narsOperatorName, Object object, String methodName) throws NoSuchMethodException { + public void appendAndRegisterMethodWithoutArguments(final Pluggable pluggable, final String narsOperatorName, final Object object, final String methodName, final List<Class> argumentTypes) throws NoSuchMethodException { Method calledMethod = retMethodByName(object, methodName); - MethodInvocationOperator operator = new MethodInvocationOperator(narsOperatorName, object, calledMethod); + MethodInvocationOperator operator = new MethodInvocationOperator(narsOperatorName, object, calledMethod, argumentTypes); // register operator pluggable.addPlugin(operator); @@ -39,7 +40,7 @@ public class OperatorReflection { methodOperators.put(narsOperatorName, operator); } - protected Method retMethodByName(Object object, String methodName) throws NoSuchMethodException { + protected Method retMethodByName(final Object object, final String methodName) throws NoSuchMethodException { return object.getClass().getMethod(methodName); } } diff --git a/src/main/org/opennars/middle/operatorreflection/MethodInvocationOperator.java b/src/main/org/opennars/middle/operatorreflection/MethodInvocationOperator.java deleted file mode 100644 index 4e017e6..0000000 --- a/src/main/org/opennars/middle/operatorreflection/MethodInvocationOperator.java +++ /dev/null @@ -1,44 +0,0 @@ -package org.opennars.middle.operatorreflection; - -import org.opennars.entity.Task; -import org.opennars.interfaces.Pluggable; -import org.opennars.interfaces.Timable; -import org.opennars.language.Term; -import org.opennars.operator.Operation; -import org.opennars.operator.Operator; -import org.opennars.storage.Memory; - -/** - * Exposes a method of a object as a callable operator - */ - public class MethodInvocationOperator extends Operator { - private Method method; - private Object object; - - /** - * @param narsOperatorName name of the operator as called by NARS - * @param object object of method call - * @param method called method - */ - public MethodInvocationOperator(String narsOperatorName, Object object, Method method) { - super(narsOperatorName); - - this.object = object; - this.method = method; - } - - @Override - protected List<Task> execute(Operation operation, Term[] args, Memory memory, Timable time) { - try { - method.invoke(object); - } - catch (IllegalAccessException e) { - // ignore - } - catch (InvocationTargetException e) { - // ignore - } - - return null; - } -} -- GitLab