Skip to content
This repository has been archived by the owner on Mar 2, 2019. It is now read-only.

Commit

Permalink
Merge f22493e into ae8e662
Browse files Browse the repository at this point in the history
  • Loading branch information
Wang Xien Dong committed Nov 6, 2016
2 parents ae8e662 + f22493e commit 0539d82
Show file tree
Hide file tree
Showing 12 changed files with 446 additions and 85 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -25,4 +25,4 @@ public String toString() {
public ImmutableTask getTask() {
return task;
}
}
}
70 changes: 57 additions & 13 deletions src/main/java/seedu/todo/logic/commands/TagCommand.java
Original file line number Diff line number Diff line change
Expand Up @@ -51,13 +51,15 @@ public class TagCommand extends BaseCommand {
private static final String DESCRIPTION_DELETE_TAGS_TASK = "Remove tags from a task";
private static final String DESCRIPTION_DELETE_TAGS = "Remove tags from all tasks";
private static final String DESCRIPTION_RENAME_TAGS = "Rename a tag";
private static final String DESCRIPTION_RENAME_TAG_TASK = "Rename a tag from a task";

private static final int INDEX_OFFSET = 1;
private static final String ARGUMENTS_SHOW_TAGS = "";
private static final String ARGUMENTS_ADD_TAGS = "index tag1 [, tag2, ...]";
private static final String ARGUMENTS_DELETE_TAGS_TASK = "index /d tag1 [, tag2, ...]";
private static final String ARGUMENTS_DELETE_TAGS = "/d tag1 [, tag2, ...]";
private static final String ARGUMENTS_RENAME_TAGS = "/r old_tag_name new_tag_name";
private static final String ARGUMENTS_RENAME_TAG_TASK = "index /r old_tag_name new_tag_name";

/* Variables */
private Argument<Integer> index = new IntArgument("index");
Expand Down Expand Up @@ -130,6 +132,7 @@ public List<CommandSummary> getCommandSummary() {
new CommandSummary(DESCRIPTION_ADD_TAGS, getCommandName(), ARGUMENTS_ADD_TAGS),
new CommandSummary(DESCRIPTION_DELETE_TAGS_TASK, getCommandName(), ARGUMENTS_DELETE_TAGS_TASK),
new CommandSummary(DESCRIPTION_DELETE_TAGS, getCommandName(), ARGUMENTS_DELETE_TAGS),
new CommandSummary(DESCRIPTION_RENAME_TAG_TASK, getCommandName(), ARGUMENTS_RENAME_TAG_TASK),
new CommandSummary(DESCRIPTION_RENAME_TAGS, getCommandName(), ARGUMENTS_RENAME_TAGS)
);
}
Expand All @@ -140,6 +143,7 @@ protected void validateArguments() {
handleUnavailableInputParameters();
}
validateRenameParams();
validateRenameAllParams();
super.validateArguments();
}

Expand All @@ -153,6 +157,7 @@ public CommandResult execute() throws ValidationException {
performAddTagToTaskWhenApplicable(),
performDeleteTagsFromTaskWhenApplicable(),
performDeleteTagsGloballyWhenApplicable(),
performRenameTagFromTaskWhenApplicable(),
performRenameTagWhenApplicable());

guaranteeCommandResultExists(result); //Just a sanity check.
Expand Down Expand Up @@ -269,35 +274,64 @@ private CommandResult performDeleteTagsGloballyWhenApplicable() throws Validatio
return null;
}

/* Renaming Tags */
/* Rename Tag from a task */
/**
* Returns true if the command parameter matches the action of renaming a tag from a task.
*/
private boolean isRenameTagFromTask() {
return index.hasBoundValue() && !addTags.hasBoundValue() && !deleteTags.hasBoundValue()
&& renameTag.hasBoundValue();
}

/**
* Performs the following execution if the command indicates so:
* Rename a specific tag from a task.
*/
private CommandResult performRenameTagFromTaskWhenApplicable() throws ValidationException {
if (isRenameTagFromTask()) {
String[] renameTagsParam = StringUtil.split(renameTag.getValue());
String oldName = renameTagsParam[0];
String newName = renameTagsParam[1];
model.renameTag(index.getValue(), oldName, newName);
return new CommandResult(oldName + SUCCESS_RENAME_TAGS + newName);
}
return null;
}

/**
* Performs validation to rename params (check for sufficient parameters to rename).
*/
private void validateRenameParams() {
if (isRenameTagFromTask()) {
validateParameterForTwoItems(renameTag.getName(), renameTag.getValue());
}
}

