Skip to content

Commit

Permalink
Merge pull request #90 from jordancjq/team_implementation
Browse files Browse the repository at this point in the history
Add AssignCommand without test
  • Loading branch information
codeeong authored Mar 30, 2018
2 parents 2cafd0e + d7b243a commit 07777a0
Show file tree
Hide file tree
Showing 24 changed files with 620 additions and 26 deletions.
3 changes: 2 additions & 1 deletion src/main/java/seedu/address/commons/core/Messages.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ public class Messages {
public static final String MESSAGE_INVALID_COMMAND_FORMAT = "Invalid command format! \n%1$s";
public static final String MESSAGE_INVALID_PERSON_DISPLAYED_INDEX = "The person index provided is invalid";
public static final String MESSAGE_PERSONS_LISTED_OVERVIEW = "%1$d persons listed!";
public static final String MESSAGE_TEAM_NOT_FOUND = "Team does not exist and will not be assigned!";
public static final String MESSAGE_TEAM_NOT_FOUND = "Team does not exist or is not specified!";
public static final String MESSAGE_INVALID_ALL_INDEX = "All person index provided is invalid";

}
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ public AddressBookChangedEvent(ReadOnlyAddressBook data) {

@Override
public String toString() {
return "number of persons " + data.getPersonList().size() + ", number of tags " + data.getTagList().size();
return "number of persons " + data.getPersonList().size()
+ ", number of tags " + data.getTagList().size()
+ ", number of teams " + data.getTeamList().size();
}
}
17 changes: 17 additions & 0 deletions src/main/java/seedu/address/logic/commands/AddCommand.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,14 @@
import static seedu.address.logic.parser.CliSyntax.PREFIX_POSITION;
import static seedu.address.logic.parser.CliSyntax.PREFIX_RATING;
import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG;
import static seedu.address.logic.parser.CliSyntax.PREFIX_TEAMNAME;
import static seedu.address.logic.parser.ParserUtil.UNSPECIFIED_FIELD;

import seedu.address.commons.core.Messages;
import seedu.address.logic.commands.exceptions.CommandException;
import seedu.address.model.person.Person;
import seedu.address.model.person.exceptions.DuplicatePersonException;
import seedu.address.model.team.TeamName;

