Sync conflict merge, not totally working

pull/14/head
Sam Bosley 14 years ago
parent e91df38e0c
commit 9b6689a90d

@ -428,9 +428,9 @@ public final class ActFmSyncService {
} catch (JSONException e) { } catch (JSONException e) {
handleException("task-save-json", e); handleException("task-save-json", e);
} catch (IOException e) { } catch (IOException e) {
if (notPermanentError(e)) if (notPermanentError(e)) {
addFailedPush(new FailedPush(PUSH_TYPE_TASK, task.getId())); addFailedPush(new FailedPush(PUSH_TYPE_TASK, task.getId()));
else { } else {
handleException("task-save-io", e); handleException("task-save-io", e);
task.setValue(Task.LAST_SYNC, DateUtilities.now() + 1000L); task.setValue(Task.LAST_SYNC, DateUtilities.now() + 1000L);
} }
@ -717,57 +717,58 @@ public final class ActFmSyncService {
* @param done * @param done
*/ */
public void fetchActiveTasks(final boolean manual, SyncExceptionHandler handler, Runnable done) { public void fetchActiveTasks(final boolean manual, SyncExceptionHandler handler, Runnable done) {
invokeFetchList("task", manual, handler, new ListItemProcessor<Task>() { invokeFetchList("task", manual, handler, new TaskListItemProcessor(manual), done, "active_tasks");
@Override // invokeFetchList("task", manual, handler, new ListItemProcessor<Task>() {
protected void mergeAndSave(JSONArray list, HashMap<Long,Long> locals) throws JSONException { // @Override
Task remote = new Task(); // protected void mergeAndSave(JSONArray list, HashMap<Long,Long> locals) throws JSONException {
// Task remote = new Task();
ArrayList<Metadata> metadata = new ArrayList<Metadata>(); //
HashSet<Long> ids = new HashSet<Long>(list.length()); // ArrayList<Metadata> metadata = new ArrayList<Metadata>();
for(int i = 0; i < list.length(); i++) { // HashSet<Long> ids = new HashSet<Long>(list.length());
JSONObject item = list.getJSONObject(i); // for(int i = 0; i < list.length(); i++) {
readIds(locals, item, remote); // JSONObject item = list.getJSONObject(i);
JsonHelper.taskFromJson(item, remote, metadata); // readIds(locals, item, remote);
// JsonHelper.taskFromJson(item, remote, metadata);
if(remote.getValue(Task.USER_ID) == 0) { //
if(!remote.isSaved()) // if(remote.getValue(Task.USER_ID) == 0) {
StatisticsService.reportEvent(StatisticsConstants.ACTFM_TASK_CREATED); // if(!remote.isSaved())
else if(remote.isCompleted()) // StatisticsService.reportEvent(StatisticsConstants.ACTFM_TASK_CREATED);
StatisticsService.reportEvent(StatisticsConstants.ACTFM_TASK_COMPLETED); // else if(remote.isCompleted())
} // StatisticsService.reportEvent(StatisticsConstants.ACTFM_TASK_COMPLETED);
// }
if(!remote.isSaved() && remote.hasDueDate() && //
remote.getValue(Task.DUE_DATE) < DateUtilities.now()) // if(!remote.isSaved() && remote.hasDueDate() &&
remote.setFlag(Task.REMINDER_FLAGS, Task.NOTIFY_AFTER_DEADLINE, false); // remote.getValue(Task.DUE_DATE) < DateUtilities.now())
// remote.setFlag(Task.REMINDER_FLAGS, Task.NOTIFY_AFTER_DEADLINE, false);
remote.putTransitory(SyncFlags.ACTFM_SUPPRESS_SYNC, true); //
taskService.save(remote); // remote.putTransitory(SyncFlags.ACTFM_SUPPRESS_SYNC, true);
ids.add(remote.getId()); // taskService.save(remote);
metadataService.synchronizeMetadata(remote.getId(), metadata, MetadataCriteria.withKey(TagService.KEY)); // ids.add(remote.getId());
remote.clear(); // metadataService.synchronizeMetadata(remote.getId(), metadata, MetadataCriteria.withKey(TagService.KEY));
} // remote.clear();
// }
if(manual) { //
Long[] localIds = ids.toArray(new Long[ids.size()]); // if(manual) {
taskService.deleteWhere(Criterion.and(TaskCriteria.activeAndVisible(), // Long[] localIds = ids.toArray(new Long[ids.size()]);
Task.REMOTE_ID.isNotNull(), // taskService.deleteWhere(Criterion.and(TaskCriteria.activeAndVisible(),
Criterion.not(Task.ID.in(localIds)))); // Task.REMOTE_ID.isNotNull(),
} // Criterion.not(Task.ID.in(localIds))));
} // }
// }
@Override //
protected HashMap<Long, Long> getLocalModels() { // @Override
TodorooCursor<Task> cursor = taskService.query(Query.select(Task.ID, // protected HashMap<Long, Long> getLocalModels() {
Task.REMOTE_ID).where(Task.REMOTE_ID.in(remoteIds)).orderBy( // TodorooCursor<Task> cursor = taskService.query(Query.select(Task.ID,
Order.asc(Task.REMOTE_ID))); // Task.REMOTE_ID).where(Task.REMOTE_ID.in(remoteIds)).orderBy(
return cursorToMap(cursor, taskDao, Task.REMOTE_ID, Task.ID); // Order.asc(Task.REMOTE_ID)));
} // return cursorToMap(cursor, taskDao, Task.REMOTE_ID, Task.ID);
// }
@Override //
protected Class<Task> typeClass() { // @Override
return Task.class; // protected Class<Task> typeClass() {
} // return Task.class;
}, done, "active_tasks"); // }
// }, done, "active_tasks");
} }
/** /**
@ -1063,6 +1064,82 @@ public final class ActFmSyncService {
} }
private class TaskListItemProcessor extends ListItemProcessor<Task> {
private final boolean deleteExtras;
private final HashMap<Long, Long> modificationDates;
public TaskListItemProcessor(boolean deleteExtras) {
this.deleteExtras = deleteExtras;
this.modificationDates = new HashMap<Long, Long>();
}
@Override
protected void mergeAndSave(JSONArray list, HashMap<Long,Long> locals) throws JSONException {
Task remote = new Task();
ArrayList<Metadata> metadata = new ArrayList<Metadata>();
HashSet<Long> ids = new HashSet<Long>(list.length());
for(int i = 0; i < list.length(); i++) {
JSONObject item = list.getJSONObject(i);
readIds(locals, item, remote);
long serverModificationDate = item.optLong("updated_at") * 1000;
System.err.println("Server mod: " + serverModificationDate + ", local mod: " + modificationDates.get(remote.getId()));
if (serverModificationDate > 0 && modificationDates.containsKey(remote.getId()) && serverModificationDate < modificationDates.get(remote.getId())) {
ids.add(remote.getId());
continue; // Modified locally more recently than remotely -- don't overwrite changes
}
JsonHelper.taskFromJson(item, remote, metadata);
if(remote.getValue(Task.USER_ID) == 0) {
if(!remote.isSaved())
StatisticsService.reportEvent(StatisticsConstants.ACTFM_TASK_CREATED);
else if(remote.isCompleted())
StatisticsService.reportEvent(StatisticsConstants.ACTFM_TASK_COMPLETED);
}
if(!remote.isSaved() && remote.hasDueDate() &&
remote.getValue(Task.DUE_DATE) < DateUtilities.now())
remote.setFlag(Task.REMINDER_FLAGS, Task.NOTIFY_AFTER_DEADLINE, false);
remote.putTransitory(SyncFlags.ACTFM_SUPPRESS_SYNC, true);
taskService.save(remote);
ids.add(remote.getId());
metadataService.synchronizeMetadata(remote.getId(), metadata, MetadataCriteria.withKey(TagService.KEY));
remote.clear();
}
if(deleteExtras) {
Long[] localIds = ids.toArray(new Long[ids.size()]);
taskService.deleteWhere(Criterion.and(TaskCriteria.activeAndVisible(),
Task.REMOTE_ID.isNotNull(),
Criterion.not(Task.ID.in(localIds))));
}
}
@Override
protected HashMap<Long, Long> getLocalModels() {
TodorooCursor<Task> cursor = taskService.query(Query.select(Task.ID, Task.MODIFICATION_DATE,
Task.REMOTE_ID).where(Task.REMOTE_ID.in(remoteIds)).orderBy(
Order.asc(Task.REMOTE_ID)));
Task task = new Task();
for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
task.readFromCursor(cursor);
modificationDates.put(task.getId(), task.getValue(Task.MODIFICATION_DATE));
}
return cursorToMap(cursor, taskDao, Task.REMOTE_ID, Task.ID);
}
@Override
protected Class<Task> typeClass() {
return Task.class;
}
}
/** Call sync method */ /** Call sync method */
private void invokeFetchList(final String model, final boolean manual, final SyncExceptionHandler handler, private void invokeFetchList(final String model, final boolean manual, final SyncExceptionHandler handler,
final ListItemProcessor<?> processor, final Runnable done, final String lastSyncKey, final ListItemProcessor<?> processor, final Runnable done, final String lastSyncKey,

Loading…
Cancel
Save