diff options
Diffstat (limited to 'server')
-rw-r--r-- | server/src/com/vaadin/server/JsonCodec.java | 38 | ||||
-rw-r--r-- | server/tests/src/com/vaadin/tests/server/TestClassesSerializable.java | 1 |
2 files changed, 29 insertions, 10 deletions
diff --git a/server/src/com/vaadin/server/JsonCodec.java b/server/src/com/vaadin/server/JsonCodec.java index d05922b40d..d5e1082487 100644 --- a/server/src/com/vaadin/server/JsonCodec.java +++ b/server/src/com/vaadin/server/JsonCodec.java @@ -62,6 +62,25 @@ import com.vaadin.ui.ConnectorTracker; */ public class JsonCodec implements Serializable { + /* Immutable Encode Result representing null */ + private static final EncodeResult ENCODE_RESULT_NULL = new EncodeResult( + JSONObject.NULL); + + /* Immutable empty JSONArray */ + private static final JSONArray EMPTY_JSON_ARRAY = new JSONArray() { + @Override + public JSONArray put(Object value) { + throw new UnsupportedOperationException( + "Immutable empty JSONArray."); + }; + + @Override + public JSONArray put(int index, Object value) { + throw new UnsupportedOperationException( + "Immutable empty JSONArray."); + }; + }; + public static interface BeanProperty extends Serializable { public Object getValue(Object bean) throws Exception; @@ -635,7 +654,7 @@ public class JsonCodec implements Serializable { } if (null == value) { - return encodeNull(); + return ENCODE_RESULT_NULL; } if (value instanceof String[]) { @@ -680,7 +699,7 @@ public class JsonCodec implements Serializable { if (value instanceof Component && !(LegacyCommunicationManager .isComponentVisibleToClient((Component) value))) { - return encodeNull(); + return ENCODE_RESULT_NULL; } return new EncodeResult(connector.getConnectorId()); } else if (value instanceof Enum) { @@ -701,10 +720,6 @@ public class JsonCodec implements Serializable { } } - private static EncodeResult encodeNull() { - return new EncodeResult(JSONObject.NULL); - } - public static Collection<BeanProperty> getProperties(Class<?> type) throws IntrospectionException { Collection<BeanProperty> cachedProperties = typePropertyCache.get(type); @@ -781,14 +796,17 @@ public class JsonCodec implements Serializable { if (fieldValue == JSONObject.NULL) { fieldValue = null; } - if (referenceValue == JSONObject.NULL) { - referenceValue = null; - } if (fieldValue == referenceValue) { return true; } else if (fieldValue == null || referenceValue == null) { return false; + } else if (fieldValue instanceof Integer + && referenceValue instanceof Integer) { + return ((Integer) fieldValue).equals(referenceValue); + } else if (fieldValue instanceof Boolean + && referenceValue instanceof Boolean) { + return ((Boolean) fieldValue).equals(referenceValue); } else { return fieldValue.toString().equals(referenceValue.toString()); } @@ -849,7 +867,7 @@ public class JsonCodec implements Serializable { if (map.isEmpty()) { // Client -> server encodes empty map as an empty array because of // #8906. Do the same for server -> client to maintain symmetry. - return new JSONArray(); + return EMPTY_JSON_ARRAY; } if (keyType == String.class) { diff --git a/server/tests/src/com/vaadin/tests/server/TestClassesSerializable.java b/server/tests/src/com/vaadin/tests/server/TestClassesSerializable.java index 0a36c7f7ce..e938a1cd37 100644 --- a/server/tests/src/com/vaadin/tests/server/TestClassesSerializable.java +++ b/server/tests/src/com/vaadin/tests/server/TestClassesSerializable.java @@ -63,6 +63,7 @@ public class TestClassesSerializable extends TestCase { "com\\.vaadin\\.sass.*", // "com\\.vaadin\\.testbench.*", // "com\\.vaadin\\.util\\.CurrentInstance\\$1", // + "com\\.vaadin\\.server\\.JsonCodec\\$1", // "com\\.vaadin\\.server\\.communication\\.PushConnection", // "com\\.vaadin\\.server\\.communication\\.AtmospherePushConnection", // "com\\.vaadin\\.util\\.ConnectorHelper", // |