/**
* Adds a player to the address book.
Expand All @@ -26,6 +30,7 @@ public class AddCommand extends UndoableCommand {
+ "Parameters: "
+ PREFIX_NAME + "NAME "
+ PREFIX_EMAIL + "EMAIL "
+ "[" + PREFIX_TEAMNAME + "TEAMNAME] "
+ "[" + PREFIX_PHONE + "PHONE] "
+ "[" + PREFIX_ADDRESS + "ADDRESS] "
+ "[" + PREFIX_RATING + "RATING] "
Expand Down Expand Up @@ -70,11 +75,23 @@ public CommandResult executeUndoableCommand() throws CommandException {
requireNonNull(model);
try {
model.addPerson(toAdd);
if (!toAdd.getTeamName().toString().equals(UNSPECIFIED_FIELD)) {
model.assignPersonToTeam(toAdd, toAdd.getTeamName());
}
return new CommandResult(String.format(MESSAGE_SUCCESS, toAdd));
} catch (DuplicatePersonException e) {
throw new CommandException(MESSAGE_DUPLICATE_PERSON);
}
}

@Override
protected void preprocessUndoableCommand() throws CommandException {
TeamName teamName = toAdd.getTeamName();
if (!model.getAddressBook().getTeamList().contains(teamName)) {
if (!teamName.toString().equals(UNSPECIFIED_FIELD)) {
throw new CommandException((Messages.MESSAGE_TEAM_NOT_FOUND));
}
}
}

@Override
Expand Down
106 changes: 106 additions & 0 deletions src/main/java/seedu/address/logic/commands/AssignCommand.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
package seedu.address.logic.commands;

import static java.util.Objects.requireNonNull;
import static seedu.address.logic.parser.CliSyntax.PREFIX_INDEX;
import static seedu.address.logic.parser.CliSyntax.PREFIX_TEAMNAME;
import static seedu.address.model.Model.PREDICATE_SHOW_ALL_PERSONS;

import java.util.ArrayList;
import java.util.List;

import seedu.address.commons.core.Messages;
import seedu.address.commons.core.index.Index;
import seedu.address.logic.commands.exceptions.CommandException;
import seedu.address.model.person.Person;
import seedu.address.model.person.exceptions.DuplicatePersonException;
import seedu.address.model.team.TeamName;

/**
* Assigns a person to a team.
*/
public class AssignCommand extends UndoableCommand {

public static final String COMMAND_WORD = "assign";
public static final String COMMAND_ALIAS = "at";

public static final String MESSAGE_USAGE = COMMAND_WORD + ": Assigns a person or a group of person to a team "
+ "by the index number used in the last person listing.\n"
+ "Team of the person will be updated and will be added to team.\n"
+ "Parameters: "
+ PREFIX_TEAMNAME + "TEAM_NAME "
+ PREFIX_INDEX + "INDEX (must be a positive integer) "
+ "[INDEX]...\n"
+ "Example: " + COMMAND_WORD + " "
+ PREFIX_TEAMNAME + "Arsenal "
+ PREFIX_INDEX + "1 2";

public static final String MESSAGE_PARAMETERS = PREFIX_TEAMNAME + "TEAM_NAME "
+ PREFIX_INDEX + "INDEX "
+ "[INDEX]...";

public static final String MESSAGE_SUCCESS = "Person assigned to team";
public static final String MESSAGE_DUPLICATE_PERSON = "This person already exists in the team";

private final TeamName targetTeam;
private final List<Index> targetIndexes;

private List<Person> personsToAssign;

/**
* Creates an AssignCommand to assign person to {@code Team}
*/
public AssignCommand(TeamName targetTeam, List<Index> targetIndexes) {
requireNonNull(targetTeam);
requireNonNull(targetIndexes);

this.targetTeam = targetTeam;
this.targetIndexes = targetIndexes;
}

@Override
public CommandResult executeUndoableCommand() throws CommandException {
try {
for (Person person : personsToAssign) {
model.assignPersonToTeam(person, targetTeam);
}
} catch (DuplicatePersonException e) {
throw new CommandException(MESSAGE_DUPLICATE_PERSON);
}

model.updateFilteredPersonList(PREDICATE_SHOW_ALL_PERSONS);
return new CommandResult(MESSAGE_SUCCESS);
}

@Override
protected void preprocessUndoableCommand() throws CommandException {
if (!model.getAddressBook().getTeamList().stream().anyMatch(t -> t.getTeamName().equals(targetTeam))) {
throw new CommandException(Messages.MESSAGE_TEAM_NOT_FOUND);
}

List<Person> lastShownList = model.getFilteredPersonList();
List<Index> executableIndexes = new ArrayList<>();
Boolean canAssignPerson = false;

for (Index idx : targetIndexes) {
if (idx.getZeroBased() < lastShownList.size()) {
executableIndexes.add(idx);
canAssignPerson = true;
}
}

if (!canAssignPerson) {
throw new CommandException(Messages.MESSAGE_INVALID_ALL_INDEX);
}

personsToAssign = new ArrayList<>();
executableIndexes.forEach(idx -> personsToAssign.add(lastShownList.get(idx.getZeroBased())));
}

@Override
public boolean equals(Object other) {
return other == this // short circuit if same object
|| (other instanceof AssignCommand // instanceof handles nulls
&& this.targetTeam.equals(((AssignCommand) other).targetTeam)) // state check
&& this.targetIndexes.equals(((AssignCommand) other).targetIndexes);
}
}
51 changes: 51 additions & 0 deletions src/main/java/seedu/address/logic/commands/RemoveCommand.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package seedu.address.logic.commands;

import static java.util.Objects.requireNonNull;

import seedu.address.commons.core.Messages;
import seedu.address.logic.commands.exceptions.CommandException;
import seedu.address.model.team.TeamName;
import seedu.address.model.team.exceptions.TeamNotFoundException;

