Browse Source

Merge "Don't fetch old bean property value if it is not needed (#10940)" into 7.0

tags/7.0.1
Artur Signell 11 years ago
parent
commit
2d9e28e19c
1 changed files with 34 additions and 2 deletions
  1. 34
    2
      client/src/com/vaadin/client/communication/JsonDecoder.java

+ 34
- 2
client/src/com/vaadin/client/communication/JsonDecoder.java View 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

Loading…
Cancel
Save