mirror of https://github.com/tasks/tasks
Merge pull request #86 from sbosley/110905_sb_case_insensitive_lists
Case insensitive listspull/14/head
commit
b2eacec1f8
@ -0,0 +1,123 @@
|
||||
package com.todoroo.astrid.tags;
|
||||
|
||||
import java.util.HashMap;
|
||||
|
||||
import com.todoroo.andlib.data.TodorooCursor;
|
||||
import com.todoroo.andlib.service.Autowired;
|
||||
import com.todoroo.andlib.service.DependencyInjectionService;
|
||||
import com.todoroo.andlib.sql.Criterion;
|
||||
import com.todoroo.andlib.sql.Join;
|
||||
import com.todoroo.andlib.sql.Query;
|
||||
import com.todoroo.andlib.utility.Preferences;
|
||||
import com.todoroo.astrid.data.Metadata;
|
||||
import com.todoroo.astrid.data.TagData;
|
||||
import com.todoroo.astrid.data.Task;
|
||||
import com.todoroo.astrid.service.MetadataService;
|
||||
import com.todoroo.astrid.service.TagDataService;
|
||||
import com.todoroo.astrid.service.TaskService;
|
||||
|
||||
public class TagCaseMigrator {
|
||||
|
||||
@Autowired TaskService taskService;
|
||||
@Autowired TagDataService tagDataService;
|
||||
@Autowired MetadataService metadataService;
|
||||
|
||||
private static final String PREF_CASE_MIGRATION_PERFORMED = "tag_case_migration"; //$NON-NLS-1$
|
||||
|
||||
public TagCaseMigrator() {
|
||||
DependencyInjectionService.getInstance().inject(this);
|
||||
}
|
||||
|
||||
private final HashMap<String, String> renameMap = new HashMap<String, String>();
|
||||
private final HashMap<String, Long> nameToRemoteId = new HashMap<String, Long>();
|
||||
private final HashMap<String, Integer> nameCountMap = new HashMap<String, Integer>();
|
||||
|
||||
public void performTagCaseMigration() {
|
||||
if (!Preferences.getBoolean(PREF_CASE_MIGRATION_PERFORMED, false)) {
|
||||
TagService.Tag[] allTagData = TagService.getInstance().getGroupedTags(TagService.GROUPED_TAGS_BY_ALPHA, Criterion.all);
|
||||
|
||||
for (int i = 0; i < allTagData.length - 1; i++) {
|
||||
TagService.Tag first = allTagData[i];
|
||||
TagService.Tag second = allTagData[i+1];
|
||||
|
||||
if (first.tag.equalsIgnoreCase(second.tag)) {
|
||||
markForRenaming(first.tag, first.remoteId);
|
||||
markForRenaming(second.tag, second.remoteId);
|
||||
}
|
||||
}
|
||||
|
||||
for (String key : renameMap.keySet()) {
|
||||
TagService.getInstance().renameCaseSensitive(key, renameMap.get(key));
|
||||
updateTagData(key);
|
||||
}
|
||||
|
||||
Preferences.setBoolean(PREF_CASE_MIGRATION_PERFORMED, true);
|
||||
}
|
||||
}
|
||||
|
||||
private String targetNameForTag(String tag) {
|
||||
String targetName = tag.toLowerCase();
|
||||
targetName = targetName.substring(0, 1).toUpperCase() + targetName.substring(1);
|
||||
return targetName;
|
||||
}
|
||||
|
||||
private void markForRenaming(String tag, long remoteId) {
|
||||
if (renameMap.containsKey(tag)) return;
|
||||
|
||||
String targetName = targetNameForTag(tag);
|
||||
|
||||
int suffix = 1;
|
||||
if (nameCountMap.containsKey(targetName)) {
|
||||
suffix = nameCountMap.get(targetName);
|
||||
}
|
||||
|
||||
String newName = targetName + "_" + suffix; //$NON-NLS-1$
|
||||
nameCountMap.put(targetName, suffix + 1);
|
||||
renameMap.put(tag, newName);
|
||||
nameToRemoteId.put(tag, remoteId);
|
||||
}
|
||||
|
||||
private void updateTagData(String tag) {
|
||||
long remoteId = nameToRemoteId.get(tag);
|
||||
TodorooCursor<TagData> tagData = tagDataService.query(Query.select(TagData.NAME, TagData.REMOTE_ID)
|
||||
.where(Criterion.and(
|
||||
TagData.NAME.eq(tag), TagData.REMOTE_ID.eq(remoteId))));
|
||||
try {
|
||||
for (tagData.moveToFirst(); !tagData.isAfterLast(); tagData.moveToNext()) {
|
||||
TagData curr = new TagData(tagData);
|
||||
curr.setValue(TagData.NAME, renameMap.get(tag));
|
||||
tagDataService.save(curr);
|
||||
}
|
||||
} finally {
|
||||
tagData.close();
|
||||
}
|
||||
|
||||
addTasksToTargetTag(renameMap.get(tag), targetNameForTag(tag));
|
||||
}
|
||||
|
||||
private void addTasksToTargetTag(String tag, String target) {
|
||||
TodorooCursor<Task> tasks = taskService.query(Query.select(Task.ID).join(Join.inner(Metadata.TABLE,
|
||||
Task.ID.eq(Metadata.TASK))).where(TagService.tagEq(tag, null)));
|
||||
try {
|
||||
for (tasks.moveToFirst(); !tasks.isAfterLast(); tasks.moveToNext()) {
|
||||
Task curr = new Task(tasks);
|
||||
TodorooCursor<Metadata> tagMetadata = metadataService.query(Query.select(TagService.TAG)
|
||||
.where(Criterion.and(TagService.TAG.eq(target), Metadata.KEY.eq(TagService.KEY))));
|
||||
try {
|
||||
if (tagMetadata.getCount() == 0) {
|
||||
Metadata newTag = new Metadata();
|
||||
newTag.setValue(Metadata.KEY, TagService.KEY);
|
||||
newTag.setValue(Metadata.TASK, curr.getId());
|
||||
newTag.setValue(TagService.TAG, target);
|
||||
metadataService.save(newTag);
|
||||
} // else already exists for some weird reason
|
||||
} finally {
|
||||
tagMetadata.close();
|
||||
}
|
||||
}
|
||||
} finally {
|
||||
tasks.close();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue