From 79b07cba2b522d57a5891e5f56b09763043532d0 Mon Sep 17 00:00:00 2001 From: zwe Date: Sun, 13 Oct 2024 21:24:51 +0800 Subject: [PATCH 1/7] Refactor code for hireme --- src/main/java/seedu/address/MainApp.java | 13 ++- src/main/java/seedu/address/logic/Logic.java | 7 +- .../seedu/address/logic/LogicManager.java | 17 +-- .../java/seedu/address/logic/Messages.java | 17 ++- .../address/logic/commands/AddCommand.java | 17 +-- .../seedu/address/logic/commands/Command.java | 4 +- .../address/logic/commands/DeleteCommand.java | 11 +- .../address/logic/commands/EditCommand.java | 36 +++--- .../address/logic/commands/FindCommand.java | 4 +- .../address/logic/commands/ListCommand.java | 4 +- .../logic/parser/AddCommandParser.java | 47 ++++---- .../java/seedu/address/model/AddressBook.java | 49 ++++---- .../address/model/AddressBookComparable.java | 7 ++ src/main/java/seedu/address/model/Model.java | 16 +-- .../seedu/address/model/ModelManager.java | 49 ++++---- .../address/model/ReadOnlyAddressBook.java | 4 +- .../address/model/person/Internship.java | 4 +- ...{UniquePersonList.java => UniqueList.java} | 45 +++---- .../address/model/util/SampleDataUtil.java | 40 ++----- .../address/storage/AddressBookStorage.java | 11 +- .../storage/JsonAdaptedInternship.java | 65 +++++++++++ .../address/storage/JsonAdaptedPerson.java | 110 ------------------ .../storage/JsonSerializableAddressBook.java | 24 ++-- .../java/seedu/address/storage/Storage.java | 7 +- .../{PersonCard.java => InternshipCard.java} | 29 ++--- .../seedu/address/ui/InternshipListPanel.java | 50 ++++++++ .../java/seedu/address/ui/MainWindow.java | 14 ++- .../seedu/address/ui/PersonListPanel.java | 49 -------- src/main/java/seedu/address/ui/UiManager.java | 5 +- ...nListCard.fxml => InternshipListCard.fxml} | 8 +- ...istPanel.fxml => InternshipListPanel.fxml} | 2 +- 31 files changed, 355 insertions(+), 410 deletions(-) create mode 100644 src/main/java/seedu/address/model/AddressBookComparable.java rename src/main/java/seedu/address/model/person/{UniquePersonList.java => UniqueList.java} (73%) create mode 100644 src/main/java/seedu/address/storage/JsonAdaptedInternship.java delete mode 100644 src/main/java/seedu/address/storage/JsonAdaptedPerson.java rename src/main/java/seedu/address/ui/{PersonCard.java => InternshipCard.java} (57%) create mode 100644 src/main/java/seedu/address/ui/InternshipListPanel.java delete mode 100644 src/main/java/seedu/address/ui/PersonListPanel.java rename src/main/resources/view/{PersonListCard.fxml => InternshipListCard.fxml} (84%) rename src/main/resources/view/{PersonListPanel.fxml => InternshipListPanel.fxml} (76%) diff --git a/src/main/java/seedu/address/MainApp.java b/src/main/java/seedu/address/MainApp.java index 813b027050a..f0d51289636 100644 --- a/src/main/java/seedu/address/MainApp.java +++ b/src/main/java/seedu/address/MainApp.java @@ -21,6 +21,7 @@ import seedu.address.model.ReadOnlyAddressBook; import seedu.address.model.ReadOnlyUserPrefs; import seedu.address.model.UserPrefs; +import seedu.address.model.person.Internship; import seedu.address.model.util.SampleDataUtil; import seedu.address.storage.AddressBookStorage; import seedu.address.storage.JsonAddressBookStorage; @@ -43,7 +44,7 @@ public class MainApp extends Application { protected Ui ui; protected Logic logic; protected Storage storage; - protected Model model; + protected Model model; protected Config config; @Override @@ -72,11 +73,11 @@ public void init() throws Exception { * The data from the sample address book will be used instead if {@code storage}'s address book is not found, * or an empty address book will be used instead if errors occur when reading {@code storage}'s address book. */ - private Model initModelManager(Storage storage, ReadOnlyUserPrefs userPrefs) { + private Model initModelManager(Storage storage, ReadOnlyUserPrefs userPrefs) { logger.info("Using data file : " + storage.getAddressBookFilePath()); - Optional addressBookOptional; - ReadOnlyAddressBook initialData; + Optional> addressBookOptional; + ReadOnlyAddressBook initialData; try { addressBookOptional = storage.readAddressBook(); if (!addressBookOptional.isPresent()) { @@ -87,10 +88,10 @@ private Model initModelManager(Storage storage, ReadOnlyUserPrefs userPrefs) { } catch (DataLoadingException e) { logger.warning("Data file at " + storage.getAddressBookFilePath() + " could not be loaded." + " Will be starting with an empty AddressBook."); - initialData = new AddressBook(); + initialData = new AddressBook<>(); } - return new ModelManager(initialData, userPrefs); + return new ModelManager(initialData, userPrefs); } private void initLogging(Config config) { diff --git a/src/main/java/seedu/address/logic/Logic.java b/src/main/java/seedu/address/logic/Logic.java index 92cd8fa605a..bd444b25cd4 100644 --- a/src/main/java/seedu/address/logic/Logic.java +++ b/src/main/java/seedu/address/logic/Logic.java @@ -7,13 +7,14 @@ import seedu.address.logic.commands.CommandResult; import seedu.address.logic.commands.exceptions.CommandException; import seedu.address.logic.parser.exceptions.ParseException; +import seedu.address.model.AddressBookComparable; import seedu.address.model.ReadOnlyAddressBook; import seedu.address.model.person.Person; /** * API of the Logic component */ -public interface Logic { +public interface Logic> { /** * Executes the command and returns the result. * @param commandText The command as entered by the user. @@ -28,10 +29,10 @@ public interface Logic { * * @see seedu.address.model.Model#getAddressBook() */ - ReadOnlyAddressBook getAddressBook(); + ReadOnlyAddressBook getAddressBook(); /** Returns an unmodifiable view of the filtered list of persons */ - ObservableList getFilteredPersonList(); + ObservableList getFilteredList(); /** * Returns the user prefs' address book file path. diff --git a/src/main/java/seedu/address/logic/LogicManager.java b/src/main/java/seedu/address/logic/LogicManager.java index 648b69cb43e..6df101b7676 100644 --- a/src/main/java/seedu/address/logic/LogicManager.java +++ b/src/main/java/seedu/address/logic/LogicManager.java @@ -13,6 +13,7 @@ import seedu.address.logic.commands.exceptions.CommandException; import seedu.address.logic.parser.AddressBookParser; import seedu.address.logic.parser.exceptions.ParseException; +import seedu.address.model.AddressBookComparable; import seedu.address.model.Model; import seedu.address.model.ReadOnlyAddressBook; import seedu.address.model.person.Person; @@ -21,7 +22,7 @@ /** * The main LogicManager of the app. */ -public class LogicManager implements Logic { +public class LogicManager> implements Logic { public static final String FILE_OPS_ERROR_FORMAT = "Could not save data due to the following error: %s"; public static final String FILE_OPS_PERMISSION_ERROR_FORMAT = @@ -29,14 +30,14 @@ public class LogicManager implements Logic { private final Logger logger = LogsCenter.getLogger(LogicManager.class); - private final Model model; - private final Storage storage; + private final Model model; + private final Storage storage; private final AddressBookParser addressBookParser; /** * Constructs a {@code LogicManager} with the given {@code Model} and {@code Storage}. */ - public LogicManager(Model model, Storage storage) { + public LogicManager(Model model, Storage storage) { this.model = model; this.storage = storage; addressBookParser = new AddressBookParser(); @@ -47,7 +48,7 @@ public CommandResult execute(String commandText) throws CommandException, ParseE logger.info("----------------[USER COMMAND][" + commandText + "]"); CommandResult commandResult; - Command command = addressBookParser.parseCommand(commandText); + Command command = addressBookParser.parseCommand(commandText); commandResult = command.execute(model); try { @@ -62,13 +63,13 @@ public CommandResult execute(String commandText) throws CommandException, ParseE } @Override - public ReadOnlyAddressBook getAddressBook() { + public ReadOnlyAddressBook getAddressBook() { return model.getAddressBook(); } @Override - public ObservableList getFilteredPersonList() { - return model.getFilteredPersonList(); + public ObservableList getFilteredList() { + return model.getFilteredList(); } @Override diff --git a/src/main/java/seedu/address/logic/Messages.java b/src/main/java/seedu/address/logic/Messages.java index ecd32c31b53..d1fac11cacf 100644 --- a/src/main/java/seedu/address/logic/Messages.java +++ b/src/main/java/seedu/address/logic/Messages.java @@ -5,6 +5,7 @@ import java.util.stream.Stream; import seedu.address.logic.parser.Prefix; +import seedu.address.model.person.Internship; import seedu.address.model.person.Person; /** @@ -34,17 +35,13 @@ public static String getErrorMessageForDuplicatePrefixes(Prefix... duplicatePref /** * Formats the {@code person} for display to the user. */ - public static String format(Person person) { + public static String format(Internship internship) { final StringBuilder builder = new StringBuilder(); - builder.append(person.getName()) - .append("; Phone: ") - .append(person.getPhone()) - .append("; Email: ") - .append(person.getEmail()) - .append("; Address: ") - .append(person.getAddress()) - .append("; Tags: "); - person.getTags().forEach(builder::append); + builder.append(internship.getCompany()) + .append("; Role: ") + .append(internship.getRole()) + .append("; Date: ") + .append(internship.getDateOfApplication()); return builder.toString(); } diff --git a/src/main/java/seedu/address/logic/commands/AddCommand.java b/src/main/java/seedu/address/logic/commands/AddCommand.java index 192872abd19..ff419d01679 100644 --- a/src/main/java/seedu/address/logic/commands/AddCommand.java +++ b/src/main/java/seedu/address/logic/commands/AddCommand.java @@ -10,12 +10,13 @@ import seedu.address.logic.Messages; import seedu.address.logic.commands.exceptions.CommandException; import seedu.address.model.Model; +import seedu.address.model.person.Internship; import seedu.address.model.person.Person; /** * Adds a person to the address book. */ -public class AddCommand extends Command { +public class AddCommand extends Command { public static final String COMMAND_WORD = "add"; @@ -35,25 +36,25 @@ public class AddCommand extends Command { public static final String MESSAGE_DUPLICATE_PERSON = "This internship application already exists in the address book"; - private final Person toAdd; + private final Internship toAdd; /** * Creates an AddCommand to add the specified {@code Person} */ - public AddCommand(Person person) { - requireNonNull(person); - toAdd = person; + public AddCommand(Internship internship) { + requireNonNull(internship); + toAdd = internship; } @Override - public CommandResult execute(Model model) throws CommandException { + public CommandResult execute(Model model) throws CommandException { requireNonNull(model); - if (model.hasPerson(toAdd)) { + if (model.hasItem(toAdd)) { throw new CommandException(MESSAGE_DUPLICATE_PERSON); } - model.addPerson(toAdd); + model.addItem(toAdd); return new CommandResult(String.format(MESSAGE_SUCCESS, Messages.format(toAdd))); } diff --git a/src/main/java/seedu/address/logic/commands/Command.java b/src/main/java/seedu/address/logic/commands/Command.java index 64f18992160..f8a49ebae2f 100644 --- a/src/main/java/seedu/address/logic/commands/Command.java +++ b/src/main/java/seedu/address/logic/commands/Command.java @@ -6,7 +6,7 @@ /** * Represents a command with hidden internal logic and the ability to be executed. */ -public abstract class Command { +public abstract class Command { /** * Executes the command and returns the result message. @@ -15,6 +15,6 @@ public abstract class Command { * @return feedback message of the operation result for display * @throws CommandException If an error occurs during command execution. */ - public abstract CommandResult execute(Model model) throws CommandException; + public abstract CommandResult execute(Model model) throws CommandException; } diff --git a/src/main/java/seedu/address/logic/commands/DeleteCommand.java b/src/main/java/seedu/address/logic/commands/DeleteCommand.java index 3dbfdd0c008..fc7b2aedec2 100644 --- a/src/main/java/seedu/address/logic/commands/DeleteCommand.java +++ b/src/main/java/seedu/address/logic/commands/DeleteCommand.java @@ -9,12 +9,13 @@ import seedu.address.logic.Messages; import seedu.address.logic.commands.exceptions.CommandException; import seedu.address.model.Model; +import seedu.address.model.person.Internship; import seedu.address.model.person.Person; /** * Deletes an internship application identified using it's displayed index from the address book. */ -public class DeleteCommand extends Command { +public class DeleteCommand extends Command { public static final String COMMAND_WORD = "delete"; @@ -32,16 +33,16 @@ public DeleteCommand(Index targetIndex) { } @Override - public CommandResult execute(Model model) throws CommandException { + public CommandResult execute(Model model) throws CommandException { requireNonNull(model); - List lastShownList = model.getFilteredPersonList(); + List lastShownList = model.getFilteredList(); if (targetIndex.getZeroBased() >= lastShownList.size()) { throw new CommandException(Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX); } - Person internshipApplicationToDelete = lastShownList.get(targetIndex.getZeroBased()); - model.deletePerson(internshipApplicationToDelete); + Internship internshipApplicationToDelete = lastShownList.get(targetIndex.getZeroBased()); + model.deleteItem(internshipApplicationToDelete); return new CommandResult(String.format(MESSAGE_DELETE_PERSON_SUCCESS, Messages.format(internshipApplicationToDelete))); } diff --git a/src/main/java/seedu/address/logic/commands/EditCommand.java b/src/main/java/seedu/address/logic/commands/EditCommand.java index 4b581c7331e..d3b3e03bf36 100644 --- a/src/main/java/seedu/address/logic/commands/EditCommand.java +++ b/src/main/java/seedu/address/logic/commands/EditCommand.java @@ -6,7 +6,7 @@ import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME; import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE; import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG; -import static seedu.address.model.Model.PREDICATE_SHOW_ALL_PERSONS; +import static seedu.address.model.Model.PREDICATE_SHOW_ALL; import java.util.Collections; import java.util.HashSet; @@ -14,6 +14,7 @@ import java.util.Objects; import java.util.Optional; import java.util.Set; +import java.util.function.Predicate; import seedu.address.commons.core.index.Index; import seedu.address.commons.util.CollectionUtil; @@ -21,17 +22,13 @@ import seedu.address.logic.Messages; import seedu.address.logic.commands.exceptions.CommandException; import seedu.address.model.Model; -import seedu.address.model.person.Address; -import seedu.address.model.person.Email; -import seedu.address.model.person.Name; -import seedu.address.model.person.Person; -import seedu.address.model.person.Phone; +import seedu.address.model.person.*; import seedu.address.model.tag.Tag; /** * Edits the details of an existing person in the address book. */ -public class EditCommand extends Command { +public class EditCommand extends Command { public static final String COMMAND_WORD = "edit"; @@ -68,24 +65,25 @@ public EditCommand(Index index, EditPersonDescriptor editPersonDescriptor) { } @Override - public CommandResult execute(Model model) throws CommandException { + public CommandResult execute(Model model) throws CommandException { requireNonNull(model); - List lastShownList = model.getFilteredPersonList(); + List lastShownList = model.getFilteredList(); if (index.getZeroBased() >= lastShownList.size()) { throw new CommandException(Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX); } - Person personToEdit = lastShownList.get(index.getZeroBased()); - Person editedPerson = createEditedPerson(personToEdit, editPersonDescriptor); - - if (!personToEdit.isSamePerson(editedPerson) && model.hasPerson(editedPerson)) { - throw new CommandException(MESSAGE_DUPLICATE_PERSON); - } - - model.setPerson(personToEdit, editedPerson); - model.updateFilteredPersonList(PREDICATE_SHOW_ALL_PERSONS); - return new CommandResult(String.format(MESSAGE_EDIT_PERSON_SUCCESS, Messages.format(editedPerson))); +// Internship personToEdit = lastShownList.get(index.getZeroBased()); +// Internship editedPerson = createEditedPerson(personToEdit, editPersonDescriptor); +// +// if (!personToEdit.isSame(editedPerson) && model.hasItem(editedPerson)) { +// throw new CommandException(MESSAGE_DUPLICATE_PERSON); +// } +// +// model.setItem(personToEdit, editedPerson); +// model.updateFilteredList((Predicate) PREDICATE_SHOW_ALL); +// return new CommandResult(String.format(MESSAGE_EDIT_PERSON_SUCCESS, Messages.format(editedPerson))); + return new CommandResult(String.format(MESSAGE_EDIT_PERSON_SUCCESS, "")); } /** diff --git a/src/main/java/seedu/address/logic/commands/FindCommand.java b/src/main/java/seedu/address/logic/commands/FindCommand.java index 72b9eddd3a7..1da2b32086a 100644 --- a/src/main/java/seedu/address/logic/commands/FindCommand.java +++ b/src/main/java/seedu/address/logic/commands/FindCommand.java @@ -29,9 +29,9 @@ public FindCommand(NameContainsKeywordsPredicate predicate) { @Override public CommandResult execute(Model model) { requireNonNull(model); - model.updateFilteredPersonList(predicate); + model.updateFilteredList(predicate); return new CommandResult( - String.format(Messages.MESSAGE_PERSONS_LISTED_OVERVIEW, model.getFilteredPersonList().size())); + String.format(Messages.MESSAGE_PERSONS_LISTED_OVERVIEW, model.getFilteredList().size())); } @Override diff --git a/src/main/java/seedu/address/logic/commands/ListCommand.java b/src/main/java/seedu/address/logic/commands/ListCommand.java index 5a5a514430c..e41f9300a0d 100644 --- a/src/main/java/seedu/address/logic/commands/ListCommand.java +++ b/src/main/java/seedu/address/logic/commands/ListCommand.java @@ -1,7 +1,7 @@ package seedu.address.logic.commands; import static java.util.Objects.requireNonNull; -import static seedu.address.model.Model.PREDICATE_SHOW_ALL_PERSONS; +import static seedu.address.model.Model.PREDICATE_SHOW_ALL; import seedu.address.model.Model; @@ -18,7 +18,7 @@ public class ListCommand extends Command { @Override public CommandResult execute(Model model) { requireNonNull(model); - model.updateFilteredPersonList(PREDICATE_SHOW_ALL_PERSONS); + model.updateFilteredList(PREDICATE_SHOW_ALL); return new CommandResult(MESSAGE_SUCCESS); } } diff --git a/src/main/java/seedu/address/logic/parser/AddCommandParser.java b/src/main/java/seedu/address/logic/parser/AddCommandParser.java index 4ff1a97ed77..02e2e84e234 100644 --- a/src/main/java/seedu/address/logic/parser/AddCommandParser.java +++ b/src/main/java/seedu/address/logic/parser/AddCommandParser.java @@ -7,16 +7,13 @@ import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE; import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG; +import java.time.LocalDate; import java.util.Set; import java.util.stream.Stream; import seedu.address.logic.commands.AddCommand; import seedu.address.logic.parser.exceptions.ParseException; -import seedu.address.model.person.Address; -import seedu.address.model.person.Email; -import seedu.address.model.person.Name; -import seedu.address.model.person.Person; -import seedu.address.model.person.Phone; +import seedu.address.model.person.*; import seedu.address.model.tag.Tag; /** @@ -30,24 +27,28 @@ public class AddCommandParser implements Parser { * @throws ParseException if the user input does not conform the expected format */ public AddCommand parse(String args) throws ParseException { - ArgumentMultimap argMultimap = - ArgumentTokenizer.tokenize(args, PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS, PREFIX_TAG); - - if (!arePrefixesPresent(argMultimap, PREFIX_NAME, PREFIX_ADDRESS, PREFIX_PHONE, PREFIX_EMAIL) - || !argMultimap.getPreamble().isEmpty()) { - throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddCommand.MESSAGE_USAGE)); - } - - argMultimap.verifyNoDuplicatePrefixesFor(PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS); - 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()); - Address address = ParserUtil.parseAddress(argMultimap.getValue(PREFIX_ADDRESS).get()); - Set tagList = ParserUtil.parseTags(argMultimap.getAllValues(PREFIX_TAG)); - - Person person = new Person(name, phone, email, address, tagList); - - return new AddCommand(person); +// ArgumentMultimap argMultimap = +// ArgumentTokenizer.tokenize(args, PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS, PREFIX_TAG); +// +// if (!arePrefixesPresent(argMultimap, PREFIX_NAME, PREFIX_ADDRESS, PREFIX_PHONE, PREFIX_EMAIL) +// || !argMultimap.getPreamble().isEmpty()) { +// throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddCommand.MESSAGE_USAGE)); +// } + +// argMultimap.verifyNoDuplicatePrefixesFor(PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS); +// 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()); +// Address address = ParserUtil.parseAddress(argMultimap.getValue(PREFIX_ADDRESS).get()); +// Set tagList = ParserUtil.parseTags(argMultimap.getAllValues(PREFIX_TAG)); + +// Person person = new Person(name, phone, email, address, tagList); + NameO name = new NameO("ABC Company"); + Email email = new Email("abc@example.com"); + Company company = new Company(email, name); + Role role = new Role("Software Engineer Intern"); + Date date = new Date(LocalDate.now()); + return new AddCommand(new Internship(company, date, role)); } /** diff --git a/src/main/java/seedu/address/model/AddressBook.java b/src/main/java/seedu/address/model/AddressBook.java index 73397161e84..3e34ff35420 100644 --- a/src/main/java/seedu/address/model/AddressBook.java +++ b/src/main/java/seedu/address/model/AddressBook.java @@ -6,16 +6,15 @@ import javafx.collections.ObservableList; import seedu.address.commons.util.ToStringBuilder; -import seedu.address.model.person.Person; -import seedu.address.model.person.UniquePersonList; +import seedu.address.model.person.UniqueList; /** * Wraps all data at the address-book level * Duplicates are not allowed (by .isSamePerson comparison) */ -public class AddressBook implements ReadOnlyAddressBook { +public class AddressBook> implements ReadOnlyAddressBook { - private final UniquePersonList persons; + private final UniqueList items; /* * The 'unusual' code block below is a non-static initialization block, sometimes used to avoid duplication @@ -25,7 +24,7 @@ public class AddressBook implements ReadOnlyAddressBook { * among constructors. */ { - persons = new UniquePersonList(); + items = new UniqueList<>(); } public AddressBook() {} @@ -33,7 +32,7 @@ public AddressBook() {} /** * Creates an AddressBook using the Persons in the {@code toBeCopied} */ - public AddressBook(ReadOnlyAddressBook toBeCopied) { + public AddressBook(ReadOnlyAddressBook toBeCopied) { this(); resetData(toBeCopied); } @@ -44,17 +43,17 @@ public AddressBook(ReadOnlyAddressBook toBeCopied) { * Replaces the contents of the person list with {@code persons}. * {@code persons} must not contain duplicate persons. */ - public void setPersons(List persons) { - this.persons.setPersons(persons); + public void setItems(List items) { + this.items.setItems(items); } /** * Resets the existing data of this {@code AddressBook} with {@code newData}. */ - public void resetData(ReadOnlyAddressBook newData) { + public void resetData(ReadOnlyAddressBook newData) { requireNonNull(newData); - setPersons(newData.getPersonList()); + setItems(newData.getList()); } //// person-level operations @@ -62,17 +61,17 @@ public void resetData(ReadOnlyAddressBook newData) { /** * Returns true if a person with the same identity as {@code person} exists in the address book. */ - public boolean hasPerson(Person person) { - requireNonNull(person); - return persons.contains(person); + public boolean hasItem(T item) { + requireNonNull(item); + return items.contains(item); } /** * Adds a person to the address book. * The person must not already exist in the address book. */ - public void addPerson(Person p) { - persons.add(p); + public void addItem(T p) { + items.add(p); } /** @@ -80,18 +79,18 @@ public void addPerson(Person p) { * {@code target} must exist in the address book. * The person identity of {@code editedPerson} must not be the same as another existing person in the address book. */ - public void setPerson(Person target, Person editedPerson) { - requireNonNull(editedPerson); + public void setItem(T target, T edited) { + requireNonNull(edited); - persons.setPerson(target, editedPerson); + items.setItem(target, edited); } /** * Removes {@code key} from this {@code AddressBook}. * {@code key} must exist in the address book. */ - public void removePerson(Person key) { - persons.remove(key); + public void removeItem(T key) { + items.remove(key); } //// util methods @@ -99,13 +98,13 @@ public void removePerson(Person key) { @Override public String toString() { return new ToStringBuilder(this) - .add("persons", persons) + .add("items", items) .toString(); } @Override - public ObservableList getPersonList() { - return persons.asUnmodifiableObservableList(); + public ObservableList getList() { + return items.asUnmodifiableObservableList(); } @Override @@ -120,11 +119,11 @@ public boolean equals(Object other) { } AddressBook otherAddressBook = (AddressBook) other; - return persons.equals(otherAddressBook.persons); + return items.equals(otherAddressBook.items); } @Override public int hashCode() { - return persons.hashCode(); + return items.hashCode(); } } diff --git a/src/main/java/seedu/address/model/AddressBookComparable.java b/src/main/java/seedu/address/model/AddressBookComparable.java new file mode 100644 index 00000000000..5bc0165350d --- /dev/null +++ b/src/main/java/seedu/address/model/AddressBookComparable.java @@ -0,0 +1,7 @@ +package seedu.address.model; + +import seedu.address.model.person.Person; + +public interface AddressBookComparable { + boolean isSame(T other); +} diff --git a/src/main/java/seedu/address/model/Model.java b/src/main/java/seedu/address/model/Model.java index 0221e1e667f..0ff40829487 100644 --- a/src/main/java/seedu/address/model/Model.java +++ b/src/main/java/seedu/address/model/Model.java @@ -10,9 +10,9 @@ /** * The API of the Model component. */ -public interface Model { +public interface Model { /** {@code Predicate} that always evaluate to true */ - Predicate PREDICATE_SHOW_ALL_PERSONS = unused -> true; + Predicate PREDICATE_SHOW_ALL = unused -> true; /** * Replaces user prefs data with the data in {@code userPrefs}. @@ -55,33 +55,33 @@ public interface Model { /** * Returns true if a person with the same identity as {@code person} exists in the address book. */ - boolean hasPerson(Person person); + boolean hasItem(T item); /** * Deletes the given person. * The person must exist in the address book. */ - void deletePerson(Person target); + void deleteItem(T target); /** * Adds the given person. * {@code person} must not already exist in the address book. */ - void addPerson(Person person); + void addItem(T item); /** * Replaces the given person {@code target} with {@code editedPerson}. * {@code target} must exist in the address book. * The person identity of {@code editedPerson} must not be the same as another existing person in the address book. */ - void setPerson(Person target, Person editedPerson); + void setItem(T target, T edited); /** Returns an unmodifiable view of the filtered person list */ - ObservableList getFilteredPersonList(); + ObservableList getFilteredList(); /** * Updates the filter of the filtered person list to filter by the given {@code predicate}. * @throws NullPointerException if {@code predicate} is null. */ - void updateFilteredPersonList(Predicate predicate); + void updateFilteredList(Predicate predicate); } diff --git a/src/main/java/seedu/address/model/ModelManager.java b/src/main/java/seedu/address/model/ModelManager.java index a0a2da7ea1f..8e64ad76d5a 100644 --- a/src/main/java/seedu/address/model/ModelManager.java +++ b/src/main/java/seedu/address/model/ModelManager.java @@ -11,29 +11,28 @@ import javafx.collections.transformation.FilteredList; import seedu.address.commons.core.GuiSettings; import seedu.address.commons.core.LogsCenter; -import seedu.address.model.person.Person; + /** * Represents the in-memory model of the address book data. */ -public class ModelManager implements Model { +public class ModelManager> implements Model { private static final Logger logger = LogsCenter.getLogger(ModelManager.class); - - private final AddressBook addressBook; + private final AddressBook addressBook; private final UserPrefs userPrefs; - private final FilteredList filteredPersons; + private final FilteredList filtered; /** * Initializes a ModelManager with the given addressBook and userPrefs. */ - public ModelManager(ReadOnlyAddressBook addressBook, ReadOnlyUserPrefs userPrefs) { + public ModelManager(ReadOnlyAddressBook addressBook, ReadOnlyUserPrefs userPrefs) { requireAllNonNull(addressBook, userPrefs); logger.fine("Initializing with address book: " + addressBook + " and user prefs " + userPrefs); - this.addressBook = new AddressBook(addressBook); + this.addressBook = new AddressBook<>(addressBook); this.userPrefs = new UserPrefs(userPrefs); - filteredPersons = new FilteredList<>(this.addressBook.getPersonList()); + filtered = new FilteredList<>(this.addressBook.getList()); } public ModelManager() { @@ -83,32 +82,32 @@ public void setAddressBook(ReadOnlyAddressBook addressBook) { } @Override - public ReadOnlyAddressBook getAddressBook() { + public ReadOnlyAddressBook getAddressBook() { return addressBook; } @Override - public boolean hasPerson(Person person) { - requireNonNull(person); - return addressBook.hasPerson(person); + public boolean hasItem(T item) { + requireNonNull(item); + return addressBook.hasItem(item); } @Override - public void deletePerson(Person target) { - addressBook.removePerson(target); + public void deleteItem(T target) { + addressBook.removeItem(target); } @Override - public void addPerson(Person person) { - addressBook.addPerson(person); - updateFilteredPersonList(PREDICATE_SHOW_ALL_PERSONS); + public void addItem(T item) { + addressBook.addItem(item); + updateFilteredList((Predicate) PREDICATE_SHOW_ALL); } @Override - public void setPerson(Person target, Person editedPerson) { - requireAllNonNull(target, editedPerson); + public void setItem(T target, T edited) { + requireAllNonNull(target, edited); - addressBook.setPerson(target, editedPerson); + addressBook.setItem(target, edited); } //=========== Filtered Person List Accessors ============================================================= @@ -118,14 +117,14 @@ public void setPerson(Person target, Person editedPerson) { * {@code versionedAddressBook} */ @Override - public ObservableList getFilteredPersonList() { - return filteredPersons; + public ObservableList getFilteredList() { + return filtered; } @Override - public void updateFilteredPersonList(Predicate predicate) { + public void updateFilteredList(Predicate predicate) { requireNonNull(predicate); - filteredPersons.setPredicate(predicate); + filtered.setPredicate(predicate); } @Override @@ -142,7 +141,7 @@ public boolean equals(Object other) { ModelManager otherModelManager = (ModelManager) other; return addressBook.equals(otherModelManager.addressBook) && userPrefs.equals(otherModelManager.userPrefs) - && filteredPersons.equals(otherModelManager.filteredPersons); + && filtered.equals(otherModelManager.filtered); } } diff --git a/src/main/java/seedu/address/model/ReadOnlyAddressBook.java b/src/main/java/seedu/address/model/ReadOnlyAddressBook.java index 027574a5f84..72c1defbdab 100644 --- a/src/main/java/seedu/address/model/ReadOnlyAddressBook.java +++ b/src/main/java/seedu/address/model/ReadOnlyAddressBook.java @@ -6,12 +6,12 @@ /** * Unmodifiable view of a book */ -public interface ReadOnlyAddressBook { +public interface ReadOnlyAddressBook { /** * Returns an unmodifiable view of the persons list. * This list will not contain any duplicate persons. */ - ObservableList getPersonList(); + ObservableList getList(); } diff --git a/src/main/java/seedu/address/model/person/Internship.java b/src/main/java/seedu/address/model/person/Internship.java index 50eca3858a5..9290bb83956 100644 --- a/src/main/java/seedu/address/model/person/Internship.java +++ b/src/main/java/seedu/address/model/person/Internship.java @@ -5,12 +5,13 @@ import java.util.Objects; import seedu.address.commons.util.ToStringBuilder; +import seedu.address.model.AddressBookComparable; /** * Represents an Internship in the network book. * Guarantees: details are present and not null, field values are validated, immutable. */ -public class Internship { +public class Internship implements AddressBookComparable { // Identity fields private final Company company; @@ -61,6 +62,7 @@ public Role getRole() { * Returns true if both internships have the same company, date of application, and role. * This defines a weaker notion of equality between two internships. */ + @Override public boolean isSame(Internship otherInternship) { if (otherInternship == this) { return true; diff --git a/src/main/java/seedu/address/model/person/UniquePersonList.java b/src/main/java/seedu/address/model/person/UniqueList.java similarity index 73% rename from src/main/java/seedu/address/model/person/UniquePersonList.java rename to src/main/java/seedu/address/model/person/UniqueList.java index cc0a68d79f9..ea6d25f644e 100644 --- a/src/main/java/seedu/address/model/person/UniquePersonList.java +++ b/src/main/java/seedu/address/model/person/UniqueList.java @@ -8,6 +8,7 @@ import javafx.collections.FXCollections; import javafx.collections.ObservableList; +import seedu.address.model.AddressBookComparable; import seedu.address.model.person.exceptions.DuplicatePersonException; import seedu.address.model.person.exceptions.PersonNotFoundException; @@ -22,25 +23,25 @@ * * @see Person#isSamePerson(Person) */ -public class UniquePersonList implements Iterable { +public class UniqueList> implements Iterable { - private final ObservableList internalList = FXCollections.observableArrayList(); - private final ObservableList internalUnmodifiableList = + private final ObservableList internalList = FXCollections.observableArrayList(); + private final ObservableList internalUnmodifiableList = FXCollections.unmodifiableObservableList(internalList); /** * Returns true if the list contains an equivalent person as the given argument. */ - public boolean contains(Person toCheck) { + public boolean contains(T toCheck) { requireNonNull(toCheck); - return internalList.stream().anyMatch(toCheck::isSamePerson); + return internalList.stream().anyMatch(toCheck::isSame); } /** * Adds a person to the list. * The person must not already exist in the list. */ - public void add(Person toAdd) { + public void add(T toAdd) { requireNonNull(toAdd); if (contains(toAdd)) { throw new DuplicatePersonException(); @@ -53,33 +54,33 @@ public void add(Person toAdd) { * {@code target} must exist in the list. * The person identity of {@code editedPerson} must not be the same as another existing person in the list. */ - public void setPerson(Person target, Person editedPerson) { - requireAllNonNull(target, editedPerson); + public void setItem(T target, T edited) { + requireAllNonNull(target, edited); int index = internalList.indexOf(target); if (index == -1) { throw new PersonNotFoundException(); } - if (!target.isSamePerson(editedPerson) && contains(editedPerson)) { + if (!target.isSame(edited) && contains(edited)) { throw new DuplicatePersonException(); } - internalList.set(index, editedPerson); + internalList.set(index, edited); } /** * Removes the equivalent person from the list. * The person must exist in the list. */ - public void remove(Person toRemove) { + public void remove(T toRemove) { requireNonNull(toRemove); if (!internalList.remove(toRemove)) { throw new PersonNotFoundException(); } } - public void setPersons(UniquePersonList replacement) { + public void setItems(UniqueList replacement) { requireNonNull(replacement); internalList.setAll(replacement.internalList); } @@ -88,24 +89,24 @@ public void setPersons(UniquePersonList replacement) { * Replaces the contents of this list with {@code persons}. * {@code persons} must not contain duplicate persons. */ - public void setPersons(List persons) { - requireAllNonNull(persons); - if (!personsAreUnique(persons)) { + public void setItems(List items) { + requireAllNonNull(items); + if (!areUnique(items)) { throw new DuplicatePersonException(); } - internalList.setAll(persons); + internalList.setAll(items); } /** * Returns the backing list as an unmodifiable {@code ObservableList}. */ - public ObservableList asUnmodifiableObservableList() { + public ObservableList asUnmodifiableObservableList() { return internalUnmodifiableList; } @Override - public Iterator iterator() { + public Iterator iterator() { return internalList.iterator(); } @@ -116,11 +117,11 @@ public boolean equals(Object other) { } // instanceof handles nulls - if (!(other instanceof UniquePersonList)) { + if (!(other instanceof UniqueList)) { return false; } - UniquePersonList otherUniquePersonList = (UniquePersonList) other; + UniqueList otherUniquePersonList = (UniqueList) other; return internalList.equals(otherUniquePersonList.internalList); } @@ -137,10 +138,10 @@ public String toString() { /** * Returns true if {@code persons} contains only unique persons. */ - private boolean personsAreUnique(List persons) { + private boolean areUnique(List persons) { for (int i = 0; i < persons.size() - 1; i++) { for (int j = i + 1; j < persons.size(); j++) { - if (persons.get(i).isSamePerson(persons.get(j))) { + if (persons.get(i).isSame(persons.get(j))) { return false; } } diff --git a/src/main/java/seedu/address/model/util/SampleDataUtil.java b/src/main/java/seedu/address/model/util/SampleDataUtil.java index 1806da4facf..d0a432e104e 100644 --- a/src/main/java/seedu/address/model/util/SampleDataUtil.java +++ b/src/main/java/seedu/address/model/util/SampleDataUtil.java @@ -1,49 +1,31 @@ package seedu.address.model.util; +import java.time.LocalDate; import java.util.Arrays; import java.util.Set; import java.util.stream.Collectors; import seedu.address.model.AddressBook; import seedu.address.model.ReadOnlyAddressBook; -import seedu.address.model.person.Address; -import seedu.address.model.person.Email; -import seedu.address.model.person.Name; -import seedu.address.model.person.Person; -import seedu.address.model.person.Phone; +import seedu.address.model.person.*; import seedu.address.model.tag.Tag; /** * Contains utility methods for populating {@code AddressBook} with sample data. */ public class SampleDataUtil { - public static Person[] getSamplePersons() { - return new Person[] { - new Person(new Name("Alex Yeoh"), new Phone("87438807"), new Email("alexyeoh@example.com"), - new Address("Blk 30 Geylang Street 29, #06-40"), - getTagSet("friends")), - new Person(new Name("Bernice Yu"), new Phone("99272758"), new Email("berniceyu@example.com"), - new Address("Blk 30 Lorong 3 Serangoon Gardens, #07-18"), - getTagSet("colleagues", "friends")), - new Person(new Name("Charlotte Oliveiro"), new Phone("93210283"), new Email("charlotte@example.com"), - new Address("Blk 11 Ang Mo Kio Street 74, #11-04"), - getTagSet("neighbours")), - new Person(new Name("David Li"), new Phone("91031282"), new Email("lidavid@example.com"), - new Address("Blk 436 Serangoon Gardens Street 26, #16-43"), - getTagSet("family")), - new Person(new Name("Irfan Ibrahim"), new Phone("92492021"), new Email("irfan@example.com"), - new Address("Blk 47 Tampines Street 20, #17-35"), - getTagSet("classmates")), - new Person(new Name("Roy Balakrishnan"), new Phone("92624417"), new Email("royb@example.com"), - new Address("Blk 45 Aljunied Street 85, #11-31"), - getTagSet("colleagues")) + public static Internship[] getSampleInternships() { + return new Internship[] { + new Internship(new Company( + new Email("company1@mail.com"),new NameO("Company 1")), + new Date(LocalDate.now()), new Role("role 1")) }; } - public static ReadOnlyAddressBook getSampleAddressBook() { - AddressBook sampleAb = new AddressBook(); - for (Person samplePerson : getSamplePersons()) { - sampleAb.addPerson(samplePerson); + public static ReadOnlyAddressBook getSampleAddressBook() { + AddressBook sampleAb = new AddressBook<>(); + for (Internship sampleInternship : getSampleInternships()) { + sampleAb.addItem(sampleInternship); } return sampleAb; } diff --git a/src/main/java/seedu/address/storage/AddressBookStorage.java b/src/main/java/seedu/address/storage/AddressBookStorage.java index f2e015105ae..94bc54ed479 100644 --- a/src/main/java/seedu/address/storage/AddressBookStorage.java +++ b/src/main/java/seedu/address/storage/AddressBookStorage.java @@ -5,12 +5,13 @@ import java.util.Optional; import seedu.address.commons.exceptions.DataLoadingException; +import seedu.address.model.AddressBookComparable; import seedu.address.model.ReadOnlyAddressBook; /** * Represents a storage for {@link seedu.address.model.AddressBook}. */ -public interface AddressBookStorage { +public interface AddressBookStorage> { /** * Returns the file path of the data file. @@ -23,23 +24,23 @@ public interface AddressBookStorage { * * @throws DataLoadingException if loading the data from storage failed. */ - Optional readAddressBook() throws DataLoadingException; + Optional> readAddressBook() throws DataLoadingException; /** * @see #getAddressBookFilePath() */ - Optional readAddressBook(Path filePath) throws DataLoadingException; + Optional> readAddressBook(Path filePath) throws DataLoadingException; /** * Saves the given {@link ReadOnlyAddressBook} to the storage. * @param addressBook cannot be null. * @throws IOException if there was any problem writing to the file. */ - void saveAddressBook(ReadOnlyAddressBook addressBook) throws IOException; + void saveAddressBook(ReadOnlyAddressBook addressBook) throws IOException; /** * @see #saveAddressBook(ReadOnlyAddressBook) */ - void saveAddressBook(ReadOnlyAddressBook addressBook, Path filePath) throws IOException; + void saveAddressBook(ReadOnlyAddressBook addressBook, Path filePath) throws IOException; } diff --git a/src/main/java/seedu/address/storage/JsonAdaptedInternship.java b/src/main/java/seedu/address/storage/JsonAdaptedInternship.java new file mode 100644 index 00000000000..e902fd3f5b9 --- /dev/null +++ b/src/main/java/seedu/address/storage/JsonAdaptedInternship.java @@ -0,0 +1,65 @@ +package seedu.address.storage; + +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; + +import seedu.address.commons.exceptions.IllegalValueException; +import seedu.address.model.person.*; + +/** + * Jackson-friendly version of {@link Person}. + */ +class JsonAdaptedInternship { + + public static final String MISSING_FIELD_MESSAGE_FORMAT = "Person's %s field is missing!"; + + private final String companyName; + private final String companyEmail; + private final String role; + private final LocalDate date; + + /** + * Constructs a {@code JsonAdaptedPerson} with the given person details. + */ + @JsonCreator + public JsonAdaptedInternship(@JsonProperty("companyName") String companyName, @JsonProperty("companyEmail") String companyEmail, + @JsonProperty("role") String role, @JsonProperty("date") String date ) { + this.companyName = companyName; + this.companyEmail = companyEmail; + this.role = role; + this.date = LocalDate.parse(date, DateTimeFormatter.ofPattern("dd/MM/yy")); + } + + /** + * Converts a given {@code Person} into this class for Jackson use. + */ + public JsonAdaptedInternship(Internship source) { + companyName = source.getCompany().getName().getValue(); + companyEmail = source.getCompany().getEmail().getValue(); + role = source.getRole().getValue(); + date = source.getDateOfApplication().getValue(); + } + + /** + * Converts this Jackson-friendly adapted person object into the model's {@code Person} object. + * + * @throws IllegalValueException if there were any data constraints violated in the adapted person. + */ + public Internship toModelType() throws IllegalValueException { + NameO name = new NameO(companyName); + Email email = new Email(companyEmail); + Company company = new Company(email, name); + Role role = new Role(this.role); + Date date = new Date(this.date); + return new Internship(company, date, role); + } + +} diff --git a/src/main/java/seedu/address/storage/JsonAdaptedPerson.java b/src/main/java/seedu/address/storage/JsonAdaptedPerson.java deleted file mode 100644 index f51780d841c..00000000000 --- a/src/main/java/seedu/address/storage/JsonAdaptedPerson.java +++ /dev/null @@ -1,110 +0,0 @@ -package seedu.address.storage; - -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; - -import com.fasterxml.jackson.annotation.JsonCreator; -import com.fasterxml.jackson.annotation.JsonProperty; - -import seedu.address.commons.exceptions.IllegalValueException; -import seedu.address.model.person.Address; -import seedu.address.model.person.Email; -import seedu.address.model.person.Name; -import seedu.address.model.person.Person; -import seedu.address.model.person.Phone; -import seedu.address.model.tag.Tag; - -/** - * Jackson-friendly version of {@link Person}. - */ -class JsonAdaptedPerson { - - public static final String MISSING_FIELD_MESSAGE_FORMAT = "Person's %s field is missing!"; - - private final String name; - private final String phone; - private final String email; - private final String address; - private final List tags = new ArrayList<>(); - - /** - * Constructs a {@code JsonAdaptedPerson} with the given person details. - */ - @JsonCreator - public JsonAdaptedPerson(@JsonProperty("name") String name, @JsonProperty("phone") String phone, - @JsonProperty("email") String email, @JsonProperty("address") String address, - @JsonProperty("tags") List tags) { - this.name = name; - this.phone = phone; - this.email = email; - this.address = address; - if (tags != null) { - this.tags.addAll(tags); - } - } - - /** - * Converts a given {@code Person} into this class for Jackson use. - */ - public JsonAdaptedPerson(Person source) { - name = source.getName().getValue(); - phone = source.getPhone().value; - email = source.getEmail().getValue(); - address = source.getAddress().value; - tags.addAll(source.getTags().stream() - .map(JsonAdaptedTag::new) - .collect(Collectors.toList())); - } - - /** - * Converts this Jackson-friendly adapted person object into the model's {@code Person} object. - * - * @throws IllegalValueException if there were any data constraints violated in the adapted person. - */ - public Person toModelType() throws IllegalValueException { - final List personTags = new ArrayList<>(); - for (JsonAdaptedTag tag : tags) { - personTags.add(tag.toModelType()); - } - - if (name == null) { - throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT, Name.class.getSimpleName())); - } - if (!Name.validate(name)) { - throw new IllegalValueException(Name.MESSAGE_CONSTRAINTS); - } - final Name modelName = new Name(name); - - if (phone == null) { - throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT, Phone.class.getSimpleName())); - } - if (!Phone.isValidPhone(phone)) { - throw new IllegalValueException(Phone.MESSAGE_CONSTRAINTS); - } - final Phone modelPhone = new Phone(phone); - - if (email == null) { - throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT, - Email.class.getSimpleName())); - } - if (!Email.validate(email)) { - throw new IllegalValueException(Email.MESSAGE_CONSTRAINTS); - } - final Email modelEmail = new Email(email); - - if (address == null) { - throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT, Address.class.getSimpleName())); - } - if (!Address.isValidAddress(address)) { - throw new IllegalValueException(Address.MESSAGE_CONSTRAINTS); - } - final Address modelAddress = new Address(address); - - final Set modelTags = new HashSet<>(personTags); - return new Person(modelName, modelPhone, modelEmail, modelAddress, modelTags); - } - -} diff --git a/src/main/java/seedu/address/storage/JsonSerializableAddressBook.java b/src/main/java/seedu/address/storage/JsonSerializableAddressBook.java index 5efd834091d..ed62a3e15bb 100644 --- a/src/main/java/seedu/address/storage/JsonSerializableAddressBook.java +++ b/src/main/java/seedu/address/storage/JsonSerializableAddressBook.java @@ -11,7 +11,7 @@ import seedu.address.commons.exceptions.IllegalValueException; import seedu.address.model.AddressBook; import seedu.address.model.ReadOnlyAddressBook; -import seedu.address.model.person.Person; +import seedu.address.model.person.Internship; /** * An Immutable AddressBook that is serializable to JSON format. @@ -21,14 +21,14 @@ class JsonSerializableAddressBook { public static final String MESSAGE_DUPLICATE_PERSON = "Persons list contains duplicate person(s)."; - private final List persons = new ArrayList<>(); + private final List internships = new ArrayList<>(); /** * Constructs a {@code JsonSerializableAddressBook} with the given persons. */ @JsonCreator - public JsonSerializableAddressBook(@JsonProperty("persons") List persons) { - this.persons.addAll(persons); + public JsonSerializableAddressBook(@JsonProperty("internships") List internships) { + this.internships.addAll(internships); } /** @@ -36,8 +36,8 @@ public JsonSerializableAddressBook(@JsonProperty("persons") List source) { + internships.addAll(source.getList().stream().map(JsonAdaptedInternship::new).collect(Collectors.toList())); } /** @@ -45,14 +45,14 @@ public JsonSerializableAddressBook(ReadOnlyAddressBook source) { * * @throws IllegalValueException if there were any data constraints violated. */ - public AddressBook toModelType() throws IllegalValueException { - AddressBook addressBook = new AddressBook(); - for (JsonAdaptedPerson jsonAdaptedPerson : persons) { - Person person = jsonAdaptedPerson.toModelType(); - if (addressBook.hasPerson(person)) { + public AddressBook toModelType() throws IllegalValueException { + AddressBook addressBook = new AddressBook<>(); + for (JsonAdaptedInternship jsonAdaptedInternship : internships) { + Internship internship = jsonAdaptedInternship.toModelType(); + if (addressBook.hasItem(internship)) { throw new IllegalValueException(MESSAGE_DUPLICATE_PERSON); } - addressBook.addPerson(person); + addressBook.addItem(internship); } return addressBook; } diff --git a/src/main/java/seedu/address/storage/Storage.java b/src/main/java/seedu/address/storage/Storage.java index 9fba0c7a1d6..13afbd4315a 100644 --- a/src/main/java/seedu/address/storage/Storage.java +++ b/src/main/java/seedu/address/storage/Storage.java @@ -5,6 +5,7 @@ import java.util.Optional; import seedu.address.commons.exceptions.DataLoadingException; +import seedu.address.model.AddressBookComparable; import seedu.address.model.ReadOnlyAddressBook; import seedu.address.model.ReadOnlyUserPrefs; import seedu.address.model.UserPrefs; @@ -12,7 +13,7 @@ /** * API of the Storage component */ -public interface Storage extends AddressBookStorage, UserPrefsStorage { +public interface Storage> extends AddressBookStorage, UserPrefsStorage { @Override Optional readUserPrefs() throws DataLoadingException; @@ -24,9 +25,9 @@ public interface Storage extends AddressBookStorage, UserPrefsStorage { Path getAddressBookFilePath(); @Override - Optional readAddressBook() throws DataLoadingException; + Optional> readAddressBook() throws DataLoadingException; @Override - void saveAddressBook(ReadOnlyAddressBook addressBook) throws IOException; + void saveAddressBook(ReadOnlyAddressBook addressBook) throws IOException; } diff --git a/src/main/java/seedu/address/ui/PersonCard.java b/src/main/java/seedu/address/ui/InternshipCard.java similarity index 57% rename from src/main/java/seedu/address/ui/PersonCard.java rename to src/main/java/seedu/address/ui/InternshipCard.java index 52817fa3b9c..4bafefb9f88 100644 --- a/src/main/java/seedu/address/ui/PersonCard.java +++ b/src/main/java/seedu/address/ui/InternshipCard.java @@ -7,14 +7,14 @@ import javafx.scene.layout.FlowPane; import javafx.scene.layout.HBox; import javafx.scene.layout.Region; -import seedu.address.model.person.Person; +import seedu.address.model.person.Internship; /** * An UI component that displays information of a {@code Person}. */ -public class PersonCard extends UiPart { +public class InternshipCard extends UiPart { - private static final String FXML = "PersonListCard.fxml"; + private static final String FXML = "InternshipListCard.fxml"; /** * Note: Certain keywords such as "location" and "resources" are reserved keywords in JavaFX. @@ -24,7 +24,7 @@ public class PersonCard extends UiPart { * @see The issue on AddressBook level 4 */ - public final Person person; + public final Internship internship; @FXML private HBox cardPane; @@ -33,27 +33,22 @@ public class PersonCard extends UiPart { @FXML private Label id; @FXML - private Label phone; + private Label role; @FXML - private Label address; + private Label date; @FXML private Label email; - @FXML - private FlowPane tags; /** * Creates a {@code PersonCode} with the given {@code Person} and index to display. */ - public PersonCard(Person person, int displayedIndex) { + public InternshipCard(Internship internship, int displayedIndex) { super(FXML); - this.person = person; + this.internship = internship; id.setText(displayedIndex + ". "); - name.setText(person.getName().getValue()); - phone.setText(person.getPhone().value); - address.setText(person.getAddress().value); - email.setText(person.getEmail().getValue()); - person.getTags().stream() - .sorted(Comparator.comparing(tag -> tag.tagName)) - .forEach(tag -> tags.getChildren().add(new Label(tag.tagName))); + name.setText(internship.getCompany().getName().getValue()); + email.setText(internship.getCompany().getName().getValue()); + role.setText(internship.getRole().getValue()); + date.setText(internship.getDateOfApplication().getValue().toString()); } } diff --git a/src/main/java/seedu/address/ui/InternshipListPanel.java b/src/main/java/seedu/address/ui/InternshipListPanel.java new file mode 100644 index 00000000000..735188d4035 --- /dev/null +++ b/src/main/java/seedu/address/ui/InternshipListPanel.java @@ -0,0 +1,50 @@ +package seedu.address.ui; + +import java.util.logging.Logger; + +import javafx.collections.ObservableList; +import javafx.fxml.FXML; +import javafx.scene.control.ListCell; +import javafx.scene.control.ListView; +import javafx.scene.layout.Region; +import seedu.address.commons.core.LogsCenter; +import seedu.address.model.person.Internship; +import seedu.address.model.person.Person; + +/** + * Panel containing the list of persons. + */ +public class InternshipListPanel extends UiPart { + private static final String FXML = "InternshipListPanel.fxml"; + private final Logger logger = LogsCenter.getLogger(InternshipListPanel.class); + + @FXML + private ListView internshipListView; + + /** + * Creates a {@code PersonListPanel} with the given {@code ObservableList}. + */ + public InternshipListPanel(ObservableList internshipList) { + super(FXML); + internshipListView.setItems(internshipList); + internshipListView.setCellFactory(listView -> new InternshipListViewCell()); + } + + /** + * Custom {@code ListCell} that displays the graphics of a {@code Person} using a {@code PersonCard}. + */ + class InternshipListViewCell extends ListCell { + @Override + protected void updateItem(Internship internship, boolean empty) { + super.updateItem(internship, empty); + + if (empty || internship == null) { + setGraphic(null); + setText(null); + } else { + setGraphic(new InternshipCard(internship, getIndex() + 1).getRoot()); + } + } + } + +} diff --git a/src/main/java/seedu/address/ui/MainWindow.java b/src/main/java/seedu/address/ui/MainWindow.java index 79e74ef37c0..9a4e85969d3 100644 --- a/src/main/java/seedu/address/ui/MainWindow.java +++ b/src/main/java/seedu/address/ui/MainWindow.java @@ -16,6 +16,7 @@ import seedu.address.logic.commands.CommandResult; import seedu.address.logic.commands.exceptions.CommandException; import seedu.address.logic.parser.exceptions.ParseException; +import seedu.address.model.person.Internship; /** * The Main Window. Provides the basic application layout containing @@ -28,10 +29,10 @@ public class MainWindow extends UiPart { private final Logger logger = LogsCenter.getLogger(getClass()); private Stage primaryStage; - private Logic logic; + private Logic logic; // Independent Ui parts residing in this Ui container - private PersonListPanel personListPanel; + private InternshipListPanel internshipListPanel; private ResultDisplay resultDisplay; private HelpWindow helpWindow; @@ -110,8 +111,9 @@ private void setAccelerator(MenuItem menuItem, KeyCombination keyCombination) { * Fills up all the placeholders of this window. */ void fillInnerParts() { - personListPanel = new PersonListPanel(logic.getFilteredPersonList()); - personListPanelPlaceholder.getChildren().add(personListPanel.getRoot()); + System.out.println("Filter list is " + logic.getFilteredList()); + internshipListPanel = new InternshipListPanel(logic.getFilteredList()); + personListPanelPlaceholder.getChildren().add(internshipListPanel.getRoot()); resultDisplay = new ResultDisplay(); resultDisplayPlaceholder.getChildren().add(resultDisplay.getRoot()); @@ -163,8 +165,8 @@ private void handleExit() { primaryStage.hide(); } - public PersonListPanel getPersonListPanel() { - return personListPanel; + public InternshipListPanel getInternshipListPanel() { + return internshipListPanel; } /** diff --git a/src/main/java/seedu/address/ui/PersonListPanel.java b/src/main/java/seedu/address/ui/PersonListPanel.java deleted file mode 100644 index f4c501a897b..00000000000 --- a/src/main/java/seedu/address/ui/PersonListPanel.java +++ /dev/null @@ -1,49 +0,0 @@ -package seedu.address.ui; - -import java.util.logging.Logger; - -import javafx.collections.ObservableList; -import javafx.fxml.FXML; -import javafx.scene.control.ListCell; -import javafx.scene.control.ListView; -import javafx.scene.layout.Region; -import seedu.address.commons.core.LogsCenter; -import seedu.address.model.person.Person; - -/** - * Panel containing the list of persons. - */ -public class PersonListPanel extends UiPart { - private static final String FXML = "PersonListPanel.fxml"; - private final Logger logger = LogsCenter.getLogger(PersonListPanel.class); - - @FXML - private ListView personListView; - - /** - * Creates a {@code PersonListPanel} with the given {@code ObservableList}. - */ - public PersonListPanel(ObservableList personList) { - super(FXML); - personListView.setItems(personList); - personListView.setCellFactory(listView -> new PersonListViewCell()); - } - - /** - * Custom {@code ListCell} that displays the graphics of a {@code Person} using a {@code PersonCard}. - */ - class PersonListViewCell extends ListCell { - @Override - protected void updateItem(Person person, boolean empty) { - super.updateItem(person, empty); - - if (empty || person == null) { - setGraphic(null); - setText(null); - } else { - setGraphic(new PersonCard(person, getIndex() + 1).getRoot()); - } - } - } - -} diff --git a/src/main/java/seedu/address/ui/UiManager.java b/src/main/java/seedu/address/ui/UiManager.java index fdf024138bc..7ad461af31e 100644 --- a/src/main/java/seedu/address/ui/UiManager.java +++ b/src/main/java/seedu/address/ui/UiManager.java @@ -11,6 +11,7 @@ import seedu.address.commons.core.LogsCenter; import seedu.address.commons.util.StringUtil; import seedu.address.logic.Logic; +import seedu.address.model.person.Internship; /** * The manager of the UI component. @@ -22,13 +23,13 @@ public class UiManager implements Ui { private static final Logger logger = LogsCenter.getLogger(UiManager.class); private static final String ICON_APPLICATION = "/images/address_book_32.png"; - private Logic logic; + private Logic logic; private MainWindow mainWindow; /** * Creates a {@code UiManager} with the given {@code Logic}. */ - public UiManager(Logic logic) { + public UiManager(Logic logic) { this.logic = logic; } diff --git a/src/main/resources/view/PersonListCard.fxml b/src/main/resources/view/InternshipListCard.fxml similarity index 84% rename from src/main/resources/view/PersonListCard.fxml rename to src/main/resources/view/InternshipListCard.fxml index 84e09833a87..5621a3aabd5 100644 --- a/src/main/resources/view/PersonListCard.fxml +++ b/src/main/resources/view/InternshipListCard.fxml @@ -3,7 +3,6 @@ - @@ -27,10 +26,9 @@