Browse Source

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
tags/7.2.0
Jonatan Kronqvist 10 years ago
parent
commit
82033e827f

+ 4
- 0
client-compiler/src/com/vaadin/server/widgetsetutils/ConnectorBundleLoaderFactory.java View File

@@ -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();

+ 10
- 2
client-compiler/src/com/vaadin/server/widgetsetutils/metadata/FieldProperty.java View File

@@ -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(";");
}


+ 122
- 0
uitest/src/com/vaadin/tests/serialization/SerializerTest.java View File

@@ -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.<Connector> asList(this,
testExtension), Arrays.asList(new SimpleTestBean(234),
new SimpleTestBean(-568)));
state.intList = Arrays.asList(5, 8, -234);
state.connectorList = Arrays.<Connector> 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<Integer>(Arrays.asList(4, 7, 12)), Collections
.singleton((Connector) this), new HashSet<SimpleTestBean>(
Arrays.asList(new SimpleTestBean(1), new SimpleTestBean(2))));
state.intSet = new HashSet<Integer>(Arrays.asList(4, 7, 12));
state.connectorSet = Collections.singleton((Connector) this);

state.beanSet = new HashSet<SimpleTestBean>(Arrays.asList(
new SimpleTestBean(1), new SimpleTestBean(2)));

rpc.sendMap(new HashMap<String, SimpleTestBean>() {
{
@@ -125,6 +197,31 @@ public class SerializerTest extends AbstractTestUI {
put(new SimpleTestBean(-4), new SimpleTestBean(4));
}
});
state.stringMap = new HashMap<String, SimpleTestBean>() {
{
put("1", new SimpleTestBean(1));
put("2", new SimpleTestBean(2));
}
};
state.connectorMap = new HashMap<Connector, SimpleTestBean>() {
{
put(testExtension, new SimpleTestBean(3));
put(getUI(), new SimpleTestBean(4));
}
};
state.intMap = new HashMap<Integer, Connector>() {
{
put(5, testExtension);
put(10, getUI());
}
};
state.beanMap = new HashMap<SimpleTestBean, SimpleTestBean>() {
{
put(new SimpleTestBean(5), new SimpleTestBean(-5));
put(new SimpleTestBean(-4), new SimpleTestBean(4));
}
};

rpc.sendWrappedGenerics(new HashMap<Set<SimpleTestBean>, Map<Integer, List<SimpleTestBean>>>() {
{
put(Collections.singleton(new SimpleTestBean(42)),
@@ -136,13 +233,32 @@ public class SerializerTest extends AbstractTestUI {
});
}
});
state.generics = new HashMap<Set<SimpleTestBean>, Map<Integer, List<SimpleTestBean>>>() {
{
put(Collections.singleton(new SimpleTestBean(42)),
new HashMap<Integer, List<SimpleTestBean>>() {
{
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);

}

});
}


+ 75
- 3
uitest/src/com/vaadin/tests/widgetset/client/SerializerTestConnector.java View File

@@ -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<Integer> intList; public List<Connector> connectorList;
* public List<SimpleTestBean> simpleTestBeanList;
*
* public List<int[]> primitiveArrayList; public List<Integer[]>
* objectArrayList; public List<SimpleTestBean[]> beanArrayList;
*
* public List<Integer>[] objectListArray; public List<SimpleTestBean>[]
* beanListArray;
*
* public Set<Integer> intSet; public Set<Connector> connectorSet;
* public Set<SimpleTestBean> beanSet;
*
* public Map<String, SimpleTestBean> stringMap; public Map<Connector,
* SimpleTestBean> connectorMap; public Map<Integer, Connector> intMap;
* public Map<SimpleTestBean, SimpleTestBean> beanMap;
*
* public Map<Set<SimpleTestBean>, Map<Integer, List<SimpleTestBean>>>
* generics;
*
* public ContentMode contentMode; public ContentMode[] array; public
* List<ContentMode> list;
*
* public SimpleTestBean bean;
*
* public Date date1; public Date date2;
*/
}

@Override

+ 2
- 0
uitest/src/com/vaadin/tests/widgetset/client/SerializerTestRpc.java View File

@@ -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);
}

+ 100
- 0
uitest/src/com/vaadin/tests/widgetset/client/SerializerTestState.java View File

@@ -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<Integer> intList;
public List<Connector> connectorList;
public List<SimpleTestBean> simpleTestBeanList;

public List<int[]> primitiveArrayList;
public List<Integer[]> objectArrayList;
public List<SimpleTestBean[]> beanArrayList;

public List<Integer>[] objectListArray;
public List<SimpleTestBean>[] beanListArray;

public Set<Integer> intSet;
public Set<Connector> connectorSet;
public Set<SimpleTestBean> beanSet;

public Map<String, SimpleTestBean> stringMap;
public Map<Connector, SimpleTestBean> connectorMap;
public Map<Integer, Connector> intMap;
public Map<SimpleTestBean, SimpleTestBean> beanMap;

public Map<Set<SimpleTestBean>, Map<Integer, List<SimpleTestBean>>> generics;

public ContentMode contentMode;
public ContentMode[] array;
public List<ContentMode> list;

public SimpleTestBean bean;

public Date date1;
public Date date2;

}

+ 3
- 3
uitest/src/com/vaadin/tests/widgetset/server/SerializerTestExtension.java View File

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

Loading…
Cancel
Save