From ea1d26c2ffc9d82a515b41636abd8b2da3af61b1 Mon Sep 17 00:00:00 2001 From: Adolfo Panizo Date: Wed, 24 Dec 2014 11:58:39 +0100 Subject: Parsing only methods specified in JsonBuilder interface from a given json. Signed-off-by: Manolo Carrasco --- .../gwt/query/client/builders/JsonBuilder.java | 6 +++ .../com/google/gwt/query/vm/JsonFactoryJre.java | 22 ++++++++++- .../google/gwt/query/vm/JsonFactoryParseTest.java | 46 ++++++++++++++++++++++ 3 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 gwtquery-core/src/test/java/com/google/gwt/query/vm/JsonFactoryParseTest.java diff --git a/gwtquery-core/src/main/java/com/google/gwt/query/client/builders/JsonBuilder.java b/gwtquery-core/src/main/java/com/google/gwt/query/client/builders/JsonBuilder.java index b5f30451..9dd3df78 100644 --- a/gwtquery-core/src/main/java/com/google/gwt/query/client/builders/JsonBuilder.java +++ b/gwtquery-core/src/main/java/com/google/gwt/query/client/builders/JsonBuilder.java @@ -30,6 +30,12 @@ public interface JsonBuilder extends IsProperties { */ 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 parseStrict(String json, Class clz); + /** * Returns the wrapped object, normally a Properties jso in client * but can be used to return the underlying Json implementation in JVM diff --git a/gwtquery-core/src/main/java/com/google/gwt/query/vm/JsonFactoryJre.java b/gwtquery-core/src/main/java/com/google/gwt/query/vm/JsonFactoryJre.java index 7bd8c792..dfdb4cf2 100644 --- a/gwtquery-core/src/main/java/com/google/gwt/query/vm/JsonFactoryJre.java +++ b/gwtquery-core/src/main/java/com/google/gwt/query/vm/JsonFactoryJre.java @@ -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 clz = (Class) args[1]; + Class proxie = (Class) 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 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 index 00000000..48272a61 --- /dev/null +++ b/gwtquery-core/src/test/java/com/google/gwt/query/vm/JsonFactoryParseTest.java @@ -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")); + } + +} -- cgit v1.2.3 From b0f52ef82a0e432eeab694add4924b21d103bdd6 Mon Sep 17 00:00:00 2001 From: Adolfo Panizo Date: Wed, 24 Dec 2014 16:23:39 +0100 Subject: Implementing strip() on isProperties Signed-off-by: Manolo Carrasco --- .../com/google/gwt/query/client/IsProperties.java | 7 +++- .../com/google/gwt/query/client/Properties.java | 6 +++ .../gwt/query/client/builders/JsonBuilder.java | 6 --- .../gwt/query/client/builders/JsonBuilderBase.java | 9 +++++ .../com/google/gwt/query/vm/JsonFactoryJre.java | 37 ++++++++++------- .../query/client/dbinding/DataBindingTestJre.java | 46 ++++++++++++++++++++++ .../google/gwt/query/vm/JsonFactoryParseTest.java | 16 +++++--- 7 files changed, 101 insertions(+), 26 deletions(-) diff --git a/gwtquery-core/src/main/java/com/google/gwt/query/client/IsProperties.java b/gwtquery-core/src/main/java/com/google/gwt/query/client/IsProperties.java index bcd79cdb..3b88edf5 100644 --- a/gwtquery-core/src/main/java/com/google/gwt/query/client/IsProperties.java +++ b/gwtquery-core/src/main/java/com/google/gwt/query/client/IsProperties.java @@ -31,6 +31,12 @@ public interface IsProperties { * parses a json string and loads the resulting properties object. */ T parse(String json); + + /** + * Removes the extra JSON and leaves only the setters/getters described + * in the JsonBuilder interface. + */ + 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. diff --git a/gwtquery-core/src/main/java/com/google/gwt/query/client/Properties.java b/gwtquery-core/src/main/java/com/google/gwt/query/client/Properties.java index db35f5d6..91259103 100644 --- a/gwtquery-core/src/main/java/com/google/gwt/query/client/Properties.java +++ b/gwtquery-core/src/main/java/com/google/gwt/query/client/Properties.java @@ -219,6 +219,12 @@ public class Properties extends JavaScriptObject implements IsProperties { return getDataImpl(); } + @SuppressWarnings("unchecked") + @Override + public final J strip() { + return getDataImpl(); + } + public final J parse(String json) { return load(JsUtils.parseJSON(json)); } diff --git a/gwtquery-core/src/main/java/com/google/gwt/query/client/builders/JsonBuilder.java b/gwtquery-core/src/main/java/com/google/gwt/query/client/builders/JsonBuilder.java index 9dd3df78..b5f30451 100644 --- a/gwtquery-core/src/main/java/com/google/gwt/query/client/builders/JsonBuilder.java +++ b/gwtquery-core/src/main/java/com/google/gwt/query/client/builders/JsonBuilder.java @@ -30,12 +30,6 @@ public interface JsonBuilder extends IsProperties { */ 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 parseStrict(String json, Class clz); - /** * Returns the wrapped object, normally a Properties jso in client * but can be used to return the underlying Json implementation in JVM diff --git a/gwtquery-core/src/main/java/com/google/gwt/query/client/builders/JsonBuilderBase.java b/gwtquery-core/src/main/java/com/google/gwt/query/client/builders/JsonBuilderBase.java index c09836a5..bd5ad66e 100644 --- a/gwtquery-core/src/main/java/com/google/gwt/query/client/builders/JsonBuilderBase.java +++ b/gwtquery-core/src/main/java/com/google/gwt/query/client/builders/JsonBuilderBase.java @@ -37,6 +37,15 @@ public abstract class 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 diff --git a/gwtquery-core/src/main/java/com/google/gwt/query/vm/JsonFactoryJre.java b/gwtquery-core/src/main/java/com/google/gwt/query/vm/JsonFactoryJre.java index dfdb4cf2..634a483d 100644 --- a/gwtquery-core/src/main/java/com/google/gwt/query/vm/JsonFactoryJre.java +++ b/gwtquery-core/src/main/java/com/google/gwt/query/vm/JsonFactoryJre.java @@ -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 clz = (Class) args[1]; - Class proxie = (Class) Proxy.getProxyClass(clz.getClassLoader(), new Class[] {clz}); - JsonObject jsonArg = Json.parse((String)args[0]); - parseStrict(proxie, jsonArg, regexGetOrSet); + } else if ("strip".equals(mname)) { + List 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 proxie, JsonObject jsonArg, - String regexGetOrSet) { - for(Method m: proxie.getMethods()) { - if (!m.getName().matches("^set.+")) { - continue; + private void strip(List 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; } diff --git a/gwtquery-core/src/test/java/com/google/gwt/query/client/dbinding/DataBindingTestJre.java b/gwtquery-core/src/test/java/com/google/gwt/query/client/dbinding/DataBindingTestJre.java index 7158fe8d..be0a83f7 100644 --- a/gwtquery-core/src/test/java/com/google/gwt/query/client/dbinding/DataBindingTestJre.java +++ b/gwtquery-core/src/test/java/com/google/gwt/query/client/dbinding/DataBindingTestJre.java @@ -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.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 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 index 48272a61..b4ea332f 100644 --- 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 @@ -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")); } -- cgit v1.2.3 From 44702affcd643c1ddb85c7ac0cce88da75f9a3dc Mon Sep 17 00:00:00 2001 From: Manolo Carrasco Date: Wed, 24 Dec 2014 19:05:29 +0100 Subject: Fix client-side code Signed-off-by: Manolo Carrasco --- .../com/google/gwt/query/client/Properties.java | 14 +++--- .../gwt/query/client/builders/JsonBuilderBase.java | 33 +++++++++----- .../gwt/query/rebind/JsonBuilderGenerator.java | 2 +- .../query/client/dbinding/DataBindingTestJre.java | 20 +++------ .../google/gwt/query/vm/JsonFactoryParseTest.java | 52 ---------------------- 5 files changed, 36 insertions(+), 85 deletions(-) delete mode 100644 gwtquery-core/src/test/java/com/google/gwt/query/vm/JsonFactoryParseTest.java diff --git a/gwtquery-core/src/main/java/com/google/gwt/query/client/Properties.java b/gwtquery-core/src/main/java/com/google/gwt/query/client/Properties.java index 91259103..0b978548 100644 --- a/gwtquery-core/src/main/java/com/google/gwt/query/client/Properties.java +++ b/gwtquery-core/src/main/java/com/google/gwt/query/client/Properties.java @@ -142,7 +142,7 @@ public class Properties extends JavaScriptObject implements IsProperties { public final Object getObject(Object name) { return c().get(String.valueOf(name)); } - + public final Properties getProperties(Object name) { return getJavaScriptObject(name); } @@ -176,9 +176,9 @@ public class Properties extends JavaScriptObject implements IsProperties { /** * Adds a new native js function to the properties object. * This native function will wrap the passed java Function. - * + * * Its useful for exporting or importing to javascript. - * + * */ public final native void setFunction(T name, Function f) /*-{ if (!f) return; @@ -219,12 +219,10 @@ public class Properties extends JavaScriptObject implements IsProperties { return getDataImpl(); } - @SuppressWarnings("unchecked") - @Override public final J strip() { return getDataImpl(); } - + public final J parse(String json) { return load(JsUtils.parseJSON(json)); } @@ -236,11 +234,11 @@ public class Properties extends JavaScriptObject implements IsProperties { public final String toJson() { return toJsonString(); } - + public final String toJsonWithName() { return toJsonWithName(getJsonName()); } - + public final String toJsonWithName(String name) { return "{\"" + name + "\":{" + toJson() + "}"; } diff --git a/gwtquery-core/src/main/java/com/google/gwt/query/client/builders/JsonBuilderBase.java b/gwtquery-core/src/main/java/com/google/gwt/query/client/builders/JsonBuilderBase.java index bd5ad66e..baf42181 100644 --- a/gwtquery-core/src/main/java/com/google/gwt/query/client/builders/JsonBuilderBase.java +++ b/gwtquery-core/src/main/java/com/google/gwt/query/client/builders/JsonBuilderBase.java @@ -19,12 +19,18 @@ import com.google.gwt.core.client.JavaScriptObject; import com.google.gwt.core.client.JsArray; import com.google.gwt.query.client.IsProperties; import com.google.gwt.query.client.Properties; +import com.google.gwt.query.client.js.JsCache; import com.google.gwt.query.client.js.JsObjectArray; import com.google.gwt.query.client.js.JsUtils; +import com.google.gwt.user.client.Window; + +import java.util.Arrays; +import java.util.List; public abstract class JsonBuilderBase> implements JsonBuilder { protected Properties p = Properties.create(); + protected String[] fieldNames = new String[] {}; @SuppressWarnings("unchecked") @Override @@ -37,13 +43,16 @@ public abstract class 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); + List names = Arrays.asList(getFieldNames()); + for (String jsonName : p.getFieldNames()) { + if (!names.contains(jsonName)) { + p.cast().delete(jsonName); + } + } return (J)this; } @@ -107,7 +116,7 @@ public abstract class JsonBuilderBase> implements J public String toJson() { return p.tostring(); } - + public String toJsonWithName() { return "{\"" + getJsonName() + "\":" + p.tostring() + "}"; } @@ -117,22 +126,22 @@ public abstract class JsonBuilderBase> implements J public Properties getProperties() { return p; } - + @Override public String toQueryString() { return p.toQueryString(); } - + @SuppressWarnings("unchecked") @Override public Properties getDataImpl() { return p; } - + public T get(Object key) { return p.get(key); } - + @SuppressWarnings("unchecked") public T set(Object key, Object val) { if (val instanceof IsProperties) { @@ -142,8 +151,12 @@ public abstract class JsonBuilderBase> implements J } return (T)this; } - + public T as(Class clz) { return p.as(clz); } + + public final String[] getFieldNames() { + return fieldNames; + } } diff --git a/gwtquery-core/src/main/java/com/google/gwt/query/rebind/JsonBuilderGenerator.java b/gwtquery-core/src/main/java/com/google/gwt/query/rebind/JsonBuilderGenerator.java index c2383c19..197e23b8 100644 --- a/gwtquery-core/src/main/java/com/google/gwt/query/rebind/JsonBuilderGenerator.java +++ b/gwtquery-core/src/main/java/com/google/gwt/query/rebind/JsonBuilderGenerator.java @@ -143,7 +143,7 @@ public class JsonBuilderGenerator extends Generator { for (Iterator it = attrs.iterator(); it.hasNext();) { ret += (ret.isEmpty() ? "" : ",") + "\"" + it.next() + "\""; } - sw.println("public final String[] getFieldNames() {return new String[]{" + ret + "};}"); + sw.println("{ fieldNames = new String[]{" + ret + "}; }"); } public void generateMethod(SourceWriter sw, JMethod method, String name, TreeLogger logger) diff --git a/gwtquery-core/src/test/java/com/google/gwt/query/client/dbinding/DataBindingTestJre.java b/gwtquery-core/src/test/java/com/google/gwt/query/client/dbinding/DataBindingTestJre.java index be0a83f7..5aeaacb7 100644 --- a/gwtquery-core/src/test/java/com/google/gwt/query/client/dbinding/DataBindingTestJre.java +++ b/gwtquery-core/src/test/java/com/google/gwt/query/client/dbinding/DataBindingTestJre.java @@ -15,7 +15,6 @@ */ package com.google.gwt.query.client.dbinding; -import com.google.gwt.core.shared.GWT; import com.google.gwt.junit.client.GWTTestCase; import com.google.gwt.query.client.Function; import com.google.gwt.query.client.GQ; @@ -23,8 +22,6 @@ import com.google.gwt.query.client.IsProperties; import com.google.gwt.query.client.builders.JsonBuilder; import com.google.gwt.query.client.builders.Name; -import java.io.ByteArrayOutputStream; -import java.io.PrintStream; import java.util.Arrays; import java.util.Date; import java.util.List; @@ -153,46 +150,41 @@ public class DataBindingTestJre extends GWTTestCase { assertEquals(1, c.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()); 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 deleted file mode 100644 index b4ea332f..00000000 --- a/gwtquery-core/src/test/java/com/google/gwt/query/vm/JsonFactoryParseTest.java +++ /dev/null @@ -1,52 +0,0 @@ -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); - - 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' " + - " }"; - - @Test public void - test_parse_json() { - GUser entity = GQ.create(GUser.class); - entity.parse(JSON_USER_EXAMPLE); - - 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.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")); - } - -} -- cgit v1.2.3 From 8b5e7e3ca0f571ca048c04b02e29f342d125a198 Mon Sep 17 00:00:00 2001 From: Manolo Carrasco Date: Thu, 25 Dec 2014 21:18:10 +0100 Subject: Make strip recursive in server side. Signed-off-by: Manolo Carrasco --- .../gwt/query/client/builders/JsonBuilderBase.java | 2 + .../com/google/gwt/query/vm/JsonFactoryJre.java | 71 +++++++++++++--------- .../query/client/dbinding/DataBindingTestJre.java | 47 ++++++++------ 3 files changed, 73 insertions(+), 47 deletions(-) diff --git a/gwtquery-core/src/main/java/com/google/gwt/query/client/builders/JsonBuilderBase.java b/gwtquery-core/src/main/java/com/google/gwt/query/client/builders/JsonBuilderBase.java index baf42181..57f5a909 100644 --- a/gwtquery-core/src/main/java/com/google/gwt/query/client/builders/JsonBuilderBase.java +++ b/gwtquery-core/src/main/java/com/google/gwt/query/client/builders/JsonBuilderBase.java @@ -49,6 +49,8 @@ public abstract class JsonBuilderBase> implements J public J strip() { List names = Arrays.asList(getFieldNames()); for (String jsonName : p.getFieldNames()) { + // TODO: figure out a way so as we can generate some marks in generated class in + // order to call getters to return JsonBuilder object given an an attribute name if (!names.contains(jsonName)) { p.cast().delete(jsonName); } diff --git a/gwtquery-core/src/main/java/com/google/gwt/query/vm/JsonFactoryJre.java b/gwtquery-core/src/main/java/com/google/gwt/query/vm/JsonFactoryJre.java index 634a483d..479b09d2 100644 --- a/gwtquery-core/src/main/java/com/google/gwt/query/vm/JsonFactoryJre.java +++ b/gwtquery-core/src/main/java/com/google/gwt/query/vm/JsonFactoryJre.java @@ -1,13 +1,5 @@ package com.google.gwt.query.vm; -import com.google.gwt.query.client.Function; -import com.google.gwt.query.client.IsProperties; -import com.google.gwt.query.client.Properties; -import com.google.gwt.query.client.builders.JsonBuilder; -import com.google.gwt.query.client.builders.JsonFactory; -import com.google.gwt.query.client.builders.Name; -import com.google.gwt.query.rebind.JsonBuilderGenerator; - import java.lang.reflect.Array; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; @@ -15,10 +7,19 @@ 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.HashSet; +import java.util.Hashtable; import java.util.List; +import com.google.gwt.query.client.Function; +import com.google.gwt.query.client.IsProperties; +import com.google.gwt.query.client.Properties; +import com.google.gwt.query.client.builders.JsonBuilder; +import com.google.gwt.query.client.builders.JsonFactory; +import com.google.gwt.query.client.builders.Name; +import com.google.gwt.query.rebind.JsonBuilderGenerator; + import elemental.json.Json; import elemental.json.JsonArray; import elemental.json.JsonBoolean; @@ -200,10 +201,8 @@ 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(regexGetOrSet, "")); + String attr = name != null ? name.value() : methodName2AttrName(mname); if ("getFieldNames".equals(mname)) { return jsonObject.keys(); @@ -222,9 +221,7 @@ public class JsonFactoryJre implements JsonFactory { } jsonObject = Json.parse(json); } else if ("strip".equals(mname)) { - List keys = Arrays.asList(jsonObject.keys()); - Class type = proxy.getClass().getInterfaces()[0]; - strip(keys, type.getMethods()); + stripProxy((JsonBuilder)proxy); } else if (mname.matches("toString")) { return jsonObject.toString(); } else if (mname.matches("toJsonWithName")) { @@ -251,26 +248,40 @@ public class JsonFactoryJre implements JsonFactory { return null; } - private void strip(List keys, Method[] methods) { - for (String key: keys) { - boolean isInType = isInType(key, methods); - if (!isInType) { + /** + * @param proxy + */ + private void stripProxy(JsonBuilder proxy) { + Class type = proxy.getClass().getInterfaces()[0]; + HashSet valid = new HashSet(); + Hashtable getters = new Hashtable(); + for (Method m : type.getMethods()) { + String attr = methodName2AttrName(m.getName()); + valid.add(attr); + Class[] classes = m.getParameterTypes(); + if (classes.length == 0) { + if (IsProperties.class.isAssignableFrom(m.getReturnType())) { + getters.put(attr, m); + } + } + } + for (String key: jsonObject.keys()) { + String name = methodName2AttrName(key); + Method getter = getters.get(name); + if (!valid.contains(name)) { jsonObject.remove(key); + } else if (getter != null) { + try { + ((IsProperties)invoke(proxy, getter, new Object[]{})).strip(); + } catch (Throwable e) { + e.printStackTrace(); + } } } } - 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 methodName2AttrName(String s) { + return deCapitalize(s.replaceFirst("^[gs]et", "")); } private String deCapitalize(String s) { diff --git a/gwtquery-core/src/test/java/com/google/gwt/query/client/dbinding/DataBindingTestJre.java b/gwtquery-core/src/test/java/com/google/gwt/query/client/dbinding/DataBindingTestJre.java index 5aeaacb7..3d1273c1 100644 --- a/gwtquery-core/src/test/java/com/google/gwt/query/client/dbinding/DataBindingTestJre.java +++ b/gwtquery-core/src/test/java/com/google/gwt/query/client/dbinding/DataBindingTestJre.java @@ -15,6 +15,7 @@ */ package com.google.gwt.query.client.dbinding; +import com.google.gwt.core.shared.GWT; import com.google.gwt.junit.client.GWTTestCase; import com.google.gwt.query.client.Function; import com.google.gwt.query.client.GQ; @@ -151,33 +152,38 @@ public class DataBindingTestJre extends GWTTestCase { assertEquals(1, c.get("a").intValue()); } - public interface GUser extends JsonBuilder{ - int getAge(); - void setAge(int age); + public interface GAddress extends JsonBuilder { + String street(); + String city(); + } + public interface GUser extends JsonBuilder { + int getAge(); String getName(); - void setName(String name); - - GUser address(String address); - String address(); + GAddress address(); } - public static final String JSON_USER_EXAMPLE = " { " + - " 'email': 'foo@bar.com', " + - " 'age': 27, " + - " 'name': 'Foo Bar', " + - " 'address': 'Street Foo N6' " + - " }"; + public static final String JSON_USER_EXAMPLE = " { " + + " 'email': 'foo@bar.com', " + + " 'age': 27, " + + " 'name': 'Foo Bar', " + + " 'address': {" + + " 'street': 'Street Foo N6', " + + " 'phone': '670'" + + " }" + + "}"; public void test_parse_json() { GUser entity = GQ.create(GUser.class); entity.parse(JSON_USER_EXAMPLE, true); + assertNotNull(entity.get("email")); assertEquals(27, entity.getAge()); assertEquals("Foo Bar", entity.getName()); - assertEquals("Street Foo N6", entity.address()); - assertTrue(entity.toJson().contains("email")); + assertNotNull(entity.address()); + assertEquals("Street Foo N6", entity.address().street()); + assertNotNull(entity.address().get("phone")); } public void @@ -185,9 +191,16 @@ public class DataBindingTestJre extends GWTTestCase { GUser entity = GQ.create(GUser.class); entity.parse(JSON_USER_EXAMPLE, true); entity.strip(); + + assertNull(entity.get("email")); assertEquals(27, entity.getAge()); assertEquals("Foo Bar", entity.getName()); - assertEquals("Street Foo N6", entity.address()); - assertFalse(entity.toJson().contains("email")); + assertNotNull(entity.address()); + assertEquals("Street Foo N6", entity.address().street()); + + // Recursion not implemented in client side + if (GWT.isScript()) { + assertNull(entity.address().get("phone")); + } } } \ No newline at end of file -- cgit v1.2.3 From c6fd41796742df282f523bfddedba31a69883f44 Mon Sep 17 00:00:00 2001 From: Adolfo Panizo Date: Fri, 26 Dec 2014 14:26:07 +0100 Subject: Fix for @Name in strip() implementation on the VM (added some refactors) --- .../com/google/gwt/query/client/Properties.java | 5 +- .../com/google/gwt/query/vm/JsonFactoryJre.java | 62 ++++++++++------------ .../google/gwt/query/vm/strip/JsonStripJre.java | 61 +++++++++++++++++++++ .../google/gwt/query/vm/util/MethodNameParser.java | 12 +++++ .../query/client/dbinding/DataBindingTestJre.java | 6 +++ 5 files changed, 109 insertions(+), 37 deletions(-) create mode 100644 gwtquery-core/src/main/java/com/google/gwt/query/vm/strip/JsonStripJre.java create mode 100644 gwtquery-core/src/main/java/com/google/gwt/query/vm/util/MethodNameParser.java diff --git a/gwtquery-core/src/main/java/com/google/gwt/query/client/Properties.java b/gwtquery-core/src/main/java/com/google/gwt/query/client/Properties.java index 0b978548..2c2ba54c 100644 --- a/gwtquery-core/src/main/java/com/google/gwt/query/client/Properties.java +++ b/gwtquery-core/src/main/java/com/google/gwt/query/client/Properties.java @@ -218,9 +218,10 @@ public class Properties extends JavaScriptObject implements IsProperties { } return getDataImpl(); } - + + @SuppressWarnings("unchecked") public final J strip() { - return getDataImpl(); + return (J)this; } public final J parse(String json) { diff --git a/gwtquery-core/src/main/java/com/google/gwt/query/vm/JsonFactoryJre.java b/gwtquery-core/src/main/java/com/google/gwt/query/vm/JsonFactoryJre.java index 479b09d2..799cf256 100644 --- a/gwtquery-core/src/main/java/com/google/gwt/query/vm/JsonFactoryJre.java +++ b/gwtquery-core/src/main/java/com/google/gwt/query/vm/JsonFactoryJre.java @@ -1,5 +1,15 @@ package com.google.gwt.query.vm; +import com.google.gwt.query.client.Function; +import com.google.gwt.query.client.IsProperties; +import com.google.gwt.query.client.Properties; +import com.google.gwt.query.client.builders.JsonBuilder; +import com.google.gwt.query.client.builders.JsonFactory; +import com.google.gwt.query.client.builders.Name; +import com.google.gwt.query.rebind.JsonBuilderGenerator; +import com.google.gwt.query.vm.strip.JsonStripJre; +import com.google.gwt.query.vm.util.MethodNameParser; + import java.lang.reflect.Array; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; @@ -12,14 +22,6 @@ import java.util.HashSet; import java.util.Hashtable; import java.util.List; -import com.google.gwt.query.client.Function; -import com.google.gwt.query.client.IsProperties; -import com.google.gwt.query.client.Properties; -import com.google.gwt.query.client.builders.JsonBuilder; -import com.google.gwt.query.client.builders.JsonFactory; -import com.google.gwt.query.client.builders.Name; -import com.google.gwt.query.rebind.JsonBuilderGenerator; - import elemental.json.Json; import elemental.json.JsonArray; import elemental.json.JsonBoolean; @@ -202,7 +204,7 @@ public class JsonFactoryJre implements JsonFactory { int largs = classes.length; Name name = method.getAnnotation(Name.class); - String attr = name != null ? name.value() : methodName2AttrName(mname); + String attr = name != null ? name.value() : MethodNameParser.methodName2AttrName(mname); if ("getFieldNames".equals(mname)) { return jsonObject.keys(); @@ -253,39 +255,29 @@ public class JsonFactoryJre implements JsonFactory { */ private void stripProxy(JsonBuilder proxy) { Class type = proxy.getClass().getInterfaces()[0]; - HashSet valid = new HashSet(); - Hashtable getters = new Hashtable(); - for (Method m : type.getMethods()) { - String attr = methodName2AttrName(m.getName()); - valid.add(attr); - Class[] classes = m.getParameterTypes(); - if (classes.length == 0) { - if (IsProperties.class.isAssignableFrom(m.getReturnType())) { - getters.put(attr, m); - } - } - } + + HashSet valid = JsonStripJre.getValidMethodsFrom(type.getMethods()); + Hashtable recursiveBuilders = JsonStripJre.getJsonBuildersFrom(type.getMethods()); + for (String key: jsonObject.keys()) { - String name = methodName2AttrName(key); - Method getter = getters.get(name); + String name = MethodNameParser.methodName2AttrName(key); if (!valid.contains(name)) { jsonObject.remove(key); - } else if (getter != null) { - try { - ((IsProperties)invoke(proxy, getter, new Object[]{})).strip(); - } catch (Throwable e) { - e.printStackTrace(); - } + continue; + } + Method recursiveBuilder = recursiveBuilders.get(name); + if (recursiveBuilder != null) { + callRecursiveStrip(proxy,recursiveBuilder); } } } - private String methodName2AttrName(String s) { - return deCapitalize(s.replaceFirst("^[gs]et", "")); - } - - private String deCapitalize(String s) { - return s != null && s.length() > 0 ? s.substring(0, 1).toLowerCase() + s.substring(1) : s; + private void callRecursiveStrip(JsonBuilder proxy, Method recursiveBuilder) { + try { + ((IsProperties)invoke(proxy, recursiveBuilder, new Object[]{})).strip(); + } catch (Throwable e) { + e.printStackTrace(); + } } private String getDataBindingClassName(Class type) { diff --git a/gwtquery-core/src/main/java/com/google/gwt/query/vm/strip/JsonStripJre.java b/gwtquery-core/src/main/java/com/google/gwt/query/vm/strip/JsonStripJre.java new file mode 100644 index 00000000..19e961af --- /dev/null +++ b/gwtquery-core/src/main/java/com/google/gwt/query/vm/strip/JsonStripJre.java @@ -0,0 +1,61 @@ +package com.google.gwt.query.vm.strip; + +import com.google.gwt.query.client.IsProperties; +import com.google.gwt.query.client.builders.Name; +import com.google.gwt.query.vm.util.MethodNameParser; + +import java.lang.reflect.Method; +import java.util.HashSet; +import java.util.Hashtable; + +public class JsonStripJre { + + public static HashSet getValidMethodsFrom(Method[] methods) { + HashSet valid = new HashSet(); + + if (!isValidArray(methods)) { + return valid; + } + + for (Method m : methods) { + String attr = MethodNameParser.methodName2AttrName(m.getName()); + Name annotation = m.getAnnotation(Name.class); + + if (annotation != null) { + attr = annotation.value(); + } + valid.add(attr); + } + return valid; + } + + + + public static Hashtable getJsonBuildersFrom(Method[] methods) { + Hashtable recursiveBuilders = new Hashtable(); + + if (!isValidArray(methods)) { + return recursiveBuilders; + } + + for (Method m : methods) { + if(isRecursiveJsonBuilder(m)) { + String attr = MethodNameParser.methodName2AttrName(m.getName()); + recursiveBuilders.put(attr, m); + } + } + + return recursiveBuilders; + } + + private static boolean isRecursiveJsonBuilder(Method m) { + Class[] classes = m.getParameterTypes(); + return classes.length == 0 && IsProperties.class.isAssignableFrom(m.getReturnType()); + } + + + private static boolean isValidArray(Object[] array) { + return array != null && array.length > 0; + } + +} diff --git a/gwtquery-core/src/main/java/com/google/gwt/query/vm/util/MethodNameParser.java b/gwtquery-core/src/main/java/com/google/gwt/query/vm/util/MethodNameParser.java new file mode 100644 index 00000000..99e9ff93 --- /dev/null +++ b/gwtquery-core/src/main/java/com/google/gwt/query/vm/util/MethodNameParser.java @@ -0,0 +1,12 @@ +package com.google.gwt.query.vm.util; + +public class MethodNameParser { + + public static String methodName2AttrName(String s) { + return deCapitalize(s.replaceFirst("^[gs]et", "")); + } + + private static 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/client/dbinding/DataBindingTestJre.java b/gwtquery-core/src/test/java/com/google/gwt/query/client/dbinding/DataBindingTestJre.java index 3d1273c1..5ea76a18 100644 --- a/gwtquery-core/src/test/java/com/google/gwt/query/client/dbinding/DataBindingTestJre.java +++ b/gwtquery-core/src/test/java/com/google/gwt/query/client/dbinding/DataBindingTestJre.java @@ -158,12 +158,16 @@ public class DataBindingTestJre extends GWTTestCase { } public interface GUser extends JsonBuilder { + @Name("_id") + String getId(); + int getAge(); String getName(); GAddress address(); } public static final String JSON_USER_EXAMPLE = " { " + + " '_id': 'aaabbbccc', " + " 'email': 'foo@bar.com', " + " 'age': 27, " + " 'name': 'Foo Bar', " @@ -179,6 +183,7 @@ public class DataBindingTestJre extends GWTTestCase { entity.parse(JSON_USER_EXAMPLE, true); assertNotNull(entity.get("email")); + assertEquals("aaabbbccc", entity.getId()); assertEquals(27, entity.getAge()); assertEquals("Foo Bar", entity.getName()); assertNotNull(entity.address()); @@ -192,6 +197,7 @@ public class DataBindingTestJre extends GWTTestCase { entity.parse(JSON_USER_EXAMPLE, true); entity.strip(); + assertEquals("aaabbbccc", entity.getId()); assertNull(entity.get("email")); assertEquals(27, entity.getAge()); assertEquals("Foo Bar", entity.getName()); -- cgit v1.2.3 From 195620f534fa11002f393ced2657fe80c37a9b29 Mon Sep 17 00:00:00 2001 From: Adolfo Panizo Date: Fri, 26 Dec 2014 16:15:44 +0100 Subject: Separating JsonBuilderHanler into a new class --- .../google/gwt/query/vm/JsonBuilderHandler.java | 333 +++++++++++++++++++++ .../com/google/gwt/query/vm/JsonFactoryJre.java | 273 +---------------- .../google/gwt/query/vm/strip/JsonStripJre.java | 61 ---- .../google/gwt/query/vm/util/MethodNameParser.java | 12 - 4 files changed, 334 insertions(+), 345 deletions(-) create mode 100644 gwtquery-core/src/main/java/com/google/gwt/query/vm/JsonBuilderHandler.java delete mode 100644 gwtquery-core/src/main/java/com/google/gwt/query/vm/strip/JsonStripJre.java delete mode 100644 gwtquery-core/src/main/java/com/google/gwt/query/vm/util/MethodNameParser.java diff --git a/gwtquery-core/src/main/java/com/google/gwt/query/vm/JsonBuilderHandler.java b/gwtquery-core/src/main/java/com/google/gwt/query/vm/JsonBuilderHandler.java new file mode 100644 index 00000000..5e7e1e54 --- /dev/null +++ b/gwtquery-core/src/main/java/com/google/gwt/query/vm/JsonBuilderHandler.java @@ -0,0 +1,333 @@ +package com.google.gwt.query.vm; + +import com.google.gwt.query.client.Function; +import com.google.gwt.query.client.IsProperties; +import com.google.gwt.query.client.Properties; +import com.google.gwt.query.client.builders.JsonBuilder; +import com.google.gwt.query.client.builders.Name; +import com.google.gwt.query.rebind.JsonBuilderGenerator; +import com.google.gwt.query.vm.JsonFactoryJre.JreJsonFunction; + +import java.lang.reflect.Array; +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashSet; +import java.util.Hashtable; +import java.util.List; + +import elemental.json.Json; +import elemental.json.JsonArray; +import elemental.json.JsonBoolean; +import elemental.json.JsonNull; +import elemental.json.JsonNumber; +import elemental.json.JsonObject; +import elemental.json.JsonString; +import elemental.json.JsonValue; + +public class JsonBuilderHandler implements InvocationHandler { + + static JsonFactoryJre jsonFactory = new JsonFactoryJre(); + + private JsonObject jsonObject; + + public JsonBuilderHandler() { + jsonObject = Json.createObject(); + } + + public JsonBuilderHandler(JsonObject j) { + jsonObject = j; + } + + public JsonBuilderHandler(String payload) throws Throwable { + jsonObject = Json.parse(payload); + } + + @SuppressWarnings("unchecked") + private Object jsonArrayToList(JsonArray j, Class ctype, boolean isArray) { + List l = new ArrayList(); + for (int i = 0; j != null && i < j.length(); i++) { + l.add((T) getValue(j, i, null, null, ctype, null)); + } + return l.isEmpty() ? null : isArray ? l.toArray((T[]) Array.newInstance(ctype, l.size())) : l; + } + + private Double toDouble(String attr, JsonArray arr, int idx, JsonObject obj) { + try { + return obj != null ? obj.getNumber(attr) : arr.getNumber(idx); + } catch (Exception e) { + return Double.valueOf(0d); + } + } + + private Object getValue(JsonArray arr, int idx, JsonObject obj, String attr, Class clz, + Method method) { + if (clz.equals(Boolean.class) || clz == Boolean.TYPE) { + try { + return obj != null ? obj.getBoolean(attr) : arr.getBoolean(idx); + } catch (Exception e) { + return Boolean.FALSE; + } + } else if (clz.equals(Date.class)) { + return new Date((long) (obj != null ? obj.getNumber(attr) : arr.getNumber(idx))); + } else if (clz.equals(Byte.class) || clz == Byte.TYPE) { + return toDouble(attr, arr, idx, obj).byteValue(); + } else if (clz.equals(Short.class) || clz == Short.TYPE) { + return toDouble(attr, arr, idx, obj).shortValue(); + } else if (clz.equals(Integer.class) || clz == Integer.TYPE) { + return toDouble(attr, arr, idx, obj).intValue(); + } else if (clz.equals(Double.class) || clz == Double.TYPE) { + return toDouble(attr, arr, idx, obj); + } else if (clz.equals(Float.class) || clz == Float.TYPE) { + return toDouble(attr, arr, idx, obj).floatValue(); + } else if (clz.equals(Long.class) || clz == Long.TYPE) { + return toDouble(attr, arr, idx, obj).longValue(); + } + + Object ret = obj != null ? obj.get(attr) : arr.get(idx); + if (ret instanceof JreJsonFunction || clz.equals(Function.class)) { + return ret != null && ret instanceof JreJsonFunction ? ((JreJsonFunction) ret).getFunction() + : null; + } else if (ret instanceof JsonNull) { + return null; + } else if (ret instanceof JsonString) { + return ((JsonString) ret).asString(); + } else if (ret instanceof JsonBoolean) { + return ((JsonBoolean) ret).asBoolean(); + } else if (ret instanceof JsonNumber) { + return toDouble(attr, arr, idx, obj); + } else if (ret instanceof JsonArray || clz.isArray() || clz.equals(List.class)) { + Class ctype = Object.class; + if (clz.isArray()) { + ctype = clz.getComponentType(); + } else { + Type returnType = method.getGenericReturnType(); + if (returnType instanceof ParameterizedType) { + ctype = (Class) ((ParameterizedType) returnType).getActualTypeArguments()[0]; + } + } + return jsonArrayToList(obj.getArray(attr), ctype, clz.isArray()); + } else if (ret instanceof JsonObject) { + if (clz == Object.class) { + return jsonFactory.createBinder((JsonObject) ret); + } else if (IsProperties.class.isAssignableFrom(clz) && !clz.isAssignableFrom(ret.getClass())) { + return jsonFactory.create(clz, (JsonObject) ret); + } + } + return ret; + } + + private JsonArray listToJsonArray(Object... l) throws Throwable { + JsonArray ret = Json.createArray(); + for (Object o : l) { + setValue(ret, null, null, o); + } + return ret; + } + + private Object setValue(JsonArray jsArr, JsonObject jsObj, String attr, Object val) { + if (val == null) { + return Json.createNull(); + } + + try { + Class valClaz = JsonValue.class; + if (val instanceof Number) { + val = ((Number) val).doubleValue(); + valClaz = Double.TYPE; + } else if (val instanceof Boolean) { + valClaz = Boolean.TYPE; + } else if (val instanceof Date) { + val = ((Date) val).getTime(); + valClaz = Double.TYPE; + } else if (val instanceof String) { + valClaz = String.class; + } else if (val instanceof IsProperties) { + val = ((IsProperties) val).getDataImpl(); + } else if (val.getClass().isArray() || val instanceof List) { + val = + listToJsonArray(val.getClass().isArray() ? (Object[]) val : ((List) val).toArray()); + } else if (val instanceof Function) { + val = new JreJsonFunction((Function) val); + } + + if (jsObj != null) { + Method mth = jsObj.getClass().getMethod("put", String.class, valClaz); + mth.invoke(jsObj, new Object[] {attr, val}); + return jsObj; + } else { + Method mth = jsArr.getClass().getMethod("set", Integer.TYPE, valClaz); + mth.invoke(jsArr, new Object[] {new Integer(jsArr.length()), val}); + return jsArr; + } + } catch (Throwable e) { + e.printStackTrace(); + } + return null; + } + + @Override + public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { + String mname = method.getName(); + Class[] classes = method.getParameterTypes(); + int largs = classes.length; + + Name name = method.getAnnotation(Name.class); + String attr = name != null ? name.value() : methodName2AttrName(mname); + + if ("getFieldNames".equals(mname)) { + return jsonObject.keys(); + } else if ("as".equals(mname)) { + @SuppressWarnings("unchecked") + Class clz = (Class) args[0]; + return jsonFactory.create(clz, jsonObject); + } else if ("getJsonName".equals(mname)) { + return JsonBuilderGenerator.classNameToJsonName(getDataBindingClassName(proxy.getClass())); + } else if (mname.matches("getProperties|getDataImpl")) { + return jsonObject; + } else if (largs > 0 && ("parse".equals(mname) || "load".equals(mname))) { + String json = String.valueOf(args[0]); + if (largs > 1 && Boolean.TRUE.equals(args[1])) { + json = Properties.wrapPropertiesString(json); + } + jsonObject = Json.parse(json); + } else if ("strip".equals(mname)) { + stripProxy((JsonBuilder) proxy); + } else if (mname.matches("toString")) { + return jsonObject.toString(); + } else if (mname.matches("toJsonWithName")) { + String jsonName = + JsonBuilderGenerator.classNameToJsonName(getDataBindingClassName(proxy.getClass())); + return "{\"" + jsonName + "\":" + jsonObject.toString() + "}"; + } else if (mname.matches("toJson")) { + return jsonObject.toString(); + } else if ("toQueryString".equals(mname)) { + return param(jsonObject); + } else if (largs == 1 && mname.equals("get")) { + Class ret = method.getReturnType(); + attr = String.valueOf(args[0]); + return getValue(null, 0, jsonObject, attr, ret, method); + } else if (largs == 0 || mname.startsWith("get")) { + Class ret = method.getReturnType(); + return getValue(null, 0, jsonObject, attr, ret, method); + } else if (largs == 2 && mname.equals("set")) { + setValue(null, jsonObject, String.valueOf(args[0]), args[1]); + return proxy; + } else if (largs == 1 || mname.startsWith("set")) { + setValue(null, jsonObject, attr, args[0]); + return proxy; + } + return null; + } + + public String methodName2AttrName(String s) { + return deCapitalize(s.replaceFirst("^[gs]et", "")); + } + + private String deCapitalize(String s) { + return s != null && s.length() > 0 ? s.substring(0, 1).toLowerCase() + s.substring(1) : s; + } + + /** + * @param proxy + */ + private void stripProxy(JsonBuilder proxy) { + Class type = proxy.getClass().getInterfaces()[0]; + + HashSet valid = getValidMethodsFrom(type.getMethods()); + Hashtable recursiveBuilders = getJsonBuildersFrom(type.getMethods()); + + for (String key : jsonObject.keys()) { + String name = methodName2AttrName(key); + if (!valid.contains(name)) { + jsonObject.remove(key); + continue; + } + Method recursiveBuilder = recursiveBuilders.get(name); + if (recursiveBuilder != null) { + callRecursiveStrip(proxy, recursiveBuilder); + } + } + } + + private void callRecursiveStrip(JsonBuilder proxy, Method recursiveBuilder) { + try { + ((IsProperties) invoke(proxy, recursiveBuilder, new Object[] {})).strip(); + } catch (Throwable e) { + e.printStackTrace(); + } + } + + private String getDataBindingClassName(Class type) { + for (Class c : type.getInterfaces()) { + if (c.equals(JsonBuilder.class)) { + return type.getName(); + } else { + return getDataBindingClassName(c); + } + } + return null; + } + + private String param(JsonObject o) { + String ret = ""; + for (String k : o.keys()) { + ret += ret.isEmpty() ? "" : "&"; + JsonValue v = o.get(k); + if (v instanceof JsonArray) { + for (int i = 0, l = ((JsonArray) v).length(); i < l; i++) { + ret += i > 0 ? "&" : ""; + JsonValue e = ((JsonArray) v).get(i); + ret += k + "[]=" + e.toJson(); + } + } else { + if (v != null && !(v instanceof JsonNull)) { + ret += k + "=" + v.toJson(); + } + } + } + return ret; + } + + private HashSet getValidMethodsFrom(Method[] methods) { + HashSet valid = new HashSet(); + + if (methods == null || methods.length == 0) { + return valid; + } + + for (Method m : methods) { + String attr = methodName2AttrName(m.getName()); + Name annotation = m.getAnnotation(Name.class); + + if (annotation != null) { + attr = annotation.value(); + } + valid.add(attr); + } + return valid; + } + + private Hashtable getJsonBuildersFrom(Method[] methods) { + Hashtable recursiveBuilders = new Hashtable(); + + if (methods == null || methods.length == 0) { + return recursiveBuilders; + } + + for (Method m : methods) { + Class[] classes = m.getParameterTypes(); + boolean isRecursiveJsonBuilder = + classes.length == 0 && IsProperties.class.isAssignableFrom(m.getReturnType()); + if (isRecursiveJsonBuilder) { + String attr = methodName2AttrName(m.getName()); + recursiveBuilders.put(attr, m); + } + } + + return recursiveBuilders; + } +} \ No newline at end of file diff --git a/gwtquery-core/src/main/java/com/google/gwt/query/vm/JsonFactoryJre.java b/gwtquery-core/src/main/java/com/google/gwt/query/vm/JsonFactoryJre.java index 799cf256..54e8aab3 100644 --- a/gwtquery-core/src/main/java/com/google/gwt/query/vm/JsonFactoryJre.java +++ b/gwtquery-core/src/main/java/com/google/gwt/query/vm/JsonFactoryJre.java @@ -2,34 +2,13 @@ package com.google.gwt.query.vm; import com.google.gwt.query.client.Function; import com.google.gwt.query.client.IsProperties; -import com.google.gwt.query.client.Properties; import com.google.gwt.query.client.builders.JsonBuilder; import com.google.gwt.query.client.builders.JsonFactory; -import com.google.gwt.query.client.builders.Name; -import com.google.gwt.query.rebind.JsonBuilderGenerator; -import com.google.gwt.query.vm.strip.JsonStripJre; -import com.google.gwt.query.vm.util.MethodNameParser; -import java.lang.reflect.Array; import java.lang.reflect.InvocationHandler; -import java.lang.reflect.Method; -import java.lang.reflect.ParameterizedType; import java.lang.reflect.Proxy; -import java.lang.reflect.Type; -import java.util.ArrayList; -import java.util.Date; -import java.util.HashSet; -import java.util.Hashtable; -import java.util.List; -import elemental.json.Json; -import elemental.json.JsonArray; -import elemental.json.JsonBoolean; -import elemental.json.JsonNull; -import elemental.json.JsonNumber; import elemental.json.JsonObject; -import elemental.json.JsonString; -import elemental.json.JsonValue; import elemental.json.impl.JreJsonNull; /** @@ -40,7 +19,7 @@ import elemental.json.impl.JreJsonNull; */ public class JsonFactoryJre implements JsonFactory { - static JsonFactoryJre jsonFactory = new JsonFactoryJre(); + /** * Although functions cannot be serialized to json we use JsonBuilders @@ -62,256 +41,6 @@ public class JsonFactoryJre implements JsonFactory { } } - public static class JsonBuilderHandler implements InvocationHandler { - private JsonObject jsonObject; - - public JsonBuilderHandler() { - jsonObject = Json.createObject(); - } - - public JsonBuilderHandler(JsonObject j) { - jsonObject = j; - } - - public JsonBuilderHandler(String payload) throws Throwable { - jsonObject = Json.parse(payload); - } - - @SuppressWarnings("unchecked") - private Object jsonArrayToList(JsonArray j, Class ctype, boolean isArray) { - List l = new ArrayList(); - for (int i = 0; j != null && i < j.length() ; i++) { - l.add((T)getValue(j, i, null, null, ctype, null)); - } - return l.isEmpty() ? null : isArray ? l.toArray((T[])Array.newInstance(ctype, l.size())) : l; - } - - private Double toDouble(String attr, JsonArray arr, int idx, JsonObject obj) { - try { - return obj != null ? obj.getNumber(attr) : arr.getNumber(idx); - } catch (Exception e) { - return Double.valueOf(0d); - } - } - - private Object getValue(JsonArray arr, int idx, JsonObject obj, String attr, Class clz, Method method) { - if (clz.equals(Boolean.class) || clz == Boolean.TYPE) { - try { - return obj != null ? obj.getBoolean(attr): arr.getBoolean(idx); - } catch (Exception e) { - return Boolean.FALSE; - } - } else if (clz.equals(Date.class)) { - return new Date((long)(obj != null ? obj.getNumber(attr): arr.getNumber(idx))); - } else if (clz.equals(Byte.class) || clz == Byte.TYPE) { - return toDouble(attr, arr, idx, obj).byteValue(); - } else if (clz.equals(Short.class) || clz == Short.TYPE) { - return toDouble(attr, arr, idx, obj).shortValue(); - } else if (clz.equals(Integer.class) || clz == Integer.TYPE) { - return toDouble(attr, arr, idx, obj).intValue(); - } else if (clz.equals(Double.class) || clz == Double.TYPE) { - return toDouble(attr, arr, idx, obj); - } else if (clz.equals(Float.class) || clz == Float.TYPE) { - return toDouble(attr, arr, idx, obj).floatValue(); - } else if (clz.equals(Long.class) || clz == Long.TYPE) { - return toDouble(attr, arr, idx, obj).longValue(); - } - - Object ret = obj != null ? obj.get(attr): arr.get(idx); - if (ret instanceof JreJsonFunction || clz.equals(Function.class)) { - return ret != null && ret instanceof JreJsonFunction ? ((JreJsonFunction)ret).getFunction() : null; - } else if (ret instanceof JsonNull) { - return null; - } else if (ret instanceof JsonString) { - return ((JsonString)ret).asString(); - } else if (ret instanceof JsonBoolean) { - return ((JsonBoolean)ret).asBoolean(); - } else if (ret instanceof JsonNumber) { - return toDouble(attr, arr, idx, obj); - } else if (ret instanceof JsonArray || clz.isArray() || clz.equals(List.class)) { - Class ctype = Object.class; - if (clz.isArray()) { - ctype = clz.getComponentType(); - } else { - Type returnType = method.getGenericReturnType(); - if (returnType instanceof ParameterizedType) { - ctype = (Class)((ParameterizedType) returnType).getActualTypeArguments()[0]; - } - } - return jsonArrayToList(obj.getArray(attr), ctype, clz.isArray()); - } else if (ret instanceof JsonObject) { - if (clz == Object.class) { - return jsonFactory.createBinder((JsonObject)ret); - } else if (IsProperties.class.isAssignableFrom(clz) && !clz.isAssignableFrom(ret.getClass())) { - return jsonFactory.create(clz, (JsonObject)ret); - } - } - return ret; - } - - private JsonArray listToJsonArray(Object...l) throws Throwable { - JsonArray ret = Json.createArray(); - for (Object o: l) { - setValue(ret, null, null, o); - } - return ret; - } - - private Object setValue(JsonArray jsArr, JsonObject jsObj, String attr, Object val) { - if (val == null) { - return Json.createNull(); - } - - try { - Class valClaz = JsonValue.class; - if (val instanceof Number) { - val = ((Number)val).doubleValue(); - valClaz = Double.TYPE; - } else if (val instanceof Boolean) { - valClaz = Boolean.TYPE; - } else if (val instanceof Date) { - val = ((Date)val).getTime(); - valClaz = Double.TYPE; - } else if (val instanceof String) { - valClaz = String.class; - } else if (val instanceof IsProperties) { - val = ((IsProperties)val).getDataImpl(); - } else if (val.getClass().isArray() || val instanceof List) { - val = listToJsonArray(val.getClass().isArray() ? (Object[])val : ((List)val).toArray()); - } else if (val instanceof Function) { - val = new JreJsonFunction((Function)val); - } - - if (jsObj != null) { - Method mth = jsObj.getClass().getMethod("put", String.class, valClaz); - mth.invoke(jsObj, new Object[]{attr, val}); - return jsObj; - } else { - Method mth = jsArr.getClass().getMethod("set", Integer.TYPE, valClaz); - mth.invoke(jsArr, new Object[]{new Integer(jsArr.length()), val}); - return jsArr; - } - } catch (Throwable e) { - e.printStackTrace(); - } - return null; - } - - @Override - public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { - String mname = method.getName(); - Class[] classes = method.getParameterTypes(); - int largs = classes.length; - - Name name = method.getAnnotation(Name.class); - String attr = name != null ? name.value() : MethodNameParser.methodName2AttrName(mname); - - if ("getFieldNames".equals(mname)) { - return jsonObject.keys(); - } else if ("as".equals(mname)) { - @SuppressWarnings("unchecked") - Class clz = (Class)args[0]; - return jsonFactory.create(clz, jsonObject); - } else if ("getJsonName".equals(mname)) { - return JsonBuilderGenerator.classNameToJsonName(getDataBindingClassName(proxy.getClass())); - } else if (mname.matches("getProperties|getDataImpl")) { - return jsonObject; - } else if (largs > 0 && ("parse".equals(mname) || "load".equals(mname))) { - String json = String.valueOf(args[0]); - if (largs > 1 && Boolean.TRUE.equals(args[1])) { - json = Properties.wrapPropertiesString(json); - } - jsonObject = Json.parse(json); - } else if ("strip".equals(mname)) { - stripProxy((JsonBuilder)proxy); - } else if (mname.matches("toString")) { - return jsonObject.toString(); - } else if (mname.matches("toJsonWithName")) { - String jsonName = JsonBuilderGenerator.classNameToJsonName(getDataBindingClassName(proxy.getClass())); - return "{\"" + jsonName + "\":"+ jsonObject.toString() + "}"; - } else if (mname.matches("toJson")) { - return jsonObject.toString() ; - } else if ("toQueryString".equals(mname)) { - return param(jsonObject); - } else if (largs == 1 && mname.equals("get")) { - Class ret = method.getReturnType(); - attr = String.valueOf(args[0]); - return getValue(null, 0, jsonObject, attr, ret, method); - } else if (largs == 0 || mname.startsWith("get")) { - Class ret = method.getReturnType(); - return getValue(null, 0, jsonObject, attr, ret, method); - } else if (largs == 2 && mname.equals("set")) { - setValue(null, jsonObject, String.valueOf(args[0]), args[1]); - return proxy; - } else if (largs == 1 || mname.startsWith("set")) { - setValue(null, jsonObject, attr, args[0]); - return proxy; - } - return null; - } - - /** - * @param proxy - */ - private void stripProxy(JsonBuilder proxy) { - Class type = proxy.getClass().getInterfaces()[0]; - - HashSet valid = JsonStripJre.getValidMethodsFrom(type.getMethods()); - Hashtable recursiveBuilders = JsonStripJre.getJsonBuildersFrom(type.getMethods()); - - for (String key: jsonObject.keys()) { - String name = MethodNameParser.methodName2AttrName(key); - if (!valid.contains(name)) { - jsonObject.remove(key); - continue; - } - Method recursiveBuilder = recursiveBuilders.get(name); - if (recursiveBuilder != null) { - callRecursiveStrip(proxy,recursiveBuilder); - } - } - } - - private void callRecursiveStrip(JsonBuilder proxy, Method recursiveBuilder) { - try { - ((IsProperties)invoke(proxy, recursiveBuilder, new Object[]{})).strip(); - } catch (Throwable e) { - e.printStackTrace(); - } - } - - private String getDataBindingClassName(Class type) { - for (Class c : type.getInterfaces()) { - if (c.equals(JsonBuilder.class)) { - return type.getName(); - } else { - return getDataBindingClassName(c); - } - } - return null; - } - - private String param(JsonObject o) { - String ret = ""; - for (String k : o.keys()) { - ret += ret.isEmpty() ? "" : "&"; - JsonValue v = o.get(k); - if (v instanceof JsonArray) { - for (int i = 0, l = ((JsonArray)v).length(); i < l ; i++) { - ret += i > 0 ? "&" : ""; - JsonValue e = ((JsonArray)v).get(i); - ret += k + "[]=" + e.toJson(); - } - } else { - if (v != null && !(v instanceof JsonNull)) { - ret += k + "=" + v.toJson(); - } - } - } - return ret; - } - } - @SuppressWarnings("unchecked") public T create(Class clz, JsonObject jso) { InvocationHandler handler = new JsonBuilderHandler(jso); diff --git a/gwtquery-core/src/main/java/com/google/gwt/query/vm/strip/JsonStripJre.java b/gwtquery-core/src/main/java/com/google/gwt/query/vm/strip/JsonStripJre.java deleted file mode 100644 index 19e961af..00000000 --- a/gwtquery-core/src/main/java/com/google/gwt/query/vm/strip/JsonStripJre.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.google.gwt.query.vm.strip; - -import com.google.gwt.query.client.IsProperties; -import com.google.gwt.query.client.builders.Name; -import com.google.gwt.query.vm.util.MethodNameParser; - -import java.lang.reflect.Method; -import java.util.HashSet; -import java.util.Hashtable; - -public class JsonStripJre { - - public static HashSet getValidMethodsFrom(Method[] methods) { - HashSet valid = new HashSet(); - - if (!isValidArray(methods)) { - return valid; - } - - for (Method m : methods) { - String attr = MethodNameParser.methodName2AttrName(m.getName()); - Name annotation = m.getAnnotation(Name.class); - - if (annotation != null) { - attr = annotation.value(); - } - valid.add(attr); - } - return valid; - } - - - - public static Hashtable getJsonBuildersFrom(Method[] methods) { - Hashtable recursiveBuilders = new Hashtable(); - - if (!isValidArray(methods)) { - return recursiveBuilders; - } - - for (Method m : methods) { - if(isRecursiveJsonBuilder(m)) { - String attr = MethodNameParser.methodName2AttrName(m.getName()); - recursiveBuilders.put(attr, m); - } - } - - return recursiveBuilders; - } - - private static boolean isRecursiveJsonBuilder(Method m) { - Class[] classes = m.getParameterTypes(); - return classes.length == 0 && IsProperties.class.isAssignableFrom(m.getReturnType()); - } - - - private static boolean isValidArray(Object[] array) { - return array != null && array.length > 0; - } - -} diff --git a/gwtquery-core/src/main/java/com/google/gwt/query/vm/util/MethodNameParser.java b/gwtquery-core/src/main/java/com/google/gwt/query/vm/util/MethodNameParser.java deleted file mode 100644 index 99e9ff93..00000000 --- a/gwtquery-core/src/main/java/com/google/gwt/query/vm/util/MethodNameParser.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.google.gwt.query.vm.util; - -public class MethodNameParser { - - public static String methodName2AttrName(String s) { - return deCapitalize(s.replaceFirst("^[gs]et", "")); - } - - private static String deCapitalize(String s) { - return s != null && s.length() > 0 ? s.substring(0, 1).toLowerCase() + s.substring(1) : s; - } -} -- cgit v1.2.3 From b571d28f9371a4c95837ddf383699d7211572857 Mon Sep 17 00:00:00 2001 From: Adolfo Panizo Date: Fri, 26 Dec 2014 16:49:26 +0100 Subject: Adding documentation and renaming some vars --- .../com/google/gwt/query/client/IsProperties.java | 2 + .../google/gwt/query/vm/JsonBuilderHandler.java | 45 ++++++++++------------ 2 files changed, 22 insertions(+), 25 deletions(-) diff --git a/gwtquery-core/src/main/java/com/google/gwt/query/client/IsProperties.java b/gwtquery-core/src/main/java/com/google/gwt/query/client/IsProperties.java index 3b88edf5..f630cf21 100644 --- a/gwtquery-core/src/main/java/com/google/gwt/query/client/IsProperties.java +++ b/gwtquery-core/src/main/java/com/google/gwt/query/client/IsProperties.java @@ -35,6 +35,8 @@ public interface IsProperties { /** * Removes the extra JSON and leaves only the setters/getters described * in the JsonBuilder interface. + * If the object contains another IsProperties attributes the method strip() + * is called on them. */ T strip(); diff --git a/gwtquery-core/src/main/java/com/google/gwt/query/vm/JsonBuilderHandler.java b/gwtquery-core/src/main/java/com/google/gwt/query/vm/JsonBuilderHandler.java index 5e7e1e54..8d9b9a4c 100644 --- a/gwtquery-core/src/main/java/com/google/gwt/query/vm/JsonBuilderHandler.java +++ b/gwtquery-core/src/main/java/com/google/gwt/query/vm/JsonBuilderHandler.java @@ -231,36 +231,31 @@ public class JsonBuilderHandler implements InvocationHandler { return s != null && s.length() > 0 ? s.substring(0, 1).toLowerCase() + s.substring(1) : s; } - /** - * @param proxy + /* + * This method removes all the json which is not mapped into a + * method inside the JsonBuilder Object. + * Also if the proxy contains another JsonBuilder in their methods + * the method strip() is called. */ - private void stripProxy(JsonBuilder proxy) { + private void stripProxy(JsonBuilder proxy) throws Throwable { Class type = proxy.getClass().getInterfaces()[0]; - HashSet valid = getValidMethodsFrom(type.getMethods()); - Hashtable recursiveBuilders = getJsonBuildersFrom(type.getMethods()); + HashSet validAttrs = getAttributeNames(type.getMethods()); + Hashtable ispropertyGetters = getJsonBuilders(type.getMethods()); for (String key : jsonObject.keys()) { String name = methodName2AttrName(key); - if (!valid.contains(name)) { + if (!validAttrs.contains(name)) { jsonObject.remove(key); continue; } - Method recursiveBuilder = recursiveBuilders.get(name); - if (recursiveBuilder != null) { - callRecursiveStrip(proxy, recursiveBuilder); + Method ispropertyGetter = ispropertyGetters.get(name); + if (ispropertyGetter != null) { + ((IsProperties) invoke(proxy, ispropertyGetter, new Object[] {})).strip(); } } } - private void callRecursiveStrip(JsonBuilder proxy, Method recursiveBuilder) { - try { - ((IsProperties) invoke(proxy, recursiveBuilder, new Object[] {})).strip(); - } catch (Throwable e) { - e.printStackTrace(); - } - } - private String getDataBindingClassName(Class type) { for (Class c : type.getInterfaces()) { if (c.equals(JsonBuilder.class)) { @@ -292,7 +287,7 @@ public class JsonBuilderHandler implements InvocationHandler { return ret; } - private HashSet getValidMethodsFrom(Method[] methods) { + private HashSet getAttributeNames(Method[] methods) { HashSet valid = new HashSet(); if (methods == null || methods.length == 0) { @@ -311,23 +306,23 @@ public class JsonBuilderHandler implements InvocationHandler { return valid; } - private Hashtable getJsonBuildersFrom(Method[] methods) { - Hashtable recursiveBuilders = new Hashtable(); + private Hashtable getJsonBuilders(Method[] methods) { + Hashtable ispropertyGetters = new Hashtable(); if (methods == null || methods.length == 0) { - return recursiveBuilders; + return ispropertyGetters; } for (Method m : methods) { Class[] classes = m.getParameterTypes(); - boolean isRecursiveJsonBuilder = + boolean isJsonBuilder = classes.length == 0 && IsProperties.class.isAssignableFrom(m.getReturnType()); - if (isRecursiveJsonBuilder) { + if (isJsonBuilder) { String attr = methodName2AttrName(m.getName()); - recursiveBuilders.put(attr, m); + ispropertyGetters.put(attr, m); } } - return recursiveBuilders; + return ispropertyGetters; } } \ No newline at end of file -- cgit v1.2.3