]> source.dussan.org Git - vaadin-framework.git/commitdiff
Make JavaScriptExtension serializable (#9721)
authorArtur <artur@vaadin.com>
Wed, 26 Jul 2017 10:17:44 +0000 (13:17 +0300)
committerHenri Sara <henri.sara@gmail.com>
Wed, 26 Jul 2017 10:17:44 +0000 (13:17 +0300)
Fixes #9705

compatibility-server/src/test/java/com/vaadin/tests/server/SerializationTest.java [new file with mode: 0644]
server/src/main/java/com/vaadin/server/JavaScriptCallbackHelper.java

diff --git a/compatibility-server/src/test/java/com/vaadin/tests/server/SerializationTest.java b/compatibility-server/src/test/java/com/vaadin/tests/server/SerializationTest.java
new file mode 100644 (file)
index 0000000..eb85297
--- /dev/null
@@ -0,0 +1,62 @@
+package com.vaadin.tests.server;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.Serializable;
+
+import org.junit.Test;
+
+import com.vaadin.server.AbstractJavaScriptExtension;
+import com.vaadin.ui.JavaScriptFunction;
+
+import elemental.json.JsonArray;
+
+public class SerializationTest {
+
+    public static class JSE extends AbstractJavaScriptExtension {
+        {
+            addFunction("foo", new JavaScriptFunction() {
+                @Override
+                public void call(JsonArray arguments) {
+                    System.out.println("Foo called");
+                }
+            });
+        }
+
+    }
+
+    @Test
+    public void testJSExtension() throws Exception {
+        serializeAndDeserialize(new JSE());
+    }
+
+    private static <S extends Serializable> S serializeAndDeserialize(S s)
+            throws IOException, ClassNotFoundException {
+        // Serialize and deserialize
+
+        ByteArrayOutputStream bs = new ByteArrayOutputStream();
+        ObjectOutputStream out = new ObjectOutputStream(bs);
+        out.writeObject(s);
+        byte[] data = bs.toByteArray();
+        ObjectInputStream in = new ObjectInputStream(
+                new ByteArrayInputStream(data));
+        @SuppressWarnings("unchecked")
+        S s2 = (S) in.readObject();
+
+        if (s.equals(s2)) {
+            System.out.println(s + " equals " + s2);
+        } else {
+            System.out.println(s + " does NOT equal " + s2);
+        }
+
+        return s2;
+    }
+
+    private static String toString(Object o) {
+        return String.valueOf(o);
+    }
+
+}
index 7e228bb7ca4d2bb2e900920c6b186a485f1883f2..7765764b47f724a5f731573fea80ccabd05eb428 100644 (file)
@@ -72,12 +72,17 @@ public class JavaScriptCallbackHelper implements Serializable {
 
     private void ensureRpc() {
         if (javascriptCallbackRpc == null) {
-            javascriptCallbackRpc = (String name, JsonArray arguments) -> {
-                JavaScriptFunction callback = callbacks.get(name);
-                try {
-                    callback.call(arguments);
-                } catch (JsonException e) {
-                    throw new IllegalArgumentException(e);
+            // Note that javascriptCallbackRpc is not a lambda to make sure it
+            // can be serialized properly
+            javascriptCallbackRpc = new JavaScriptCallbackRpc() {
+                @Override
+                public void call(String name, JsonArray arguments) {
+                    JavaScriptFunction callback = callbacks.get(name);
+                    try {
+                        callback.call(arguments);
+                    } catch (JsonException e) {
+                        throw new IllegalArgumentException(e);
+                    }
                 }
             };
             connector.registerRpc(javascriptCallbackRpc);