Skip to content

Commit

Permalink
[v1.2] Added AddTask Command (#46)
Browse files Browse the repository at this point in the history
* aboutUsUpdate

* WIP implementations

Add tasks related model
Add commands related to tasks

* fix *imports

* passed checkstyle test
  • Loading branch information
luhan02 authored and QzSG committed Oct 10, 2018
1 parent ece5088 commit 25088fc
Show file tree
Hide file tree
Showing 16 changed files with 508 additions and 0 deletions.
1 change: 1 addition & 0 deletions src/main/java/seedu/address/MainApp.java
Original file line number Diff line number Diff line change
Expand Up @@ -190,6 +190,7 @@ public void stop() {
try {
storage.saveUserPrefs(userPrefs);
} catch (IOException e) {

logger.severe("Failed to save preferences " + StringUtil.getDetails(e));
}
Platform.exit();
Expand Down
71 changes: 71 additions & 0 deletions src/main/java/seedu/address/logic/commands/AddTaskCommand.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
package seedu.address.logic.commands;

import static java.util.Objects.requireNonNull;
import static seedu.address.logic.parser.CliSyntax.PREFIX_BODY;
import static seedu.address.logic.parser.CliSyntax.PREFIX_END;
import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;
import static seedu.address.logic.parser.CliSyntax.PREFIX_PRIORITY;
import static seedu.address.logic.parser.CliSyntax.PREFIX_START;
import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG;

import seedu.address.logic.CommandHistory;
import seedu.address.logic.commands.exceptions.CommandException;
import seedu.address.model.Model;
import seedu.address.model.task.Task;

/**
* Adds a task to the task list.
*/
public class AddTaskCommand extends Command {
public static final String COMMAND_WORD = "task";

public static final String MESSAGE_USAGE = COMMAND_WORD + ": Adds a task to the task list. \n"
+ "Parameters: "
+ PREFIX_NAME + "NAME "
+ "[" + PREFIX_BODY + "BODY] "
+ "[" + PREFIX_START + "START_DATETIME] "
+ PREFIX_END + "END_DATETIME "
+ PREFIX_PRIORITY + "PRIORITY "
+ "[" + PREFIX_TAG + "TAG]...\n"
+ "Example: " + COMMAND_WORD + " "
+ PREFIX_NAME + "Submission "
+ PREFIX_BODY + "CG2027_assign2 "
+ PREFIX_START + "09/10_1700 "
+ PREFIX_END + "16/10_1400 "
+ PREFIX_PRIORITY + "HIGH "
+ PREFIX_TAG + "IVLE";

public static final String MESSAGE_SUCCESS = "New task added: %1$s";
public static final String MESSAGE_DUPLICATE_TASK = "This task already exists in the task list";

private final Task toAdd;

/**
* Creates an AddCommand to add the specified {@code Person}
*/
public AddTaskCommand(Task task) {
requireNonNull(task);
toAdd = task;
}

@Override
public CommandResult execute(Model model, CommandHistory history) throws CommandException {
requireNonNull(model);

if (model.hasTask(toAdd)) {
throw new CommandException(MESSAGE_DUPLICATE_TASK);
}

model.addTask(toAdd);
model.commitAddressBook();
return new CommandResult(String.format(MESSAGE_SUCCESS, toAdd));
}

@Override
public boolean equals(Object other) {
return other == this // short circuit if same object
|| (other instanceof AddTaskCommand // instanceof handles nulls
&& toAdd.equals(((AddTaskCommand) other).toAdd));
}

}
62 changes: 62 additions & 0 deletions src/main/java/seedu/address/logic/parser/AddTaskCommandParser.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package seedu.address.logic.parser;

import static seedu.address.commons.core.Messages.MESSAGE_INVALID_COMMAND_FORMAT;
import static seedu.address.logic.parser.CliSyntax.PREFIX_BODY;
import static seedu.address.logic.parser.CliSyntax.PREFIX_END;
import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;
import static seedu.address.logic.parser.CliSyntax.PREFIX_PRIORITY;
import static seedu.address.logic.parser.CliSyntax.PREFIX_START;
import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG;

import java.util.Set;
import java.util.stream.Stream;

import seedu.address.logic.commands.AddTaskCommand;
import seedu.address.logic.parser.exceptions.ParseException;
import seedu.address.model.tag.Tag;
import seedu.address.model.task.Body;
import seedu.address.model.task.DateTime;
import seedu.address.model.task.Priority;
import seedu.address.model.task.Task;
import seedu.address.model.task.TaskName;

/**
* Parses input arguments and creates a new AddTaskCommand object
*/
public class AddTaskCommandParser implements Parser<AddTaskCommand> {

public AddTaskCommandParser() throws ParseException {
}

/**
* Returns true if none of the prefixes contains empty {@code Optional} values in the given
* {@code ArgumentMultimap}.
*/
private static boolean arePrefixesPresent(ArgumentMultimap argumentMultimap, Prefix... prefixes) {
return Stream.of(prefixes).allMatch(prefix -> argumentMultimap.getValue(prefix).isPresent());
}

@Override
public AddTaskCommand parse(String userInput) throws ParseException {
ArgumentMultimap argMultimap =
ArgumentTokenizer.tokenize(userInput, PREFIX_NAME, PREFIX_BODY, PREFIX_START, PREFIX_END,
PREFIX_PRIORITY, PREFIX_TAG);

if (!arePrefixesPresent(argMultimap, PREFIX_NAME, PREFIX_BODY, PREFIX_START, PREFIX_END, PREFIX_PRIORITY)
|| !argMultimap.getPreamble().isEmpty()) {
throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddTaskCommand.MESSAGE_USAGE));
}

TaskName taskName = ParserUtil.parseTaskName(argMultimap.getValue(PREFIX_NAME).get());
Body body = ParserUtil.parseBody(argMultimap.getValue(PREFIX_BODY).get());
DateTime startDateTime = ParserUtil.parseDateTime(argMultimap.getValue(PREFIX_START).get());
DateTime endDateTime = ParserUtil.parseDateTime(argMultimap.getValue(PREFIX_END).get());
Priority priority = ParserUtil.parsePriority(argMultimap.getValue(PREFIX_PRIORITY).get());
Set<Tag> tagList = ParserUtil.parseTags(argMultimap.getAllValues(PREFIX_TAG));

Task task = new Task(taskName, body, startDateTime, endDateTime, priority, tagList);

return new AddTaskCommand(task);

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import java.util.regex.Pattern;

import seedu.address.logic.commands.AddCommand;
import seedu.address.logic.commands.AddTaskCommand;
import seedu.address.logic.commands.BackupCommand;
import seedu.address.logic.commands.ClearCommand;
import seedu.address.logic.commands.Command;
Expand Down Expand Up @@ -88,6 +89,9 @@ public Command parseCommand(String userInput) throws ParseException {
case BackupCommand.COMMAND_WORD:
return new BackupCommandParser().parse(arguments);

case AddTaskCommand.COMMAND_WORD:
return new AddTaskCommandParser().parse(arguments);

default:
throw new ParseException(MESSAGE_UNKNOWN_COMMAND);
}
Expand Down
4 changes: 4 additions & 0 deletions src/main/java/seedu/address/logic/parser/CliSyntax.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,8 @@ public class CliSyntax {
public static final Prefix PREFIX_ADDRESS = new Prefix("a/");
public static final Prefix PREFIX_TAG = new Prefix("t/");

public static final Prefix PREFIX_BODY = new Prefix("b/");
public static final Prefix PREFIX_START = new Prefix("s/");
public static final Prefix PREFIX_END = new Prefix("e/");
public static final Prefix PREFIX_PRIORITY = new Prefix("p/");
}
75 changes: 75 additions & 0 deletions src/main/java/seedu/address/logic/parser/ParserUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,10 @@
import seedu.address.model.person.Name;
import seedu.address.model.person.Phone;
import seedu.address.model.tag.Tag;
import seedu.address.model.task.Body;
import seedu.address.model.task.DateTime;
import seedu.address.model.task.Priority;
import seedu.address.model.task.TaskName;

/**
* Contains utility methods used for parsing strings in the various *Parser classes.
Expand Down Expand Up @@ -136,4 +140,75 @@ public static Optional<Path> parsePath(String stringPath) throws ParseException
}
return Optional.ofNullable(Paths.get(stringPath));
}

/**
* Parses a {@code String name} into a {@code TaskName}.
* Leading and trailing whitespaces will be trimmed.
*
* @throws ParseException if the given {@code name} is invalid.
*/
public static TaskName parseTaskName(String name) throws ParseException {
requireNonNull(name);
String trimmedName = name.trim();
if (!Name.isValidName(trimmedName)) {
throw new ParseException(Name.MESSAGE_NAME_CONSTRAINTS);
}
return new TaskName(trimmedName);
}

/**
* Parses a {@code String body} into a {@codeBody}.
* Leading and trailing whitespaces will be trimmed.
*
* @throws ParseException if the given {@code body} is invalid.
*/
public static Body parseBody(String body) throws ParseException {
return new Body(body);
}

/**
* Parses a {@code String stareDateTime } into an {@code DateTime}.
* Leading and trailing whitespaces will be trimmed.
*
* @throws ParseException if the given {@code startDateTime} is invalid.
*/
public static DateTime parseDateTime(String startDateTime) throws ParseException {
requireNonNull(startDateTime);
String trimmedStartDateTime = startDateTime.trim();
if (!DateTime.isValidDateTime(trimmedStartDateTime)) {
throw new ParseException(DateTime.MESSAGE_DATETIME_CONSTRAINTS);
}
return new DateTime(trimmedStartDateTime);
}

/**
* Parses a {@code String endDateTime} into an {@code DateTime}.
* Leading and trailing whitespaces will be trimmed.
*
* @throws ParseException if the given {@code endDateTime} is invalid.
*/
public static DateTime parseTagDateTime(String endDateTime) throws ParseException {
requireNonNull(endDateTime);
String trimmedEndDateTime = endDateTime.trim();
if (!DateTime.isValidDateTime(trimmedEndDateTime)) {
throw new ParseException(DateTime.MESSAGE_DATETIME_CONSTRAINTS);
}
return new DateTime(trimmedEndDateTime);
}

/**
* Parses a {@code String priority} into an {@code Priority}.
* Leading and trailing whitespaces will be trimmed.
*
* @throws ParseException if the given {@code priority} is invalid.
*/
public static Priority parsePriority(String priority) throws ParseException {
String trimmedPriority = priority.trim();
if (!Priority.isValidPriority(trimmedPriority)) {
throw new ParseException(Priority.MESSAGE_PRIORITY_CONSTRAINTS);
}
return new Priority(trimmedPriority);
}


}
13 changes: 13 additions & 0 deletions src/main/java/seedu/address/model/Model.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

import javafx.collections.ObservableList;
import seedu.address.model.person.Person;
import seedu.address.model.task.Task;

/**
* The API of the Model component.
Expand Down Expand Up @@ -83,5 +84,17 @@ public interface Model {
/**
* Backup current address book to storage.
*/
void backupAddressBook();
void backupAddressBook(Path backupPath);

/**
* Returns true if a task with the same identity as {@code task} exists in the address book.
*/
boolean hasTask(Task task);

/**
* Adds the given task.
* {@code task} must not already exist in the address book.
*/
void addTask(Task person);
}
17 changes: 17 additions & 0 deletions src/main/java/seedu/address/model/ModelManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import seedu.address.commons.events.model.AddressBookChangedEvent;
import seedu.address.commons.events.model.AddressBookLocalBackupEvent;
import seedu.address.model.person.Person;
import seedu.address.model.task.Task;

