]> source.dussan.org Git - gwtquery.git/commitdiff
Fixing a bug in Properties parser when the input string was an empty json. Re-factori...
authorManolo Carrasco <manolo@apache.org>
Mon, 2 May 2011 08:41:50 +0000 (08:41 +0000)
committerManolo Carrasco <manolo@apache.org>
Mon, 2 May 2011 08:41:50 +0000 (08:41 +0000)
gwtquery-core/src/main/java/com/google/gwt/query/client/Properties.java
gwtquery-core/src/main/java/com/google/gwt/query/client/js/JsCache.java
gwtquery-core/src/test/java/com/google/gwt/query/client/GQueryJsTest.java
gwtquery-core/src/test/java/com/google/gwt/query/client/JreQueryCoreTest.java

index 5d576ed51470454df87acfd74487d97476c0ec90..25d62c8fa18510e8cae7d36042001b863d1d5aef 100644 (file)
@@ -23,35 +23,36 @@ import com.google.gwt.query.client.js.JsCache;
  */\r
 public class Properties extends JavaScriptObject {\r
   \r
+  public static Properties create() {\r
+    return (Properties) createImpl("({})");\r
+  }\r
+  \r
   public static Properties create(String properties) {\r
     String p = wrapPropertiesString(properties);\r
     try {\r
       return (Properties) createImpl(p);\r
     } catch (Exception e) {\r
-      System.err.println("Error creating Properties: \n" + properties  + "\n" + p + "\n" + e.getMessage());\r
-      return (Properties) createImpl("({})");\r
+      System.err.println("Error creating Properties: \n> " + properties  + "\n< " + p + "\n" + e.getMessage());\r
+      return create();\r
     }\r
   }\r
-  \r
-  public static Properties create() {\r
-    return (Properties) createImpl("({})");\r
-  }\r
 \r
   public static final native JavaScriptObject createImpl(String properties) /*-{\r
-     return eval(properties);\r
+    return eval(properties);\r
   }-*/;\r
 \r
   public static String wrapPropertiesString(String s) {\r
     String ret = "({" + s //\r
-        .replaceAll("\\s*/\\*[\\s\\S]*?\\*/\\s*", "") //\r
-        .replaceAll("([:\\)\\(,;}{'\"])\\s+" , "$1") //\r
-        .replaceAll("\\s+([:\\)\\(,;}{'\"])" , "$1") //\r
-        .replaceFirst("^[{\\(]+(.+[^}\\)])[}\\)]+$", "$1") //\r
-        .replaceAll("\\('([^\\)]+)'\\)" , "($1)") //\r
-        .replaceAll(",([\\w-]+:+)" , ";$1") //\r
-        .replaceAll(":\\s*[\"']?([^;]+)([;]|$)[\"']?\\s*", ":'$1',") //\r
-        .replaceFirst("[;,]$", "") //\r
-        .replaceAll("\\s*[']+\\s*", "'") //\r
+        .replaceAll("\\s*/\\*[\\s\\S]*?\\*/\\s*", "") // Remove comments\r
+        .replaceAll("([:\\)\\(,;}{'\"])\\s+" , "$1") // Remove spaces\r
+        .replaceAll("\\s+([:\\)\\(,;}{'\"])" , "$1") // Remove spaces\r
+        .replaceFirst("^[{\\(]+(|.*[^}\\)])[}\\)]+$", "$1") // Remove ({})\r
+        .replaceAll("\\('([^\\)]+)'\\)" , "($1)") // Remove quotes\r
+        .replaceAll(",+([\\w-]+:+)" , ";$1") // put semicolon\r
+        .replaceAll(":\\s*[\"']?([^;]+)([;]+|$)[\"']?\\s*", ":'$1',") // put quotes\r
+        .replaceAll(":'(-?[\\d\\.]+|null|false|true)',", ":$1,") // numbers do not need quote\r
+        .replaceFirst("[;,]$", "") // remove endings \r
+        .replaceAll("\\s*[']+\\s*", "'") // remove duplicates\r
         + "})";\r
     return ret;\r
   }\r
@@ -64,6 +65,10 @@ public class Properties extends JavaScriptObject {
     return this;\r
   }\r
 \r
+  private JsCache c() {\r
+    return this.<JsCache>cast();\r
+  }\r
+\r
   public final native Properties cloneProps() /*-{\r
     var props = {};\r
     for(p in this) {\r
@@ -72,33 +77,41 @@ public class Properties extends JavaScriptObject {
     return props;\r
   }-*/;\r
 \r
-  public final native boolean defined(String name) /*-{\r
-    return this[name] != undefined;  \r
-  }-*/;\r
+  public final boolean defined(Object name) {\r
+    return c().exists(String.valueOf(name));\r
+  }\r
 \r
-  public final native <T> T get(String name) /*-{\r
-    return this[name];\r
-  }-*/;\r
+  public final <T> T get(Object name) {\r
+    return c().get(String.valueOf(name));\r
+  }\r
 \r
-  public final native String getStr(String name) /*-{\r
-    return String(this[name]);\r
-  }-*/;\r
+  public final boolean getBoolean(Object name) {\r
+    return c().getBoolean(String.valueOf(name));\r
+  }\r
 \r
-  public final native float getFloat(String name) /*-{\r
-    return this[name];\r
-  }-*/;\r
+  public final float getFloat(Object name) {\r
+    return c().getFloat(String.valueOf(name));\r
+  }\r
 \r
-  public final native int getInt(String name) /*-{\r
-    return this[name];\r
-  }-*/;\r
+  public final int getInt(Object name) {\r
+    return c().getInt(String.valueOf(name));\r
+  }\r
+  \r
+  public final String getStr(Object name) {\r
+    return c().getString(String.valueOf(name));\r
+  }\r
 \r
   public final String[] keys() {\r
-    return this.<JsCache>cast().keys();\r
+    return c().keys();\r
+  }\r
+  \r
+  public final <T> void remove(T name) {\r
+    c().delete(String.valueOf(name));\r
+  }\r
+  \r
+  public final <T> void set(T name, Object val) {\r
+    c().put(String.valueOf(name), val);\r
   }\r
-\r
-  public final native void set(String key, Object val) /*-{\r
-    this[key]=val;\r
-  }-*/;\r
   \r
   public final String tostring() {\r
     String ret = "";\r
index 022ee6bc50135f55085089a8d846b6f45071a5f5..5a85be04aee8914d2a424bab5ca4659f14098a08 100644 (file)
@@ -53,6 +53,22 @@ public class JsCache extends JavaScriptObject {
   public final JsCache getCache(int id) {
     return (JsCache)get(id);
   }
+  
+  public final native boolean getBoolean(int id) /*-{
+    return !!this[id];
+  }-*/;
+
+  public final native boolean getBoolean(String id) /*-{
+    return !!this[id];
+  }-*/;
+
+  public final native float getFloat(int id) /*-{
+    return this[id] || 0;
+  }-*/;
+
+  public final native float getFloat(String id) /*-{
+    return this[id] || 0;
+  }-*/;
 
   public final native double getDouble(int id) /*-{
     return this[id] || 0;
@@ -61,7 +77,7 @@ public class JsCache extends JavaScriptObject {
   public final native double getDouble(String id) /*-{
     return this[id] || 0;
   }-*/;
-
+  
   public final native int getInt(int id) /*-{
     return this[id] || 0;
   }-*/;
@@ -71,11 +87,11 @@ public class JsCache extends JavaScriptObject {
   }-*/;
 
   public final native String getString(int id) /*-{
-    return this[id];
+    return this[id] == null ? null : String(this[id]);
   }-*/;
 
   public final native String getString(String id) /*-{
-    return this[id] || null;
+    return this[id] == null ? null : String(this[id]);
   }-*/;
 
   public final native boolean isEmpty() /*-{
index c497bde62241ba7b6d184462c0622ced3e6d3c3b..0a3bb9d97eeb97bb6970595e56ff9f7efc60bde4 100644 (file)
@@ -117,5 +117,20 @@ public class GQueryJsTest extends GWTTestCase {
     p = $$("color: 'rgb(0, 0,139)', background: red");
     assertEquals(2, p.keys().length);
     assertEquals("rgb(0,0,139)", p.getStr("color"));
+    
+    p = $$("a: 1, b: 0.5, c: null, d: whatever, e: true, f: false");
+    System.out.println(p.tostring());
+    assertEquals(1, p.getInt("a"));
+    assertEquals(0.5f, p.getFloat("b"));
+    assertEquals("whatever", p.getStr("d"));
+    assertNull(p.getStr("c"));
+    assertNull(p.getStr("ccc"));
+    assertTrue(p.getBoolean("e"));
+    assertTrue(p.getBoolean("d"));
+    assertFalse(p.getBoolean("f"));
+    assertFalse(p.getBoolean("c"));
+    assertTrue(p.defined("d"));
+    p.remove("d");
+    assertFalse(p.defined("d"));
   }
 }
index a6df7a39e0b5c71c94c9746289be6acd30f9a040..48c9dda06ee49dde08d122a747563dad47379daf 100644 (file)
@@ -34,6 +34,10 @@ public class JreQueryCoreTest extends GWTTestCase {
   }
 
   public void testWrapPropertiesString() {
+    assertEquals("({})", Properties
+        .wrapPropertiesString(""));
+    assertEquals("({})", Properties
+        .wrapPropertiesString("({})"));
     assertEquals("({border:'1px solid black'})", Properties
         .wrapPropertiesString("border:'1px solid black'"));
     assertEquals("({border:'1px solid black'})", Properties
@@ -48,8 +52,8 @@ public class JreQueryCoreTest extends GWTTestCase {
         .wrapPropertiesString("{(border:'1px solid black')}"));
     assertEquals("({border:'1px solid black'})", Properties
         .wrapPropertiesString("({border:'1px solid black'})"));
-    assertEquals("({b:'a',c:'1',d:'url(https://test.com)'})", Properties
-        .wrapPropertiesString("b: 'a'; c: 1, /*gg: aadf*/d: url('https://test.com');"));
+    assertEquals("({b:'a',c:1,d:'url(https://test.com)',e:null,f:false})", Properties
+        .wrapPropertiesString("b: 'a'; c: 1, /*gg: aadf*/d: url('https://test.com');,e:null,f:false"));
     assertEquals("({color:'rgb(0,0,139)',background:'red'})", Properties
         .wrapPropertiesString("color: 'rgb(0, 0,139)', background: red"));
   }