From 26e6e13b166751c36039444f0841bb55dbd16e20 Mon Sep 17 00:00:00 2001 From: Sam Bosley Date: Thu, 24 Jan 2013 18:24:50 -0800 Subject: [PATCH] Infrastructure for adding/removing members to tags during sync --- .../actfm/sync/messages/MakeChanges.java | 38 ++++++++++++++++-- .../todoroo/astrid/core/PluginServices.java | 8 ++++ .../todoroo/astrid/dao/TagMetadataDao.java | 40 +++++++++++++++++++ .../service/AstridDependencyInjector.java | 2 + 4 files changed, 84 insertions(+), 4 deletions(-) create mode 100644 astrid/src/com/todoroo/astrid/dao/TagMetadataDao.java diff --git a/astrid/plugin-src/com/todoroo/astrid/actfm/sync/messages/MakeChanges.java b/astrid/plugin-src/com/todoroo/astrid/actfm/sync/messages/MakeChanges.java index 21d9de20f..7470be2df 100644 --- a/astrid/plugin-src/com/todoroo/astrid/actfm/sync/messages/MakeChanges.java +++ b/astrid/plugin-src/com/todoroo/astrid/actfm/sync/messages/MakeChanges.java @@ -19,13 +19,14 @@ import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.Preferences; import com.todoroo.astrid.core.PluginServices; import com.todoroo.astrid.dao.RemoteModelDao; +import com.todoroo.astrid.dao.TagMetadataDao; import com.todoroo.astrid.data.Metadata; import com.todoroo.astrid.data.MetadataApiDao.MetadataCriteria; import com.todoroo.astrid.data.RemoteModel; import com.todoroo.astrid.data.SyncFlags; import com.todoroo.astrid.data.TagData; -import com.todoroo.astrid.tags.TaskToTagMetadata; import com.todoroo.astrid.tags.TagService; +import com.todoroo.astrid.tags.TaskToTagMetadata; @SuppressWarnings("nls") public class MakeChanges extends ServerToClientMessage { @@ -215,6 +216,7 @@ public class MakeChanges extends ServerToClientMessage super(model, changes, uuid); } + @SuppressWarnings("null") @Override public void performChanges() { if (changes.has("name")) { @@ -225,9 +227,37 @@ public class MakeChanges extends ServerToClientMessage TaskToTagMetadata.TAG_UUID.eq(uuid)), template); } - if (changes.has("member_added")) { - model.setValue(TagData.MEMBERS, "{}"); // Clear this value for migration purposes - //TODO: Do more things here also + TagMetadataDao tagMetadataDao = PluginServices.getTagMetadataDao(); + + JSONArray addMembers = changes.optJSONArray("member_added"); + JSONArray removeMembers = changes.optJSONArray("member_removed"); + boolean membersAdded = (addMembers != null && addMembers.length() > 0); + boolean membersRemoved = (removeMembers != null && removeMembers.length() > 0); + + if (membersAdded) { + model.setValue(TagData.MEMBERS, ""); // Clear this value for migration purposes + model.setValue(TagData.MEMBERS, ""); // Clear this value for migration purposes + for (int i = 0; i < addMembers.length(); i++) { + try { + String memberId = addMembers.getString(i); + tagMetadataDao.createMemberLink(uuid, memberId); + } catch (JSONException e) { + // + } + } + } + + if (membersRemoved) { + ArrayList toRemove = new ArrayList(removeMembers.length()); + for (int i = 0; i < removeMembers.length(); i++) { + try { + String tagUuid = removeMembers.getString(i); + toRemove.add(tagUuid); + } catch (JSONException e) { + // + } + } + tagMetadataDao.removeMemberLinks(uuid, toRemove.toArray(new String[toRemove.size()])); } } } diff --git a/astrid/plugin-src/com/todoroo/astrid/core/PluginServices.java b/astrid/plugin-src/com/todoroo/astrid/core/PluginServices.java index f99ee6d52..cae0b76fd 100644 --- a/astrid/plugin-src/com/todoroo/astrid/core/PluginServices.java +++ b/astrid/plugin-src/com/todoroo/astrid/core/PluginServices.java @@ -14,6 +14,7 @@ import com.todoroo.astrid.dao.Database; import com.todoroo.astrid.dao.MetadataDao.MetadataCriteria; import com.todoroo.astrid.dao.StoreObjectDao; import com.todoroo.astrid.dao.TagDataDao; +import com.todoroo.astrid.dao.TagMetadataDao; import com.todoroo.astrid.dao.TagOutstandingDao; import com.todoroo.astrid.dao.TaskDao; import com.todoroo.astrid.dao.TaskOutstandingDao; @@ -48,6 +49,9 @@ public final class PluginServices { @Autowired MetadataService metadataService; + @Autowired + TagMetadataDao tagMetadataDao; + @Autowired AddOnService addOnService; @@ -107,6 +111,10 @@ public final class PluginServices { return getInstance().tagDataDao; } + public static TagMetadataDao getTagMetadataDao() { + return getInstance().tagMetadataDao; + } + public static TaskOutstandingDao getTaskOutstandingDao() { return getInstance().taskOutstandingDao; } diff --git a/astrid/src/com/todoroo/astrid/dao/TagMetadataDao.java b/astrid/src/com/todoroo/astrid/dao/TagMetadataDao.java new file mode 100644 index 000000000..78e721e09 --- /dev/null +++ b/astrid/src/com/todoroo/astrid/dao/TagMetadataDao.java @@ -0,0 +1,40 @@ +/** + * Copyright (c) 2012 Todoroo Inc + * + * See the file "LICENSE" for the full license governing this code. + */ +package com.todoroo.astrid.dao; + +import com.todoroo.andlib.data.DatabaseDao; +import com.todoroo.andlib.service.Autowired; +import com.todoroo.andlib.service.DependencyInjectionService; +import com.todoroo.astrid.data.Metadata; +import com.todoroo.astrid.data.TagMetadata; + +/** + * Data Access layer for {@link Metadata}-related operations. + * + * @author Tim Su + * + */ +public class TagMetadataDao extends DatabaseDao { + + @Autowired + private Database database; + + @edu.umd.cs.findbugs.annotations.SuppressWarnings(value="UR_UNINIT_READ") + public TagMetadataDao() { + super(TagMetadata.class); + DependencyInjectionService.getInstance().inject(this); + setDatabase(database); + } + + public void createMemberLink(String tagUuid, String memberId) { + // TODO: Implement + } + + public void removeMemberLinks(String tagUuid, String[] memberIds) { + // TODO: Implement + } +} + diff --git a/astrid/src/com/todoroo/astrid/service/AstridDependencyInjector.java b/astrid/src/com/todoroo/astrid/service/AstridDependencyInjector.java index 0d31e6838..2a1a1e54f 100644 --- a/astrid/src/com/todoroo/astrid/service/AstridDependencyInjector.java +++ b/astrid/src/com/todoroo/astrid/service/AstridDependencyInjector.java @@ -19,6 +19,7 @@ import com.todoroo.astrid.dao.Database; import com.todoroo.astrid.dao.MetadataDao; import com.todoroo.astrid.dao.StoreObjectDao; import com.todoroo.astrid.dao.TagDataDao; +import com.todoroo.astrid.dao.TagMetadataDao; import com.todoroo.astrid.dao.TagOutstandingDao; import com.todoroo.astrid.dao.TaskDao; import com.todoroo.astrid.dao.TaskOutstandingDao; @@ -70,6 +71,7 @@ public class AstridDependencyInjector extends AbstractDependencyInjector { injectables.put("database", Database.class); injectables.put("taskDao", TaskDao.class); injectables.put("metadataDao", MetadataDao.class); + injectables.put("tagMetadataDao", TagMetadataDao.class); injectables.put("tagDataDao", TagDataDao.class); injectables.put("storeObjectDao", StoreObjectDao.class); injectables.put("updateDao", UpdateDao.class);