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) {
