package jm.org.data.area;
import static jm.org.data.area.AreaConstants.ACTION_BING_UPDATE;
import static jm.org.data.area.AreaConstants.ACTION_FAIL_UPDATE;
import static jm.org.data.area.AreaConstants.ACTION_IDS_UPDATE;
import static jm.org.data.area.AreaConstants.ACTION_WORLD_UPDATE;
import static jm.org.data.area.AreaConstants.BING_SEARCH;
import static jm.org.data.area.AreaConstants.IDS_SEARCH;
import static jm.org.data.area.AreaConstants.RETURN_CNTRY_IDs;
import static jm.org.data.area.AreaConstants.RETURN_COUNTRIES;
import static jm.org.data.area.AreaConstants.RETURN_DATE;
import static jm.org.data.area.AreaConstants.RETURN_IND_ID;
import static jm.org.data.area.AreaConstants.RETURN_KEYWORDS;
import static jm.org.data.area.AreaConstants.RETURN_STRING;
import static jm.org.data.area.AreaConstants.RETURN_WB_IND_ID;
import static jm.org.data.area.AreaConstants.SEARCH_FAIL;
import static jm.org.data.area.AreaConstants.SEARCH_SUCCESS;
import static jm.org.data.area.AreaConstants.WORLD_SEARCH;
import static jm.org.data.area.DBConstants.BING_SEARCH_RESULTS;
import static jm.org.data.area.DBConstants.B_S_ID;
import static jm.org.data.area.DBConstants.IDS_SEARCH_RESULTS;
import static jm.org.data.area.DBConstants.IDS_S_ID;
import static jm.org.data.area.DBConstants.SC_ID;
import static jm.org.data.area.DBConstants.WB_DATA;
import java.util.ArrayList;
import java.util.Hashtable;
import android.app.Service;
import android.content.Intent;
import android.database.Cursor;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;
/**
* AreaService Background service used to make API calls to cloud services and
* store in local database
*/
public class AreaService extends Service {
private static final String TAG = AreaService.class.getSimpleName();
private final IBinder mBinder = new MyBinder();
private AreaApplication area;
@Override
public IBinder onBind(Intent intent) {
Log.d(TAG, "Service Binded");
return mBinder;
}
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG, "Service created");
}
@Override
public void onDestroy() {
super.onDestroy();
Log.e(TAG, "Service destroyed");
}
public class MyBinder extends Binder {
AreaService getService() {
return AreaService.this;
}
}
/***********************
* Search Functions
***********************/
public int genericSearch(int dSource, String indID, String[] ctry) {
// Check local cache
int return_value;
Hashtable<String, Object> return_data = new Hashtable<String, Object>();
area = (AreaApplication) getApplication();
Log.e(TAG, "Calling Generic Search 1");
return_value = area.areaData.genericSearch(dSource, indID, ctry);
// return_value = (Integer) return_data.get(RETURN_VALUE);
if (return_value == SEARCH_SUCCESS) {
return SEARCH_SUCCESS;
} else if (return_value > SEARCH_SUCCESS) {
Thread genericSearch = new Thread(new GenericSearchRunnable(
dSource, return_data));
genericSearch.start();
// return SEARCH_API_SOME OR SEARCH_API_NONE
}
return return_value;
}
public int globalSearch(String searchParam) {
return SEARCH_FAIL;
}
/*
* Thread Definitions
*/
public class GenericSearchRunnable implements Runnable {
private int dataSource, search_id;
private Cursor cursor;
private AreaApplication area = (AreaApplication) getApplication();
private String table, tableKey;
// private String indicatorID;
// private String[] country;
private Hashtable<String, Object> search_data = new Hashtable<String, Object>();
public GenericSearchRunnable(int dataS, Hashtable<String, Object> data) {
this.dataSource = dataS;
// this.indicatorID = indi;
// this.country = cty;
this.search_data = data;
}
public void run() {
// Go fetch API data
// Insert into DB
switch (dataSource) {
case WORLD_SEARCH:
/*
* return_data.put(RETURN_VALUE , SEARCH_API_NONE );
* return_data.put(RETURN_IND_ID , ind_id );
* return_data.put(RETURN_WB_IND_ID , indicatorID );
* return_data.put(RETURN_COUNTRIES , countries_to_get );
* return_data.put(RETURN_CNTRY_IDs , countryIDs );
* return_data.put(RETURN_DATE , "date=1990:2012" );
*/
try {
int indicator_id = (Integer) search_data.get(RETURN_IND_ID);
String indicator = (String) search_data
.get(RETURN_WB_IND_ID), date = (String) search_data
.get(RETURN_DATE);
@SuppressWarnings("unchecked")
ArrayList<Integer> countryIDList = (ArrayList<Integer>) search_data
.get(RETURN_CNTRY_IDs);
@SuppressWarnings("unchecked")
ArrayList<String> countries = (ArrayList<String>) search_data
.get(RETURN_COUNTRIES);
search_id = area.areaData.getCountryIndicators(
indicator_id, indicator, countries, countryIDList,
date);
} catch (Exception e) {
Log.e(TAG, "Error retrieving hashtable objects:");
}
table = WB_DATA;
tableKey = SC_ID;
break;
case IDS_SEARCH:
/*
* return_data.put(RETURN_VALUE , SEARCH_API_NONE );
* return_data.put(RETURN_IND_ID , ind_id );
* return_data.put(RETURN_KEYWORDS , keyWords );
*/
int indicator = (Integer) search_data.get(RETURN_IND_ID);
String[] parameters = (String[]) search_data
.get(RETURN_KEYWORDS);
search_id = area.areaData.getDocuments(indicator,0, parameters);
table = IDS_SEARCH_RESULTS;
tableKey = IDS_S_ID;
break;
case BING_SEARCH:
// return_data.put(RETURN_STRING , indicatorStr );
String param = (String) search_data.get(RETURN_STRING);
search_id = area.areaData.getBingArticles(param);
table = BING_SEARCH_RESULTS;
tableKey = B_S_ID;
break;
default:
break;
}
// Query DB
// get Search record based on the api being searched and return the
// associated list of values
cursor = area.areaData.rawQuery(table, null, tableKey + " = '"
+ search_id + "'");
// Set Shared Cursor: area.setSharedCursor(apiCode, cursor);
area.setSharedCursor(dataSource, cursor);
// notifyActivity
notifyActivity(dataSource);
}
}
/*
* private boolean inDatabase() {
*
* return false; }
*/
private void notifyActivity(int apiCode) {
switch (apiCode) {
case WORLD_SEARCH:
sendBroadcast(new Intent(ACTION_WORLD_UPDATE));
case IDS_SEARCH:
sendBroadcast(new Intent(ACTION_IDS_UPDATE));
case BING_SEARCH:
sendBroadcast(new Intent(ACTION_BING_UPDATE));
default: // Fail || Problem with update
sendBroadcast(new Intent(ACTION_FAIL_UPDATE));
}
}
}