/* Renaming Tags From All Tasks*/
/**
* Returns true if the command parameters matches the action of renaming tags.
*/
private boolean isRenamingTag() {
private boolean isRenameTagFromAllTasks() {
return !index.hasBoundValue() && !addTags.hasBoundValue() && !deleteTags.hasBoundValue()
&& renameTag.hasBoundValue();
}

/**
* Performs validation to rename params (check for sufficient parameters to rename).
*/
private void validateRenameParams() {
if (isRenamingTag()) {
String[] params = StringUtil.split(renameTag.getValue());
if (params != null && params.length != 2) {
errors.put(renameTag.getName(), ERROR_TWO_PARAMS);
}
private void validateRenameAllParams() {
if (isRenameTagFromAllTasks()) {
validateParameterForTwoItems(renameTag.getName(), renameTag.getValue());
}
}

/**
* Performs the following execution if the command indicates so:
* Rename a specific tag.
* Rename a specific tag globally.
*/
private CommandResult performRenameTagWhenApplicable() throws ValidationException {
String[] renameTagsParam = StringUtil.split(renameTag.getValue());

if (isRenamingTag()) {
if (isRenameTagFromAllTasks()) {
String[] renameTagsParam = StringUtil.split(renameTag.getValue());
String oldName = renameTagsParam[0];
String newName = renameTagsParam[1];
model.renameTag(oldName, newName);
Expand Down Expand Up @@ -330,7 +364,17 @@ private void guaranteeCommandResultExists(CommandResult result) throws Validatio
*/
private boolean isInputParameterSufficient() {
return getNumberOfTruth(isShowTags(), isAddTagsToTask(), isDeleteTagsFromTask(),
isDeleteTagsFromAllTasks(), isRenamingTag()) == 1;
isDeleteTagsFromAllTasks(), isRenameTagFromAllTasks(), isRenameTagFromTask()) == 1;
}

/**
* Validates the given {@code param} if there is exactly 2 items.
*/
private void validateParameterForTwoItems(String fieldName, String param) {
String[] params = StringUtil.split(param);
if (params == null || params.length != 2) {
errors.put(fieldName, ERROR_TWO_PARAMS);
}
}

/**
Expand Down
9 changes: 9 additions & 0 deletions src/main/java/seedu/todo/model/Model.java
Original file line number Diff line number Diff line change
Expand Up @@ -210,4 +210,13 @@ public interface Model {
* @throws ValidationException when the tag is not found, or the new name clashes with existing names.
*/
void renameTag(String oldName, String newName) throws ValidationException;

/**
* Renames a tag for a particular task.
* @param index The task displayed index to be renamed.
* @param oldName Name of the tag to be renamed.
* @param newName New name that the tag will assume.
* @throws ValidationException when the tag is not found, or the new name clashes with existing names.
*/
void renameTag(int index, String oldName, String newName) throws ValidationException;
}
85 changes: 51 additions & 34 deletions src/main/java/seedu/todo/model/TodoModel.java
Original file line number Diff line number Diff line change
Expand Up @@ -280,53 +280,40 @@ public List<Tag> getGlobalTagsList() {
@Override
public void addTagsToTask(int index, String... tagNames) throws ValidationException {
saveUndoState();

ImmutableTask task = getTask(index);
UniqueTagCollectionValidator
.validate("add tags", validator -> validator.validateAddTags(task, tagNames));

addTagsToTaskHelper(index, task, tagNames);
addTagsToTaskHelper(index, tagNames);
}

@Override
public void addTagsToTask(MutableTask task, String... tagNames) {
saveUndoState();

//Do not perform validation (disallowed by Consumer interface). Perform actual tag adding.
addTagsToTaskHelper(task, tagNames);
}

@Override
public void deleteTagsFromTask(int index, String... tagNames) throws ValidationException {
saveUndoState();

ImmutableTask task = getTask(index);
UniqueTagCollectionValidator
.validate("delete tags", validator -> validator.validateDeleteTags(task, tagNames));

deleteTagsFromTaskHelper(index, tagNames);
}

@Override
public void deleteTags(String... tagNames) throws ValidationException {
saveUndoState();

UniqueTagCollectionValidator.validate("delete tags",
validator -> validator.validateDeleteTags(uniqueTagCollection, tagNames));

deleteTagsHelper(tagNames);
}

@Override
public void renameTag(String oldName, String newName) throws ValidationException {
saveUndoState();

UniqueTagCollectionValidator.validate("rename tag",
validator -> validator.validateRenameCommand(uniqueTagCollection, oldName, newName));

renameTagHelper(oldName, newName);
}

@Override
public void renameTag(int index, String oldName, String newName) throws ValidationException {
saveUndoState();
renameTagFromTaskHelper(index, oldName, newName);
}

/**
* Gets the {@link ImmutableTask} object at the respective displayed index.
* @throws ValidationException when the index is invalid.
Expand All @@ -339,31 +326,42 @@ public ImmutableTask getTask(int displayedIndex) throws ValidationException {

/* Helper Method */
/**
* Helper method that handles tag adding operation
* Helper method that validate and handles tag adding operation
*/
private void addTagsToTaskHelper(int index, ImmutableTask task, String[] tagNames)
private void addTagsToTaskHelper(int index, String... tagNames)
throws ValidationException {
int taskIndex = getTaskIndex(index);
ImmutableTask task = getTask(index);

UniqueTagCollectionValidator
.validate("add tags", validator -> validator.validateAddTags(task, tagNames));

update(index, mutableTask -> {
todoList.update(taskIndex, mutableTask -> {
assert mutableTask.equals(task); //Just a sanity check.
addTagsToTask(mutableTask, tagNames);
addTagsToTaskHelper(mutableTask, tagNames);
});
}

/**
* Helper method that handles tag adding operation
* Helper method that handles tag adding operation without validation
*/
private void addTagsToTaskHelper(MutableTask task, String[] tagNames) {
private void addTagsToTaskHelper(MutableTask task, String... tagNames) {
Set<Tag> newTags = new HashSet<>(uniqueTagCollection.associateTaskToTags(task, tagNames));
newTags.addAll(task.getTags());
task.setTags(newTags);
}

/**
* Helper method that handles tag deletion from task operation
* Helper method that validates and handles tag deletion from task operation
*/
private void deleteTagsFromTaskHelper(int index, String[] tagNames) throws ValidationException {
update(index, mutableTask -> {
private void deleteTagsFromTaskHelper(int index, String... tagNames) throws ValidationException {
int taskIndex = getTaskIndex(index);
ImmutableTask task = getTask(index);

UniqueTagCollectionValidator
.validate("delete tags", validator -> validator.validateDeleteTags(task, tagNames));

todoList.update(taskIndex, mutableTask -> {
Set<Tag> tagsFromTask = new HashSet<>(mutableTask.getTags());
Collection<Tag> deletedTags = uniqueTagCollection.dissociateTaskFromTags(mutableTask, tagNames);
tagsFromTask.removeAll(deletedTags);
Expand All @@ -372,9 +370,12 @@ private void deleteTagsFromTaskHelper(int index, String[] tagNames) throws Valid
}

/**
* Helper method that handles tag deletion operation
* Helper method that validates and handles tag deletion operation
*/
private void deleteTagsHelper(String[] tagNames) throws ValidationException {
private void deleteTagsHelper(String... tagNames) throws ValidationException {
UniqueTagCollectionValidator.validate("delete tags",
validator -> validator.validateDeleteTags(uniqueTagCollection, tagNames));

Collection<Tag> deletedTags = uniqueTagCollection.deleteTags(tagNames);
todoList.updateAll(mutableTask -> {
Set<Tag> tagsFromTask = new HashSet<>(mutableTask.getTags());
Expand All @@ -384,16 +385,32 @@ private void deleteTagsHelper(String[] tagNames) throws ValidationException {
}

/**
* Helper method that handles tag renaming operation
* Helper method that validates and handles global tag renaming operation
*/
private void renameTagHelper(String oldName, String newName) throws ValidationException {
UniqueTagCollectionValidator.validate("rename tag",
validator -> validator.validateGlobalRenameCommand(uniqueTagCollection, oldName, newName));

Set<ImmutableTask> tasksWithTag = uniqueTagCollection.getTasksLinkedToTag(oldName);
deleteTags(oldName);
deleteTagsHelper(oldName);

todoList.updateAll(mutableTask -> {
if (tasksWithTag.contains(mutableTask)) {
addTagsToTask(mutableTask, newName);
addTagsToTaskHelper(mutableTask, newName);
}
});
}

/**
* Helper method that validates and handles tag renaming operation
*/
private void renameTagFromTaskHelper(int index, String oldName, String newName) throws ValidationException {
ImmutableTask task = getTask(index);

UniqueTagCollectionValidator.validate("rename tag",
validator -> validator.validateRenameCommand(task, oldName, newName));

deleteTagsFromTaskHelper(index, oldName);
addTagsToTaskHelper(index, newName);
}
}
8 changes: 6 additions & 2 deletions src/main/java/seedu/todo/model/tag/UniqueTagCollection.java
Original file line number Diff line number Diff line change
Expand Up @@ -93,14 +93,18 @@ private Tag associateTaskToTag(ImmutableTask task, Tag tag) {
}

/**
* Removes the association between the {@code task} from the {@code tag} in
* the {@link #uniqueTagsToTasksMap}.
* Removes the association between the {@code task} from the {@code tag} in {@link #uniqueTagsToTasksMap}.
* If the tag do not have any associated task, the tag will be removed from the map.
* @return an instance of the {@code tag}
*/
private Tag dissociateTaskFromTag(ImmutableTask task, Tag tag) {
Set<ImmutableTask> setOfTasks = uniqueTagsToTasksMap.get(tag);
if (setOfTasks != null) {
setOfTasks.remove(task);

if (setOfTasks.isEmpty()) {
uniqueTagsToTasksMap.remove(tag);
}
}
return tag;
}
Expand Down

0 comments on commit 0539d82

Please sign in to comment.