/*
* Copyright 2010 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.samsung.appengine.jsonrpc.gwt;
import com.samsung.appengine.allshared.JsonRpcClient;
import com.samsung.appengine.allshared.JsonRpcException;
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.json.client.JSONArray;
import com.google.gwt.json.client.JSONObject;
import com.google.gwt.json.client.JSONParser;
import com.google.gwt.json.client.JSONString;
import java.util.Arrays;
import java.util.List;
public class JsonRpcGwtClient implements JsonRpcClient {
private final String mRpcUrl;
public JsonRpcGwtClient(String rpcUrl) {
mRpcUrl = rpcUrl;
}
public void call(String methodName, Object params, final Callback callback) {
callBatch(Arrays.asList(new JsonRpcClient.Call[] {
new JsonRpcClient.Call(methodName, params)
}), new JsonRpcClient.BatchCallback() {
public void onError(int callIndex, JsonRpcException caught) {
callback.onError(caught);
}
public void onData(Object[] data) {
if (data[0] != null)
callback.onSuccess(data[0]);
}
});
}
public void callBatch(final List<JsonRpcClient.Call> calls, final BatchCallback callback) {
RequestBuilder builder = new RequestBuilder(RequestBuilder.POST, mRpcUrl);
JSONObject requestJson = new JSONObject();
JSONArray callsJson = new JSONArray();
for (int i = 0; i < calls.size(); i++) {
JsonRpcClient.Call call = calls.get(i);
JSONObject callJson = new JSONObject();
callJson.put("method", new JSONString(call.getMethodName()));
if (call.getParams() != null) {
JSONObject callParams = (JSONObject) call.getParams();
for (String key : callParams.keySet()) {
callJson.put(key, callParams.get(key));
}
}
callsJson.set(i, callJson);
}
requestJson.put("calls", callsJson);
try {
builder.sendRequest(requestJson.toString(), new RequestCallback() {
public void onError(Request request, Throwable e) {
callback.onError(-1, new JsonRpcException(-1, e.getMessage()));
}
public void onResponseReceived(Request request, Response response) {
if (200 == response.getStatusCode()) {
JSONObject responseJson = JSONParser.parse(response.getText()).isObject();
JSONArray resultsJson = responseJson.get("results").isArray();
Object[] resultData = new Object[calls.size()];
for (int i = 0; i < calls.size(); i++) {
JSONObject result = resultsJson.get(i).isObject();
if (result.containsKey("error")) {
callback.onError(i, new JsonRpcException(
(int) result.get("error").isNumber().doubleValue(),
calls.get(i).getMethodName(),
result.get("message").isString().stringValue(),
null));
resultData[i] = null;
} else {
resultData[i] = result.get("data");
}
}
callback.onData(resultData);
} else {
callback.onError(-1, new JsonRpcException(-1,
"Received HTTP status code other than 200: "
+ response.getStatusText()));
}
}
});
} catch (RequestException e) {
// Couldn't connect to server
callback.onError(-1, new JsonRpcException(-1, e.getMessage()));
}
}
}