package com.jobmineplus.mobile.database.pages;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.util.Pair;
import com.jobmineplus.mobile.database.DataSourceBase;
import com.jobmineplus.mobile.widgets.Job;
public final class PageDataSource extends DataSourceBase{
// Database fields
private final PageDatabaseHelper dbHelper;
public PageDataSource(Context context) {
dbHelper = new PageDatabaseHelper(context);
}
@Override
public void open() {
database = dbHelper.getWritableDatabase();
}
@Override
public void close() {
dbHelper.close();
}
public void addPageIds(String username, String pagename, ArrayList<Integer> jobIds) {
Date now = new Date();
addPageIds(username, pagename, jobIds, now.getTime());
}
public synchronized void addPageIds(String username, String pagename, ArrayList<Integer> jobIds,
long timestamp) {
String joblist = "";
if (!jobIds.isEmpty()) {
// Make list of jobs as string, remove last comma
StringBuilder sb = new StringBuilder();
for (int id : jobIds) {
sb.append(id).append(',');
}
if (sb.charAt(sb.length() - 1) == ',') {
sb.deleteCharAt(sb.length() - 1);
}
joblist = sb.toString();
}
internalAddPage(username, pagename, joblist, timestamp);
}
public void addPage(String username, String pagename, ArrayList<Job> jobs) {
Date now = new Date();
addPage(username, pagename, jobs, now.getTime());
}
public synchronized void addPage(String username, String pagename, ArrayList<Job> jobs,
long timestamp) {
String joblist = "";
if (!jobs.isEmpty()) {
// Make list of jobs as string, remove last comma
StringBuilder sb = new StringBuilder();
for (Job job : jobs) {
if (job != null) {
sb.append(job.getId()).append(',');
}
}
if (sb.charAt(sb.length() - 1) == ',') {
sb.deleteCharAt(sb.length() - 1);
}
joblist = sb.toString();
}
internalAddPage(username, pagename, joblist, timestamp);
}
public void addPageIds(String username, String pagename, HashMap<String, ArrayList<Integer>> jobMapIds) {
Date now = new Date();
addPageIds(username, pagename, jobMapIds, now.getTime());
}
public synchronized void addPageIds(String username, String pagename, HashMap<String, ArrayList<Integer>> jobMapIds,
long timestamp) {
// Build the string
StringBuilder sb = new StringBuilder();
for (String key : jobMapIds.keySet()) {
ArrayList<Integer> ids = jobMapIds.get(key);
sb.append(key).append(':');
for (int id : ids) {
sb.append(id).append(',');
}
if (sb.charAt(sb.length() - 1) == ',') {
sb.deleteCharAt(sb.length() - 1);
}
sb.append('|');
}
sb.deleteCharAt(sb.length() - 1);
internalAddPage(username, pagename, sb.toString(), timestamp);
}
public void addPage(String username, String pagename, HashMap<String, ArrayList<Job>> jobMap) {
Date now = new Date();
addPage(username, pagename, jobMap, now.getTime());
}
public synchronized void addPage(String username, String pagename, HashMap<String, ArrayList<Job>> jobMap,
long timestamp) {
// Build the string
StringBuilder sb = new StringBuilder();
for (String key : jobMap.keySet()) {
ArrayList<Job> jobs = jobMap.get(key);
sb.append(key).append(':');
for (Job job : jobs) {
if (job != null) {
sb.append(job.getId()).append(',');
}
}
if (sb.charAt(sb.length() - 1) == ',') {
sb.deleteCharAt(sb.length() - 1);
}
sb.append('|');
}
sb.deleteCharAt(sb.length() - 1);
internalAddPage(username, pagename, sb.toString(), timestamp);
}
/**
* Returns all the ids of jobs from this user of the page specified
* @param pagename
* @return list of ids, null if empty
*/
public synchronized ArrayList<Integer> getJobsIds(String username, String pagename) {
Cursor cursor = getCursorFromPage(username, pagename, PageTable.COLUMN_JOBLIST);
if (cursor == null) { return null; }
return cursorToJobIds(cursor);
}
public synchronized HashMap<String, ArrayList<Integer>> getJobsIdMap(String username, String pagename) {
Cursor cursor = getCursorFromPage(username, pagename, PageTable.COLUMN_JOBLIST);
if (cursor == null) { return null; }
return cursorToJobsMap(cursor);
}
public synchronized PageResult getPageData(String username, String pagename) {
Cursor cursor = getCursorFromPage(username, pagename, PageTable.COLUMN_JOBLIST, PageTable.COLUMN_TIME);
if (cursor == null) { return null; }
long time = cursor.getLong(1);
return new PageResult(cursorToJobIds(cursor), time);
}
public synchronized PageMapResult getPageDataMap(String username, String pagename) {
Cursor cursor = getCursorFromPage(username, pagename, PageTable.COLUMN_JOBLIST, PageTable.COLUMN_TIME);
if (cursor == null) { return null; }
long time = cursor.getLong(1);
return new PageMapResult(cursorToJobsMap(cursor), time);
}
public synchronized ArrayList<Integer> cursorToJobIds(Cursor cursor) {
String retStr = cursor.getString(0);
if (retStr.length() == 0) {
cursor.close();
return null;
}
String[] idStrings = retStr.split(",");
ArrayList<Integer> ids = new ArrayList<Integer>(idStrings.length);
for (int i = 0; i < idStrings.length; i++) {
try {
ids.add(Integer.parseInt(idStrings[i]));
} catch(NumberFormatException e) {
e.printStackTrace();
}
}
cursor.close();
return ids;
}
private HashMap<String, ArrayList<Integer>> cursorToJobsMap(Cursor cursor) {
String tabt = cursor.getString(0);
String[] tabString = tabt.split("\\|");
HashMap<String, ArrayList<Integer>> jobMap = new HashMap<String, ArrayList<Integer>>();
for (String str : tabString) {
int colonPos = str.indexOf(':');
if (colonPos == -1) {
continue;
}
String tag = str.substring(0, colonPos);
String retStr = str.substring(colonPos + 1);
if (retStr.length() == 0) {
jobMap.put(tag, null);
continue;
}
String[] idStrings = retStr.split(",");
ArrayList<Integer> ids = new ArrayList<Integer>(idStrings.length);
for (int i = 0; i < idStrings.length; i++) {
ids.add(Integer.parseInt(idStrings[i]));
}
jobMap.put(tag, ids);
}
cursor.close();
return jobMap;
}
private Cursor getCursorFromPage(String username, String pagename, String... columns) {
if (username == null) {
throw new NullPointerException("Username is null trying to get cursor from page.");
}
// Build query
StringBuilder sb = new StringBuilder();
sb.append("select ");
for (String column : columns) {
sb.append(column).append(',');
}
sb.deleteCharAt(sb.length() - 1); // Remove last comma
// select <columns> from <table> where pageCol='page' and userCol='username'
sb.append(" from ").append(PageTable.TABLE_PAGE).append(' ')
.append(" where ").append(PageTable.COLUMN_PAGENAME).append("='")
.append(pagename).append("' and ").append(PageTable.COLUMN_USERNAME)
.append("='").append(username).append('\'');
// Run query
if (!database.isOpen()) {
open();
}
Cursor cursor = database.rawQuery(sb.toString(), null);
if (cursor != null) {
cursor.moveToFirst();
}
if (cursor.isAfterLast()) {
cursor.close();
return null;
}
return cursor;
}
private void internalAddPage(String username, String pagename,
String jobsString, long timestamp) {
ContentValues values = new ContentValues();
addNonNullValue(values, PageTable.COLUMN_USERNAME, username);
addNonNullValue(values, PageTable.COLUMN_PAGENAME, pagename);
addNonNullValue(values, PageTable.COLUMN_JOBLIST, jobsString);
addNonNullValue(values, PageTable.COLUMN_TIME, timestamp);
// Where statement
ArrayList<Pair<String, Object>> where = new ArrayList<Pair<String,Object>>();
where.add(new Pair<String, Object>(PageTable.COLUMN_PAGENAME, pagename));
where.add(new Pair<String, Object>(PageTable.COLUMN_USERNAME, username));
updateElseInsert(PageTable.TABLE_PAGE, where, values);
}
}