From 9edc41957ccef30702eeee27c08d301a4a97cd41 Mon Sep 17 00:00:00 2001 From: GabrielWLM <77065071+GabrielWLM@users.noreply.github.com> Date: Fri, 29 Oct 2021 08:57:40 +0800 Subject: [PATCH] add find group command --- .../seedu/address/commons/core/Messages.java | 1 - .../logic/commands/AddGroupCommand.java | 4 +- .../logic/commands/ViewGroupCommand.java | 38 +++++++++++++------ .../address/logic/parser/ClassmateParser.java | 4 ++ .../logic/parser/ViewGroupCommandParser.java | 32 ++++++++++++---- .../java/seedu/address/model/Classmate.java | 11 ++++-- .../model/student/GroupMemberPredicate.java | 32 ++++++++++++++++ .../model/student/GroupNamePredicate.java | 30 --------------- .../model/student/GroupTypePredicate.java | 32 ---------------- 9 files changed, 95 insertions(+), 89 deletions(-) create mode 100644 src/main/java/seedu/address/model/student/GroupMemberPredicate.java delete mode 100644 src/main/java/seedu/address/model/student/GroupNamePredicate.java delete mode 100644 src/main/java/seedu/address/model/student/GroupTypePredicate.java diff --git a/src/main/java/seedu/address/commons/core/Messages.java b/src/main/java/seedu/address/commons/core/Messages.java index 62016154176..adb2cf16db3 100644 --- a/src/main/java/seedu/address/commons/core/Messages.java +++ b/src/main/java/seedu/address/commons/core/Messages.java @@ -9,7 +9,6 @@ public class Messages { public static final String MESSAGE_INVALID_COMMAND_FORMAT = "Invalid command format! \n%1$s"; public static final String MESSAGE_INVALID_STUDENT_DISPLAYED_INDEX = "The student index provided is invalid"; public static final String MESSAGE_INVALID_CLASS_DISPLAYED_INDEX = "The class index provided is invalid"; - public static final String MESSAGE_INVALID_GROUP_DISPLAYED_INDEX = "The group index provided is invalid"; public static final String MESSAGE_STUDENTS_LISTED_OVERVIEW = "%1$d students listed!"; public static final String MESSAGE_TUTORIAL_CLASSES_LISTED_OVERVIEW = "%1$d tutorial classes listed!"; public static final String MESSAGE_TUTORIAL_GROUP_LISTED_OVERVIEW = "%1$d students from tutorial group listed!"; diff --git a/src/main/java/seedu/address/logic/commands/AddGroupCommand.java b/src/main/java/seedu/address/logic/commands/AddGroupCommand.java index 9d1fac49cf2..a940d79a7b7 100644 --- a/src/main/java/seedu/address/logic/commands/AddGroupCommand.java +++ b/src/main/java/seedu/address/logic/commands/AddGroupCommand.java @@ -1,6 +1,7 @@ package seedu.address.logic.commands; import static java.util.Objects.requireNonNull; +import static seedu.address.commons.core.Messages.MESSAGE_CLASS_DOES_NOT_EXIST; import static seedu.address.logic.parser.CliSyntax.PREFIX_CLASSCODE; import static seedu.address.logic.parser.CliSyntax.PREFIX_GROUPNUMBER; import static seedu.address.logic.parser.CliSyntax.PREFIX_TYPE; @@ -16,8 +17,8 @@ public class AddGroupCommand extends Command { public static final String MESSAGE_USAGE = COMMAND_WORD + ": Adds a group to a class to Classmate. " + "Parameters: " + PREFIX_CLASSCODE + "CLASSCODE " - + PREFIX_GROUPNAME + "GROUPNAME " + PREFIX_TYPE + "TYPE " + + PREFIX_GROUPNUMBER + "GROUPNUMBER " + "Example: " + COMMAND_WORD + " " + PREFIX_GROUPNUMBER + "1 " + PREFIX_CLASSCODE + "G06 " @@ -25,7 +26,6 @@ public class AddGroupCommand extends Command { public static final String MESSAGE_SUCCESS = "New group added: %1$s"; public static final String MESSAGE_DUPLICATE_GROUP = "This group already exists in Classmate"; - public static final String MESSAGE_CLASS_DOES_NOT_EXIST = "The class does not exist in Classmate"; private final TutorialGroup toAdd; private final TutorialClass toAddTutorialClass; diff --git a/src/main/java/seedu/address/logic/commands/ViewGroupCommand.java b/src/main/java/seedu/address/logic/commands/ViewGroupCommand.java index 8b0e9093b7e..feec367db12 100644 --- a/src/main/java/seedu/address/logic/commands/ViewGroupCommand.java +++ b/src/main/java/seedu/address/logic/commands/ViewGroupCommand.java @@ -2,13 +2,15 @@ import static java.util.Objects.requireNonNull; import static seedu.address.logic.parser.CliSyntax.PREFIX_CLASSCODE; -import static seedu.address.logic.parser.CliSyntax.PREFIX_GROUPNAME; +import static seedu.address.logic.parser.CliSyntax.PREFIX_GROUPNUMBER; import static seedu.address.logic.parser.CliSyntax.PREFIX_TYPE; import seedu.address.commons.core.Messages; +import seedu.address.logic.commands.exceptions.CommandException; import seedu.address.model.Model; -import seedu.address.model.student.ClassMemberPredicate; -import seedu.address.model.tutorialgroup.TutorialGroupContainsKeywordsPredicate; +import seedu.address.model.student.GroupMemberPredicate; +import seedu.address.model.tutorialclass.TutorialClass; +import seedu.address.model.tutorialgroup.TutorialGroup; /** * Lists all students in a tutorial group in ClassMATE given a class code, tutorial group type and tutorial group name @@ -23,26 +25,38 @@ public class ViewGroupCommand extends Command { + "with index numbers.\n" + "Parameters: " + PREFIX_CLASSCODE + "CLASSCODE " - + PREFIX_GROUPNAME + "GROUPNAME " + PREFIX_TYPE + "TYPE " + + PREFIX_GROUPNUMBER + "GROUPNUMBER " + "Example: " + COMMAND_WORD + " " - + PREFIX_GROUPNAME + "3 " + + PREFIX_GROUPNUMBER + "3 " + PREFIX_CLASSCODE + "G06 " + PREFIX_TYPE + "OP2 "; - private final TutorialGroupContainsKeywordsPredicate predicate; + private final TutorialGroup toView; + private final TutorialClass toViewTutorialClass; - public ViewGroupCommand(TutorialGroupContainsKeywordsPredicate predicate) { - this.predicate = predicate; + /** + * Creates a ViewGroupCommand to show the students in the specified {@code TutorialGroup} + */ + public ViewGroupCommand(TutorialGroup tutorialGroup) { + requireNonNull(tutorialGroup); + toView = tutorialGroup; + // new class with the same class code created to check whether it exists in ClassMATE + toViewTutorialClass = TutorialClass.createTestTutorialClass(toView.getClassCode()); } @Override - public CommandResult execute(Model model) { + public CommandResult execute(Model model) throws CommandException { requireNonNull(model); - model.updateFilteredTutorialGroupList(predicate); + // check if tutorial class exists in ClassMATE + if (!model.hasTutorialClass(toViewTutorialClass)) { + throw new CommandException(Messages.MESSAGE_CLASS_DOES_NOT_EXIST); + } - model.updateFilteredStudentList(new ClassMemberPredicate(targetClassCode)); + + + model.updateFilteredStudentList(new GroupMemberPredicate(toView)); return new CommandResult( String.format(Messages.MESSAGE_TUTORIAL_GROUP_LISTED_OVERVIEW, model.getFilteredStudentList().size())); @@ -52,6 +66,6 @@ public CommandResult execute(Model model) { public boolean equals(Object other) { return other == this // short circuit if same object || (other instanceof ViewGroupCommand // instanceof handles nulls - && predicate.equals(((ViewGroupCommand) other).predicate)); // state check + && toView.equals(((ViewGroupCommand) other).toView)); // state check } } diff --git a/src/main/java/seedu/address/logic/parser/ClassmateParser.java b/src/main/java/seedu/address/logic/parser/ClassmateParser.java index 879ff4ddbc4..303963d2616 100644 --- a/src/main/java/seedu/address/logic/parser/ClassmateParser.java +++ b/src/main/java/seedu/address/logic/parser/ClassmateParser.java @@ -27,6 +27,7 @@ import seedu.address.logic.commands.ListClassCommand; import seedu.address.logic.commands.ListStudentCommand; import seedu.address.logic.commands.ViewClassCommand; +import seedu.address.logic.commands.ViewGroupCommand; import seedu.address.logic.commands.ViewStudentCommand; import seedu.address.logic.parser.exceptions.ParseException; @@ -97,6 +98,9 @@ public Command parseCommand(String userInput) throws ParseException { case ViewClassCommand.COMMAND_WORD: return new ViewClassCommandParser().parse(arguments); + case ViewGroupCommand.COMMAND_WORD: + return new ViewGroupCommandParser().parse(arguments); + case ViewStudentCommand.COMMAND_WORD: return new ViewStudentCommandParser().parse(arguments); diff --git a/src/main/java/seedu/address/logic/parser/ViewGroupCommandParser.java b/src/main/java/seedu/address/logic/parser/ViewGroupCommandParser.java index cedf492c061..261e22f8f76 100644 --- a/src/main/java/seedu/address/logic/parser/ViewGroupCommandParser.java +++ b/src/main/java/seedu/address/logic/parser/ViewGroupCommandParser.java @@ -1,12 +1,19 @@ package seedu.address.logic.parser; import static seedu.address.commons.core.Messages.MESSAGE_INVALID_COMMAND_FORMAT; +import static seedu.address.logic.parser.CliSyntax.PREFIX_CLASSCODE; +import static seedu.address.logic.parser.CliSyntax.PREFIX_GROUPNUMBER; +import static seedu.address.logic.parser.CliSyntax.PREFIX_TYPE; -import java.util.Arrays; +import java.util.stream.Stream; +import seedu.address.logic.commands.AddGroupCommand; import seedu.address.logic.commands.ViewGroupCommand; import seedu.address.logic.parser.exceptions.ParseException; -import seedu.address.model.tutorialgroup.TutorialGroupContainsKeywordsPredicate; +import seedu.address.model.student.ClassCode; +import seedu.address.model.tutorialgroup.GroupNumber; +import seedu.address.model.tutorialgroup.GroupType; +import seedu.address.model.tutorialgroup.TutorialGroup; /** * Parses input arguments and creates a new ViewGroupCommand object @@ -19,15 +26,24 @@ public class ViewGroupCommandParser implements Parser { * @throws ParseException if the user input does not conform the expected format */ public ViewGroupCommand parse(String args) throws ParseException { - String trimmedArgs = args.trim(); - if (trimmedArgs.isEmpty()) { - throw new ParseException( - String.format(MESSAGE_INVALID_COMMAND_FORMAT, ViewGroupCommand.MESSAGE_USAGE)); + ArgumentMultimap argMultimap = + ArgumentTokenizer.tokenize(args, PREFIX_CLASSCODE, PREFIX_TYPE, PREFIX_GROUPNUMBER); + + if (!arePrefixesPresent(argMultimap, PREFIX_CLASSCODE, PREFIX_TYPE, PREFIX_GROUPNUMBER) + || !argMultimap.getPreamble().isEmpty()) { + throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddGroupCommand.MESSAGE_USAGE)); } - String[] nameKeywords = trimmedArgs.split("\\s+"); + GroupNumber groupNumber = ParserUtil.parseGroupName(argMultimap.getValue(PREFIX_GROUPNUMBER).get()); + ClassCode classCode = ParserUtil.parseClassCode(argMultimap.getValue(PREFIX_CLASSCODE).get()); + GroupType groupType = ParserUtil.parseGroupType(argMultimap.getValue(PREFIX_TYPE).get()); + + TutorialGroup tutorialGroup = new TutorialGroup(groupNumber, classCode, groupType); - return new ViewGroupCommand(new TutorialGroupContainsKeywordsPredicate(Arrays.asList(nameKeywords))); + return new ViewGroupCommand(tutorialGroup); } + private static boolean arePrefixesPresent(ArgumentMultimap argumentMultimap, Prefix... prefixes) { + return Stream.of(prefixes).allMatch(prefix -> argumentMultimap.getValue(prefix).isPresent()); + } } diff --git a/src/main/java/seedu/address/model/Classmate.java b/src/main/java/seedu/address/model/Classmate.java index a21a3e19dc8..da007a101b3 100644 --- a/src/main/java/seedu/address/model/Classmate.java +++ b/src/main/java/seedu/address/model/Classmate.java @@ -11,6 +11,7 @@ import seedu.address.model.tutorialclass.TutorialClass; import seedu.address.model.tutorialclass.UniqueTutorialClassList; import seedu.address.model.tutorialgroup.TutorialGroup; +import seedu.address.model.tutorialgroup.UniqueTutorialGroupList; /** * Wraps all data at the address-book level @@ -22,6 +23,7 @@ public class Classmate implements ReadOnlyClassmate { private final UniqueStudentList students; private final UniqueTutorialClassList tutorialClasses; + private final UniqueTutorialGroupList tutorialGroups; /* * The 'unusual' code block below is a non-static initialization block, sometimes used to avoid duplication @@ -33,6 +35,7 @@ public class Classmate implements ReadOnlyClassmate { { students = new UniqueStudentList(); tutorialClasses = new UniqueTutorialClassList(); + tutorialGroups = new UniqueTutorialGroupList(); } public Classmate() {} @@ -155,7 +158,7 @@ public void removeTutorialClass(TutorialClass key) { * {@code key} must exist in the ClassMATE. */ public void removeTutorialGroup(TutorialGroup key) { - tutorialClasses.remove(key); + tutorialGroups.remove(key); } /** @@ -163,7 +166,7 @@ public void removeTutorialGroup(TutorialGroup key) { */ public boolean hasTutorialGroup(TutorialGroup tutorialGroup) { requireNonNull(tutorialGroup); - return tutorialClasses.contains(tutorialGroup); + return tutorialGroups.contains(tutorialGroup); } /** @@ -171,14 +174,14 @@ public boolean hasTutorialGroup(TutorialGroup tutorialGroup) { * The tutorial group must not already exist in the ClassMATE. */ public void addTutorialGroup(TutorialGroup tutorialGroup) { - tutorialClasses.add(tutorialGroup); + tutorialGroups.add(tutorialGroup); } /** * Sorts the tutorial groups in ClassMATE. */ public void sortTutorialGroups() { - tutorialClasses.sort(); + tutorialGroups.sort(); } diff --git a/src/main/java/seedu/address/model/student/GroupMemberPredicate.java b/src/main/java/seedu/address/model/student/GroupMemberPredicate.java new file mode 100644 index 00000000000..a802086cee2 --- /dev/null +++ b/src/main/java/seedu/address/model/student/GroupMemberPredicate.java @@ -0,0 +1,32 @@ +package seedu.address.model.student; + +import java.util.function.Predicate; + +import seedu.address.model.tutorialgroup.TutorialGroup; + +/** + * Tests that a {@code Student}'s {@code TutorialGroup} matches the given TutorialGroup. + */ +public class GroupMemberPredicate implements Predicate { + private final TutorialGroup tutorialGroup; + + public GroupMemberPredicate(TutorialGroup tutorialGroup) { + this.tutorialGroup = tutorialGroup; + } + + public TutorialGroup getTutorialGroup() { + return tutorialGroup; + } + + @Override + public boolean test(Student student) { + return student.getTutorialGroups().contains(tutorialGroup); + } + + @Override + public boolean equals(Object other) { + return other == this // short circuit if same instance + || other instanceof GroupMemberPredicate // instanceof handles null + && tutorialGroup.equals(((GroupMemberPredicate) other).getTutorialGroup()); // state check + } +} diff --git a/src/main/java/seedu/address/model/student/GroupNamePredicate.java b/src/main/java/seedu/address/model/student/GroupNamePredicate.java deleted file mode 100644 index cdb72639d63..00000000000 --- a/src/main/java/seedu/address/model/student/GroupNamePredicate.java +++ /dev/null @@ -1,30 +0,0 @@ -package seedu.address.model.student; - -import java.util.function.Predicate; - -/** - * Tests that a {@code Student}'s {@code GroupName} matches the given group name. - */ -public class GroupNamePredicate implements Predicate { - private final ClassCode classCode; - - public GroupNamePredicate(ClassCode classCode) { - this.classCode = classCode; - } - - public ClassCode getClassCode() { - return classCode; - } - - @Override - public boolean test(Student student) { - return student.getClassCode().equals(classCode); - } - - @Override - public boolean equals(Object other) { - return other == this // short circuit if same instance - || other instanceof GroupNamePredicate // instanceof handles null - && classCode.equals(((GroupNamePredicate) other).getClassCode()); // state check - } -} diff --git a/src/main/java/seedu/address/model/student/GroupTypePredicate.java b/src/main/java/seedu/address/model/student/GroupTypePredicate.java deleted file mode 100644 index 1ed5466d7e0..00000000000 --- a/src/main/java/seedu/address/model/student/GroupTypePredicate.java +++ /dev/null @@ -1,32 +0,0 @@ -package seedu.address.model.student; - -import java.util.function.Predicate; - -import seedu.address.model.tutorialgroup.GroupType; - -/** - * Tests that a {@code Student}'s {@code GroupType} matches the given group type. - */ -public class GroupTypePredicate implements Predicate { - private final GroupType groupType; - - public GroupTypePredicate(GroupType groupType) { - this.groupType = groupType; - } - - public GroupType getGroupType() { - return groupType; - } - - @Override - public boolean test(Student student) { - return student.getGroupType().equals(groupType); - } - - @Override - public boolean equals(Object other) { - return other == this // short circuit if same instance - || other instanceof GroupTypePredicate // instanceof handles null - && groupType.equals(((GroupTypePredicate) other).getGroupType()); // state check - } -}