]> source.dussan.org Git - vaadin-framework.git/commitdiff
Don't fetch old bean property value if it is not needed (#10940)
authorLeif Åstrand <leif@vaadin.com>
Tue, 5 Feb 2013 09:42:19 +0000 (11:42 +0200)
committerLeif Åstrand <leif@vaadin.com>
Tue, 5 Feb 2013 09:42:19 +0000 (11:42 +0200)
Change-Id: I6231eedef94c402457fc4cb217366a3e08f1492c

client/src/com/vaadin/client/communication/JsonDecoder.java

index 75af42fc1e51ee0e6b4f7cb0c149b1b503814c64..d32cdd92aa57c079b2641bc1204b69987622560d 100644 (file)
@@ -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<Object, Object> decodeMap(Type type, JSONValue jsonMap,
             ApplicationConnection connection) {
         // Client -> server encodes empty map as an empty array because of