From d9bda26018def4c38dabc19fd5c6ddcd8682dd39 Mon Sep 17 00:00:00 2001 From: Javier Godoy <11554739+javier-godoy@users.noreply.github.com> Date: Mon, 17 Nov 2025 14:14:09 -0300 Subject: [PATCH 1/3] fix: invoke executeJs using reflection --- .../vaadin/jsonmigration/JsonMigration.java | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/flowingcode/vaadin/jsonmigration/JsonMigration.java b/src/main/java/com/flowingcode/vaadin/jsonmigration/JsonMigration.java index ef23c12..57983ba 100644 --- a/src/main/java/com/flowingcode/vaadin/jsonmigration/JsonMigration.java +++ b/src/main/java/com/flowingcode/vaadin/jsonmigration/JsonMigration.java @@ -116,6 +116,17 @@ public static void setPropertyJson(Element element, String name, JsonValue json) invoke(Element_setPropertyJson, element, name, json); } + private static Method Element_executeJs = lookup_executeJs(); + + @SneakyThrows + private static Method lookup_executeJs() { + if (Version.getMajorVersion() > 24) { + return Element.class.getMethod("executeJs", String.class, Object[].class); + } else { + return Element.class.getMethod("executeJs", String.class, Serializable[].class); + } + } + /** * Asynchronously runs the given JavaScript expression in the browser in the context of this * element. @@ -128,7 +139,8 @@ public static void setPropertyJson(Element element, String name, JsonValue json) */ public static ElementalPendingJavaScriptResult executeJs(Element element, String expression, Serializable... parameters) { - PendingJavaScriptResult result = element.executeJs(expression, parameters); + PendingJavaScriptResult result = + (PendingJavaScriptResult) invoke(Element_executeJs, element, expression, parameters); return helper.convertPendingJavaScriptResult(result); } From fb2ae68270cdbd3be5b8f76bac71a2322f03c99c Mon Sep 17 00:00:00 2001 From: Javier Godoy <11554739+javier-godoy@users.noreply.github.com> Date: Mon, 17 Nov 2025 14:14:32 -0300 Subject: [PATCH 2/3] fix: convert JsonValue in varargs methods --- .../jsonmigration/JsonMigrationHelper25.java | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/src/main/java/com/flowingcode/vaadin/jsonmigration/JsonMigrationHelper25.java b/src/main/java/com/flowingcode/vaadin/jsonmigration/JsonMigrationHelper25.java index cbd36aa..7ea9cb2 100644 --- a/src/main/java/com/flowingcode/vaadin/jsonmigration/JsonMigrationHelper25.java +++ b/src/main/java/com/flowingcode/vaadin/jsonmigration/JsonMigrationHelper25.java @@ -27,6 +27,7 @@ import elemental.json.JsonArray; import elemental.json.JsonObject; import elemental.json.JsonValue; +import java.lang.reflect.Array; import java.util.concurrent.CompletableFuture; import lombok.AllArgsConstructor; import lombok.NoArgsConstructor; @@ -58,7 +59,18 @@ public JsonValue convertToJsonValue(Object object) { @SneakyThrows public Object invoke(Method method, Object instance, Object... args) { Object[] convertedArgs = null; + + int j = args.length - 1; Class parameterTypes[] = method.getParameterTypes(); + if (method.isVarArgs() && j >= 0 && args[j] instanceof Object[]) { + Object[] convertedArray = + convertArray((Object[]) args[j], parameterTypes[j].getComponentType()); + if (convertedArray != null) { + convertedArgs = Arrays.copyOf(args, args.length); + convertedArgs[j] = convertedArray; + } + } + for (int i = 0; i < parameterTypes.length; i++) { if (args[i] instanceof JsonValue && parameterTypes[i] == BaseJsonNode.class) { @@ -74,6 +86,33 @@ public Object invoke(Method method, Object instance, Object... args) { return method.invoke(instance, convertedArgs); } + + private static T[] convertArray(Object[] array, Class newType) { + T[] convertedArray = null; + if (newType.isAssignableFrom(BaseJsonNode.class)) { + for (int i = 0; i < array.length; i++) { + if (array[i] instanceof JsonValue) { + if (convertedArray == null) { + @SuppressWarnings("unchecked") + T[] copy = (newType == Object.class) + ? (T[]) new Object[array.length] + : (T[]) Array.newInstance(newType, array.length); + if (i>0) { + System.arraycopy(array, 0, copy, 0, i); + } + convertedArray = copy; + } + @SuppressWarnings("unchecked") + T t = (T) convertToJsonNode((JsonValue) array[i]); + convertedArray[i] = t; + } else if (convertedArray != null) { + convertedArray[i] = newType.cast(array[i]); + } + } + } + return convertedArray; + } + private static JsonValue convertToJsonValue(JsonNode jsonNode) { switch (jsonNode.getNodeType()) { case OBJECT: From 796ad3ca0e0131cb1dd10486f3df28d3a95fb3d9 Mon Sep 17 00:00:00 2001 From: Javier Godoy <11554739+javier-godoy@users.noreply.github.com> Date: Mon, 17 Nov 2025 16:31:46 -0300 Subject: [PATCH 3/3] fix: add guard against incorrect number of parameters --- .../jsonmigration/JsonMigrationHelper25.java | 29 ++++++++++--------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/flowingcode/vaadin/jsonmigration/JsonMigrationHelper25.java b/src/main/java/com/flowingcode/vaadin/jsonmigration/JsonMigrationHelper25.java index 7ea9cb2..c2d6d31 100644 --- a/src/main/java/com/flowingcode/vaadin/jsonmigration/JsonMigrationHelper25.java +++ b/src/main/java/com/flowingcode/vaadin/jsonmigration/JsonMigrationHelper25.java @@ -62,24 +62,27 @@ public Object invoke(Method method, Object instance, Object... args) { int j = args.length - 1; Class parameterTypes[] = method.getParameterTypes(); - if (method.isVarArgs() && j >= 0 && args[j] instanceof Object[]) { - Object[] convertedArray = - convertArray((Object[]) args[j], parameterTypes[j].getComponentType()); - if (convertedArray != null) { - convertedArgs = Arrays.copyOf(args, args.length); - convertedArgs[j] = convertedArray; + if (args.length == parameterTypes.length) { + if (method.isVarArgs() && args[j] instanceof Object[]) { + Object[] convertedArray = + convertArray((Object[]) args[j], parameterTypes[j].getComponentType()); + if (convertedArray != null) { + convertedArgs = Arrays.copyOf(args, args.length); + convertedArgs[j] = convertedArray; + } } - } - for (int i = 0; i < parameterTypes.length; i++) { - if (args[i] instanceof JsonValue && parameterTypes[i] == BaseJsonNode.class) { - - if (convertedArgs == null) { - convertedArgs = Arrays.copyOf(args, args.length); + for (int i = 0; i < parameterTypes.length; i++) { + if (args[i] instanceof JsonValue && parameterTypes[i] == BaseJsonNode.class) { + + if (convertedArgs == null) { + convertedArgs = Arrays.copyOf(args, args.length); + } + convertedArgs[i] = convertToJsonNode((JsonValue) args[i]); } - convertedArgs[i] = convertToJsonNode((JsonValue) args[i]); } } + if (convertedArgs == null) { convertedArgs = args; }