You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openwhisk.apache.org by ni...@apache.org on 2022/08/05 03:27:44 UTC

[openwhisk-runtime-java] 03/12: Make javaactionloop to support array as input

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 95bbf04623f4ff6cd2be14b1d5fb6a45e5a5eadc
Author: ning.yougang <ni...@navercorp.com>
AuthorDate: Tue Jul 5 11:22:43 2022 +0800

    Make javaactionloop to support array as input
---
 core/java8actionloop/lib/src/Launcher.java | 43 +++++++++++++++++++++---------
 1 file changed, 31 insertions(+), 12 deletions(-)

diff --git a/core/java8actionloop/lib/src/Launcher.java b/core/java8actionloop/lib/src/Launcher.java
index a5cbf05..443ca4e 100644
--- a/core/java8actionloop/lib/src/Launcher.java
+++ b/core/java8actionloop/lib/src/Launcher.java
@@ -59,16 +59,9 @@ class Launcher {
         }
 
         mainClass = Class.forName(mainClassName);
-        Method m = mainClass.getMethod(mainMethodName, 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(mainMethodName);
-        }
-        mainMethod = m;
     }
 
-    private static Object invokeMain(JsonObject arg, Map<String, String> env) throws Exception {
+    private static Object invokeMain(JsonElement arg, Map<String, String> env) throws Exception {
         augmentEnv(env);
         return mainMethod.invoke(null, arg);
     }
@@ -119,7 +112,9 @@ class Launcher {
                 new OutputStreamWriter(
                         new FileOutputStream("/dev/fd/3"), "UTF-8"));
         JsonParser json = new JsonParser();
-        JsonObject empty = json.parse("{}").getAsJsonObject();
+        JsonObject emptyForJsonObject = json.parse("{}").getAsJsonObject();
+        JsonArray emptyForJsonArray = json.parse("[]").getAsJsonArray();
+        Boolean isJsonObjectParam = true;
         String input = "";
         while (true) {
             try {
@@ -127,14 +122,19 @@ class Launcher {
                 if (input == null)
                     break;
                 JsonElement element = json.parse(input);
-                JsonObject payload = empty.deepCopy();
+                JsonObject payloadForJsonObject = emptyForJsonObject.deepCopy();
+                JsonArray payloadForJsonArray = emptyForJsonArray.deepCopy();
                 HashMap<String, String> env = new HashMap<String, String>();
                 if (element.isJsonObject()) {
                     // collect payload and environment
                     for (Map.Entry<String, JsonElement> entry : element.getAsJsonObject().entrySet()) {
                         if (entry.getKey().equals("value")) {
                             if (entry.getValue().isJsonObject())
-                                payload = entry.getValue().getAsJsonObject();
+                                payloadForJsonObject = entry.getValue().getAsJsonObject();
+                            else {
+                                payloadForJsonArray = entry.getValue().getAsJsonArray();
+                                isJsonObjectParam = false;
+                            }
                         } else {
                             env.put(String.format("__OW_%s", entry.getKey().toUpperCase()),
                                     entry.getValue().getAsString());
@@ -142,7 +142,26 @@ class Launcher {
                     }
                     augmentEnv(env);
                 }
-                Object response = invokeMain(payload, env);
+
+                Method m = null;
+                if (isJsonObjectParam) {
+                    m = mainClass.getMethod(mainMethodName, new Class[] { JsonObject.class });
+                } else {
+                    m = mainClass.getMethod(mainMethodName, new Class[] { JsonArray.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(mainMethodName);
+                }
+                mainMethod = m;
+
+                Object response;
+                if (isJsonObjectParam) {
+                    response = invokeMain(payloadForJsonObject, env);
+                } else {
+                    response = invokeMain(payloadForJsonArray, env);
+                }
                 out.println(response.toString());
             } catch(NullPointerException npe) {
                 System.out.println("the action returned null");