/* This file is part of ZamiaDroid.
*
* ZamiaDroid is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* ZamiaDroid is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with ZamiaDroid. If not, see <http://www.gnu.org/licenses/>.
*/
package uni.projecte.controler;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.content.Context;
import android.database.Cursor;
import android.util.Log;
import uni.projecte.dataLayer.RemoteDBManager.RemoteDBFilumList;
import uni.projecte.dataLayer.bd.DataBaseDbAdapter;
import uni.projecte.dataLayer.utils.StringUtils;
import uni.projecte.dataTypes.Utilities;
public class RemoteDBControler {
private DataBaseDbAdapter remoteDBAdapter;
private Context baseContext;
private HashMap<String, ArrayList<String>> dbTerrritories;
private String[] allDBs;
public RemoteDBControler (Context baseContext){
this.baseContext=baseContext;
remoteDBAdapter=new DataBaseDbAdapter(baseContext);
dbTerrritories= new HashMap<String, ArrayList<String>>();
//initialData();
checkDBConfig();
}
/*
* Initial dbLoad
*
*/
public void initialData(){
remoteDBAdapter.open();
int id=(int) remoteDBAdapter.createRemoteDB("gbif");
remoteDBAdapter.createRemoteDBFilum(id, "Flora", 0);
remoteDBAdapter.createRemoteDBFilum(id, "Bryophytes", 0);
remoteDBAdapter.createRemoteDBFilum(id, "Algae", 0);
remoteDBAdapter.createRemoteDBFilum(id, "Fungi", 0);
remoteDBAdapter.createRemoteDBFilum(id, "Lichens", 0);
remoteDBAdapter.createRemoteDBFilum(id, "Vertebrates", 0);
remoteDBAdapter.createRemoteDBFilum(id, "Aves", 0);
remoteDBAdapter.createRemoteDBFilum(id, "Amphibia", 0);
remoteDBAdapter.createRemoteDBFilum(id, "Mammalia", 0);
remoteDBAdapter.createRemoteDBFilum(id, "Reptilia", 0);
remoteDBAdapter.createRemoteDBFilum(id, "Invertebrate", 0);
remoteDBAdapter.createRemoteDBFilum(id, "Reptilia", 0);
remoteDBAdapter.createRemoteDBFilum(id, "Arthropods", 0);
/* id=(int) remoteDBAdapter.createRemoteDB("sifib");
remoteDBAdapter.createRemoteDBFilum(id, "Flora", 1);
id=(int) remoteDBAdapter.createRemoteDB("siba");
remoteDBAdapter.createRemoteDBFilum(id, "Flora", 2);
id=(int)remoteDBAdapter.createRemoteDB("orca");
remoteDBAdapter.createRemoteDBFilum(id, "Flora", 3);
id=(int)remoteDBAdapter.createRemoteDB("sivim");
remoteDBAdapter.createRemoteDBFilum(id, "Flora", 4); */
remoteDBAdapter.close();
}
public ArrayList<String> getAvailableFilumsIds(String filum){
ArrayList<String> filums=new ArrayList<String>();
remoteDBAdapter.open();
Cursor filumList=remoteDBAdapter.getAvailableFilumsList(filum);
if(filumList!=null){
filumList.moveToFirst();
while(!filumList.isAfterLast()){
filums.add(filumList.getString(2));
filumList.moveToNext();
}
filumList.close();
}
remoteDBAdapter.close();
return filums;
}
/*
*
* Checks if remoteDB with @dBId works with @dbFilum
*
*/
public boolean checkDBAvailability(long dbId, String dbFilum){
remoteDBAdapter.open();
boolean result=remoteDBAdapter.checkDataBaseAvailable(dbId, dbFilum);
remoteDBAdapter.close();
return result;
}
public String getDBTagdByDBId(int dbId){
String dbTag="";
if(allDBs!=null && dbId<allDBs.length+1) dbTag=allDBs[dbId-1];
return dbTag;
}
public String[] getAvailableDBs() {
remoteDBAdapter.open();
Cursor list=remoteDBAdapter.getAllDBList();
String[] dbArray=new String[list.getCount()];
int i=0;
while (!list.isAfterLast()) {
dbArray[i]=list.getString(1);
list.moveToNext();
i++;
}
list.close();
remoteDBAdapter.close();
return dbArray;
}
public ArrayList<Integer> getDbsListByFilum(String filum) {
ArrayList<Integer> dbList=new ArrayList<Integer>();
remoteDBAdapter.open();
Cursor list=remoteDBAdapter.getDataBaseAvailable(filum);
while (!list.isAfterLast()) {
if(list.getInt(1)>0) dbList.add(list.getInt(1));
list.moveToNext();
}
list.close();
remoteDBAdapter.close();
return dbList;
}
public RemoteDBFilumList getAvailableDbByFilum(String filumId) {
RemoteDBFilumList rl=new RemoteDBFilumList(filumId);
remoteDBAdapter.open();
Cursor dbList=remoteDBAdapter.getAvailableDbByFilum(filumId);
if(dbList!=null){
dbList.moveToFirst();
while(!dbList.isAfterLast()){
//DB_FILUM_ID,DB_ID_FK, FILUM,ORDER,,ACTIVE_FILUM
rl.addDB(dbList.getInt(0),dbList.getString(6), dbList.getInt(5)+":", filumId, dbList.getInt(3), dbList.getInt(4)>0);
dbList.moveToNext();
}
dbList.close();
}
remoteDBAdapter.close();
return rl;
}
public boolean changeDBFilumState(int id) {
remoteDBAdapter.open();
boolean result=remoteDBAdapter.getDBFilumState(id);
remoteDBAdapter.updateDBState(id, !result);
remoteDBAdapter.close();
return !result;
}
public void updateDbFilumOrder(int dbId, int order) {
remoteDBAdapter.open();
remoteDBAdapter.updateDbFilumOrder(dbId, order);
remoteDBAdapter.close();
}
public void filterDbByTerritory(String locIberia, boolean[] allowedDB) {
ArrayList<String> dbTags=dbTerrritories.get(locIberia);
if(dbTags!=null){
Iterator<String> it=dbTags.iterator();
while(it.hasNext()){
String dbTag=it.next();
int pos=Utilities.findString(allDBs, dbTag);
allowedDB[pos]=true;
}
}
}
public void checkDBConfig(){
InputStream is;
allDBs=getAvailableDBs();
remoteDBAdapter.open();
try {
is = baseContext.getResources().getAssets().open("dbConfig.cnf");
String jsonTypes=StringUtils.convertStreamToString(is);
JSONObject json = new JSONObject(jsonTypes);
JSONArray jsonTypesList=json.getJSONArray("dbList");
for(int i=0;i<jsonTypesList.length();i++){
JSONObject proj=jsonTypesList.getJSONObject(i);
JSONArray nameArray=proj.names();
JSONArray valArray=proj.toJSONArray(nameArray);
checkDBExists(nameArray,valArray);
}
}
catch (IOException e) {
e.printStackTrace();
}
catch (JSONException e) {
e.printStackTrace();
}
remoteDBAdapter.close();
}
public void checkDBExists(JSONArray nameArray,JSONArray valArray) {
try {
String dbTag="";
String territory="";
//String[] filumList = null;
JSONArray filumList=null;
for(int i=0; i<nameArray.length(); i++){
String name=nameArray.getString(i);
if(name.equals("dbTag")){
dbTag=valArray.getString(i);
}
else if(name.equals("type")){
filumList=valArray.getJSONArray(i);
}
else if(name.equals("territory")){
territory=valArray.getString(i);
}
}
long dbId=remoteDBAdapter.createRemoteDB(dbTag);
if(dbId > -1){
for(int i=0; i<filumList.length(); i++){
String filum=filumList.getString(i);
int count=remoteDBAdapter.getFilumsCount(filum);
remoteDBAdapter.createRemoteDBFilum((int)dbId, filumList.getString(i), count);
}
}
ArrayList<String> territoryDBs=dbTerrritories.get(territory);
//territory not created
if(territoryDBs==null){
ArrayList<String> dbTags=new ArrayList<String>();
dbTags.add(dbTag);
dbTerrritories.put(territory, dbTags);
}
else{
territoryDBs.add(dbTag);
}
}
catch (JSONException e) {
e.printStackTrace();
}
}
public int getDBCount() {
return allDBs.length;
}
public void printAvailableDB(boolean[] allowedDB) {
Log.i("CitationMap","--------- Available DB's by Territory-----------");
for(int i=0; i<allowedDB.length ; i++){
Log.i("CitationMap",allDBs[i] +" : "+allowedDB[i]);
}
Log.i("CitationMap","----------------------------");
}
}