package com.todoroo.astrid.dao;
import com.todoroo.andlib.data.AbstractModel;
import com.todoroo.andlib.data.DatabaseDao;
import com.todoroo.andlib.data.Property;
import com.todoroo.andlib.data.TodorooCursor;
import com.todoroo.andlib.sql.Query;
import com.todoroo.astrid.core.PluginServices;
import com.todoroo.astrid.data.RemoteModel;
import com.todoroo.astrid.helper.UUIDHelper;
/**
* This class is meant to be subclassed for daos whose models
* require UUID generation (i.e., most RemoteModels). The createNew
* method takes care of automatically generating a new UUID for each newly
* created model if one doesn't already exist.
* @author Sam
*
* @param <RTYPE>
*/
public class RemoteModelDao<RTYPE extends RemoteModel> extends DatabaseDao<RTYPE> {
public RemoteModelDao(Class<RTYPE> modelClass) {
super(modelClass);
}
@Override
public boolean createNew(RTYPE item) {
if (!item.containsValue(RemoteModel.UUID_PROPERTY) || RemoteModel.isUuidEmpty(item.getValue(RemoteModel.UUID_PROPERTY))) {
item.setValue(RemoteModel.UUID_PROPERTY, UUIDHelper.newUUID());
}
return super.createNew(item);
}
private static int outstandingEntryFlag = -1;
public static final int OUTSTANDING_FLAG_UNINITIALIZED = -1;
public static final int OUTSTANDING_ENTRY_FLAG_RECORD_OUTSTANDING = 1 << 0;
public static final int OUTSTANDING_ENTRY_FLAG_ENQUEUE_MESSAGES = 1 << 1;
public static void setOutstandingEntryFlags(int newValue) {
synchronized (RemoteModelDao.class) {
outstandingEntryFlag = newValue;
}
}
public static boolean getOutstandingEntryFlag(int flag) {
if (outstandingEntryFlag == -1) {
synchronized (RemoteModelDao.class) {
int newValue = 0;
if (PluginServices.getActFmPreferenceService().isLoggedIn())
newValue = OUTSTANDING_ENTRY_FLAG_ENQUEUE_MESSAGES | OUTSTANDING_ENTRY_FLAG_RECORD_OUTSTANDING;
else if (PluginServices.getActFmPreferenceService().wasLoggedIn())
newValue = OUTSTANDING_ENTRY_FLAG_RECORD_OUTSTANDING;
outstandingEntryFlag = newValue;
}
}
return (outstandingEntryFlag & flag) > 0;
}
@Override
protected boolean shouldRecordOutstanding(RTYPE item) {
return super.shouldRecordOutstanding(item) && getOutstandingEntryFlag(OUTSTANDING_ENTRY_FLAG_RECORD_OUTSTANDING);
}
/**
* Fetch a model object by UUID
* @param uuid
* @param properties
* @return
*/
public RTYPE fetch(String uuid, Property<?>... properties) {
TodorooCursor<RTYPE> cursor = fetchItem(uuid, properties);
return returnFetchResult(cursor);
}
/**
* Returns cursor to object corresponding to the given identifier
*
* @param database
* @param table
* name of table
* @param properties
* properties to read
* @param id
* id of item
* @return
*/
protected TodorooCursor<RTYPE> fetchItem(String uuid, Property<?>... properties) {
TodorooCursor<RTYPE> cursor = query(
Query.select(properties).where(RemoteModel.UUID_PROPERTY.eq(uuid)));
cursor.moveToFirst();
return new TodorooCursor<RTYPE>(cursor, properties);
}
/**
* Get the local id
* @param uuid
* @return
*/
public long localIdFromUuid(String uuid) {
TodorooCursor<RTYPE> cursor = query(Query.select(AbstractModel.ID_PROPERTY).where(RemoteModel.UUID_PROPERTY.eq(uuid)));
try {
if (cursor.getCount() == 0)
return AbstractModel.NO_ID;
cursor.moveToFirst();
return cursor.get(AbstractModel.ID_PROPERTY);
} finally {
cursor.close();
}
}
public String uuidFromLocalId(long localId) {
TodorooCursor<RTYPE> cursor = query(Query.select(RemoteModel.UUID_PROPERTY).where(AbstractModel.ID_PROPERTY.eq(localId)));
try {
if (cursor.getCount() == 0)
return RemoteModel.NO_UUID;
cursor.moveToFirst();
return cursor.get(RemoteModel.UUID_PROPERTY);
} finally {
cursor.close();
}
}
}