/*
* Ext GWT - Ext for GWT
* Copyright(c) 2007-2009, Ext JS, LLC.
* licensing@extjs.com
*
* http://extjs.com/license
*/
package com.extjs.gxt.ui.client.data;
import java.util.Map;
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.Response;
import com.google.gwt.user.client.rpc.AsyncCallback;
/**
* A concrete <code>DataProxy</code> that retrieves data using a
* <code>RequestBulder</code> instances.
*
* <p />
* When using a load config object that implements <code>LoadConfig</code> or
* <code>ModelData</code>, all properties and property values will be sent as
* request parameters in the load request.
*
* @param <D> the data type being returned by the proxy
*
* @see RequestBuilder
* @see ScriptTagProxy
*/
public class HttpProxy<D> implements DataProxy<D> {
protected RequestBuilder builder;
protected String initUrl;
/**
* Creates a new HttpProxy.
*
* @param builder the request builder
*/
public HttpProxy(RequestBuilder builder) {
this.builder = builder;
this.initUrl = builder.getUrl();
}
public void load(final DataReader<D> reader, final Object loadConfig, final AsyncCallback<D> callback) {
try {
String data = null;
if (builder.getHTTPMethod().equals("POST")) {
data = generateUrl(loadConfig);
} else {
String url = initUrl;
url = url + (url.indexOf("?") == -1 ? "?" : "&");
String params = generateUrl(loadConfig);
url += params;
setUrl(builder, url);
}
builder.sendRequest(data, new RequestCallback() {
public void onError(Request request, Throwable exception) {
callback.onFailure(exception);
}
@SuppressWarnings("unchecked")
public void onResponseReceived(Request request, Response response) {
if (response.getStatusCode() != Response.SC_OK) {
callback.onFailure(new RuntimeException("HttpProxy: Invalid status code "
+ response.getStatusCode()));
return;
}
String text = response.getText();
try {
D data = null;
if (reader != null) {
data = reader.read(loadConfig, text);
} else {
data = (D) text;
}
callback.onSuccess(data);
} catch (Exception e) {
e.printStackTrace();
callback.onFailure(e);
}
}
});
} catch (Exception e) {
callback.onFailure(e);
}
}
protected String generateUrl(Object loadConfig) {
StringBuffer sb = new StringBuffer();
if (loadConfig instanceof ModelData) {
Map<String, Object> map = ((ModelData) loadConfig).getProperties();
for (String key : map.keySet()) {
sb.append("&" + key + "=" + map.get(key));
}
}
if (sb.length() > 0) {
return sb.substring(1, sb.length());
}
return sb.toString();
}
private native void setUrl(RequestBuilder rb, String url) /*-{
rb.@com.google.gwt.http.client.RequestBuilder::url = url;
}-*/;
}