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:41 UTC

[openwhisk-runtime-java] branch support-array-result-include-sequence-action created (now 177e122)

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

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


      at 177e122  Support sequence action for java8

This branch includes the following new commits:

     new 3e1cbcd  Support array result
     new 3ea32fd  Change Launcher to support array
     new 95bbf04  Make javaactionloop to support array as input
     new 6274269  Fix test case error
     new da7cc6d  Add test case
     new ccffe21  Change depend
     new d107659  Optimize test case
     new 4a40fe0  Use go1.18 to build actionloop
     new b99e99c  Change depend on master branch
     new babd2c3  Add another test case for sequence action
     new 574da16  Add document
     new 177e122  Support sequence action for java8

The 12 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[openwhisk-runtime-java] 11/12: Add document

Posted by ni...@apache.org.
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 574da1647189b07ed409c19cdd6f65c6a3b3e62c
Author: ning.yougang <ni...@navercorp.com>
AuthorDate: Fri Aug 5 10:25:40 2022 +0800

    Add document
---
 README.md | 30 ++++++++++++++++++++++++++++++
 1 file changed, 30 insertions(+)

diff --git a/README.md b/README.md
index 58f46c9..c7ce6ca 100644
--- a/README.md
+++ b/README.md
@@ -68,6 +68,36 @@ If needed you can also customize the method name of your Java action. This
 can be done by specifying the Java fully-qualified method name of your action,
 e.q., `--main com.example.MyMain#methodName`
 
