]> source.dussan.org Git - vaadin-framework.git/commitdiff
Fixes #8673 (some fields not en/decoded correctly) by using the setter/getter name...
authorMarc Englund <marc@vaadin.com>
Tue, 17 Apr 2012 06:19:36 +0000 (09:19 +0300)
committerMarc Englund <marc@vaadin.com>
Tue, 17 Apr 2012 06:21:04 +0000 (09:21 +0300)
src/com/vaadin/terminal/gwt/server/JsonCodec.java
src/com/vaadin/terminal/gwt/widgetsetutils/SerializerGenerator.java

index 304267d4b9376bbf358848878921a684ad65625a..1824a16fb239c4643fc6ac5fac03b39d3dc3601f 100644 (file)
@@ -271,9 +271,9 @@ public class JsonCodec implements Serializable {
         try {
             for (PropertyDescriptor pd : Introspector.getBeanInfo(
                     value.getClass()).getPropertyDescriptors()) {
-                String fieldName = pd.getName();
                 Class<?> fieldType = pd.getPropertyType();
-                if (pd.getReadMethod() == null || pd.getWriteMethod() == null) {
+                String fieldName = getTransportFieldName(pd);
+                if (fieldName == null) {
                     continue;
                 }
                 Method getterMethod = pd.getReadMethod();
@@ -288,6 +288,24 @@ public class JsonCodec implements Serializable {
         return jsonMap;
     }
 
+    /**
+     * Returns the name that should be used as field name in the JSON. We strip
+     * "set" from the setter, keeping the result - this is easy to do on both
+     * server and client, avoiding some issues with cASE. E.g setZIndex()
+     * becomes "ZIndex". Also ensures that both getter and setter are present,
+     * returning null otherwise.
+     * 
+     * @param pd
+     * @return the name to be used or null if both getter and setter are not
+     *         found.
+     */
+    private static String getTransportFieldName(PropertyDescriptor pd) {
+        if (pd.getReadMethod() == null || pd.getWriteMethod() == null) {
+            return null;
+        }
+        return pd.getWriteMethod().getName().substring(3);
+    }
+
     private static Object decodeObject(String type,
             JSONObject serializedObject, Application application)
             throws JSONException {
@@ -299,11 +317,11 @@ public class JsonCodec implements Serializable {
             Object decodedObject = cls.newInstance();
             for (PropertyDescriptor pd : Introspector.getBeanInfo(cls)
                     .getPropertyDescriptors()) {
-                if (pd.getReadMethod() == null || pd.getWriteMethod() == null) {
+
+                String fieldName = getTransportFieldName(pd);
+                if (fieldName == null) {
                     continue;
                 }
-
-                String fieldName = pd.getName();
                 JSONArray encodedObject = serializedObject
                         .getJSONArray(fieldName);
                 pd.getWriteMethod().invoke(decodedObject,
index 43496a545156df44deb09a9d02837769809d2446..18bc5439eccd7eab73635f34e141a2e758468081 100644 (file)
@@ -130,8 +130,7 @@ public class SerializerGenerator extends Generator {
 
         for (JMethod setterMethod : getSetters(beanType)) {
             String setterName = setterMethod.getName();
-            String capitalizedFieldName = setterName.substring(3);
-            String fieldName = decapitalize(capitalizedFieldName);
+            String fieldName = setterName.substring(3); // setZindex() -> ZIndex
             String getterName = findGetter(beanType, setterMethod);
 
             if (getterName == null) {
@@ -162,14 +161,13 @@ public class SerializerGenerator extends Generator {
                 + beanQualifiedSourceName + ".class);");
         for (JMethod method : getSetters(beanType)) {
             String setterName = method.getName();
-            String capitalizedFieldName = setterName.substring(3);
-            String fieldName = decapitalize(capitalizedFieldName);
+            String fieldName = setterName.substring(3); // setZIndex() -> ZIndex
             JType setterParameterType = method.getParameterTypes()[0];
 
             logger.log(Type.DEBUG, "* Processing field " + fieldName + " in "
                     + beanQualifiedSourceName + " (" + beanType.getName() + ")");
 
-            String jsonFieldName = "json" + capitalizedFieldName;
+            String jsonFieldName = "json" + fieldName;
             // JSONArray jsonHeight = (JSONArray) jsonValue.get("height");
             sourceWriter.println("JSONArray " + jsonFieldName
                     + " = (JSONArray) jsonValue.get(\"" + fieldName + "\");");
@@ -209,12 +207,12 @@ public class SerializerGenerator extends Generator {
 
     private String findGetter(JClassType beanType, JMethod setterMethod) {
         JType setterParameterType = setterMethod.getParameterTypes()[0];
-        String capitalizedFieldName = setterMethod.getName().substring(3);
+        String fieldName = setterMethod.getName().substring(3);
         if (setterParameterType.getQualifiedSourceName().equals(
                 boolean.class.getName())) {
-            return "is" + capitalizedFieldName;
+            return "is" + fieldName;
         } else {
-            return "get" + capitalizedFieldName;
+            return "get" + fieldName;
         }
     }