From 28b7703d29d93f0fefc7e020d9f7cf14c0349aa7 Mon Sep 17 00:00:00 2001 From: Leif Åstrand Date: Tue, 5 Feb 2013 11:42:19 +0200 Subject: Don't fetch old bean property value if it is not needed (#10940) Change-Id: I6231eedef94c402457fc4cb217366a3e08f1492c --- .../vaadin/client/communication/JsonDecoder.java | 36 ++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/client/src/com/vaadin/client/communication/JsonDecoder.java b/client/src/com/vaadin/client/communication/JsonDecoder.java index 75af42fc1e..d32cdd92aa 100644 --- a/client/src/com/vaadin/client/communication/JsonDecoder.java +++ b/client/src/com/vaadin/client/communication/JsonDecoder.java @@ -30,6 +30,7 @@ import com.google.gwt.json.client.JSONString; import com.google.gwt.json.client.JSONValue; import com.vaadin.client.ApplicationConnection; import com.vaadin.client.ConnectorMap; +import com.vaadin.client.FastStringSet; import com.vaadin.client.metadata.NoDataException; import com.vaadin.client.metadata.Property; import com.vaadin.client.metadata.Type; @@ -48,6 +49,24 @@ import com.vaadin.shared.Connector; */ public class JsonDecoder { + private static final FastStringSet decodedWithoutReference = FastStringSet + .create(); + static { + decodedWithoutReference.add(String.class.getName()); + decodedWithoutReference.add(Boolean.class.getName()); + decodedWithoutReference.add(Byte.class.getName()); + decodedWithoutReference.add(Character.class.getName()); + decodedWithoutReference.add(Short.class.getName()); + decodedWithoutReference.add(Integer.class.getName()); + decodedWithoutReference.add(Long.class.getName()); + decodedWithoutReference.add(Float.class.getName()); + decodedWithoutReference.add(Double.class.getName()); + decodedWithoutReference.add(Connector.class.getName()); + decodedWithoutReference.add(Map.class.getName()); + decodedWithoutReference.add(List.class.getName()); + decodedWithoutReference.add(Set.class.getName()); + } + /** * Decode a JSON array with two elements (type and value) into a client-side * type, recursively if necessary. @@ -134,8 +153,17 @@ public class JsonDecoder { if (encodedPropertyValue == null) { continue; } - Object propertyReference = property.getValue(target); - Object decodedValue = decodeValue(property.getType(), + + Type propertyType = property.getType(); + + Object propertyReference; + if (needsReferenceValue(propertyType)) { + propertyReference = property.getValue(target); + } else { + propertyReference = null; + } + + Object decodedValue = decodeValue(propertyType, encodedPropertyValue, propertyReference, connection); property.setValue(target, decodedValue); } @@ -147,6 +175,10 @@ public class JsonDecoder { } } + private static boolean needsReferenceValue(Type type) { + return !decodedWithoutReference.contains(type.getBaseTypeName()); + } + private static Map decodeMap(Type type, JSONValue jsonMap, ApplicationConnection connection) { // Client -> server encodes empty map as an empty array because of -- cgit v1.2.3