From 571adea5d78c187029f1b3e5c9165a4c067fcbf7 Mon Sep 17 00:00:00 2001 From: Jules Date: Sat, 13 Apr 2024 04:45:40 +0800 Subject: [PATCH 1/3] Fix multiple issues 1. Error when `charge` does nothing. 2. Error when `cca_delete` tries to delete a CCA that does not exist. 3. Correct `ChargeCommand.MESSAGE_USAGE`. 4. Correct `DeleteCcaCommand.MESSAGE_USAGE`. 5. Added details to `FilterCommand.MESSAGE_USAGE`. 6. Correct `OweCommand.MESSAGE_USAGE`. 7. Fix parsing for OweCommand where multiple `m/` were allowed but not handled. --- .../address/logic/commands/ChargeCommand.java | 19 +++++++++++--- .../logic/commands/DeleteCcaCommand.java | 25 +++++++++++-------- .../address/logic/commands/FilterCommand.java | 12 ++++++--- .../address/logic/commands/OweCommand.java | 2 +- .../logic/parser/ChargeCommandParser.java | 7 ------ .../logic/parser/DeleteCcaCommandParser.java | 8 +----- .../logic/parser/OweCommandParser.java | 2 ++ 7 files changed, 44 insertions(+), 31 deletions(-) diff --git a/src/main/java/seedu/address/logic/commands/ChargeCommand.java b/src/main/java/seedu/address/logic/commands/ChargeCommand.java index fa6880a0927..050b90dc517 100644 --- a/src/main/java/seedu/address/logic/commands/ChargeCommand.java +++ b/src/main/java/seedu/address/logic/commands/ChargeCommand.java @@ -8,6 +8,8 @@ import static seedu.address.logic.parser.CliSyntax.PREFIX_ROLE; import java.util.List; +import java.util.stream.Collector; +import java.util.stream.Collectors; import seedu.address.logic.commands.exceptions.CommandException; import seedu.address.model.Model; @@ -26,15 +28,18 @@ public class ChargeCommand extends Command { public static final String MESSAGE_USAGE = COMMAND_WORD + ": Adds a certain amount to how much all matching CCA + optional role members owe. " + "Parameters: " - + "[" + PREFIX_AMOUNT + "AMOUNT]...\n" - + "[" + PREFIX_CCA + "AMOUNT] (more than one allowed)...\n" - + "[" + PREFIX_ROLE + "AMOUNT] (more than one allowed)...\n" + + PREFIX_AMOUNT + "AMOUNT " + + "[" + PREFIX_CCA + "CCA]... " + + "[" + PREFIX_ROLE + "ROLE]...\n" + "Example: " + COMMAND_WORD + " " + PREFIX_AMOUNT + "10.00 " + PREFIX_CCA + "NUS Cycling " + PREFIX_ROLE + "friends"; public static final String MESSAGE_NO_AMOUNT = "An amount should be provided."; + public static final String MESSAGE_DO_NOTHING = + "Nobody was charged as nobody is in any of the following CCAs: [%s] " + + "AND in any of the following roles: [%s]"; private final Amount amount; private final CcaContainsKeywordPredicate ccas; @@ -64,8 +69,16 @@ public boolean equals(Object other) { @Override public CommandResult execute(Model model) throws CommandException { requireNonNull(model); + List oldList = model.getFilteredPersonList().stream().collect(Collectors.toList()); model.updateFilteredPersonList(this.ccas); List lastShownList = model.getFilteredPersonList(); + if (lastShownList.isEmpty()) { + model.updateFilteredPersonList(oldList::contains); + Collector join = Collectors.joining(", "); + throw new CommandException(String.format(MESSAGE_DO_NOTHING, + ccas.getCcas().stream().map(c -> c.ccaName).collect(join), + ccas.getRoles().map(rs -> rs.stream().map(r -> r.roleName).collect(join)).orElse(""))); + } StringBuilder result = new StringBuilder(); for (Person personToOwe : lastShownList) { diff --git a/src/main/java/seedu/address/logic/commands/DeleteCcaCommand.java b/src/main/java/seedu/address/logic/commands/DeleteCcaCommand.java index fa7dd1f5301..72820380f6c 100644 --- a/src/main/java/seedu/address/logic/commands/DeleteCcaCommand.java +++ b/src/main/java/seedu/address/logic/commands/DeleteCcaCommand.java @@ -5,7 +5,6 @@ import static java.util.Objects.requireNonNull; import static seedu.address.logic.parser.CliSyntax.PREFIX_CCA; -import java.util.ArrayList; import java.util.List; import java.util.Set; import java.util.stream.Collectors; @@ -27,11 +26,13 @@ public class DeleteCcaCommand extends Command { public static final String MESSAGE_USAGE = COMMAND_WORD + ": Deletes a CCA and all its associated members from your contacts. " + "Parameters: " - + "[" + PREFIX_CCA + "CCA]...\n" + + PREFIX_CCA + "CCA\n" + "Example: " + COMMAND_WORD + " " + PREFIX_CCA + "NUS Cycling "; public static final String MESSAGE_NO_CCA = "A CCA should be provided."; + public static final String MESSAGE_NONEXISTANT_CCA = "No CCA was deleted because " + + "the CCA `%s` does not exists."; private final CcaContainsKeywordPredicate ccas; /** @@ -53,6 +54,17 @@ public boolean equals(Object other) { @Override public CommandResult execute(Model model) throws CommandException { requireNonNull(model); + + // Check if any CCA does not exists + List ccalist = model.getAddressBook().getCcaList(); + List nonexistantCcas = this.ccas.getCcas().stream() + .filter(c1 -> !ccalist.stream().anyMatch(c1::isSameCcaName)) + .collect(Collectors.toList()); + if (!nonexistantCcas.isEmpty()) { + throw new CommandException(String.format(MESSAGE_NONEXISTANT_CCA, + nonexistantCcas.stream().map(c -> c.ccaName).collect(Collectors.joining(", ")))); + } + model.updateFilteredPersonList(this.ccas); StringBuilder result = new StringBuilder(); result.append(String.format("Deleting CCA(s) %s tags from all its members:\n", this.ccas)); @@ -67,19 +79,12 @@ public CommandResult execute(Model model) throws CommandException { .collect(Collectors.toList()); // Delete their roles - ArrayList removedCcas = new ArrayList<>(); affectedPeople .forEach(affectedPerson -> { Set updatedCca = affectedPerson .getCcas() .stream() - .filter(c -> { - boolean isToDelete = ccas.contains(c); - if (isToDelete) { - removedCcas.add(c); - } - return !isToDelete; - }) + .filter(c -> !ccas.contains(c)) .collect(Collectors.toSet()); model.setPerson(affectedPerson, affectedPerson.replaceCca(updatedCca)); result.append(String.format("Person affected: %s\n", affectedPerson.getName())); diff --git a/src/main/java/seedu/address/logic/commands/FilterCommand.java b/src/main/java/seedu/address/logic/commands/FilterCommand.java index 7e4237c86bc..0a4fea4cabf 100644 --- a/src/main/java/seedu/address/logic/commands/FilterCommand.java +++ b/src/main/java/seedu/address/logic/commands/FilterCommand.java @@ -3,6 +3,8 @@ package seedu.address.logic.commands; import static java.util.Objects.requireNonNull; +import static seedu.address.logic.parser.CliSyntax.PREFIX_CCA; +import static seedu.address.logic.parser.CliSyntax.PREFIX_ROLE; import seedu.address.commons.util.ToStringBuilder; import seedu.address.logic.Messages; @@ -17,10 +19,14 @@ public class FilterCommand extends Command { public static final String COMMAND_WORD = "filter"; - public static final String MESSAGE_USAGE = COMMAND_WORD + ": Filters a person by their CCA " - + "(case-sensitive) and optionally their roles." + public static final String MESSAGE_USAGE = COMMAND_WORD + + ": Filters a person by their CCA " + + "(case-sensitive) and optionally their roles. " + + "Exact word matches are required. " + "Displays them as a list with index numbers.\n" - + "Parameters: c/CCA c/[MORE CCAs]... r/ROLE /r[MORE ROLES]\n" + + "Parameters: " + + "[" + PREFIX_CCA + "CCA]... " + + "[" + PREFIX_ROLE + "ROLE]...\n" + "Example: " + COMMAND_WORD + " c/NUS Cycling r/Member"; public static final String MESSAGE_NOT_FILTER_CCA = "A CCA should be provided."; diff --git a/src/main/java/seedu/address/logic/commands/OweCommand.java b/src/main/java/seedu/address/logic/commands/OweCommand.java index 194d524cda9..48a9b4ee23f 100644 --- a/src/main/java/seedu/address/logic/commands/OweCommand.java +++ b/src/main/java/seedu/address/logic/commands/OweCommand.java @@ -36,7 +36,7 @@ public class OweCommand extends Command { + "by the index number used in the displayed person list. " + "Existing values will be overwritten by the input values.\n" + "Parameters: INDEX (must be a positive integer) " - + "[" + PREFIX_AMOUNT + "AMOUNT]...\n" + + PREFIX_AMOUNT + "AMOUNT\n" + "Example: " + COMMAND_WORD + " 2 " + PREFIX_AMOUNT + "10.00 "; diff --git a/src/main/java/seedu/address/logic/parser/ChargeCommandParser.java b/src/main/java/seedu/address/logic/parser/ChargeCommandParser.java index e16d8b754d8..7609c6f4e1c 100644 --- a/src/main/java/seedu/address/logic/parser/ChargeCommandParser.java +++ b/src/main/java/seedu/address/logic/parser/ChargeCommandParser.java @@ -48,13 +48,6 @@ public ChargeCommand parse(String args) throws ParseException { ); } - // Make sure all roles are not empty - if (argumentMultimap.getAllValues(PREFIX_ROLE).stream().anyMatch(String::isEmpty)) { - throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, FilterCommand.MESSAGE_ROLE_EMPTY) - + "\n" + ChargeCommand.MESSAGE_USAGE); - } - - Set ccas = new HashSet<>(ParserUtil.parseCcas(argumentMultimap.getAllValues(PREFIX_CCA))); Optional> roles = argumentMultimap.getAllValues(PREFIX_ROLE).isEmpty() diff --git a/src/main/java/seedu/address/logic/parser/DeleteCcaCommandParser.java b/src/main/java/seedu/address/logic/parser/DeleteCcaCommandParser.java index 7201f80b8d0..47e3d71982b 100644 --- a/src/main/java/seedu/address/logic/parser/DeleteCcaCommandParser.java +++ b/src/main/java/seedu/address/logic/parser/DeleteCcaCommandParser.java @@ -38,13 +38,7 @@ public DeleteCcaCommand parse(String args) throws ParseException { ); } - if (argumentMultimap.getAllValues(PREFIX_CCA).size() > 1) { - throw new ParseException( - String.format( - MESSAGE_INVALID_COMMAND_FORMAT, "Cannot delete more than one CCA." - ) - ); - } + argumentMultimap.verifyNoDuplicatePrefixesFor(PREFIX_CCA); Set ccas = new HashSet<>(ParserUtil.parseCcas(argumentMultimap.getAllValues(PREFIX_CCA))); diff --git a/src/main/java/seedu/address/logic/parser/OweCommandParser.java b/src/main/java/seedu/address/logic/parser/OweCommandParser.java index 8856a2fe570..300f3f634da 100644 --- a/src/main/java/seedu/address/logic/parser/OweCommandParser.java +++ b/src/main/java/seedu/address/logic/parser/OweCommandParser.java @@ -34,6 +34,8 @@ public OweCommand parse(String args) throws ParseException { + "\n" + OweCommand.MESSAGE_USAGE, pe); } + argMultimap.verifyNoDuplicatePrefixesFor(PREFIX_AMOUNT); + if (argMultimap.getValue(PREFIX_AMOUNT).isEmpty()) { throw new ParseException(OweCommand.MESSAGE_NOT_OWE); } From e5e0400d57cc9b85f6e40a3698d7949c1cb5c81c Mon Sep 17 00:00:00 2001 From: Jules Date: Sat, 13 Apr 2024 15:06:59 +0800 Subject: [PATCH 2/3] Improve message for DeleteCcaCommand --- .../java/seedu/address/logic/commands/DeleteCcaCommand.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/seedu/address/logic/commands/DeleteCcaCommand.java b/src/main/java/seedu/address/logic/commands/DeleteCcaCommand.java index 72820380f6c..47476f48a40 100644 --- a/src/main/java/seedu/address/logic/commands/DeleteCcaCommand.java +++ b/src/main/java/seedu/address/logic/commands/DeleteCcaCommand.java @@ -67,7 +67,8 @@ public CommandResult execute(Model model) throws CommandException { model.updateFilteredPersonList(this.ccas); StringBuilder result = new StringBuilder(); - result.append(String.format("Deleting CCA(s) %s tags from all its members:\n", this.ccas)); + result.append(String.format("Deleting CCA(s) %s tags from all its members:\n", + this.ccas.getCcas().stream().map(c -> c.ccaName).collect(Collectors.joining(", ")))); // We have to essentially clone the list // because as `model.setPerson` is called, From 2ce65bc179301ace3200cf4919f777c059811e25 Mon Sep 17 00:00:00 2001 From: Jules Date: Sat, 13 Apr 2024 17:27:37 +0800 Subject: [PATCH 3/3] Fix wrong parsing of AddCommand and EditCommand --- src/main/java/seedu/address/logic/commands/AddCommand.java | 2 +- src/main/java/seedu/address/logic/commands/EditCommand.java | 6 +++--- .../java/seedu/address/logic/parser/AddCommandParser.java | 3 ++- .../java/seedu/address/logic/parser/EditCommandParser.java | 3 ++- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/main/java/seedu/address/logic/commands/AddCommand.java b/src/main/java/seedu/address/logic/commands/AddCommand.java index b2173dee1fc..883942e4adb 100644 --- a/src/main/java/seedu/address/logic/commands/AddCommand.java +++ b/src/main/java/seedu/address/logic/commands/AddCommand.java @@ -30,7 +30,7 @@ public class AddCommand extends Command { + PREFIX_ADDRESS + "ADDRESS " + "[" + PREFIX_ROLE + "ROLE]... " + "[" + PREFIX_CCA + "CCA]... " - + "[" + PREFIX_METADATA + "METADATA]...\n" + + "[" + PREFIX_METADATA + "METADATA]\n" + "Example: " + COMMAND_WORD + " " + PREFIX_NAME + "John Doe " + PREFIX_PHONE + "98765432 " diff --git a/src/main/java/seedu/address/logic/commands/EditCommand.java b/src/main/java/seedu/address/logic/commands/EditCommand.java index 3a803e084aa..bd82af29e39 100644 --- a/src/main/java/seedu/address/logic/commands/EditCommand.java +++ b/src/main/java/seedu/address/logic/commands/EditCommand.java @@ -51,9 +51,9 @@ public class EditCommand extends Command { + "[" + PREFIX_PHONE + "PHONE] " + "[" + PREFIX_EMAIL + "EMAIL] " + "[" + PREFIX_ADDRESS + "ADDRESS] " - + "[" + PREFIX_ROLE + "ROLE] " - + "[" + PREFIX_CCA + "CCA] " - + "[" + PREFIX_METADATA + "Meta-data]...\n" + + "[" + PREFIX_ROLE + "ROLE]... " + + "[" + PREFIX_CCA + "CCA]... " + + "[" + PREFIX_METADATA + "METADATA]\n" + "Example: " + COMMAND_WORD + " 1 " + PREFIX_PHONE + "91234567 " + PREFIX_EMAIL + "johndoe@example.com\n\n" diff --git a/src/main/java/seedu/address/logic/parser/AddCommandParser.java b/src/main/java/seedu/address/logic/parser/AddCommandParser.java index b66ac00d5dd..068f3204292 100644 --- a/src/main/java/seedu/address/logic/parser/AddCommandParser.java +++ b/src/main/java/seedu/address/logic/parser/AddCommandParser.java @@ -47,7 +47,8 @@ public AddCommand parse(String args) throws ParseException { throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddCommand.MESSAGE_USAGE)); } - argMultimap.verifyNoDuplicatePrefixesFor(PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS); + argMultimap.verifyNoDuplicatePrefixesFor( + PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS, PREFIX_METADATA); Name name = ParserUtil.parseName(argMultimap.getValue(PREFIX_NAME).get()); Phone phone = ParserUtil.parsePhone(argMultimap.getValue(PREFIX_PHONE).get()); Email email = ParserUtil.parseEmail(argMultimap.getValue(PREFIX_EMAIL).get()); diff --git a/src/main/java/seedu/address/logic/parser/EditCommandParser.java b/src/main/java/seedu/address/logic/parser/EditCommandParser.java index b514399addf..50064b17a21 100644 --- a/src/main/java/seedu/address/logic/parser/EditCommandParser.java +++ b/src/main/java/seedu/address/logic/parser/EditCommandParser.java @@ -48,7 +48,8 @@ public EditCommand parse(String args) throws ParseException { + "\n" + EditCommand.MESSAGE_USAGE, pe); } - argMultimap.verifyNoDuplicatePrefixesFor(PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS); + argMultimap.verifyNoDuplicatePrefixesFor( + PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS, PREFIX_METADATA); EditPersonDescriptor editPersonDescriptor = new EditPersonDescriptor();