This is an automated email from the ASF dual-hosted git repository.

ningyougang pushed a commit to branch 
support-array-result-include-sequence-action
in repository https://gitbox.apache.org/repos/asf/openwhisk-runtime-java.git

commit 177e1229c430e6b3cf54ae57d460ee2e2ac0a60e
Author: ning.yougang <[email protected]>
AuthorDate: Fri Aug 5 11:26:50 2022 +0800

    Support sequence action for java8
    
    Support json array for input param
---
 .../openwhisk/runtime/java/action/JarLoader.java   | 23 +++-----------
 .../openwhisk/runtime/java/action/Proxy.java       | 37 ++++++++++++++++++++--
 2 files changed, 40 insertions(+), 20 deletions(-)

diff --git 
a/core/java8/proxy/src/main/java/org/apache/openwhisk/runtime/java/action/JarLoader.java
 
b/core/java8/proxy/src/main/java/org/apache/openwhisk/runtime/java/action/JarLoader.java
index 29ec30f..1af3b98 100644
--- 
a/core/java8/proxy/src/main/java/org/apache/openwhisk/runtime/java/action/JarLoader.java
+++ 
b/core/java8/proxy/src/main/java/org/apache/openwhisk/runtime/java/action/JarLoader.java
@@ -37,8 +37,8 @@ import com.google.gson.JsonElement;
 import com.google.gson.JsonObject;
 
 public class JarLoader extends URLClassLoader {
-    private final Class<?> mainClass;
-    private final Method mainMethod;
+    public final Class<?> mainClass;
+    public final String entrypointMethodName;
 
     public static Path saveBase64EncodedFile(InputStream encoded) throws 
Exception {
         Base64.Decoder decoder = Base64.getDecoder();
@@ -55,31 +55,18 @@ public class JarLoader extends URLClassLoader {
     }
 
     public JarLoader(Path jarPath, String entrypoint)
-            throws MalformedURLException, ClassNotFoundException, 
NoSuchMethodException, SecurityException {
+            throws MalformedURLException, ClassNotFoundException, 
SecurityException {
         super(new URL[] { jarPath.toUri().toURL() });
 
         final String[] splittedEntrypoint = entrypoint.split("#");
         final String entrypointClassName = splittedEntrypoint[0];
-        final String entrypointMethodName = splittedEntrypoint.length > 1 ? 
splittedEntrypoint[1] : "main";
 
+        this.entrypointMethodName = splittedEntrypoint.length > 1 ? 
splittedEntrypoint[1] : "main";
         this.mainClass = loadClass(entrypointClassName);
-
-        Method m = mainClass.getMethod(entrypointMethodName, new Class[] { 
JsonObject.class });
-        m.setAccessible(true);
-        int modifiers = m.getModifiers();
-        if ((m.getReturnType() != JsonObject.class && m.getReturnType() != 
JsonArray.class) || !Modifier.isStatic(modifiers) || 
!Modifier.isPublic(modifiers)) {
-            throw new NoSuchMethodException("main");
-        }
-        this.mainMethod = m;
-    }
-
-    public Object invokeMain(JsonObject arg, Map<String, String> env) throws 
Exception {
-        augmentEnv(env);
-        return mainMethod.invoke(null, arg);
     }
 
     @SuppressWarnings({ "unchecked", "rawtypes" })
-    private static void augmentEnv(Map<String, String> newEnv) {
+    public static void augmentEnv(Map<String, String> newEnv) {
         try {
             for (Class cl : Collections.class.getDeclaredClasses()) {
                 if 
("java.util.Collections$UnmodifiableMap".equals(cl.getName())) {
diff --git 
a/core/java8/proxy/src/main/java/org/apache/openwhisk/runtime/java/action/Proxy.java
 
b/core/java8/proxy/src/main/java/org/apache/openwhisk/runtime/java/action/Proxy.java
index 27fb175..b8519ec 100644
--- 
a/core/java8/proxy/src/main/java/org/apache/openwhisk/runtime/java/action/Proxy.java
+++ 
b/core/java8/proxy/src/main/java/org/apache/openwhisk/runtime/java/action/Proxy.java
@@ -24,6 +24,8 @@ import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.io.OutputStream;
 import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
 import java.net.InetSocketAddress;
 import java.nio.charset.StandardCharsets;
 import java.nio.file.Path;
@@ -31,6 +33,7 @@ import java.util.HashMap;
 import java.util.Map;
 import java.util.Set;
 
+import com.google.gson.JsonArray;
 import com.google.gson.JsonElement;
 import com.google.gson.JsonObject;
 import com.google.gson.JsonParser;
@@ -139,7 +142,17 @@ public class Proxy {
                 InputStream is = t.getRequestBody();
                 JsonParser parser = new JsonParser();
                 JsonObject body = parser.parse(new BufferedReader(new 
InputStreamReader(is, StandardCharsets.UTF_8))).getAsJsonObject();
-                JsonObject inputObject = body.getAsJsonObject("value");
+                JsonParser json = new JsonParser();
+                JsonObject payloadForJsonObject = 
json.parse("{}").getAsJsonObject();
+                JsonArray payloadForJsonArray = 
json.parse("[]").getAsJsonArray();
+                Boolean isJsonObjectParam = true;
+                JsonElement inputJsonElement = body.get("value");
+                if (inputJsonElement.isJsonObject()) {
+                    payloadForJsonObject = inputJsonElement.getAsJsonObject();
+                } else {
+                    payloadForJsonArray = inputJsonElement.getAsJsonArray();
+                    isJsonObjectParam = false;
+                }
 
                 HashMap<String, String> env = new HashMap<String, String>();
                 Set<Map.Entry<String, JsonElement>> entrySet = body.entrySet();
@@ -153,8 +166,28 @@ public class Proxy {
                 Thread.currentThread().setContextClassLoader(loader);
                 System.setSecurityManager(new WhiskSecurityManager());
 
+                Method mainMethod = null;
+                String mainMethodName = loader.entrypointMethodName;
+                if (isJsonObjectParam) {
+                    mainMethod = loader.mainClass.getMethod(mainMethodName, 
new Class[] { JsonObject.class });
+                } else {
+                    mainMethod = loader.mainClass.getMethod(mainMethodName, 
new Class[] { JsonArray.class });
+                }
+                mainMethod.setAccessible(true);
+                int modifiers = mainMethod.getModifiers();
+                if ((mainMethod.getReturnType() != JsonObject.class && 
mainMethod.getReturnType() != JsonArray.class) || !Modifier.isStatic(modifiers) 
|| !Modifier.isPublic(modifiers)) {
+                    throw new NoSuchMethodException(mainMethodName);
+                }
+
                 // User code starts running here. the return object supports 
JsonObject and JsonArray both.
-                Object output = loader.invokeMain(inputObject, env);
+                Object output;
+                if (isJsonObjectParam) {
+                    loader.augmentEnv(env);
+                    output = mainMethod.invoke(null, payloadForJsonObject);
+                } else {
+                    loader.augmentEnv(env);
+                    output = mainMethod.invoke(null, payloadForJsonArray);
+                }
                 // User code finished running here.
 
                 if (output == null) {

Reply via email to