]> source.dussan.org Git - gwtquery.git/commitdiff
Parsing only methods specified in JsonBuilder interface from a given json.
authorAdolfo Panizo <adolfo.panizo@gmail.com>
Wed, 24 Dec 2014 10:58:39 +0000 (11:58 +0100)
committerManolo Carrasco <manolo@apache.org>
Thu, 25 Dec 2014 13:59:34 +0000 (14:59 +0100)
Signed-off-by: Manolo Carrasco <manolo@apache.org>
gwtquery-core/src/main/java/com/google/gwt/query/client/builders/JsonBuilder.java
gwtquery-core/src/main/java/com/google/gwt/query/vm/JsonFactoryJre.java
gwtquery-core/src/test/java/com/google/gwt/query/vm/JsonFactoryParseTest.java [new file with mode: 0644]

index b5f304511d32b8b9e5670be27f2f77af1b930fc2..9dd3df783a82f04f5cd3682f51f2552a738817d2 100644 (file)
@@ -30,6 +30,12 @@ public interface JsonBuilder extends IsProperties {
    */
   <J> J parse(String json, boolean fix);
 
+  /**
+   * Parses a json string and loads the resulting properties object.
+   * It will parse only the json's properties which are in clz.
+   */
+  <J> J parseStrict(String json, Class<J> clz);
+  
   /**
    * Returns the wrapped object, normally a Properties jso in client
    * but can be used to return the underlying Json implementation in JVM
index 7bd8c792bd95462ff00a3f3eff3706c70fe24b95..dfdb4cf2d634784575dd760ce1c7589baee3e197 100644 (file)
@@ -199,8 +199,10 @@ public class JsonFactoryJre implements JsonFactory  {
       Class<?>[] classes = method.getParameterTypes();
       int largs = classes.length;
 
+      String regexGetOrSet = "^[gs]et";
+      
       Name name = method.getAnnotation(Name.class);
-      String attr = name != null ? name.value() : deCapitalize(mname.replaceFirst("^[gs]et", ""));
+      String attr = name != null ? name.value() : deCapitalize(mname.replaceFirst(regexGetOrSet, ""));
 
       if ("getFieldNames".equals(mname)) {
         return jsonObject.keys();
@@ -218,6 +220,11 @@ public class JsonFactoryJre implements JsonFactory  {
           json = Properties.wrapPropertiesString(json);
         }
         jsonObject = Json.parse(json);
+      } else if (largs > 1 && ("parseStrict".equals(mname))) {
+        Class<? extends JsonBuilder> clz = (Class<? extends JsonBuilder>) args[1];
+        Class<? extends JsonBuilder> proxie = (Class<? extends JsonBuilder>) Proxy.getProxyClass(clz.getClassLoader(), new Class[] {clz});
+        JsonObject jsonArg = Json.parse((String)args[0]);
+        parseStrict(proxie, jsonArg, regexGetOrSet);
       } else if (mname.matches("toString")) {
         return jsonObject.toString();
       } else if (mname.matches("toJsonWithName")) {
@@ -244,6 +251,19 @@ public class JsonFactoryJre implements JsonFactory  {
       return null;
     }
 
+    public void parseStrict(Class<? extends JsonBuilder> proxie, JsonObject jsonArg,
+        String regexGetOrSet) {
+      for(Method m: proxie.getMethods()) {
+        if (!m.getName().matches("^set.+")) {
+          continue;
+        }
+        String attrJs = deCapitalize(m.getName().replaceFirst(regexGetOrSet, ""));
+        Object value = jsonArg.get(attrJs);
+        setValue(null, jsonObject, attrJs, value);
+      }
+      
+    }
+    
     private String deCapitalize(String s) {
       return s != null && s.length() > 0 ? s.substring(0, 1).toLowerCase() + s.substring(1) : s;
     }
diff --git a/gwtquery-core/src/test/java/com/google/gwt/query/vm/JsonFactoryParseTest.java b/gwtquery-core/src/test/java/com/google/gwt/query/vm/JsonFactoryParseTest.java
new file mode 100644 (file)
index 0000000..48272a6
--- /dev/null
@@ -0,0 +1,46 @@
+package com.google.gwt.query.vm;
+
+import com.google.gwt.query.client.GQ;
+import com.google.gwt.query.client.builders.JsonBuilder;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class JsonFactoryParseTest {
+
+  public interface GUser extends JsonBuilder{
+    int getAge();
+    void setAge(int age);
+
+    String getName();
+    void setName(String name);
+  }
+  
+  public static final String JSON_USER_EXAMPLE = " { " +
+                                                 "   'email': 'foo@bar.com', " +
+                                                 "   'age': 27, " +
+                                                 "   'name': 'Foo Bar' " +
+                                                 " }";
+      
+  @Test public void
+  test_parse_json() {
+    GUser entity = GQ.create(GUser.class);
+    entity.parse(JSON_USER_EXAMPLE);
+    System.out.println(entity.toJson());    
+   
+    Assert.assertEquals(27, entity.getAge());
+    Assert.assertEquals("Foo Bar", entity.getName());
+    Assert.assertTrue(entity.toJson().contains("email"));
+  }
+  
+  @Test public void
+  test_parse_strict_json() {
+    GUser entity = GQ.create(GUser.class);
+    entity.parseStrict(JSON_USER_EXAMPLE, GUser.class);
+    
+    Assert.assertEquals(27, entity.getAge());
+    Assert.assertEquals("Foo Bar", entity.getName());
+    Assert.assertFalse(entity.toJson().contains("email"));
+  }
+  
+}