/**
* Represents the in-memory model of the address book data.
Expand Down Expand Up @@ -145,12 +146,28 @@ public void commitAddressBook() {
versionedAddressBook.commit();
}

@Override
public void backupAddressBook() {

}

//@@author QzSG
@Override
public void backupAddressBook(Path backupPath) {
indicateAddressBookBackupRequest(backupPath);
}
//@@author
@Override
public boolean hasTask(Task task) {
return false;
}

@Override
public void addTask(Task person) {

}



@Override
public boolean equals(Object obj) {
Expand Down
22 changes: 22 additions & 0 deletions src/main/java/seedu/address/model/task/Body.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package seedu.address.model.task;

/**
* Represents a Task's datails in the task list .
* Guarantees: immutable.
*/
public class Body {

public static final String MESSAGE_BODY_CONSTRAINTS =
"Task body can take any values, and it should not be blank";

private String bodyString;

public Body(String bodyString) {
this.bodyString = bodyString;
}

@Override
public String toString() {
return bodyString;
}
}
30 changes: 30 additions & 0 deletions src/main/java/seedu/address/model/task/DateTime.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package seedu.address.model.task;

/**
* Represents a Task's start & end date time in the task list.
* Guarantees: immutable; is valid as declared in {@link #isValidDateTime(String)}
*/
public class DateTime {
public static final String MESSAGE_DATETIME_CONSTRAINTS =
"Date & Time should only contain numbers, and it should be at least 4 digits long";
public static final String DATETIME_VALIDATION_REGEX = "\\d{4,}";

private String dateTimeString;

public DateTime(String dateTimeString) {
this.dateTimeString = dateTimeString;
}

/**
* Returns true if a given string is a valid date & time.
*/
public static boolean isValidDateTime(String test) {
return true;
//return test.matches(DATETIME_VALIDATION_REGEX);
}

@Override
public String toString() {
return dateTimeString;
}
}
Loading

0 comments on commit 25088fc

Please sign in to comment.