From 82033e827fcbfb396886df627a1f8d7c02359e9d Mon Sep 17 00:00:00 2001 From: Jonatan Kronqvist Date: Sun, 11 May 2014 12:38:08 +0300 Subject: [PATCH] Support long in state again (#13692) The fix to #9379 broke the support for long type fields in state classes. This patch bypasses the unboxing of long values and adds the @UnsafeNativeLong annotation to the methods which may fetch and return (without modifying) long values. SerializerTest is extended to test the different data types in States. Change-Id: I29fd2c6af13cd9a0d29ecb1444ed9eb8a2b013e3 --- .../ConnectorBundleLoaderFactory.java | 4 + .../metadata/FieldProperty.java | 12 +- .../tests/serialization/SerializerTest.java | 122 ++++++++++++++++++ .../client/SerializerTestConnector.java | 78 ++++++++++- .../widgetset/client/SerializerTestRpc.java | 2 + .../widgetset/client/SerializerTestState.java | 100 ++++++++++++++ .../server/SerializerTestExtension.java | 6 +- 7 files changed, 316 insertions(+), 8 deletions(-) create mode 100644 uitest/src/com/vaadin/tests/widgetset/client/SerializerTestState.java diff --git a/client-compiler/src/com/vaadin/server/widgetsetutils/ConnectorBundleLoaderFactory.java b/client-compiler/src/com/vaadin/server/widgetsetutils/ConnectorBundleLoaderFactory.java index 75225c52dc..cc1841ec05 100644 --- a/client-compiler/src/com/vaadin/server/widgetsetutils/ConnectorBundleLoaderFactory.java +++ b/client-compiler/src/com/vaadin/server/widgetsetutils/ConnectorBundleLoaderFactory.java @@ -189,6 +189,8 @@ public class ConnectorBundleLoaderFactory extends Generator { if (isNative) { outdent(); println("}-*/;"); + // To support fields of type long (#13692) + println("@com.google.gwt.core.client.UnsafeNativeLong"); println("private native void %s(%s) /*-{", newMethod, args); } else { println("%s();", newMethod); @@ -313,6 +315,8 @@ public class ConnectorBundleLoaderFactory extends Generator { // Separate method for loading native JS stuff (e.g. callbacks) String loadNativeJsMethodName = "loadNativeJs"; + // To support fields of type long (#13692) + w.println("@com.google.gwt.core.client.UnsafeNativeLong"); w.println("private native void %s(%s store) /*-{", loadNativeJsMethodName, TypeDataStore.class.getName()); w.indent(); diff --git a/client-compiler/src/com/vaadin/server/widgetsetutils/metadata/FieldProperty.java b/client-compiler/src/com/vaadin/server/widgetsetutils/metadata/FieldProperty.java index a31dafe05c..6c242dfd74 100644 --- a/client-compiler/src/com/vaadin/server/widgetsetutils/metadata/FieldProperty.java +++ b/client-compiler/src/com/vaadin/server/widgetsetutils/metadata/FieldProperty.java @@ -45,17 +45,25 @@ public class FieldProperty extends Property { @Override public void writeSetterBody(TreeLogger logger, SourceWriter w, String beanVariable, String valueVariable) { + // Don't try to unbox Longs in javascript, as it's not supported. + // (#13692) + boolean shouldUnbox = !"long".equals(field.getType() + .getSimpleSourceName()); w.println("%s.@%s::%s = %s;", beanVariable, getBeanType() - .getQualifiedSourceName(), getName(), unboxValue(valueVariable)); + .getQualifiedSourceName(), getName(), + shouldUnbox ? unboxValue(valueVariable) : valueVariable); } @Override public void writeGetterBody(TreeLogger logger, SourceWriter w, String beanVariable) { + // Longs are not unboxed, as it's not supported. (#13692) + boolean shouldBox = !"long".equals(field.getType() + .getSimpleSourceName()); String value = String.format("%s.@%s::%s", beanVariable, getBeanType() .getQualifiedSourceName(), getName()); w.print("return "); - w.print(boxValue(value)); + w.print(shouldBox ? boxValue(value) : value); w.println(";"); } diff --git a/uitest/src/com/vaadin/tests/serialization/SerializerTest.java b/uitest/src/com/vaadin/tests/serialization/SerializerTest.java index 990b350c97..1c18fb1912 100644 --- a/uitest/src/com/vaadin/tests/serialization/SerializerTest.java +++ b/uitest/src/com/vaadin/tests/serialization/SerializerTest.java @@ -38,6 +38,7 @@ import com.vaadin.tests.components.AbstractTestUI; import com.vaadin.tests.util.Log; import com.vaadin.tests.widgetset.client.ComplexTestBean; import com.vaadin.tests.widgetset.client.SerializerTestRpc; +import com.vaadin.tests.widgetset.client.SerializerTestState; import com.vaadin.tests.widgetset.client.SimpleTestBean; import com.vaadin.tests.widgetset.server.SerializerTestExtension; @@ -58,44 +59,110 @@ public class SerializerTest extends AbstractTestUI { SerializerTestRpc rpc = testExtension .getRpcProxy(SerializerTestRpc.class); + SerializerTestState state = testExtension.getState(); + rpc.sendBeanSubclass(new SimpleTestBean() { @Override public int getValue() { return 42; } }); + state.simpleTestBean = new SimpleTestBean() { + @Override + public int getValue() { + return 42; + } + }; + rpc.sendBoolean(true, Boolean.FALSE, new boolean[] { true, true, false, true, false, false }); + state.booleanValue = true; + state.booleanObjectValue = Boolean.FALSE; + state.booleanArray = new boolean[] { true, true, false, true, false, + false }; + rpc.sendByte((byte) 5, Byte.valueOf((byte) -12), new byte[] { 3, 1, 2 }); + state.byteValue = (byte) 5; + state.byteObjectValue = Byte.valueOf((byte) -12); + state.byteArray = new byte[] { 3, 1, 2 }; + rpc.sendChar('\u222b', Character.valueOf('å'), "aBcD".toCharArray()); + state.charValue = '\u222b'; + state.charObjectValue = Character.valueOf('å'); + state.charArray = "aBcD".toCharArray(); + rpc.sendInt(Integer.MAX_VALUE, Integer.valueOf(0), new int[] { 5, 7 }); + state.intValue = Integer.MAX_VALUE; + state.intObjectValue = Integer.valueOf(0); + state.intArray = new int[] { 5, 7 }; + rpc.sendLong(577431841358l, Long.valueOf(0), new long[] { -57841235865l, 57 }); + state.longValue = 577431841358l; + state.longObjectValue = Long.valueOf(0); + state.longArray = new long[] { -57841235865l, 57 }; + rpc.sendFloat(3.14159f, Float.valueOf(Math.nextUp(1)), new float[] { 57, 0, -12 }); + state.floatValue = 3.14159f; + state.floatObjectValue = Float.valueOf(Math.nextUp(1)); + state.floatArray = new float[] { 57, 0, -12 }; + rpc.sendDouble(Math.PI, Double.valueOf(-Math.E), new double[] { Double.MAX_VALUE, Double.MIN_VALUE }); + state.doubleValue = Math.PI; + state.doubleValue = Double.valueOf(-Math.E); + state.doubleArray = new double[] { Double.MAX_VALUE, Double.MIN_VALUE }; + rpc.sendString("This is a tesing string ‡"); + state.string = "This is a tesing string ‡"; + rpc.sendConnector(this); + state.connector = this; + rpc.sendBean( new ComplexTestBean(new SimpleTestBean(0), new SimpleTestBean(1), Arrays.asList( new SimpleTestBean(3), new SimpleTestBean(4)), 5), new SimpleTestBean(6), new SimpleTestBean[] { new SimpleTestBean(7) }); + state.complexTestBean = new ComplexTestBean(new SimpleTestBean(0), + new SimpleTestBean(1), Arrays.asList(new SimpleTestBean(3), + new SimpleTestBean(4)), 5); + state.simpleTestBean = new SimpleTestBean(6); + state.simpleTestBeanArray = new SimpleTestBean[] { new SimpleTestBean(7) }; + rpc.sendNull("Not null", null); + state.nullString = null; + rpc.sendNestedArray(new int[][] { { 5 }, { 7 } }, new SimpleTestBean[][] { { new SimpleTestBean(4), new SimpleTestBean(2) } }); + state.nestedIntArray = new int[][] { { 5 }, { 7 } }; + state.nestedBeanArray = new SimpleTestBean[][] { { + new SimpleTestBean(4), new SimpleTestBean(2) } }; + rpc.sendList(Arrays.asList(5, 8, -234), Arrays. asList(this, testExtension), Arrays.asList(new SimpleTestBean(234), new SimpleTestBean(-568))); + state.intList = Arrays.asList(5, 8, -234); + state.connectorList = Arrays. asList(this, testExtension); + state.simpleTestBeanList = Arrays.asList(new SimpleTestBean(234), + new SimpleTestBean(-568)); + rpc.sendArrayList( Arrays.asList(new int[] { 1, 2 }, new int[] { 3, 4 }), Arrays.asList(new Integer[] { 5, 6 }, new Integer[] { 7, 8 }), Collections .singletonList(new SimpleTestBean[] { new SimpleTestBean( 7) })); + state.primitiveArrayList = Arrays.asList(new int[] { 1, 2 }, new int[] { + 3, 4 }); + state.objectArrayList = Arrays.asList(new Integer[] { 5, 6 }, + new Integer[] { 7, 8 }); + state.beanArrayList = Collections + .singletonList(new SimpleTestBean[] { new SimpleTestBean(7) }); + // Disabled because of #8861 // rpc.sendListArray( // new List[] { Arrays.asList(1, 2), Arrays.asList(3, 4) }, @@ -103,6 +170,11 @@ public class SerializerTest extends AbstractTestUI { rpc.sendSet(new HashSet(Arrays.asList(4, 7, 12)), Collections .singleton((Connector) this), new HashSet( Arrays.asList(new SimpleTestBean(1), new SimpleTestBean(2)))); + state.intSet = new HashSet(Arrays.asList(4, 7, 12)); + state.connectorSet = Collections.singleton((Connector) this); + + state.beanSet = new HashSet(Arrays.asList( + new SimpleTestBean(1), new SimpleTestBean(2))); rpc.sendMap(new HashMap() { { @@ -125,6 +197,31 @@ public class SerializerTest extends AbstractTestUI { put(new SimpleTestBean(-4), new SimpleTestBean(4)); } }); + state.stringMap = new HashMap() { + { + put("1", new SimpleTestBean(1)); + put("2", new SimpleTestBean(2)); + } + }; + state.connectorMap = new HashMap() { + { + put(testExtension, new SimpleTestBean(3)); + put(getUI(), new SimpleTestBean(4)); + } + }; + state.intMap = new HashMap() { + { + put(5, testExtension); + put(10, getUI()); + } + }; + state.beanMap = new HashMap() { + { + put(new SimpleTestBean(5), new SimpleTestBean(-5)); + put(new SimpleTestBean(-4), new SimpleTestBean(4)); + } + }; + rpc.sendWrappedGenerics(new HashMap, Map>>() { { put(Collections.singleton(new SimpleTestBean(42)), @@ -136,13 +233,32 @@ public class SerializerTest extends AbstractTestUI { }); } }); + state.generics = new HashMap, Map>>() { + { + put(Collections.singleton(new SimpleTestBean(42)), + new HashMap>() { + { + put(1, Arrays.asList(new SimpleTestBean(1), + new SimpleTestBean(3))); + } + }); + } + }; rpc.sendEnum(ContentMode.TEXT, new ContentMode[] { ContentMode.PREFORMATTED, ContentMode.XML }, Arrays.asList(ContentMode.HTML, ContentMode.RAW)); + state.contentMode = ContentMode.TEXT; + state.array = new ContentMode[] { ContentMode.PREFORMATTED, + ContentMode.XML }; + state.list = Arrays.asList(ContentMode.HTML, ContentMode.RAW); + rpc.sendDate(new Date(1)); rpc.sendDate(new Date(2013 - 1900, 5 - 1, 31, 11, 12, 13)); + state.date1 = new Date(1); + state.date2 = new Date(2013 - 1900, 5 - 1, 31, 11, 12, 13); + testExtension.registerRpc(new SerializerTestRpc() { @Override public void sendBoolean(boolean value, Boolean boxedValue, @@ -331,6 +447,12 @@ public class SerializerTest extends AbstractTestUI { log.log("sendDate: " + format.format(date)); } + @Override + public void log(String string) { + log.log(string); + + } + }); } diff --git a/uitest/src/com/vaadin/tests/widgetset/client/SerializerTestConnector.java b/uitest/src/com/vaadin/tests/widgetset/client/SerializerTestConnector.java index f1917aaeb9..0ef4b664ac 100644 --- a/uitest/src/com/vaadin/tests/widgetset/client/SerializerTestConnector.java +++ b/uitest/src/com/vaadin/tests/widgetset/client/SerializerTestConnector.java @@ -257,6 +257,11 @@ public class SerializerTestConnector extends AbstractExtensionConnector { public void sendDate(Date date) { rpc.sendDate(date); } + + @Override + public void log(String message) { + // Do nothing, used only in the other direction + } }); } @@ -271,13 +276,80 @@ public class SerializerTestConnector extends AbstractExtensionConnector { } @Override - public ComplexTestBean getState() { - return (ComplexTestBean) super.getState(); + public SerializerTestState getState() { + return (SerializerTestState) super.getState(); } @Override public void onStateChanged(StateChangeEvent stateChangeEvent) { - // TODO do something clever + rpc.log("state.booleanValue: " + getState().booleanValue); + rpc.log("state.booleanObjectValue: " + getState().booleanObjectValue); + rpc.log("state.booleanArray: " + getState().booleanArray); + + rpc.log("state.byteValue: " + getState().byteValue); + rpc.log("state.byteObjectValue: " + getState().byteObjectValue); + rpc.log("state.byteArray: " + getState().byteArray); + + rpc.log("state.charValue: " + getState().charValue); + rpc.log("state.charObjectValue: " + getState().charObjectValue); + rpc.log("state.charArray: " + String.valueOf(getState().charArray)); + + rpc.log("state.intValue: " + getState().intValue); + rpc.log("state.intObjectValue: " + getState().intObjectValue); + rpc.log("state.intArray: " + getState().intArray); + + rpc.log("state.longValue: " + getState().longValue); + rpc.log("state.longObjectValue: " + getState().longObjectValue); + rpc.log("state.longArray: " + getState().longArray); + + rpc.log("state.floatValue: " + getState().floatValue); + rpc.log("state.floatObjectValue: " + getState().floatObjectValue); + rpc.log("state.floatArray: " + getState().floatArray); + + rpc.log("state.doubleValue: " + getState().doubleValue); + rpc.log("state.doubleObjectValue: " + getState().doubleObjectValue); + rpc.log("state.doubleArray: " + getState().doubleArray); + + /* + * TODO public double doubleValue; public Double DoubleValue; public + * double[] doubleArray; ; + * + * public String string; + * + * public String nullString; + * + * public Connector connector; + * + * public ComplexTestBean complexTestBean; public SimpleTestBean + * simpleTestBean; public SimpleTestBean[] simpleTestBeanArray; public + * int[][] nestedIntArray; public SimpleTestBean[][] nestedBeanArray; + * + * public List intList; public List connectorList; + * public List simpleTestBeanList; + * + * public List primitiveArrayList; public List + * objectArrayList; public List beanArrayList; + * + * public List[] objectListArray; public List[] + * beanListArray; + * + * public Set intSet; public Set connectorSet; + * public Set beanSet; + * + * public Map stringMap; public Map connectorMap; public Map intMap; + * public Map beanMap; + * + * public Map, Map>> + * generics; + * + * public ContentMode contentMode; public ContentMode[] array; public + * List list; + * + * public SimpleTestBean bean; + * + * public Date date1; public Date date2; + */ } @Override diff --git a/uitest/src/com/vaadin/tests/widgetset/client/SerializerTestRpc.java b/uitest/src/com/vaadin/tests/widgetset/client/SerializerTestRpc.java index 1c0784d8b4..6b4c4e7ac1 100644 --- a/uitest/src/com/vaadin/tests/widgetset/client/SerializerTestRpc.java +++ b/uitest/src/com/vaadin/tests/widgetset/client/SerializerTestRpc.java @@ -81,4 +81,6 @@ public interface SerializerTestRpc extends ServerRpc, ClientRpc { public void sendBeanSubclass(SimpleTestBean bean); public void sendDate(Date date); + + public void log(String string); } diff --git a/uitest/src/com/vaadin/tests/widgetset/client/SerializerTestState.java b/uitest/src/com/vaadin/tests/widgetset/client/SerializerTestState.java new file mode 100644 index 0000000000..d22165b2bb --- /dev/null +++ b/uitest/src/com/vaadin/tests/widgetset/client/SerializerTestState.java @@ -0,0 +1,100 @@ +/* + * Copyright 2000-2014 Vaadin Ltd. + * + * Licensed under the Apache License; Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing; software + * distributed under the License is distributed on an "AS IS" BASIS; WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND; either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ +package com.vaadin.tests.widgetset.client; + +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import com.vaadin.shared.AbstractComponentState; +import com.vaadin.shared.Connector; +import com.vaadin.shared.ui.label.ContentMode; + +public class SerializerTestState extends AbstractComponentState { + + public boolean booleanValue; + public Boolean booleanObjectValue; + public boolean[] booleanArray; + + public byte byteValue; + public Byte byteObjectValue; + public byte[] byteArray; + + public char charValue; + public Character charObjectValue; + public char[] charArray; + + public int intValue; + public Integer intObjectValue; + public int[] intArray; + + public long longValue; + public Long longObjectValue; + public long[] longArray; + + public float floatValue; + public Float floatObjectValue; + public float[] floatArray; + + public double doubleValue; + public Double doubleObjectValue; + public double[] doubleArray; + + public String string; + + public String nullString; + + public Connector connector; + + public ComplexTestBean complexTestBean; + public SimpleTestBean simpleTestBean; + public SimpleTestBean[] simpleTestBeanArray; + public int[][] nestedIntArray; + public SimpleTestBean[][] nestedBeanArray; + + public List intList; + public List connectorList; + public List simpleTestBeanList; + + public List primitiveArrayList; + public List objectArrayList; + public List beanArrayList; + + public List[] objectListArray; + public List[] beanListArray; + + public Set intSet; + public Set connectorSet; + public Set beanSet; + + public Map stringMap; + public Map connectorMap; + public Map intMap; + public Map beanMap; + + public Map, Map>> generics; + + public ContentMode contentMode; + public ContentMode[] array; + public List list; + + public SimpleTestBean bean; + + public Date date1; + public Date date2; + +} diff --git a/uitest/src/com/vaadin/tests/widgetset/server/SerializerTestExtension.java b/uitest/src/com/vaadin/tests/widgetset/server/SerializerTestExtension.java index c42b8749c2..5fc5c19497 100644 --- a/uitest/src/com/vaadin/tests/widgetset/server/SerializerTestExtension.java +++ b/uitest/src/com/vaadin/tests/widgetset/server/SerializerTestExtension.java @@ -18,8 +18,8 @@ package com.vaadin.tests.widgetset.server; import com.vaadin.server.AbstractExtension; import com.vaadin.shared.communication.ClientRpc; -import com.vaadin.tests.widgetset.client.ComplexTestBean; import com.vaadin.tests.widgetset.client.SerializerTestRpc; +import com.vaadin.tests.widgetset.client.SerializerTestState; public class SerializerTestExtension extends AbstractExtension { @@ -29,8 +29,8 @@ public class SerializerTestExtension extends AbstractExtension { } @Override - public ComplexTestBean getState() { - return (ComplexTestBean) super.getState(); + public SerializerTestState getState() { + return (SerializerTestState) super.getState(); } public void registerRpc(SerializerTestRpc rpc) { -- 2.39.5