/**
* Removes a team identified using the team name
*/
public class RemoveCommand extends UndoableCommand {

public static final String COMMAND_WORD = "remove";
public static final String COMMAND_ALIAS = "rt";

public static final String MESSAGE_USAGE = COMMAND_WORD
+ ": Removes the team specified by the team name.\n"
+ "Parameters: TEAM_NAME\n"
+ "Example: " + COMMAND_WORD + " Arsenal";

public static final String MESSAGE_PARAMETERS = "TEAM_NAME";

public static final String MESSAGE_REMOVE_TEAM_SUCCESS = "Removed Team: %1$s";

private TeamName targetTeamName;

public RemoveCommand(TeamName targetTeamName) {
this.targetTeamName = targetTeamName;
}

@Override
public CommandResult executeUndoableCommand() throws CommandException {
requireNonNull(targetTeamName);
try {
model.removeTeam(targetTeamName);
} catch (TeamNotFoundException tnfe) {
throw new CommandException(Messages.MESSAGE_TEAM_NOT_FOUND);
}

return new CommandResult(String.format(MESSAGE_REMOVE_TEAM_SUCCESS, targetTeamName));
}

@Override
public boolean equals(Object other) {
return other == this // short circuit if same object
|| (other instanceof RemoveCommand // instanceof handles nulls
&& this.targetTeamName.equals(((RemoveCommand) other).targetTeamName)); // state check
}
}
16 changes: 9 additions & 7 deletions src/main/java/seedu/address/logic/parser/AddCommandParser.java
Original file line number Diff line number Diff line change
Expand Up @@ -51,19 +51,21 @@ public AddCommand parse(String args) throws ParseException {

try {
Name name = ParserUtil.parseName(argMultimap.getValue(PREFIX_NAME)).get();
Phone phone = ParserUtil.parsePhone(ParserUtil.parseValue(argMultimap.getValue(PREFIX_PHONE))).get();
Phone phone = ParserUtil.parsePhone(ParserUtil.parseValue(argMultimap.getValue(PREFIX_PHONE),
Phone.MESSAGE_PHONE_CONSTRAINTS)).get();
Email email = ParserUtil.parseEmail(argMultimap.getValue(PREFIX_EMAIL)).get();
Address address = ParserUtil.parseAddress(ParserUtil.parseValue(argMultimap
.getValue(PREFIX_ADDRESS))).get();
.getValue(PREFIX_ADDRESS), Address.MESSAGE_ADDRESS_CONSTRAINTS)).get();
Remark remark = new Remark("");
TeamName teamName = ParserUtil.parseTeamName(ParserUtil.parseValue(argMultimap.getValue(PREFIX_TEAMNAME)))
.get();
TeamName teamName = ParserUtil.parseTeamName(ParserUtil.parseValue(argMultimap.getValue(PREFIX_TEAMNAME),
TeamName.MESSAGE_TEAM_NAME_CONSTRAINTS)).get();
Set<Tag> tagList = ParserUtil.parseTags(argMultimap.getAllValues(PREFIX_TAG));
Rating rating = ParserUtil.parseRating(ParserUtil.parseValue(argMultimap.getValue(PREFIX_RATING))).get();
Rating rating = ParserUtil.parseRating(ParserUtil.parseValue(argMultimap.getValue(PREFIX_RATING),
Rating.MESSAGE_RATING_CONSTRAINTS)).get();
Position position = ParserUtil.parsePosition(ParserUtil.parseValue(argMultimap
.getValue(PREFIX_POSITION))).get();
.getValue(PREFIX_POSITION), Position.MESSAGE_POSITION_CONSTRAINTS)).get();
JerseyNumber jerseyNumber = ParserUtil.parseJerseyNumber(ParserUtil.parseValue(argMultimap
.getValue(PREFIX_JERSEY_NUMBER))).get();
.getValue(PREFIX_JERSEY_NUMBER), JerseyNumber.MESSAGE_JERSEY_NUMBER_CONSTRAINTS)).get();

