aboutsummaryrefslogtreecommitdiffstats
path: root/gwtquery-core/src
diff options
context:
space:
mode:
authorManolo Carrasco <manolo@apache.org>2011-09-21 21:03:20 +0000
committerManolo Carrasco <manolo@apache.org>2011-09-21 21:03:20 +0000
commit8791f8bdfced127ee3222ecf8aafd76bee5c3642 (patch)
tree11c20c636d1ac1058f7282e78c7a69c62b87ca10 /gwtquery-core/src
parentf30f1c4b15fd53a4d4b7e175bb11904698c46d58 (diff)
downloadgwtquery-8791f8bdfced127ee3222ecf8aafd76bee5c3642.tar.gz
gwtquery-8791f8bdfced127ee3222ecf8aafd76bee5c3642.zip
Adding Ajax abilities to Gquery, as a easy way to get and handle data from non gwt servers. Added a generator to convert JSON objects to java builders/pojos
Diffstat (limited to 'gwtquery-core/src')
-rw-r--r--gwtquery-core/src/main/java/com/google/gwt/query/Query.gwt.xml5
-rw-r--r--gwtquery-core/src/main/java/com/google/gwt/query/client/GQ.java6
-rw-r--r--gwtquery-core/src/main/java/com/google/gwt/query/client/GQuery.java2
-rw-r--r--gwtquery-core/src/main/java/com/google/gwt/query/client/Properties.java36
-rw-r--r--gwtquery-core/src/main/java/com/google/gwt/query/client/builders/JsonBuilder.java45
-rw-r--r--gwtquery-core/src/main/java/com/google/gwt/query/client/builders/JsonBuilderBase.java84
-rw-r--r--gwtquery-core/src/main/java/com/google/gwt/query/client/builders/JsonName.java29
-rw-r--r--gwtquery-core/src/main/java/com/google/gwt/query/client/js/JsCache.java22
-rw-r--r--gwtquery-core/src/main/java/com/google/gwt/query/client/js/JsUtils.java7
-rw-r--r--gwtquery-core/src/main/java/com/google/gwt/query/client/plugins/ajax/Ajax.java209
-rw-r--r--gwtquery-core/src/main/java/com/google/gwt/query/client/plugins/ajax/AjaxImpl.java174
-rw-r--r--gwtquery-core/src/test/java/com/google/gwt/query/client/GQueryAjaxTest.java83
12 files changed, 503 insertions, 199 deletions
diff --git a/gwtquery-core/src/main/java/com/google/gwt/query/Query.gwt.xml b/gwtquery-core/src/main/java/com/google/gwt/query/Query.gwt.xml
index bf096c37..f451c033 100644
--- a/gwtquery-core/src/main/java/com/google/gwt/query/Query.gwt.xml
+++ b/gwtquery-core/src/main/java/com/google/gwt/query/Query.gwt.xml
@@ -17,6 +17,11 @@
<module>
<inherits name='com.google.gwt.user.User'/>
+ <generate-with class="com.google.gwt.query.rebind.JsonBuilderGenerator">
+ <when-type-assignable class="com.google.gwt.query.client.plugins.ajax.JsonBuilder"/>
+ </generate-with>
+
+ <!-- Lazy Generator -->
<generate-with class="com.google.gwt.query.rebind.LazyGenerator">
<when-type-assignable class="com.google.gwt.query.client.Lazy"/>
</generate-with>
diff --git a/gwtquery-core/src/main/java/com/google/gwt/query/client/GQ.java b/gwtquery-core/src/main/java/com/google/gwt/query/client/GQ.java
index 1932df40..a970fefc 100644
--- a/gwtquery-core/src/main/java/com/google/gwt/query/client/GQ.java
+++ b/gwtquery-core/src/main/java/com/google/gwt/query/client/GQ.java
@@ -5,7 +5,7 @@ import java.util.List;
import com.google.gwt.core.client.GWT;
import com.google.gwt.core.client.JsArrayMixed;
-import com.google.gwt.query.client.plugins.ajax.AjaxImpl;
+import com.google.gwt.query.client.plugins.ajax.Ajax;
import com.google.gwt.dom.client.Element;
/**
@@ -54,12 +54,12 @@ public abstract class GQ extends GQuery {
ajax(null, onSuccess, onError, settings);
}
- private static AjaxImpl ajaxImpl;
+ private static Ajax ajaxImpl;
public static void ajax(String url, Function onSuccess, Function onError,
Properties settings) {
if (ajaxImpl == null) {
- ajaxImpl = GWT.create(AjaxImpl.class);
+ ajaxImpl = GWT.create(Ajax.class);
}
ajaxImpl.ajax(url, onSuccess, onError, settings);
}
diff --git a/gwtquery-core/src/main/java/com/google/gwt/query/client/GQuery.java b/gwtquery-core/src/main/java/com/google/gwt/query/client/GQuery.java
index bd7c218c..b871db88 100644
--- a/gwtquery-core/src/main/java/com/google/gwt/query/client/GQuery.java
+++ b/gwtquery-core/src/main/java/com/google/gwt/query/client/GQuery.java
@@ -1450,9 +1450,7 @@ public class GQuery implements Lazy<GQuery, LazyGQuery> {
* Stores the value in the named spot with desired return type.
*/
public GQuery data(String name, Object value) {
-// System.out.println("DDD " + size() + " " + elements().length + " " + name + " " + value);
for (Element e : elements()) {
-// System.out.println("DATAT .....");
data(e, name, value);
}
return this;
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 b9c62e0f..3aefed30 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
@@ -32,7 +32,7 @@ public class Properties extends JavaScriptObject {
if (properties != null && !properties.isEmpty()) {
String p = wrapPropertiesString(properties);
try {
- return createImpl(p);
+ return createImpl("({" + p + "})");
} catch (Exception e) {
System.err.println("Error creating Properties: \n> " + properties + "\n< " + p + "\n" + e.getMessage());
}
@@ -45,19 +45,19 @@ public class Properties extends JavaScriptObject {
}-*/;
public static String wrapPropertiesString(String s) {
- String ret = "({" + s //
+ String ret = s //
.replaceAll("\\s*/\\*[\\s\\S]*?\\*/\\s*", "") // Remove comments
.replaceAll("([:\\)\\(,;}{'\"])\\s+" , "$1") // Remove spaces
.replaceAll("\\s+([:\\)\\(,;}{'\"])" , "$1") // Remove spaces
.replaceFirst("^[{\\(]+(|.*[^}\\)])[}\\)]+$", "$1") // Remove ({})
- .replaceAll("\\('([^\\)]+)'\\)" , "($1)") // Remove quotes
+ .replaceAll("\\(\"([^\\)]+)\"\\)" , "($1)") // Remove quotes
.replaceAll(",+([\\w-]+:+)" , ";$1") // put semicolon
- .replaceAll(":\\s*[\"']?([^'\\]};]*)[\"']?\\s*(;+|$)", ":'$1',") // put quotes to values
+ .replaceAll(":\\s*[\"']?([^'\"\\]};]*)[\"']?\\s*(;+|$)", ":\"$1\",") // put quotes to all values (even empty)
+ .replaceAll("(^|[^\\w-$'])([\\w-]+):\"", "$1\"$2\":\"") // quote keys
.replaceAll(";([^:]+):", ",$1:") // change semicolon
- .replaceAll(":'(-?[\\d\\.]+|null|false|true)',", ":$1,") // numbers do not need quote
- .replaceAll("(^|[^\\w-'])([\\w]+[-][\\w-]+):", "$1'$2':") // quote keys with illegal chars
- .replaceFirst("[;,]$", "") // remove endings
- + "})";
+ .replaceAll(":\"(-?[\\d\\.]+|null|false|true)\",", ":$1,") // numbers do not need quote
+ .replaceFirst("[,]+$", "") // remove endings
+ ;
return ret;
}
@@ -130,32 +130,32 @@ public class Properties extends JavaScriptObject {
}
public final String tostring() {
- return "(" + toJsonString() + ")";
+ return toJsonString();
}
public final String toJsonString() {
String ret = "";
for (String k : keys()){
+ String ky = k.matches("\\d+") ? k : "\"" + k + "\"";
JsArrayMixed o = getArray(k);
if (o != null) {
- ret += k + ":[";
+ ret += ky + ":[";
for (int i = 0, l = o.length(); i < l ; i++) {
- ret += "'" + o.getString(i) + "',";
+ ret += "\"" + o.getString(i) + "\",";
}
ret += "],";
} else {
Properties p = getJavaScriptObject(k);
if (p != null) {
- ret += k + ":" + p.toJsonString() + ",";
+ ret += ky + ":" + p.toJsonString() + ",";
} else {
- ret += k + ":'" + getStr(k) + "',";
+ ret += ky + ":\"" + getStr(k) + "\",";
}
}
}
- return "{" + ret.replaceAll(",\\s*([\\]}]|$)","")
- .replaceAll("([:,\\[])'(-?[\\d\\.]+|null|false|true)'", "$1$2")
- .replaceAll("(^|[^\\w-'])([\\w]+[-][\\w-]+):", "$1'$2':")
+ return "{" + ret.replaceAll(",\\s*([\\]}]|$)","$1")
+ .replaceAll("([:,\\[])\"(-?[\\d\\.]+|null|false|true)\"", "$1$2")
+ "}";
}
@@ -179,4 +179,8 @@ public class Properties extends JavaScriptObject {
}
return ret;
}
+
+ public final boolean isEmpty(){
+ return c().length() == 0;
+ }
}
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
new file mode 100644
index 00000000..eeb75955
--- /dev/null
+++ b/gwtquery-core/src/main/java/com/google/gwt/query/client/builders/JsonBuilder.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2011, The gwtquery team.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.query.client.builders;
+
+import com.google.gwt.query.client.Properties;
+
+/**
+ * Tagging interface used to generate JsonBuilder classes.
+ */
+public interface JsonBuilder {
+ /**
+ * load a properties object.
+ */
+ <J> J load(Object prp);
+
+ /**
+ * parses a json string and loads the resulting properties object.
+ */
+ <J> J parse(String json);
+
+ /**
+ * parses a json string and loads the resulting properties object,
+ * if the param 'fix' is true, the syntax of the json string will be
+ * checked previously and fixed when possible.
+ */
+ <J> J parse(String json, boolean fix);
+
+ /**
+ * Returns the javascript properties object.
+ */
+ Properties getProperties();
+}
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
new file mode 100644
index 00000000..ecd8e042
--- /dev/null
+++ b/gwtquery-core/src/main/java/com/google/gwt/query/client/builders/JsonBuilderBase.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright 2011, The gwtquery team.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.query.client.builders;
+
+import com.google.gwt.core.client.JavaScriptObject;
+import com.google.gwt.query.client.Properties;
+import com.google.gwt.query.client.js.JsObjectArray;
+import com.google.gwt.query.client.js.JsUtils;
+
+public abstract class JsonBuilderBase<J extends JsonBuilderBase<?>> implements JsonBuilder {
+
+ protected Properties p = Properties.create();
+
+ public J parse(String json) {
+ return load(JsUtils.parseJSON(json));
+ }
+
+ public J parse(String json, boolean fix) {
+ return fix ? parse(Properties.wrapPropertiesString(json)) : parse(json);
+ }
+
+ @SuppressWarnings("unchecked")
+ public J load(Object prp) {
+ assert prp == null || prp instanceof JavaScriptObject || prp instanceof String;
+ if (prp != null && prp instanceof String) {
+ return parse((String)prp);
+ }
+ p = prp == null ? Properties.create() : (Properties)prp;
+ while (JsUtils.isArray(p)) {
+ p = p.get(0);
+ }
+ return (J)this;
+ }
+
+ protected <T> void setArrayBase(String n, T[] r) {
+ JsObjectArray<Object> a = JsObjectArray.create();
+ a.add(r);
+ p.set(n, a);
+ }
+
+ @SuppressWarnings("unchecked")
+ protected <T> T[] getArrayBase(String n, T[] r, Class<T> clazz) {
+ JsObjectArray<?> a = p.getArray(n).cast();
+ int l = r.length;
+ for (int i = 0 ; i < l ; i++) {
+ Object w = a.get(i);
+ Class<?> c = w.getClass();
+ do {
+ if (c.equals(clazz)) {
+ r[i] = (T)w;
+ break;
+ }
+ c = c.getSuperclass();
+ } while (c != null);
+ }
+ return r;
+ }
+
+ protected Properties getPropertiesBase(String n) {
+ Properties r = p.getJavaScriptObject(n);
+ return r != null ? r : Properties.create();
+ }
+
+ public String toString() {
+ return p.tostring();
+ }
+
+ public Properties getProperties() {
+ return p;
+ }
+}
diff --git a/gwtquery-core/src/main/java/com/google/gwt/query/client/builders/JsonName.java b/gwtquery-core/src/main/java/com/google/gwt/query/client/builders/JsonName.java
new file mode 100644
index 00000000..c3855793
--- /dev/null
+++ b/gwtquery-core/src/main/java/com/google/gwt/query/client/builders/JsonName.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2011, The gwtquery team.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.query.client.builders;
+
+import static java.lang.annotation.ElementType.METHOD;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ */
+@Target({METHOD})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface JsonName {
+ String value();
+}
diff --git a/gwtquery-core/src/main/java/com/google/gwt/query/client/js/JsCache.java b/gwtquery-core/src/main/java/com/google/gwt/query/client/js/JsCache.java
index afc62dd2..151116d9 100644
--- a/gwtquery-core/src/main/java/com/google/gwt/query/client/js/JsCache.java
+++ b/gwtquery-core/src/main/java/com/google/gwt/query/client/js/JsCache.java
@@ -1,3 +1,18 @@
+/*
+ * Copyright 2011, The gwtquery team.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
package com.google.gwt.query.client.js;
import com.google.gwt.core.client.JavaScriptObject;
@@ -45,7 +60,8 @@ public class JsCache extends JavaScriptObject {
}
public final native <T> boolean getBoolean(T id) /*-{
- return !!this[id];
+ var r = this[id], t = typeof r;
+ return 'boolean' == r ? r : 'true' == String(r);
}-*/;
public final <T> float getFloat(T id) {
@@ -53,8 +69,8 @@ public class JsCache extends JavaScriptObject {
}
public final native <T> double getDouble(T id) /*-{
- var r = this[id];
- return r && (typeof r == 'number') ? r : 0;
+ var r = this[id] ? Number(this[id]) : 0;
+ return r ? r : 0;
}-*/;
public final <T> int getInt(T id) {
diff --git a/gwtquery-core/src/main/java/com/google/gwt/query/client/js/JsUtils.java b/gwtquery-core/src/main/java/com/google/gwt/query/client/js/JsUtils.java
index f7af867c..4145dd1e 100644
--- a/gwtquery-core/src/main/java/com/google/gwt/query/client/js/JsUtils.java
+++ b/gwtquery-core/src/main/java/com/google/gwt/query/client/js/JsUtils.java
@@ -280,6 +280,11 @@ public class JsUtils {
* to get the content.
*/
public static Properties parseJSON(String json) {
- return utilsImpl.parseJSON(json);
+ try {
+ return utilsImpl.parseJSON(json);
+ } catch (Exception e) {
+ System.err.println("Error while parsing json: " + e.getMessage() + ".\n" + json);
+ return Properties.create();
+ }
}
}
diff --git a/gwtquery-core/src/main/java/com/google/gwt/query/client/plugins/ajax/Ajax.java b/gwtquery-core/src/main/java/com/google/gwt/query/client/plugins/ajax/Ajax.java
new file mode 100644
index 00000000..18d99a37
--- /dev/null
+++ b/gwtquery-core/src/main/java/com/google/gwt/query/client/plugins/ajax/Ajax.java
@@ -0,0 +1,209 @@
+package com.google.gwt.query.client.plugins.ajax;
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.dom.client.Element;
+import com.google.gwt.http.client.Request;
+import com.google.gwt.http.client.RequestBuilder;
+import com.google.gwt.http.client.RequestBuilder.Method;
+import com.google.gwt.http.client.RequestCallback;
+import com.google.gwt.http.client.RequestException;
+import com.google.gwt.http.client.Response;
+import com.google.gwt.query.client.Function;
+import com.google.gwt.query.client.Properties;
+import com.google.gwt.query.client.builders.JsonBuilder;
+import com.google.gwt.query.client.js.JsUtils;
+
+/**
+ * Ajax class for GQuery.
+ *
+ * The jQuery library has a full suite of AJAX capabilities, but GWT
+ * is plenty of classes to get data from server side: RPC, XHR, RF, etc.
+ *
+ * This class is not a substitute for the GWT utilities, but a complement
+ * to get server data in a jquery way, specially when querying non java
+ * backends.
+ *
+ * We do not pretend to clone all the jquery Ajax API inside gquery, just take
+ * its syntax and to implement the most popular usage of it.
+ * This implementation is almost thought to be used as an alternative to
+ * the GWT-XHR, GWT-XML and GWT-JSON modules.
+ *
+ * This class is not a plugin because in jquery it does not extends the jquery
+ * object, but we prefer this name-space in order to centralize the jquery core
+ * features in a common folder.
+ *
+ */
+public class Ajax {
+
+ /**
+ * Ajax Settings object
+ */
+ public interface Settings extends JsonBuilder {
+ String getType();
+ Settings setType(String t);
+ String getUrl();
+ Settings setUrl(String u);
+ Properties getData();
+ Settings setData(Properties p);
+ String getDataString();
+ Settings setDataString(String d);
+ String getDataType();
+ Settings setDataType(String t);
+ int getTimeout();
+ Settings setTimeout(int t);
+ String getUsername();
+ Settings setUsername(String u);
+ String getPassword();
+ Settings setPassword(String p);
+ String getContentType();
+ Settings setContentType(String t);
+ Properties getHeaders();
+ Settings setHeaders(Properties p);
+ Element getContext();
+ Settings setContext(Element e);
+ Function getSuccess();
+ Settings setSuccess(Function f);
+ Function getError();
+ Settings setError(Function f);
+ }
+
+ public void ajax(String url, Function onSuccess, Function onError, Properties p) {
+ Settings settings = GWT.create(Settings.class);
+ settings.load(p);
+ ajax(url, onSuccess, onError, settings);
+ }
+
+ public void ajax(String url, Function onSuccess, Function onError) {
+ ajax(url, onSuccess, onError, (Settings)null);
+ }
+
+ public void ajax(String url, Function onSuccess, Function onError, Settings settings) {
+ if (settings == null) {
+ settings = GWT.create(Settings.class);
+ }
+ settings.setUrl(url).setSuccess(onSuccess).setError(onError);
+ ajax(settings);
+ }
+
+ /**
+ * Perform an ajax request to the server.
+ *
+ *
+ * Example:
+ * <pre>
+ import static com.google.gwt.query.client.GQ.*
+ ...
+ Properties properties = $$("dataType: xml, type: post; data: {q: 'gwt'}, headers: {X-Powered-By: GQuery}");
+ ajax("test.php", new Function() {
+ public void f() {
+ Element xmlElem = getData()[0];
+ System.out.println($("message", xmlElem));
+ }
+ }, new Function(){
+ public void f() {
+ System.err.println("Ajax Error: " + getData()[1]);
+ }
+ }, properties);
+ * </pre>
+ *
+ * @param url The url to connect
+ * @param onSuccess a function to execute in the case of success
+ * @param onError the function to execute on error
+ * @param settings a Properties object with the configuration of the Ajax request.
+ */
+ public void ajax(Settings settings) {
+ Method httpMethod = RequestBuilder.POST;
+ String method = settings.getType();
+ if ("get".equalsIgnoreCase(method)) {
+ httpMethod = RequestBuilder.GET;
+ }
+
+ String url = settings.getUrl();
+
+ String data = settings.getDataString();
+ if (data == null) {
+ data = settings.getData().toQueryString();
+ }
+
+ if (data != null && httpMethod == RequestBuilder.GET) {
+ url += (url.contains("?") ? "&" : "?") + data;
+ }
+ RequestBuilder r = new RequestBuilder(httpMethod, url);
+ if (data != null && httpMethod != RequestBuilder.GET) {
+ r.setRequestData(data);
+ }
+
+ r.setTimeoutMillis(settings.getTimeout());
+
+ String user = settings.getUsername();
+ if (user != null) {
+ r.setUser(user);
+ }
+
+ String password = settings.getPassword();
+ if (password != null) {
+ r.setPassword(password);
+ }
+
+ String ctype = settings.getContentType();
+ r.setHeader("Content-type", ctype != null ? ctype
+ : "application/x-www-form-urlencoded");
+
+ final String dataType = settings.getDataType() != null
+ ? settings.getDataType() : "text";
+
+ Properties p = settings.getHeaders();
+ for (String s : p.keys()) {
+ r.setHeader(s, p.getStr(s));
+ }
+
+ final Function onSuccess = settings.getSuccess();
+ if (onSuccess != null) {
+ onSuccess.setElement(settings.getContext());
+ }
+ final Function onError = settings.getError();
+ if (onError != null) {
+ onError.setElement(settings.getContext());
+ }
+
+ r.setCallback(new RequestCallback() {
+ public void onResponseReceived(Request request, Response response) {
+ if (response.getStatusCode() > 202) {
+ if (onError != null) {
+ onError.f(response.getText(), "error", request, response);
+ }
+ } else if (onSuccess != null) {
+ Object retData = null;
+ try {
+ if ("xml".equalsIgnoreCase(dataType)) {
+ retData = JsUtils.parseXML(response.getText());
+ } else if ("json".equalsIgnoreCase(dataType)) {
+ retData = JsUtils.parseJSON(response.getText());
+ } else {
+ retData = response.getText();
+ }
+ } catch (Exception e) {
+ System.err.println("Error parsing '" + dataType
+ + "' received data: " + e.getMessage());
+ System.err.println("Server response was: \n" + response.getText());
+ }
+ onSuccess.f(retData, "success", request, response);
+ }
+ }
+
+ public void onError(Request request, Throwable exception) {
+ if (onError != null) {
+ onError.f(null, exception.getMessage(), request, null, exception);
+ }
+ }
+ });
+
+ try {
+ r.send();
+ } catch (RequestException e) {
+ if (onError != null) {
+ onError.f(null, -1, null, null, e);
+ }
+ }
+ }
+}
diff --git a/gwtquery-core/src/main/java/com/google/gwt/query/client/plugins/ajax/AjaxImpl.java b/gwtquery-core/src/main/java/com/google/gwt/query/client/plugins/ajax/AjaxImpl.java
deleted file mode 100644
index f10d712e..00000000
--- a/gwtquery-core/src/main/java/com/google/gwt/query/client/plugins/ajax/AjaxImpl.java
+++ /dev/null
@@ -1,174 +0,0 @@
-package com.google.gwt.query.client.plugins.ajax;
-
-import static com.google.gwt.query.client.GQuery.$$;
-
-import com.google.gwt.dom.client.Element;
-import com.google.gwt.http.client.Request;
-import com.google.gwt.http.client.RequestBuilder;
-import com.google.gwt.http.client.RequestCallback;
-import com.google.gwt.http.client.RequestException;
-import com.google.gwt.http.client.Response;
-import com.google.gwt.http.client.RequestBuilder.Method;
-import com.google.gwt.query.client.Function;
-import com.google.gwt.query.client.GQ;
-import com.google.gwt.query.client.Properties;
-import com.google.gwt.query.client.js.JsUtils;
-
-/**
- * Ajax class for GQuery.
- *
- * It is not actually a plugin but we prefer this name-space in order
- * to centralize jquery core features in a common folder.
- *
- */
-public class AjaxImpl {
-
- /**
- * The jQuery library has a full suite of AJAX capabilities, but GWT
- * is plenty of classes to get data from server side: RPC, XHR, RF, etc.
- *
- * This class is not a substitute for the GWT utilities, but a complement
- * to get server data in a jquery way, specially when querying non java
- * backends.
- *
- * We do not pretend to clone all the jquery Ajax API inside gquery, just take
- * its syntax and to implement the most popular usage of it.
- * This implementation is almost thought to be used as an alternative to
- * the GWT-XHR, GWT-XML and GWT-JSON modules.
- *
- * Example:
- * <pre>
- import static com.google.gwt.query.client.GQ.*
- ...
- Properties properties = $$("dataType: xml, type: post; data: {q: 'gwt'}, headers: {X-Powered-By: GQuery}");
- ajax("test.php", new Function() {
- public void f() {
- Element xmlElem = getData()[0];
- System.out.println($("message", xmlElem));
- }
- }, new Function(){
- public void f() {
- System.err.println("Ajax Error: " + getData()[1]);
- }
- }, properties);
- * </pre>
- *
- * @param url The url to connect
- * @param onSuccess a function to execute in the case of success
- * @param onError the function to execute on error
- * @param settings a Properties object with the configuration of the Ajax request.
- */
- public void ajax(String url, Function onSuccess, Function onError,
- Properties settings) {
- Method httpMethod = RequestBuilder.POST;
- String method = settings.getStr("type");
- if ("get".equalsIgnoreCase(method)) {
- httpMethod = RequestBuilder.GET;
- }
-
- if (settings.getStr("url") != null) {
- url = settings.getStr("url");
- }
-
- String data = null;
- Properties props = settings.getJavaScriptObject("data");
- if (props != null) {
- data = props.toQueryString();
- } else {
- data = settings.getStr("data");
- }
-
- if (data != null && httpMethod == RequestBuilder.GET) {
- url += (url.contains("?") ? "&" : "?") + data;
- }
- RequestBuilder r = new RequestBuilder(httpMethod, url);
- if (data != null && httpMethod != RequestBuilder.GET) {
- r.setRequestData(data);
- }
-
- int timeout = settings.getInt("timeout");
- r.setTimeoutMillis(timeout);
-
- String user = settings.getStr("username");
- if (user != null) {
- r.setUser(user);
- }
-
- String password = settings.getStr("password");
- if (password != null) {
- r.setPassword(password);
- }
-
- String ctype = settings.getStr("contentType");
- r.setHeader("Content-type", ctype != null ? ctype
- : "application/x-www-form-urlencoded");
-
- final String dataType = settings.defined("dataType")
- ? settings.getStr("dataType") : "text";
-
- Properties p = settings.getJavaScriptObject("headers");
- if (p != null) {
- for (String s : p.keys()) {
- r.setHeader(s, p.getStr(s));
- }
- }
-
- Element ctx = settings.getJavaScriptObject("context");
- if (ctx != null) {
- if (onSuccess != null) {
- onSuccess.setElement(ctx);
- }
- if (onError != null) {
- onError.setElement(ctx);
- }
- }
-
- Object o = settings.getObject("success");
- final Function success = (o != null && (o instanceof Function))
- ? (Function) o : onSuccess;
-
- o = settings.getObject("error");
- final Function error = (o != null && (o instanceof Function))
- ? (Function) o : onError;
-
- r.setCallback(new RequestCallback() {
- public void onResponseReceived(Request request, Response response) {
- if (response.getStatusCode() > 202) {
- if (error != null) {
- error.f(response.getText(), "error", request, response);
- }
- } else if (success != null) {
- Object retData = null;
- try {
- if ("xml".equalsIgnoreCase(dataType)) {
- retData = JsUtils.parseXML(response.getText());
- } else if ("json".equalsIgnoreCase(dataType)) {
- retData = JsUtils.parseJSON(response.getText());
- } else {
- retData = response.getText();
- }
- } catch (Exception e) {
- System.err.println("Error parsing '" + dataType
- + "' received data: " + e.getMessage());
- System.err.println("Server response was: \n" + response.getText());
- }
- success.f(retData, "success", request, response);
- }
- }
-
- public void onError(Request request, Throwable exception) {
- if (error != null) {
- error.f(null, exception.getMessage(), request, null, exception);
- }
- }
- });
-
- try {
- r.send();
- } catch (RequestException e) {
- if (onError != null) {
- onError.f(null, -1, null, null, e);
- }
- }
- }
-}
diff --git a/gwtquery-core/src/test/java/com/google/gwt/query/client/GQueryAjaxTest.java b/gwtquery-core/src/test/java/com/google/gwt/query/client/GQueryAjaxTest.java
new file mode 100644
index 00000000..7a84c6a8
--- /dev/null
+++ b/gwtquery-core/src/test/java/com/google/gwt/query/client/GQueryAjaxTest.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2011, The gwtquery team.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.query.client;
+
+
+import com.google.gwt.core.client.GWT;
+import com.google.gwt.dom.client.Element;
+import com.google.gwt.junit.client.GWTTestCase;
+import com.google.gwt.query.client.builders.JsonBuilder;
+import com.google.gwt.query.client.builders.JsonName;
+import com.google.gwt.user.client.ui.HTML;
+import com.google.gwt.user.client.ui.RootPanel;
+
+/**
+ * Test class for testing ajax stuff.
+ */
+public class GQueryAjaxTest extends GWTTestCase {
+
+ static Element e = null;
+
+ static HTML testPanel = null;
+
+ public String getModuleName() {
+ return "com.google.gwt.query.Query";
+ }
+
+ public void gwtSetUp() {
+ if (e == null) {
+ testPanel = new HTML();
+ RootPanel.get().add(testPanel);
+ e = testPanel.getElement();
+ e.setId("core-tst");
+ } else {
+ e.setInnerHTML("");
+ }
+ }
+
+ interface MyClass extends JsonBuilder {
+ int getA();
+ MyClass getB();
+ @JsonName("u")
+ String getUrl();
+ long getD();
+ Boolean getZ();
+ String[] getT();
+ MyClass setT(String[] strings);
+ MyClass setZ(Boolean b);
+ }
+
+ public void testJsonBuilder() {
+ String json = "[{a:1, b:{a:2,b:{a:3}},u:url, d:'2','t':['hola','adios'], 'z': true}]";
+ MyClass c = GWT.create(MyClass.class);
+ assertEquals(0, c.getA());
+ c.parse(json, true);
+ assertEquals(1, c.getA());
+ System.out.println(c);
+ assertNotNull(c.getB());
+ assertEquals(2, c.getB().getA());
+ assertEquals(3, c.getB().getB().getA());
+ assertTrue(c.getZ());
+ assertEquals("hola", c.getT()[0]);
+ assertEquals("adios", c.getT()[1]);
+ assertEquals("url", c.getUrl());
+ c.setT(new String[]{"foo", "bar"})
+ .setZ(false);
+ assertFalse(c.getZ());
+ assertEquals("foo", c.getT()[0]);
+ assertEquals("bar", c.getT()[1]);
+ }
+}