+Not only support return JsonObject but also support return JsonArray, the main function would be:
+
+```java
+import com.google.gson.JsonArray;
+import com.google.gson.JsonObject;
+
+public class HelloArray {
+    public static JsonArray main(JsonObject args) {
+        JsonArray jsonArray = new JsonArray();
+        jsonArray.add("a");
+        jsonArray.add("b");
+        return jsonArray;
+    }
+}
+```
+
+And support array result for sequence action as well, the first action's array result can be used as next action's input parameter.
+
+So the function would be:
+
+```java
+import com.google.gson.JsonArray;
+
+public class Sort {
+    public static JsonArray main(JsonArray args) {
+        return args;
+    }
+}
+```
+
 ### Create the Java Action
 To use as a docker action:
 ```


[openwhisk-runtime-java] 10/12: Add another test case for sequence action

Posted by ni...@apache.org.
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 babd2c380f97c6e8c62ac91606bd4a4d87607596
Author: ning.yougang <ni...@navercorp.com>
AuthorDate: Fri Aug 5 09:53:39 2022 +0800

    Add another test case for sequence action
---
 .../JavaActionContainerTests.scala                 | 29 +++++++++++++++++-----
 1 file changed, 23 insertions(+), 6 deletions(-)

diff --git a/tests/src/test/scala/actionContainers/JavaActionContainerTests.scala b/tests/src/test/scala/actionContainers/JavaActionContainerTests.scala
index 4981086..6ece41a 100644
--- a/tests/src/test/scala/actionContainers/JavaActionContainerTests.scala
+++ b/tests/src/test/scala/actionContainers/JavaActionContainerTests.scala
@@ -299,7 +299,7 @@ class JavaActionContainerTests extends BasicActionRunnerTests with WskActorSyste
     })
   }
 
-  it should "support array result" in {
+  it should "support return array result" in {
     val (out, err) = withActionContainer() { c =>
       val jar = JarBuilder.mkBase64Jar(
         Seq("", "HelloArrayWhisk.java") ->
@@ -324,12 +324,29 @@ class JavaActionContainerTests extends BasicActionRunnerTests with WskActorSyste
       runCode should be(200)
       runRes shouldBe Some(JsArray(JsString("a"), JsString("b")))
     }
+  }
 
-    checkStreams(out, err, {
-      case (o, e) =>
-        o shouldBe empty
-        e shouldBe empty
-    })
+  it should "support array as input param" in {
+    val (out, err) = withActionContainer() { c =>
+      val jar = JarBuilder.mkBase64Jar(
+        Seq("", "HelloArrayWhisk.java") ->
+          """
+            | import com.google.gson.JsonArray;
+            |
+            | public class HelloArrayWhisk {
+            |     public static JsonArray main(JsonArray args) throws Exception {
+            |         return args;
+            |     }
+            | }
+          """.stripMargin.trim)
+
+      val (initCode, _) = c.init(initPayload(jar, "HelloArrayWhisk"))
+      initCode should be(200)
+
+      val (runCode, runRes) = c.runForJsArray(runPayload(JsArray(JsString("a"), JsString("b"))))
+      runCode should be(200)
+      runRes shouldBe Some(JsArray(JsString("a"), JsString("b")))
+    }
   }
 
   it should "survive System.exit" in {


[openwhisk-runtime-java] 08/12: Use go1.18 to build actionloop

Posted by ni...@apache.org.
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 4a40fe0c6c16a1b1c02594ad65a2d9ed24327115
Author: ning.yougang <ni...@navercorp.com>
AuthorDate: Mon Jul 25 15:30:32 2022 +0800

    Use go1.18 to build actionloop
---
 core/java8actionloop/Dockerfile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/core/java8actionloop/Dockerfile b/core/java8actionloop/Dockerfile
index f14c47f..172d403 100644
--- a/core/java8actionloop/Dockerfile
+++ b/core/java8actionloop/Dockerfile
@@ -16,7 +16,7 @@
 #
 
 # build go proxy from source
-FROM golang:1.17 AS builder_source
+FROM golang:1.18 AS builder_source
 ARG GO_PROXY_GITHUB_USER=ningyougang
 ARG GO_PROXY_GITHUB_BRANCH=support-array-result-include-sequence-action
 RUN git clone --branch ${GO_PROXY_GITHUB_BRANCH} \


[openwhisk-runtime-java] 01/12: Support array result

Posted by ni...@apache.org.
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 3e1cbcd451d3f8f6636c6ed3f7d5f7f92905224b
Author: ning.yougang <ni...@navercorp.com>
AuthorDate: Wed May 18 09:01:57 2022 +0800

    Support array result
    
    - JsonObject is good here
    - JsonArray is bad here
---
 .../java/org/apache/openwhisk/runtime/java/action/JarLoader.java  | 8 +++++---
 .../main/java/org/apache/openwhisk/runtime/java/action/Proxy.java | 4 ++--
 core/java8actionloop/lib/src/Launcher.java                        | 2 +-
 3 files changed, 8 insertions(+), 6 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 e17d0a9..29ec30f 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
@@ -32,6 +32,8 @@ import java.util.Base64;
 import java.util.Collections;
 import java.util.Map;
 
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
 import com.google.gson.JsonObject;
 
 public class JarLoader extends URLClassLoader {
@@ -65,15 +67,15 @@ public class JarLoader extends URLClassLoader {
         Method m = mainClass.getMethod(entrypointMethodName, new Class[] { JsonObject.class });
         m.setAccessible(true);
         int modifiers = m.getModifiers();
-        if (m.getReturnType() != JsonObject.class || !Modifier.isStatic(modifiers) || !Modifier.isPublic(modifiers)) {
+        if ((m.getReturnType() != JsonObject.class && m.getReturnType() != JsonArray.class) || !Modifier.isStatic(modifiers) || !Modifier.isPublic(modifiers)) {
             throw new NoSuchMethodException("main");
         }
         this.mainMethod = m;
     }
 
-    public JsonObject invokeMain(JsonObject arg, Map<String, String> env) throws Exception {
+    public Object invokeMain(JsonObject arg, Map<String, String> env) throws Exception {
         augmentEnv(env);
-        return (JsonObject) mainMethod.invoke(null, arg);
+        return mainMethod.invoke(null, arg);
     }
 
     @SuppressWarnings({ "unchecked", "rawtypes" })
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 4c0dc21..27fb175 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
@@ -153,8 +153,8 @@ public class Proxy {
                 Thread.currentThread().setContextClassLoader(loader);
                 System.setSecurityManager(new WhiskSecurityManager());
 
-                // User code starts running here.
-                JsonObject output = loader.invokeMain(inputObject, env);
+                // User code starts running here. the return object supports JsonObject and JsonArray both.
+                Object output = loader.invokeMain(inputObject, env);
                 // User code finished running here.
 
                 if (output == null) {
diff --git a/core/java8actionloop/lib/src/Launcher.java b/core/java8actionloop/lib/src/Launcher.java
index ef571e9..7f97202 100644
--- a/core/java8actionloop/lib/src/Launcher.java
+++ b/core/java8actionloop/lib/src/Launcher.java
@@ -62,7 +62,7 @@ class Launcher {
         Method m = mainClass.getMethod(mainMethodName, new Class[] { JsonObject.class });
         m.setAccessible(true);
         int modifiers = m.getModifiers();
-        if (m.getReturnType() != JsonObject.class || !Modifier.isStatic(modifiers) || !Modifier.isPublic(modifiers)) {
+        if ((m.getReturnType() != JsonObject.class && m.getReturnType() != JsonArray.class) || !Modifier.isStatic(modifiers) || !Modifier.isPublic(modifiers)) {
             throw new NoSuchMethodException(mainMethodName);
         }
         mainMethod = m;


[openwhisk-runtime-java] 06/12: Change depend

Posted by ni...@apache.org.
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 ccffe215a9151464d9bfb1f6fb65fd5d47ba356e
Author: ning.yougang <ni...@navercorp.com>
AuthorDate: Mon Jul 25 15:02:16 2022 +0800

    Change depend
---
 core/java8actionloop/Dockerfile | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/core/java8actionloop/Dockerfile b/core/java8actionloop/Dockerfile
index 510393d..f14c47f 100644
--- a/core/java8actionloop/Dockerfile
+++ b/core/java8actionloop/Dockerfile
@@ -16,9 +16,9 @@
 #
 
 # build go proxy from source
-FROM golang:1.16 AS builder_source
-ARG GO_PROXY_GITHUB_USER=apache
-ARG GO_PROXY_GITHUB_BRANCH=master
+FROM golang:1.17 AS builder_source
+ARG GO_PROXY_GITHUB_USER=ningyougang
+ARG GO_PROXY_GITHUB_BRANCH=support-array-result-include-sequence-action
 RUN git clone --branch ${GO_PROXY_GITHUB_BRANCH} \
    https://github.com/${GO_PROXY_GITHUB_USER}/openwhisk-runtime-go /src ;\
    cd /src ; env GO111MODULE=on CGO_ENABLED=0 go build main/proxy.go && \
@@ -31,13 +31,13 @@ RUN curl -sL \
   https://github.com/apache/openwhisk-runtime-go/archive/{$GO_PROXY_RELEASE_VERSION}.tar.gz\
   | tar xzf -\
   && cd openwhisk-runtime-go-*/main\
-  && GO111MODULE=on go build -o /bin/proxy
+  && GO111MODULE=on CGO_ENABLED=0 go build -o /bin/proxy
 
 # Use AdoptOpenJDK's JDK8, OpenJ9, ubuntu
 FROM ibm-semeru-runtimes:open-8u332-b09-jdk-focal
 
 # select the builder to use
-ARG GO_PROXY_BUILD_FROM=release
+ARG GO_PROXY_BUILD_FROM=source
 
 RUN rm -rf /var/lib/apt/lists/* \
     && apt-get clean \


[openwhisk-runtime-java] 02/12: Change Launcher to support array

Posted by ni...@apache.org.
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 3ea32fdb528e82e5a497640b0a58693603244d86
Author: ning.yougang <ni...@navercorp.com>
AuthorDate: Wed May 18 11:12:21 2022 +0800

    Change Launcher to support array
---
 core/java8actionloop/lib/src/Launcher.java | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/core/java8actionloop/lib/src/Launcher.java b/core/java8actionloop/lib/src/Launcher.java
index 7f97202..a5cbf05 100644
--- a/core/java8actionloop/lib/src/Launcher.java
+++ b/core/java8actionloop/lib/src/Launcher.java
@@ -68,9 +68,9 @@ class Launcher {
         mainMethod = m;
     }
 
-    private static JsonObject invokeMain(JsonObject arg, Map<String, String> env) throws Exception {
+    private static Object invokeMain(JsonObject arg, Map<String, String> env) throws Exception {
         augmentEnv(env);
-        return (JsonObject) mainMethod.invoke(null, arg);
+        return mainMethod.invoke(null, arg);
     }
 
     private static SecurityManager defaultSecurityManager = null;
@@ -142,7 +142,7 @@ class Launcher {
                     }
                     augmentEnv(env);
                 }
-                JsonElement response = invokeMain(payload, env);
+                Object response = invokeMain(payload, env);
                 out.println(response.toString());
             } catch(NullPointerException npe) {
                 System.out.println("the action returned null");


[openwhisk-runtime-java] 05/12: Add test case

Posted by ni...@apache.org.
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 da7cc6d3554f587c83ebd68c1f54724eaa3b7f89
Author: ning.yougang <ni...@navercorp.com>
AuthorDate: Mon Jul 18 15:47:04 2022 +0800

    Add test case
---
 .../JavaActionContainerTests.scala                 | 33 ++++++++++++++++++++++
 1 file changed, 33 insertions(+)

diff --git a/tests/src/test/scala/actionContainers/JavaActionContainerTests.scala b/tests/src/test/scala/actionContainers/JavaActionContainerTests.scala
index 17b0e5d..8396404 100644
--- a/tests/src/test/scala/actionContainers/JavaActionContainerTests.scala
+++ b/tests/src/test/scala/actionContainers/JavaActionContainerTests.scala
@@ -299,6 +299,39 @@ class JavaActionContainerTests extends BasicActionRunnerTests with WskActorSyste
     })
   }
 
+  it should "support array result" in {
+    val (out, err) = withActionContainer() { c =>
+      val jar = JarBuilder.mkBase64Jar(
+        Seq("", "HelloArrayWhisk.java") ->
+          """
+            | import com.google.gson.JsonArray;
+            | import com.google.gson.JsonObject;
+            |
+            | public class HelloArrayWhisk {
+            |     public static JsonArray main(JsonObject args) throws Exception {
+            |         JsonArray jsonArray = new JsonArray();
+            |         jsonArray.add("a");
+            |         jsonArray.add("b");
+            |         return jsonArray;
+            |     }
+            | }
+          """.stripMargin.trim)
+
+      val (initCode, _) = c.init(initPayload(jar, "HelloArrayWhisk"))
+      initCode should be(200)
+
+      val (runCode, runRes) = c.runForJsArray(JsObject())
+      runCode should be(200)
+      runRes.get.elements shouldBe Vector(JsString("a"), JsString("b"))
+    }
+
+    checkStreams(out, err, {
+      case (o, e) =>
+        o shouldBe empty
+        e shouldBe empty
+    })
+  }
+
   it should "survive System.exit" in {
     val (out, err) = withActionContainer() { c =>
       val jar = JarBuilder.mkBase64Jar(


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

Posted by ni...@apache.org.
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");


[openwhisk-runtime-java] 04/12: Fix test case error

Posted by ni...@apache.org.
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 627426948d70d17be081dfd4bd43d6726f08164a
Author: ning.yougang <ni...@navercorp.com>
AuthorDate: Mon Jul 18 14:49:53 2022 +0800

    Fix test case error
---
 core/java8actionloop/lib/src/Launcher.java                    | 11 +++++++++++
 .../scala/actionContainers/JavaActionContainerTests.scala     |  4 +---
 2 files changed, 12 insertions(+), 3 deletions(-)

diff --git a/core/java8actionloop/lib/src/Launcher.java b/core/java8actionloop/lib/src/Launcher.java
index 443ca4e..f0659d2 100644
--- a/core/java8actionloop/lib/src/Launcher.java
+++ b/core/java8actionloop/lib/src/Launcher.java
@@ -59,6 +59,17 @@ class Launcher {
         }
 
         mainClass = Class.forName(mainClassName);
+        Method[] methods = mainClass.getDeclaredMethods();
+        Boolean existMain = false;
+        for(Method method: methods) {
+            if (method.getName().equals(mainMethodName)) {
+                existMain = true;
+                break;
+            }
+        }
+        if (!existMain) {
+            throw new NoSuchMethodException(mainMethodName);
+        }
     }
 
     private static Object invokeMain(JsonElement arg, Map<String, String> env) throws Exception {
diff --git a/tests/src/test/scala/actionContainers/JavaActionContainerTests.scala b/tests/src/test/scala/actionContainers/JavaActionContainerTests.scala
index 357885e..17b0e5d 100644
--- a/tests/src/test/scala/actionContainers/JavaActionContainerTests.scala
+++ b/tests/src/test/scala/actionContainers/JavaActionContainerTests.scala
@@ -157,9 +157,7 @@ class JavaActionContainerTests extends BasicActionRunnerTests with WskActorSyste
 
         val expected = m match {
           case c if c == "x" || c == "!" => s"$errPrefix java.lang.ClassNotFoundException: example.HelloWhisk$c"
-          case "#bogus" =>
-            s"$errPrefix java.lang.NoSuchMethodException: example.HelloWhisk.bogus(com.google.gson.JsonObject)"
-          case _ => s"$errPrefix java.lang.NoSuchMethodException: example.HelloWhisk.main(com.google.gson.JsonObject)"
+          case _                         => s"$errPrefix java.lang.NoSuchMethodException"
         }
 
         val error = out.get.fields.get("error").get.toString()


[openwhisk-runtime-java] 09/12: Change depend on master branch

Posted by ni...@apache.org.
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 b99e99c5e83963b3fa5176073f888a5ed6959bda
Author: ning.yougang <ni...@navercorp.com>
AuthorDate: Mon Jul 25 15:43:15 2022 +0800

    Change depend on master branch
---
 core/java8actionloop/Dockerfile | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/core/java8actionloop/Dockerfile b/core/java8actionloop/Dockerfile
index 172d403..415e07c 100644
--- a/core/java8actionloop/Dockerfile
+++ b/core/java8actionloop/Dockerfile
@@ -17,8 +17,8 @@
 
 # build go proxy from source
 FROM golang:1.18 AS builder_source
-ARG GO_PROXY_GITHUB_USER=ningyougang
-ARG GO_PROXY_GITHUB_BRANCH=support-array-result-include-sequence-action
+ARG GO_PROXY_GITHUB_USER=apache
+ARG GO_PROXY_GITHUB_BRANCH=master
 RUN git clone --branch ${GO_PROXY_GITHUB_BRANCH} \
    https://github.com/${GO_PROXY_GITHUB_USER}/openwhisk-runtime-go /src ;\
    cd /src ; env GO111MODULE=on CGO_ENABLED=0 go build main/proxy.go && \


[openwhisk-runtime-java] 12/12: Support sequence action for java8

Posted by ni...@apache.org.
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 <ni...@navercorp.com>
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) {


[openwhisk-runtime-java] 07/12: Optimize test case

Posted by ni...@apache.org.
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 d1076596132277533f098b6f86e5d04cbcae44ff
Author: ning.yougang <ni...@navercorp.com>
AuthorDate: Mon Jul 25 15:28:36 2022 +0800

    Optimize test case
---
 tests/src/test/scala/actionContainers/JavaActionContainerTests.scala | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tests/src/test/scala/actionContainers/JavaActionContainerTests.scala b/tests/src/test/scala/actionContainers/JavaActionContainerTests.scala
index 8396404..4981086 100644
--- a/tests/src/test/scala/actionContainers/JavaActionContainerTests.scala
+++ b/tests/src/test/scala/actionContainers/JavaActionContainerTests.scala
@@ -322,7 +322,7 @@ class JavaActionContainerTests extends BasicActionRunnerTests with WskActorSyste
 
       val (runCode, runRes) = c.runForJsArray(JsObject())
       runCode should be(200)
-      runRes.get.elements shouldBe Vector(JsString("a"), JsString("b"))
+      runRes shouldBe Some(JsArray(JsString("a"), JsString("b")))
     }
 
     checkStreams(out, err, {