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