| /* | |
| * Copyright 2009 Google Inc. | |
| * | |
| * 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.jsonp.client; | |
| import com.google.gwt.core.client.JavaScriptObject; | |
| import com.google.gwt.user.client.rpc.AsyncCallback; | |
| /** | |
| * Class to send cross domain requests to an http server. The server will receive a request | |
| * including a callback url parameter, which should be used to return the response as following: | |
| * | |
| * <pre><callback>(<json>);</pre> | |
| * | |
| * where <callback> is the url parameter (see {@link #setCallbackParam(String)}), and | |
| * <json> is the response to the request in json format. | |
| * | |
| * This will result on the client to call the corresponding {@link AsyncCallback#onSuccess(Object)} | |
| * method. | |
| * | |
| * <p> | |
| * If needed, errors can be handled by a separate callback: | |
| * | |
| * <pre><failureCallback>(<error>);</pre> | |
| * | |
| * where <error> is a string containing an error message. This will result on the client to | |
| * call the corresponding {@link AsyncCallback#onFailure(Throwable)} method. See | |
| * {@link #setFailureCallbackParam(String)}. | |
| * | |
| * <p> | |
| * Example using <a href="http://code.google.com/apis/gdata/json.html#Request">JSON Google Calendar | |
| * GData API</a>: | |
| * | |
| * <pre> | |
| * String url = "http://www.google.com/calendar/feeds/developer-calendar@google.com/public/full" + | |
| * "?alt=json-in-script"; | |
| * JsonpRequestBuilder jsonp = new JsonpRequestBuilder(); | |
| * jsonp.requestObject(url, | |
| * new AsyncCallback<Feed>() { | |
| * public void onFailure(Throwable throwable) { | |
| * Log.severe("Error: " + throwable); | |
| * } | |
| * | |
| * public void onSuccess(Feed feed) { | |
| * JsArray<Entry> entries = feed.getEntries(); | |
| * for (int i = 0; i < entries.length(); i++) { | |
| * Entry entry = entries.get(i); | |
| * Log.info(entry.getTitle() + | |
| * " (" + entry.getWhere() + "): " + | |
| * entry.getStartTime() + " -> " + | |
| * entry.getEndTime()); | |
| * } | |
| * } | |
| * }); | |
| * </pre> | |
| * | |
| * This example uses these overlay types: | |
| * | |
| * <pre> | |
| * class Entry extends JavaScriptObject { | |
| * protected Entry() {} | |
| * | |
| * public final native String getTitle() /*-{ | |
| * return this.title.$t; | |
| * }-*/; | |
| * | |
| * public final native String getWhere() /*-{ | |
| * return this.gd$where[0].valueString; | |
| * }-*/; | |
| * | |
| * public final native String getStartTime() /*-{ | |
| * return this.gd$when ? this.gd$when[0].startTime : null; | |
| * }-*/; | |
| * | |
| * public final native String getEndTime() /*-{ | |
| * return this.gd$when ? this.gd$when[0].endTime : null; | |
| * }-*/; | |
| * } | |
| * | |
| * class Feed extends JavaScriptObject { | |
| * protected Feed() {} | |
| * | |
| * public final native JsArray<Entry> getEntries() /*-{ | |
| * return this.feed.entry; | |
| * }-*/; | |
| * } | |
| * </pre> | |
| * | |
| * </p> | |
| */ | |
| public class JsonpRequestBuilder { | |
| private int timeout = 10000; | |
| private String callbackParam = "callback"; | |
| private String failureCallbackParam = null; | |
| private String predeterminedId = null; | |
| /** | |
| * Returns the name of the callback url parameter to send to the server. The | |
| * default value is "callback". | |
| */ | |
| public String getCallbackParam() { | |
| return callbackParam; | |
| } | |
| /** | |
| * Returns the name of the failure callback url parameter to send to the | |
| * server. The default is null. | |
| */ | |
| public String getFailureCallbackParam() { | |
| return failureCallbackParam; | |
| } | |
| /** | |
| * Returns the expected timeout (ms) for this request. | |
| */ | |
| public int getTimeout() { | |
| return timeout; | |
| } | |
| public JsonpRequest<Boolean> requestBoolean(String url, AsyncCallback<Boolean> callback) { | |
| return send(url, callback, false); | |
| } | |
| public JsonpRequest<Double> requestDouble(String url, AsyncCallback<Double> callback) { | |
| return send(url, callback, false); | |
| } | |
| public JsonpRequest<Integer> requestInteger(String url, AsyncCallback<Integer> callback) { | |
| return send(url, callback, true); | |
| } | |
| /** | |
| * Sends a JSONP request and expects a JavaScript object as a result. The caller can either use | |
| * {@link com.google.gwt.json.client.JSONObject} to parse it, or use a JavaScript overlay class. | |
| */ | |
| public <T extends JavaScriptObject> JsonpRequest<T> requestObject(String url, | |
| AsyncCallback<T> callback) { | |
| return send(url, callback, false); | |
| } | |
| public JsonpRequest<String> requestString(String url, AsyncCallback<String> callback) { | |
| return send(url, callback, false); | |
| } | |
| /** | |
| * Sends a JSONP request and does not expect any results. | |
| */ | |
| public void send(String url) { | |
| send(url, null, false); | |
| } | |
| /** | |
| * Sends a JSONP request, does not expect any result, but still allows to be notified when the | |
| * request has been executed on the server. | |
| */ | |
| public JsonpRequest<Void> send(String url, AsyncCallback<Void> callback) { | |
| return send(url, callback, false); | |
| } | |
| /** | |
| * @param callbackParam The name of the callback url parameter to send to the server. The default | |
| * value is "callback". | |
| */ | |
| public void setCallbackParam(String callbackParam) { | |
| this.callbackParam = callbackParam; | |
| } | |
| /** | |
| * @param failureCallbackParam The name of the failure callback url parameter to send to the | |
| * server. The default is null. | |
| */ | |
| public void setFailureCallbackParam(String failureCallbackParam) { | |
| this.failureCallbackParam = failureCallbackParam; | |
| } | |
| public void setPredeterminedId(String id) { | |
| this.predeterminedId = id; | |
| } | |
| /** | |
| * @param timeout The expected timeout (ms) for this request. The default is 10s. | |
| */ | |
| public void setTimeout(int timeout) { | |
| this.timeout = timeout; | |
| } | |
| private <T> JsonpRequest<T> send(String url, AsyncCallback<T> callback, boolean expectInteger) { | |
| JsonpRequest<T> request; | |
| if (predeterminedId != null) { | |
| request = new JsonpRequest<T>(callback, timeout, expectInteger, callbackParam, | |
| failureCallbackParam, predeterminedId); | |
| } else { | |
| request = new JsonpRequest<T>(callback, timeout, expectInteger, callbackParam, | |
| failureCallbackParam); | |
| } | |
| request.send(url); | |
| return request; | |
| } | |
| } |