]> source.dussan.org Git - gwtquery.git/commitdiff
Implementing strip() on isProperties
authorAdolfo Panizo <adolfo.panizo@gmail.com>
Wed, 24 Dec 2014 15:23:39 +0000 (16:23 +0100)
committerManolo Carrasco <manolo@apache.org>
Thu, 25 Dec 2014 14:00:11 +0000 (15:00 +0100)
Signed-off-by: Manolo Carrasco <manolo@apache.org>
gwtquery-core/src/main/java/com/google/gwt/query/client/IsProperties.java
gwtquery-core/src/main/java/com/google/gwt/query/client/Properties.java
gwtquery-core/src/main/java/com/google/gwt/query/client/builders/JsonBuilder.java
gwtquery-core/src/main/java/com/google/gwt/query/client/builders/JsonBuilderBase.java
gwtquery-core/src/main/java/com/google/gwt/query/vm/JsonFactoryJre.java
gwtquery-core/src/test/java/com/google/gwt/query/client/dbinding/DataBindingTestJre.java
gwtquery-core/src/test/java/com/google/gwt/query/vm/JsonFactoryParseTest.java

index bcd79cdb960ad44852c1c9b1ca17d287fbc18e3a..3b88edf5b48d2d0bfa9b681ddb1e2fc5dda9c021 100644 (file)
@@ -31,6 +31,12 @@ public interface IsProperties {
    * parses a json string and loads the resulting properties object.
    */
   <T extends IsProperties> T parse(String json);
+  
+  /**
+   * Removes the extra JSON and leaves only the setters/getters described 
+   * in the JsonBuilder interface.
+   */
+  <T extends IsProperties> T strip();
 
   /**
    * Returns the underlying object, normally a Properties jso in client
@@ -77,7 +83,6 @@ public interface IsProperties {
    */
   String getJsonName();
   
-  
   /**
    * converts a JsonBuilder instance into another JsonBuilder type but
    * preserving the underlying data object. 
index db35f5d6e37118661572ffbb4db3ebf3c65b71b4..91259103d8c039b35b4417e13970b450d196240f 100644 (file)
@@ -219,6 +219,12 @@ public class Properties extends JavaScriptObject implements IsProperties {
     return getDataImpl();
   }
 
+  @SuppressWarnings("unchecked")
+  @Override
+  public final <J extends IsProperties> J strip() {
+    return getDataImpl();
+  }
+  
   public final <J extends IsProperties> J parse(String json) {
     return load(JsUtils.parseJSON(json));
   }
index 9dd3df783a82f04f5cd3682f51f2552a738817d2..b5f304511d32b8b9e5670be27f2f77af1b930fc2 100644 (file)
@@ -30,12 +30,6 @@ 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 c09836a578a8720595ae148c22987e4a0f08bd53..bd5ad66e9a76e7bf7c714e39dada22e624a72f0c 100644 (file)
@@ -37,6 +37,15 @@ public abstract class JsonBuilderBase<J extends JsonBuilderBase<?>> implements J
   public J parse(String json, boolean fix) {
     return fix ? parse(Properties.wrapPropertiesString(json)) : parse(json);
   }
+  
+  @SuppressWarnings("unchecked")
+  @Override
+  public J strip() {
+    String[] methods = getFieldNames(); //EXCEPTION
+    String[] jsonMethods = p.getFieldNames(); // OK
+    System.out.println(methods);
+    return (J)this;
+  }
 
   @SuppressWarnings("unchecked")
   @Override
index dfdb4cf2d634784575dd760ce1c7589baee3e197..634a483dbc7543ac526f83c791a6c07cf8842513 100644 (file)
@@ -15,6 +15,7 @@ import java.lang.reflect.ParameterizedType;
 import java.lang.reflect.Proxy;
 import java.lang.reflect.Type;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Date;
 import java.util.List;
 
@@ -220,11 +221,10 @@ 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 ("strip".equals(mname)) {
+        List<String> keys = Arrays.asList(jsonObject.keys());
+        Class<?> type = proxy.getClass().getInterfaces()[0];
+        strip(keys, type.getMethods());    
       } else if (mname.matches("toString")) {
         return jsonObject.toString();
       } else if (mname.matches("toJsonWithName")) {
@@ -251,19 +251,28 @@ 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;
+    private void strip(List<String> keys, Method[] methods) {
+      for (String key: keys) {
+        boolean isInType = isInType(key, methods);
+        if (!isInType) {
+          jsonObject.remove(key);
         }
-        String attrJs = deCapitalize(m.getName().replaceFirst(regexGetOrSet, ""));
-        Object value = jsonArg.get(attrJs);
-        setValue(null, jsonObject, attrJs, value);
+      }
+    }
+
+    private boolean isInType(String key, Method[] methods) {
+      if (methods == null || methods.length == 0) {
+        return false;
       }
       
+      for(Method m : methods) {
+        if (m.getName().toLowerCase().contains(key)) {
+          return true;
+        }
+      }
+      return false;
     }
-    
+
     private String deCapitalize(String s) {
       return s != null && s.length() > 0 ? s.substring(0, 1).toLowerCase() + s.substring(1) : s;
     }
index 7158fe8daa4a87dd554b6b58b2ae1e0669a75ea0..be0a83f7a6640c4ba92307066e726e7a5e33d159 100644 (file)
@@ -29,6 +29,7 @@ import java.util.Arrays;
 import java.util.Date;
 import java.util.List;
 
+
 /**
  * Tests for Deferred which can run either in JVM and GWT
  */
@@ -152,4 +153,49 @@ public class DataBindingTestJre extends GWTTestCase {
 
     assertEquals(1, c.<Number>get("a").intValue());
   }
+  
+  public interface GUser extends JsonBuilder{
+    int getAge();
+    void setAge(int age);
+
+    String getName();
+    void setName(String name);
+    
+    GUser address(String address);
+    String address();
+  }
+  
+  public static final String JSON_USER_EXAMPLE = " { " +
+                                                 "   'email': 'foo@bar.com', " +
+                                                 "   'age': 27, " +
+                                                 "   'name': 'Foo Bar', " +
+                                                 "   'address': 'Street Foo N6' " +
+                                                 " }";
+      
+  public void
+  test_parse_json() {
+    GUser entity = GQ.create(GUser.class);
+    entity.parse(JSON_USER_EXAMPLE, true);
+      
+    assertEquals(27, entity.getAge());
+    assertEquals("Foo Bar", entity.getName());
+    assertEquals("Street Foo N6", entity.address());
+    assertTrue(entity.toJson().contains("email"));
+  }
+  
+  public void
+  test_parse_strict_json() {
+    GUser entity = GQ.create(GUser.class);
+    entity.parse(JSON_USER_EXAMPLE, true);
+    for(String s: entity.getFieldNames()) {
+      System.out.println("Moe: "+s);
+    }
+      
+    entity.strip();
+    System.out.println(entity.toJson());
+    assertEquals(27, entity.getAge());
+    assertEquals("Foo Bar", entity.getName());
+    assertEquals("Street Foo N6", entity.address());
+    assertFalse(entity.toJson().contains("email"));
+  }
 }
\ No newline at end of file
index 48272a6163ba5e367f0b84b7c8aaad6493b203b3..b4ea332febaca643f35db0ad17fdbaac902f614c 100644 (file)
@@ -14,32 +14,38 @@ public class JsonFactoryParseTest {
 
     String getName();
     void setName(String name);
+    
+    GUser address(String address);
+    String address();
   }
   
   public static final String JSON_USER_EXAMPLE = " { " +
                                                  "   'email': 'foo@bar.com', " +
                                                  "   'age': 27, " +
-                                                 "   'name': 'Foo Bar' " +
+                                                 "   'name': 'Foo Bar', " +
+                                                 "   'address': 'Street Foo N6' " +
                                                  " }";
       
   @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.assertEquals("Street Foo N6", entity.address());
     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);
-    
+    entity.parse(JSON_USER_EXAMPLE);
+    entity.strip();
+    System.out.println(entity.toJson());
     Assert.assertEquals(27, entity.getAge());
     Assert.assertEquals("Foo Bar", entity.getName());
+    Assert.assertEquals("Street Foo N6", entity.address());
     Assert.assertFalse(entity.toJson().contains("email"));
   }