package com.project.gwtbing.client;
import java.util.HashMap;
import java.util.Map.Entry;
import com.google.gwt.http.client.UrlBuilder;
import com.google.gwt.jsonp.client.JsonpRequestBuilder;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.project.gwtbing.client.options.AdultOption;
import com.project.gwtbing.client.options.JsonTypes;
public class BingSearchRequest
{
private static final String PROTOCOL_HTTP = "http";
private static final String BING_SEARCH_API_HOST = "api.bing.net";
private static final String BING_JSON_PATH = "json.aspx";
protected String appID = "";
public BingSearchRequest(String appID)
{
this.appID = appID;
}
public void jsonSearch(String query, String source, final AsyncCallback<SearchResponse> callback)
{
this.jsonSearch(query, source, new HashMap<String, String>(), callback);
}
public void jsonSearch(String query, String source, HashMap<String, String> additionalParams,
final AsyncCallback<SearchResponse> callback)
{
String searchUrl = this.buildSearchUrl(query, source, additionalParams);
JsonpRequestBuilder requestBuilder = new JsonpRequestBuilder();
requestBuilder.setCallbackParam(SearchParameters.CALLBACK);
requestBuilder.requestObject(searchUrl, new AsyncCallback<SearchResult>() {
@Override
public void onFailure(Throwable caught) {
callback.onFailure(caught);
}
@Override
public void onSuccess(SearchResult result) {
if (null == result)
{
//TODO: Replace with proper exception.
callback.onFailure(new BingSearchNullResultException());
return;
}
callback.onSuccess(result.getSearchResponse());
}});
}
private String buildSearchUrl(String query, String source,
HashMap<String, String> additionalParams)
{
UrlBuilder urlBuilder = new UrlBuilder();
urlBuilder.setProtocol(PROTOCOL_HTTP);
urlBuilder.setHost(BING_SEARCH_API_HOST);
urlBuilder.setPath(BING_JSON_PATH);
urlBuilder.setParameter(SearchParameters.APP_ID, this.appID);
urlBuilder.setParameter(SearchParameters.QUERY, query);
urlBuilder.setParameter(SearchParameters.SOURCES, source);
urlBuilder.setParameter(SearchParameters.JSON_TYPE, JsonTypes.CALLBACK);
urlBuilder.setParameter(SearchParameters.ADULT, AdultOption.STRICT.toString());
for (Entry<String, String> additionalParam : additionalParams.entrySet())
{
urlBuilder.setParameter(additionalParam.getKey(), additionalParam.getValue());
}
return urlBuilder.buildString();
}
}