Person person = new Person(name, phone, email, address, remark, teamName, tagList, rating, position,
jerseyNumber);
Expand Down
10 changes: 10 additions & 0 deletions src/main/java/seedu/address/logic/parser/AddressBookParser.java
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.AssignCommand;
import seedu.address.logic.commands.ClearCommand;
import seedu.address.logic.commands.Command;
import seedu.address.logic.commands.CreateCommand;
Expand All @@ -19,6 +20,7 @@
import seedu.address.logic.commands.ListCommand;
import seedu.address.logic.commands.RedoCommand;
import seedu.address.logic.commands.RemarkCommand;
import seedu.address.logic.commands.RemoveCommand;
import seedu.address.logic.commands.SelectCommand;
import seedu.address.logic.commands.SetCommand;
import seedu.address.logic.commands.SortCommand;
Expand Down Expand Up @@ -92,6 +94,14 @@ public Command parseCommand(String userInput) throws ParseException {
case CreateCommand.COMMAND_ALIAS:
return new CreateCommandParser().parse(arguments);

case RemoveCommand.COMMAND_WORD:
case RemoveCommand.COMMAND_ALIAS:
return new RemoveCommandParser().parse(arguments);

case AssignCommand.COMMAND_WORD:
case AssignCommand.COMMAND_ALIAS:
return new AssignCommandParser().parse(arguments);

case ExitCommand.COMMAND_WORD:
return new ExitCommand();

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

import static java.util.Objects.requireNonNull;
import static seedu.address.commons.core.Messages.MESSAGE_INVALID_COMMAND_FORMAT;
import static seedu.address.logic.parser.CliSyntax.PREFIX_INDEX;
import static seedu.address.logic.parser.CliSyntax.PREFIX_TEAMNAME;

import java.util.List;
import java.util.stream.Stream;

import seedu.address.commons.core.index.Index;
import seedu.address.commons.exceptions.IllegalValueException;
import seedu.address.logic.commands.AssignCommand;
import seedu.address.logic.parser.exceptions.ParseException;
import seedu.address.model.team.TeamName;

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

/**
* Parses the given {@code String} of arguments in the context of the AssignCommand
* and returns an AssignCommand object for execution.
* @throws ParseException if the user input does not conform the expected format
*/
public AssignCommand parse(String args) throws ParseException {
requireNonNull(args);
ArgumentMultimap argMultimap = ArgumentTokenizer.tokenize(args, PREFIX_TEAMNAME, PREFIX_INDEX);

if (!arePrefixesPresent(argMultimap, PREFIX_TEAMNAME, PREFIX_INDEX)) {
throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, AssignCommand.MESSAGE_USAGE));
}

try {
TeamName teamName = ParserUtil.parseTeamName(argMultimap.getValue(PREFIX_TEAMNAME).get());
List<Index> indexList = ParserUtil.parseIndexes(argMultimap.getValue(PREFIX_INDEX).get());

return new AssignCommand(teamName, indexList);
} catch (IllegalValueException ive) {
throw new ParseException(ive.getMessage(), ive);
}
}

/**
* 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());
}
}
2 changes: 1 addition & 1 deletion src/main/java/seedu/address/logic/parser/CliSyntax.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@ public class CliSyntax {
public static final Prefix PREFIX_REMARK = new Prefix("r/");
public static final Prefix PREFIX_TAG_COLOUR = new Prefix("tc/");
public static final Prefix PREFIX_TEAMNAME = new Prefix("at/");
public static final Prefix PREFIX_INDEX = new Prefix("i/");
public static final Prefix PREFIX_RATING = new Prefix("ra/");
public static final Prefix PREFIX_JERSEY_NUMBER = new Prefix("j/");
public static final Prefix PREFIX_POSITION = new Prefix("po/");

}
28 changes: 26 additions & 2 deletions src/main/java/seedu/address/logic/parser/ParserUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,11 @@

import static java.util.Objects.requireNonNull;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Optional;
import java.util.Set;

Expand Down Expand Up @@ -49,6 +52,26 @@ public static Index parseIndex(String oneBasedIndex) throws IllegalValueExceptio
return Index.fromOneBased(Integer.parseInt(trimmedIndex));
}

/**
* Parses {@code String oneBasedIndexes} into a {@code List<Index>} and returns it. Leading and trailing
* whitespaces will be trimmed.
*/
public static List<Index> parseIndexes(String oneBasedIndexes) throws IllegalValueException {
String trimmedIndexes = oneBasedIndexes.trim();

String[] splitOneBasedIndexes = trimmedIndexes.split("\\s+");

Set<String> uniqueIndexes = new HashSet<>(Arrays.asList(splitOneBasedIndexes));

List<Index> indexList = new ArrayList<>();

for (String index : uniqueIndexes) {
indexList.add(parseIndex(index));
}

return indexList;
}

/**
* Parses a {@code String name} into a {@code Name}.
* Leading and trailing whitespaces will be trimmed.
Expand Down Expand Up @@ -198,9 +221,10 @@ public static Optional<TeamName> parseTeamName(Optional<String> teamName) throws
/**
* Parses a {@code Optional<String> value} into the specified value or {@code UNSPECIFIED_FIELD} if is empty
*/
public static Optional<String> parseValue(Optional<String> value) throws IllegalValueException {
public static Optional<String> parseValue(Optional<String> value, String messageConstraints)
throws IllegalValueException {
if (value.isPresent() && value.get().equals(UNSPECIFIED_FIELD)) {
throw new IllegalValueException(MESSAGE_INVALID_INPUT);
throw new IllegalValueException(messageConstraints);
} else {
return Optional.of(value.orElse(UNSPECIFIED_FIELD));
}
Expand Down
Loading

0 comments on commit 07777a0

Please sign in to comment.