]> source.dussan.org Git - gwtquery.git/blob
465920d7a0a4b7c9304110427ef94140aec020b1
[gwtquery.git] /
1 /*
2  * Copyright 2013, The gwtquery team.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
5  * in compliance with the License. You may obtain a copy of the License at
6  *
7  * http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software distributed under the License
10  * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11  * or implied. See the License for the specific language governing permissions and limitations under
12  * the License.
13  */
14 package com.google.gwt.query.client.plugins.deferred;
15
16 import com.google.gwt.jsonp.client.JsonpRequestBuilder;
17 import com.google.gwt.query.client.js.JsObjectArray;
18 import com.google.gwt.query.client.js.JsRegexp;
19 import com.google.gwt.query.client.plugins.deferred.Deferred.DeferredPromiseImpl;
20 import com.google.gwt.user.client.rpc.AsyncCallback;
21
22 /**
23  * Utility class used to create promises for JsonpRequestBuilder.
24  * <pre>
25  *    Promise p = new PromiseJsonpReqBuilder(url, 4000);
26  *    
27  *    p.done(new Function() {
28  *      public void f() {
29  *        Properties p = arguments(0);
30  *      }
31  *    }).fail(new Function() {
32  *      public void f() {
33  *        Throwable error = arguments(0);
34  *      }
35  *    });
36  * </pre>
37  */
38 public class PromiseReqBuilderJSONP extends DeferredPromiseImpl {
39   
40   private static final JsRegexp callbackRegex = new JsRegexp("^(.+[\\?&])([^=]+)=\\?(.*)$");
41   
42   public PromiseReqBuilderJSONP(String url) {
43     this(url, null, 0);
44   }
45
46   public PromiseReqBuilderJSONP(String url, int timeout) {
47     this(url, null, timeout);
48   }
49
50   public PromiseReqBuilderJSONP(String url, String callbackParam, int timeout) {
51     JsonpRequestBuilder builder = new JsonpRequestBuilder();
52     if (timeout > 0) {
53       builder.setTimeout(timeout);
54     }
55     // jQuery allows a parameter callback=? to figure out the callback parameter
56     if (callbackParam == null) {
57       JsObjectArray<String> tmp = callbackRegex.exec(url);
58       if  (tmp.length() == 4) {
59         callbackParam = tmp.get(2);
60         url = tmp.get(1) + tmp.get(3);
61       }
62     }
63     if (callbackParam != null) {
64       builder.setCallbackParam(callbackParam);
65     }
66     send(builder, url, new AsyncCallback<Object>() {
67       public void onFailure(Throwable caught) {
68         dfd.reject(caught);
69       }
70
71       public void onSuccess(Object result) {
72         dfd.resolve(result);
73       }
74     });
75   }
76
77   // Using jsni because method send in JsonpRequestBuilder is private
78   private final native void send(JsonpRequestBuilder bld, String url, AsyncCallback<?> cb) /*-{
79     bld.@com.google.gwt.jsonp.client.JsonpRequestBuilder::send(Ljava/lang/String;Lcom/google/gwt/user/client/rpc/AsyncCallback;Z)(url,cb,false);
80   }-*/;
81 }