summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--client-compiler/src/com/vaadin/server/widgetsetutils/metadata/ArraySerializer.java7
-rw-r--r--client-compiler/src/com/vaadin/server/widgetsetutils/metadata/ServerRpcVisitor.java1
-rw-r--r--client/src/com/vaadin/client/ApplicationConnection.java28
-rw-r--r--client/src/com/vaadin/client/communication/JsonEncoder.java146
-rw-r--r--client/src/com/vaadin/client/communication/URLReference_Serializer.java3
-rw-r--r--server/src/com/vaadin/server/JsonCodec.java13
-rw-r--r--uitest/src/com/vaadin/tests/serialization/SerializerTest.html41
-rw-r--r--uitest/src/com/vaadin/tests/serialization/SerializerTest.java26
-rw-r--r--uitest/src/com/vaadin/tests/widgetset/client/SerializerTestConnector.java14
-rw-r--r--uitest/src/com/vaadin/tests/widgetset/client/SerializerTestRpc.java4
10 files changed, 175 insertions, 108 deletions
diff --git a/client-compiler/src/com/vaadin/server/widgetsetutils/metadata/ArraySerializer.java b/client-compiler/src/com/vaadin/server/widgetsetutils/metadata/ArraySerializer.java
index 4ab5cccb2e..7b326c65fc 100644
--- a/client-compiler/src/com/vaadin/server/widgetsetutils/metadata/ArraySerializer.java
+++ b/client-compiler/src/com/vaadin/server/widgetsetutils/metadata/ArraySerializer.java
@@ -73,14 +73,17 @@ public class ArraySerializer extends JsonSerializer {
@Override
protected void printSerializerBody(TreeLogger logger, SourceWriter w,
String value, String applicationConnection) {
+ JType componentType = arrayType.getComponentType();
+
w.println(JSONArray.class.getName() + " values = new "
+ JSONArray.class.getName() + "();");
// JPrimitiveType primitive = componentType.isPrimitive();
w.println("for (int i = 0; i < " + value + ".length; i++) {");
w.indent();
w.print("values.set(i, ");
- w.print(JsonEncoder.class.getName() + ".encode(" + value
- + "[i], false, " + applicationConnection + ")");
+ w.print(JsonEncoder.class.getName() + ".encode(" + value + "[i],");
+ ConnectorBundleLoaderFactory.writeTypeCreator(w, componentType);
+ w.print(", " + applicationConnection + ")");
w.println(");");
w.outdent();
w.println("}");
diff --git a/client-compiler/src/com/vaadin/server/widgetsetutils/metadata/ServerRpcVisitor.java b/client-compiler/src/com/vaadin/server/widgetsetutils/metadata/ServerRpcVisitor.java
index fa0a8390a4..e14e8234d5 100644
--- a/client-compiler/src/com/vaadin/server/widgetsetutils/metadata/ServerRpcVisitor.java
+++ b/client-compiler/src/com/vaadin/server/widgetsetutils/metadata/ServerRpcVisitor.java
@@ -38,6 +38,7 @@ public class ServerRpcVisitor extends TypeVisitor {
for (JMethod method : methods) {
ClientRpcVisitor.checkReturnType(logger, method);
bundle.setNeedsDelayedInfo(type, method);
+ bundle.setNeedsParamTypes(subType, method);
JType[] parameterTypes = method.getParameterTypes();
for (JType paramType : parameterTypes) {
diff --git a/client/src/com/vaadin/client/ApplicationConnection.java b/client/src/com/vaadin/client/ApplicationConnection.java
index ff59a76832..00b0d75c6c 100644
--- a/client/src/com/vaadin/client/ApplicationConnection.java
+++ b/client/src/com/vaadin/client/ApplicationConnection.java
@@ -71,6 +71,7 @@ import com.vaadin.client.communication.RpcManager;
import com.vaadin.client.communication.StateChangeEvent;
import com.vaadin.client.extensions.AbstractExtensionConnector;
import com.vaadin.client.metadata.ConnectorBundleLoader;
+import com.vaadin.client.metadata.Method;
import com.vaadin.client.metadata.NoDataException;
import com.vaadin.client.metadata.Property;
import com.vaadin.client.metadata.Type;
@@ -2393,12 +2394,29 @@ public class ApplicationConnection {
invocationJson.set(2,
new JSONString(invocation.getMethodName()));
JSONArray paramJson = new JSONArray();
- boolean restrictToInternalTypes = isLegacyVariableChange(invocation);
+
+ Type[] parameterTypes = null;
+ if (!isLegacyVariableChange(invocation)) {
+ try {
+ Type type = new Type(invocation.getInterfaceName(),
+ null);
+ Method method = type.getMethod(invocation
+ .getMethodName());
+ parameterTypes = method.getParameterTypes();
+ } catch (NoDataException e) {
+ throw new RuntimeException("No type data for "
+ + invocation.toString(), e);
+ }
+ }
+
for (int i = 0; i < invocation.getParameters().length; ++i) {
- // TODO non-static encoder? type registration?
- paramJson.set(i, JsonEncoder.encode(
- invocation.getParameters()[i],
- restrictToInternalTypes, this));
+ // TODO non-static encoder?
+ Type type = null;
+ if (parameterTypes != null) {
+ type = parameterTypes[i];
+ }
+ Object value = invocation.getParameters()[i];
+ paramJson.set(i, JsonEncoder.encode(value, type, this));
}
invocationJson.set(3, paramJson);
reqJson.set(reqJson.size(), invocationJson);
diff --git a/client/src/com/vaadin/client/communication/JsonEncoder.java b/client/src/com/vaadin/client/communication/JsonEncoder.java
index 0756d6b069..f3262c0106 100644
--- a/client/src/com/vaadin/client/communication/JsonEncoder.java
+++ b/client/src/com/vaadin/client/communication/JsonEncoder.java
@@ -59,8 +59,8 @@ public class JsonEncoder {
* @param connection
* @return JSON representation of the value
*/
- public static JSONValue encode(Object value,
- boolean restrictToInternalTypes, ApplicationConnection connection) {
+ public static JSONValue encode(Object value, Type type,
+ ApplicationConnection connection) {
if (null == value) {
return JSONNull.getInstance();
} else if (value instanceof JSONValue) {
@@ -80,55 +80,58 @@ public class JsonEncoder {
return new JSONNumber((Byte) value);
} else if (value instanceof Character) {
return new JSONString(String.valueOf(value));
- } else if (value instanceof Object[]) {
- return encodeObjectArray((Object[]) value, restrictToInternalTypes,
- connection);
+ } else if (value instanceof Object[] && type == null) {
+ // Non-legacy arrays handed by generated serializer
+ return encodeLegacyObjectArray((Object[]) value, connection);
} else if (value instanceof Enum) {
return encodeEnum((Enum<?>) value, connection);
} else if (value instanceof Map) {
- return encodeMap((Map) value, restrictToInternalTypes, connection);
+ return encodeMap((Map) value, type, connection);
} else if (value instanceof Connector) {
Connector connector = (Connector) value;
return new JSONString(connector.getConnectorId());
} else if (value instanceof Collection) {
- return encodeCollection((Collection) value,
- restrictToInternalTypes, connection);
+ return encodeCollection((Collection) value, type, connection);
} else if (value instanceof UidlValue) {
return encodeVariableChange((UidlValue) value, connection);
} else {
+ // First see if there's a custom serializer
+ JSONSerializer<Object> serializer = null;
+ if (type != null) {
+ serializer = (JSONSerializer<Object>) type.findSerializer();
+ if (serializer != null) {
+ return serializer.serialize(value, connection);
+ }
+ }
+
String transportType = getTransportType(value);
if (transportType != null) {
+ // Send the string value for remaining legacy types
return new JSONString(String.valueOf(value));
- } else {
- // Try to find a generated serializer object, class name is the
- // type
- Type type = new Type(value.getClass());
-
- JSONSerializer<Object> serializer = (JSONSerializer<Object>) type
- .findSerializer();
- if (serializer != null) {
- return serializer.serialize(value, connection);
- } else {
- try {
- Collection<Property> properties = type.getProperties();
-
- JSONObject jsonObject = new JSONObject();
- for (Property property : properties) {
- Object propertyValue = property.getValue(value);
- JSONValue encodedPropertyValue = encode(
- propertyValue, restrictToInternalTypes,
- connection);
- jsonObject.put(property.getName(),
- encodedPropertyValue);
- }
- return jsonObject;
-
- } catch (NoDataException e) {
- throw new RuntimeException("Can not encode "
- + type.getSignature(), e);
+ } else if (type != null) {
+ // And finally try using bean serialization logic
+ try {
+ Collection<Property> properties = type.getProperties();
+
+ JSONObject jsonObject = new JSONObject();
+ for (Property property : properties) {
+ Object propertyValue = property.getValue(value);
+ Type propertyType = property.getType();
+ JSONValue encodedPropertyValue = encode(propertyValue,
+ propertyType, connection);
+ jsonObject
+ .put(property.getName(), encodedPropertyValue);
}
+ return jsonObject;
+
+ } catch (NoDataException e) {
+ throw new RuntimeException("Can not encode "
+ + type.getSignature(), e);
}
+ } else {
+ throw new RuntimeException("Can't encode " + value.getClass()
+ + " without type information");
}
}
}
@@ -152,13 +155,13 @@ public class JsonEncoder {
+ valueType);
}
jsonArray.set(0, new JSONString(transportType));
- jsonArray.set(1, encode(value, true, connection));
+ jsonArray.set(1, encode(value, null, connection));
return jsonArray;
}
- private static JSONValue encodeMap(Map<Object, Object> map,
- boolean restrictToInternalTypes, ApplicationConnection connection) {
+ private static JSONValue encodeMap(Map<Object, Object> map, Type type,
+ ApplicationConnection connection) {
/*
* As we have no info about declared types, we instead select encoding
* scheme based on actual type of first key. We can't do this if there's
@@ -171,26 +174,43 @@ public class JsonEncoder {
Object firstKey = map.keySet().iterator().next();
if (firstKey instanceof String) {
- return encodeStringMap(map, restrictToInternalTypes, connection);
- } else if (restrictToInternalTypes) {
+ return encodeStringMap(map, type, connection);
+ } else if (type == null) {
throw new IllegalStateException(
"Only string keys supported for legacy maps");
} else if (firstKey instanceof Connector) {
- return encodeConnectorMap(map, connection);
+ return encodeConnectorMap(map, type, connection);
} else {
- return encodeObjectMap(map, connection);
+ return encodeObjectMap(map, type, connection);
+ }
+ }
+
+ private static JSONValue encodeChildValue(Object value,
+ Type collectionType, int typeIndex, ApplicationConnection connection) {
+ if (collectionType == null) {
+ return encode(new UidlValue(value), null, connection);
+ } else {
+ assert collectionType.getParameterTypes() != null
+ && collectionType.getParameterTypes().length > typeIndex
+ && collectionType.getParameterTypes()[typeIndex] != null : "Proper generics required for encoding child value, assertion failed for "
+ + collectionType;
+ Type childType = collectionType.getParameterTypes()[typeIndex];
+ return encode(value, childType, connection);
}
}
private static JSONValue encodeObjectMap(Map<Object, Object> map,
- ApplicationConnection connection) {
+ Type type, ApplicationConnection connection) {
JSONArray keys = new JSONArray();
JSONArray values = new JSONArray();
+
+ assert type != null : "Should only be used for non-legacy types";
+
for (Entry<?, ?> entry : map.entrySet()) {
- // restrictToInternalTypes always false if we end up here
- keys.set(keys.size(), encode(entry.getKey(), false, connection));
+ keys.set(keys.size(),
+ encodeChildValue(entry.getKey(), type, 0, connection));
values.set(values.size(),
- encode(entry.getValue(), false, connection));
+ encodeChildValue(entry.getValue(), type, 1, connection));
}
JSONArray keysAndValues = new JSONArray();
@@ -201,14 +221,14 @@ public class JsonEncoder {
}
private static JSONValue encodeConnectorMap(Map<Object, Object> map,
- ApplicationConnection connection) {
+ Type type, ApplicationConnection connection) {
JSONObject jsonMap = new JSONObject();
for (Entry<?, ?> entry : map.entrySet()) {
Connector connector = (Connector) entry.getKey();
- // restrictToInternalTypes always false if we end up here
- JSONValue encodedValue = encode(entry.getValue(), false, connection);
+ JSONValue encodedValue = encodeChildValue(entry.getValue(), type,
+ 1, connection);
jsonMap.put(connector.getConnectorId(), encodedValue);
}
@@ -217,21 +237,14 @@ public class JsonEncoder {
}
private static JSONValue encodeStringMap(Map<Object, Object> map,
- boolean restrictToInternalTypes, ApplicationConnection connection) {
+ Type type, ApplicationConnection connection) {
JSONObject jsonMap = new JSONObject();
for (Entry<?, ?> entry : map.entrySet()) {
String key = (String) entry.getKey();
Object value = entry.getValue();
- if (restrictToInternalTypes) {
- value = new UidlValue(value);
- }
-
- JSONValue encodedValue = encode(value, restrictToInternalTypes,
- connection);
-
- jsonMap.put(key, encodedValue);
+ jsonMap.put(key, encodeChildValue(value, type, 1, connection));
}
return jsonMap;
@@ -242,28 +255,23 @@ public class JsonEncoder {
return new JSONString(e.toString());
}
- private static JSONValue encodeObjectArray(Object[] array,
- boolean restrictToInternalTypes, ApplicationConnection connection) {
+ private static JSONValue encodeLegacyObjectArray(Object[] array,
+ ApplicationConnection connection) {
JSONArray jsonArray = new JSONArray();
for (int i = 0; i < array.length; ++i) {
// TODO handle object graph loops?
Object value = array[i];
- if (restrictToInternalTypes) {
- value = new UidlValue(value);
- }
- jsonArray
- .set(i, encode(value, restrictToInternalTypes, connection));
+ jsonArray.set(i, encode(value, null, connection));
}
return jsonArray;
}
- private static JSONValue encodeCollection(Collection collection,
- boolean restrictToInternalTypes, ApplicationConnection connection) {
+ private static JSONValue encodeCollection(Collection collection, Type type,
+ ApplicationConnection connection) {
JSONArray jsonArray = new JSONArray();
int idx = 0;
for (Object o : collection) {
- JSONValue encodedObject = encode(o, restrictToInternalTypes,
- connection);
+ JSONValue encodedObject = encodeChildValue(o, type, 0, connection);
jsonArray.set(idx++, encodedObject);
}
if (collection instanceof Set) {
diff --git a/client/src/com/vaadin/client/communication/URLReference_Serializer.java b/client/src/com/vaadin/client/communication/URLReference_Serializer.java
index f004980e56..e455d4ee93 100644
--- a/client/src/com/vaadin/client/communication/URLReference_Serializer.java
+++ b/client/src/com/vaadin/client/communication/URLReference_Serializer.java
@@ -46,8 +46,9 @@ public class URLReference_Serializer implements JSONSerializer<URLReference> {
public JSONValue serialize(URLReference value,
ApplicationConnection connection) {
JSONObject json = new JSONObject();
+ // No type info required for encoding a String...
json.put(URL_FIELD,
- JsonEncoder.encode(value.getURL(), true, connection));
+ JsonEncoder.encode(value.getURL(), null, connection));
return json;
}
diff --git a/server/src/com/vaadin/server/JsonCodec.java b/server/src/com/vaadin/server/JsonCodec.java
index f7cbe79fdb..aeda8f622f 100644
--- a/server/src/com/vaadin/server/JsonCodec.java
+++ b/server/src/com/vaadin/server/JsonCodec.java
@@ -666,10 +666,13 @@ public class JsonCodec implements Serializable {
return encodeEnum((Enum<?>) value, connectorTracker);
} else if (value instanceof JSONArray || value instanceof JSONObject) {
return new EncodeResult(value);
- } else {
+ } else if (valueType instanceof Class<?>) {
// Any object that we do not know how to encode we encode by looping
// through fields
- return encodeObject(value, (JSONObject) diffState, connectorTracker);
+ return encodeObject(value, (Class<?>) valueType,
+ (JSONObject) diffState, connectorTracker);
+ } else {
+ throw new JSONException("Can not encode " + valueType);
}
}
@@ -687,14 +690,14 @@ public class JsonCodec implements Serializable {
return properties;
}
- private static EncodeResult encodeObject(Object value,
+ private static EncodeResult encodeObject(Object value, Class<?> valueType,
JSONObject referenceValue, ConnectorTracker connectorTracker)
throws JSONException {
JSONObject encoded = new JSONObject();
JSONObject diff = new JSONObject();
try {
- for (BeanProperty property : getProperties(value.getClass())) {
+ for (BeanProperty property : getProperties(valueType)) {
String fieldName = property.getName();
// We can't use PropertyDescriptor.getPropertyType() as it does
// not support generics
@@ -704,7 +707,7 @@ public class JsonCodec implements Serializable {
if (encoded.has(fieldName)) {
throw new RuntimeException(
"Can't encode "
- + value.getClass().getName()
+ + valueType.getName()
+ " as it has multiple properties with the name "
+ fieldName.toLowerCase()
+ ". This can happen if there are getters and setters for a public field (the framework can't know which to ignore) or if there are properties with only casing distinguishing between the names (e.g. getFoo() and getFOO())");
diff --git a/uitest/src/com/vaadin/tests/serialization/SerializerTest.html b/uitest/src/com/vaadin/tests/serialization/SerializerTest.html
index 46b1a9ed8b..63219de5c2 100644
--- a/uitest/src/com/vaadin/tests/serialization/SerializerTest.html
+++ b/uitest/src/com/vaadin/tests/serialization/SerializerTest.html
@@ -18,93 +18,98 @@
</tr>
<tr>
<td>assertText</td>
+ <td>vaadin=runcomvaadintestsserializationSerializerTest::/VVerticalLayout[0]/VVerticalLayout[0]/VVerticalLayout[0]/VLabel[18]</td>
+ <td>sendBeanSubclass: 43</td>
+</tr>
+<tr>
+ <td>assertText</td>
<td>vaadin=runcomvaadintestsserializationSerializerTest::/VVerticalLayout[0]/VVerticalLayout[0]/VVerticalLayout[0]/VLabel[17]</td>
- <td>1. sendBoolean: false, false, [false, false, true, false, true, true]</td>
+ <td>sendBoolean: false, false, [false, false, true, false, true, true]</td>
</tr>
<tr>
<td>assertText</td>
<td>vaadin=runcomvaadintestsserializationSerializerTest::/VVerticalLayout[0]/VVerticalLayout[0]/VVerticalLayout[0]/VLabel[16]</td>
- <td>2. sendByte: 5, -12, [3, 1, 2]</td>
+ <td>sendByte: 5, -12, [3, 1, 2]</td>
</tr>
<tr>
<td>assertText</td>
<td>vaadin=runcomvaadintestsserializationSerializerTest::/VVerticalLayout[0]/VVerticalLayout[0]/VVerticalLayout[0]/VLabel[15]</td>
- <td>3. sendChar: Å, ∫, [a, b, c, d]</td>
+ <td>sendChar: Å, ∫, [a, b, c, d]</td>
</tr>
<tr>
<td>assertText</td>
<td>vaadin=runcomvaadintestsserializationSerializerTest::/VVerticalLayout[0]/VVerticalLayout[0]/VVerticalLayout[0]/VLabel[14]</td>
- <td>4. sendInt: 2, 5, [2147483647, 0]</td>
+ <td>sendInt: 2, 5, [2147483647, 0]</td>
</tr>
<tr>
<td>assertText</td>
<td>vaadin=runcomvaadintestsserializationSerializerTest::/VVerticalLayout[0]/VVerticalLayout[0]/VVerticalLayout[0]/VLabel[13]</td>
- <td>5. sendLong: -57841235865, 577431841358, [57, 0]</td>
+ <td>sendLong: -57841235865, 577431841358, [57, 0]</td>
</tr>
<tr>
<td>assertText</td>
<td>vaadin=runcomvaadintestsserializationSerializerTest::/VVerticalLayout[0]/VVerticalLayout[0]/VVerticalLayout[0]/VLabel[12]</td>
- <td>6. sendFloat: 1.0000001, 3.14159, [-12.0, 0.0, 57.0]</td>
+ <td>sendFloat: 1.0000001, 3.14159, [-12.0, 0.0, 57.0]</td>
</tr>
<tr>
<td>assertText</td>
<td>vaadin=runcomvaadintestsserializationSerializerTest::/VVerticalLayout[0]/VVerticalLayout[0]/VVerticalLayout[0]/VLabel[11]</td>
- <td>7. sendDouble: 0.423310825130748, 5.859874482048838, [2.0, 1.7976931348623157E308, 4.9E-324]</td>
+ <td>sendDouble: 0.423310825130748, 5.859874482048838, [2.0, 1.7976931348623157E308, 4.9E-324]</td>
</tr>
<tr>
<td>assertText</td>
<td>vaadin=runcomvaadintestsserializationSerializerTest::/VVerticalLayout[0]/VVerticalLayout[0]/VVerticalLayout[0]/VLabel[10]</td>
- <td>8. sendString: Taegghiiiinnrsssstt‡</td>
+ <td>sendString: Taegghiiiinnrsssstt‡</td>
</tr>
<tr>
<td>assertText</td>
<td>vaadin=runcomvaadintestsserializationSerializerTest::/VVerticalLayout[0]/VVerticalLayout[0]/VVerticalLayout[0]/VLabel[9]</td>
- <td>9. sendConnector: com.vaadin.tests.widgetset.server.SerializerTestExtension</td>
+ <td>sendConnector: com.vaadin.tests.widgetset.server.SerializerTestExtension</td>
</tr>
<tr>
<td>assertText</td>
<td>vaadin=runcomvaadintestsserializationSerializerTest::/VVerticalLayout[0]/VVerticalLayout[0]/VVerticalLayout[0]/VLabel[8]</td>
- <td>10. sendBean: ComplexTestBean [innerBean1=SimpleTestBean(1), innerBean2=SimpleTestBean(3), innerBeanCollection=[SimpleTestBean(6), SimpleTestBean(0)], privimite=6], SimpleTestBean(0), [SimpleTestBean(7)]</td>
+ <td>sendBean: ComplexTestBean [innerBean1=SimpleTestBean(1), innerBean2=SimpleTestBean(3), innerBeanCollection=[SimpleTestBean(6), SimpleTestBean(0)], privimite=6], SimpleTestBean(0), [SimpleTestBean(7)]</td>
</tr>
<tr>
<td>assertText</td>
<td>vaadin=runcomvaadintestsserializationSerializerTest::/VVerticalLayout[0]/VVerticalLayout[0]/VVerticalLayout[0]/VLabel[7]</td>
- <td>11. sendNull: null, Not null</td>
+ <td>sendNull: null, Not null</td>
</tr>
<tr>
<td>assertText</td>
<td>vaadin=runcomvaadintestsserializationSerializerTest::/VVerticalLayout[0]/VVerticalLayout[0]/VVerticalLayout[0]/VLabel[6]</td>
- <td>12. sendNestedArray: [[7, 5]], [[SimpleTestBean(2)], [SimpleTestBean(4)]]</td>
+ <td>sendNestedArray: [[7, 5]], [[SimpleTestBean(2)], [SimpleTestBean(4)]]</td>
</tr>
<tr>
<td>assertText</td>
<td>vaadin=runcomvaadintestsserializationSerializerTest::/VVerticalLayout[0]/VVerticalLayout[0]/VVerticalLayout[0]/VLabel[5]</td>
- <td>13. sendList: [-234, 5, 8], class com.vaadin.tests.widgetset.server.SerializerTestExtension, class com.vaadin.tests.serialization.SerializerTest, [SimpleTestBean(-568), SimpleTestBean(234)]</td>
+ <td>sendList: [-234, 5, 8], class com.vaadin.tests.widgetset.server.SerializerTestExtension, class com.vaadin.tests.serialization.SerializerTest, [SimpleTestBean(-568), SimpleTestBean(234)]</td>
</tr>
<tr>
<td>assertText</td>
<td>vaadin=runcomvaadintestsserializationSerializerTest::/VVerticalLayout[0]/VVerticalLayout[0]/VVerticalLayout[0]/VLabel[4]</td>
- <td>14. sendArrayList: [[2], [2]], [[2, 1], [2, 3]], [[SimpleTestBean(7)]]</td>
+ <td>sendArrayList: [[2], [2]], [[2, 1], [2, 3]], [[SimpleTestBean(7)]]</td>
</tr>
<tr>
<td>assertText</td>
<td>vaadin=runcomvaadintestsserializationSerializerTest::/VVerticalLayout[0]/VVerticalLayout[0]/VVerticalLayout[0]/VLabel[3]</td>
- <td>15. sendSet: [-12, -7, -4], class com.vaadin.tests.serialization.SerializerTest, [SimpleTestBean(2), SimpleTestBean(3)]</td>
+ <td>sendSet: [-12, -7, -4], class com.vaadin.tests.serialization.SerializerTest, [SimpleTestBean(2), SimpleTestBean(3)]</td>
</tr>
<tr>
<td>assertText</td>
<td>vaadin=runcomvaadintestsserializationSerializerTest::/VVerticalLayout[0]/VVerticalLayout[0]/VVerticalLayout[0]/VLabel[2]</td>
- <td>16. sendMap: {a=null}, [com.vaadin.tests.widgetset.server.SerializerTestExtension=false], [2=com.vaadin.tests.widgetset.server.SerializerTestExtension], {SimpleTestBean(4)=SimpleTestBean(-4), SimpleTestBean(-5)=SimpleTestBean(5)}</td>
+ <td>sendMap: {a=SimpleTestBean(1)}, [com.vaadin.tests.widgetset.server.SerializerTestExtension=SimpleTestBean(4)], [2=com.vaadin.tests.widgetset.server.SerializerTestExtension], {SimpleTestBean(4)=SimpleTestBean(-4), SimpleTestBean(-5)=SimpleTestBean(5)}</td>
</tr>
<tr>
<td>assertText</td>
<td>vaadin=runcomvaadintestsserializationSerializerTest::/VVerticalLayout[0]/VVerticalLayout[0]/VVerticalLayout[0]/VLabel[1]</td>
- <td>17. sendWrappedGenerics: {[SimpleTestBean(1)]={1=[SimpleTestBean(42)]}}</td>
+ <td>sendWrappedGenerics: {[SimpleTestBean(1)]={1=[SimpleTestBean(42)]}}</td>
</tr>
<tr>
<td>assertText</td>
<td>vaadin=runcomvaadintestsserializationSerializerTest::/VVerticalLayout[0]/VVerticalLayout[0]/VVerticalLayout[0]/VLabel[0]</td>
- <td>18. sendEnum: PREFORMATTED, [HTML, RAW], [PREFORMATTED, XML]</td>
+ <td>sendEnum: PREFORMATTED, [HTML, RAW], [PREFORMATTED, XML]</td>
</tr>
</tbody></table>
</body>
diff --git a/uitest/src/com/vaadin/tests/serialization/SerializerTest.java b/uitest/src/com/vaadin/tests/serialization/SerializerTest.java
index e7acd3e79b..efadf8c237 100644
--- a/uitest/src/com/vaadin/tests/serialization/SerializerTest.java
+++ b/uitest/src/com/vaadin/tests/serialization/SerializerTest.java
@@ -46,10 +46,20 @@ public class SerializerTest extends AbstractTestUI {
protected void setup(VaadinRequest request) {
final SerializerTestExtension testExtension = new SerializerTestExtension();
addExtension(testExtension);
+
+ // Don't show row numbers to make it easier to add tests without
+ // changing all numbers
+ log.setNumberLogRows(false);
addComponent(log);
SerializerTestRpc rpc = testExtension
.getRpcProxy(SerializerTestRpc.class);
+ rpc.sendBeanSubclass(new SimpleTestBean() {
+ @Override
+ public int getValue() {
+ return 42;
+ }
+ });
rpc.sendBoolean(true, Boolean.FALSE, new boolean[] { true, true, false,
true, false, false });
rpc.sendByte((byte) 5, Byte.valueOf((byte) -12), new byte[] { 3, 1, 2 });
@@ -95,10 +105,10 @@ public class SerializerTest extends AbstractTestUI {
put("1", new SimpleTestBean(1));
put("2", new SimpleTestBean(2));
}
- }, new HashMap<Connector, Boolean>() {
+ }, new HashMap<Connector, SimpleTestBean>() {
{
- put(testExtension, true);
- put(getUI(), false);
+ put(testExtension, new SimpleTestBean(3));
+ put(getUI(), new SimpleTestBean(4));
}
}, new HashMap<Integer, Connector>() {
{
@@ -252,11 +262,12 @@ public class SerializerTest extends AbstractTestUI {
@Override
public void sendMap(Map<String, SimpleTestBean> stringMap,
- Map<Connector, Boolean> connectorMap,
+ Map<Connector, SimpleTestBean> connectorMap,
Map<Integer, Connector> intMap,
Map<SimpleTestBean, SimpleTestBean> beanMap) {
StringBuilder sb = new StringBuilder();
- for (Entry<Connector, Boolean> entry : connectorMap.entrySet()) {
+ for (Entry<Connector, SimpleTestBean> entry : connectorMap
+ .entrySet()) {
if (sb.length() == 0) {
sb.append('[');
} else {
@@ -300,6 +311,11 @@ public class SerializerTest extends AbstractTestUI {
+ Arrays.toString(array) + ", " + list);
}
+ @Override
+ public void sendBeanSubclass(SimpleTestBean bean) {
+ log.log("sendBeanSubclass: " + bean.getValue());
+ }
+
});
}
diff --git a/uitest/src/com/vaadin/tests/widgetset/client/SerializerTestConnector.java b/uitest/src/com/vaadin/tests/widgetset/client/SerializerTestConnector.java
index 90cce49ace..9c2b1a71fa 100644
--- a/uitest/src/com/vaadin/tests/widgetset/client/SerializerTestConnector.java
+++ b/uitest/src/com/vaadin/tests/widgetset/client/SerializerTestConnector.java
@@ -93,7 +93,7 @@ public class SerializerTestConnector extends AbstractExtensionConnector {
@Override
public void sendMap(Map<String, SimpleTestBean> stringMap,
- Map<Connector, Boolean> connectorMap,
+ Map<Connector, SimpleTestBean> connectorMap,
Map<Integer, Connector> intMap,
Map<SimpleTestBean, SimpleTestBean> beanMap) {
Map<SimpleTestBean, SimpleTestBean> updatedBeanMap = new HashMap<SimpleTestBean, SimpleTestBean>();
@@ -102,7 +102,7 @@ public class SerializerTestConnector extends AbstractExtensionConnector {
updatedBeanMap.put(entry.getValue(), entry.getKey());
}
- rpc.sendMap(Collections.singletonMap("a", stringMap.get("b")),
+ rpc.sendMap(Collections.singletonMap("a", stringMap.get("1")),
Collections.singletonMap(getThisConnector(),
connectorMap.get(getUIConnector())),
Collections.singletonMap(
@@ -241,6 +241,16 @@ public class SerializerTestConnector extends AbstractExtensionConnector {
list.toArray(new ContentMode[list.size()]),
Arrays.asList(array));
}
+
+ @Override
+ public void sendBeanSubclass(final SimpleTestBean bean) {
+ rpc.sendBeanSubclass(new SimpleTestBean() {
+ @Override
+ public int getValue() {
+ return bean.getValue() + 1;
+ }
+ });
+ }
});
}
diff --git a/uitest/src/com/vaadin/tests/widgetset/client/SerializerTestRpc.java b/uitest/src/com/vaadin/tests/widgetset/client/SerializerTestRpc.java
index 0d89976ca0..56874d973a 100644
--- a/uitest/src/com/vaadin/tests/widgetset/client/SerializerTestRpc.java
+++ b/uitest/src/com/vaadin/tests/widgetset/client/SerializerTestRpc.java
@@ -67,7 +67,7 @@ public interface SerializerTestRpc extends ServerRpc, ClientRpc {
Set<SimpleTestBean> beanSet);
public void sendMap(Map<String, SimpleTestBean> stringMap,
- Map<Connector, Boolean> connectorMap,
+ Map<Connector, SimpleTestBean> connectorMap,
Map<Integer, Connector> intMap,
Map<SimpleTestBean, SimpleTestBean> beanMap);
@@ -77,4 +77,6 @@ public interface SerializerTestRpc extends ServerRpc, ClientRpc {
public void sendEnum(ContentMode contentMode, ContentMode[] array,
List<ContentMode> list);
+ public void sendBeanSubclass(SimpleTestBean bean);
+
}