Skip to content

Commit 498e171

Browse files
authored
Merge pull request #104 from hengyiqun/branch-notes
Branch notes
2 parents 3c3bfa0 + d081df7 commit 498e171

35 files changed

Lines changed: 1328 additions & 23 deletions

src/main/java/seedu/address/MainApp.java

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,18 @@
2121
import seedu.address.model.UserPrefs;
2222
import seedu.address.model.meeting.MeetingBook;
2323
import seedu.address.model.meeting.ReadOnlyMeetingBook;
24+
import seedu.address.model.note.NoteBook;
25+
import seedu.address.model.note.ReadOnlyNoteBook;
2426
import seedu.address.model.person.AddressBook;
2527
import seedu.address.model.person.ReadOnlyAddressBook;
2628
import seedu.address.model.util.SampleDataUtil;
2729
import seedu.address.storage.AddressBookStorage;
2830
import seedu.address.storage.JsonAddressBookStorage;
2931
import seedu.address.storage.JsonMeetingBookStorage;
32+
import seedu.address.storage.JsonNoteBookStorage;
3033
import seedu.address.storage.JsonUserPrefsStorage;
3134
import seedu.address.storage.MeetingBookStorage;
35+
import seedu.address.storage.NoteBookStorage;
3236
import seedu.address.storage.Storage;
3337
import seedu.address.storage.StorageManager;
3438
import seedu.address.storage.UserPrefsStorage;
@@ -63,7 +67,8 @@ public void init() throws Exception {
6367
UserPrefs userPrefs = initPrefs(userPrefsStorage);
6468
AddressBookStorage addressBookStorage = new JsonAddressBookStorage(userPrefs.getAddressBookFilePath());
6569
MeetingBookStorage meetingBookStorage = new JsonMeetingBookStorage(userPrefs.getMeetingBookFilePath());
66-
storage = new StorageManager(addressBookStorage, meetingBookStorage, userPrefsStorage);
70+
NoteBookStorage noteBookStorage = new JsonNoteBookStorage(userPrefs.getNoteBookFilePath());
71+
storage = new StorageManager(addressBookStorage, meetingBookStorage, noteBookStorage, userPrefsStorage);
6772

6873
initLogging(config);
6974

@@ -82,8 +87,10 @@ public void init() throws Exception {
8287
private Model initModelManager(Storage storage, ReadOnlyUserPrefs userPrefs) {
8388
Optional<ReadOnlyAddressBook> addressBookOptional;
8489
Optional<ReadOnlyMeetingBook> meetingBookOptional;
90+
Optional<ReadOnlyNoteBook> noteBookOptional;
8591
ReadOnlyAddressBook initialDataAddressBook;
8692
ReadOnlyMeetingBook initialDataMeetingBook;
93+
ReadOnlyNoteBook initialDataNoteBook;
8794

8895
try {
8996
addressBookOptional = storage.readAddressBook();
@@ -115,8 +122,23 @@ private Model initModelManager(Storage storage, ReadOnlyUserPrefs userPrefs) {
115122
initialDataMeetingBook = new MeetingBook();
116123
}
117124

125+
//--============= NOTE ==================================================================================
118126

119-
return new ModelManager(initialDataAddressBook, initialDataMeetingBook, userPrefs);
127+
try {
128+
noteBookOptional = storage.readNoteBook();
129+
if (!noteBookOptional.isPresent()) {
130+
logger.info("Data file not found. Will be starting with a sample NoteBook");
131+
}
132+
initialDataNoteBook = noteBookOptional.orElseGet(SampleDataUtil::getSampleNoteBook);
133+
} catch (DataConversionException e) {
134+
logger.warning("Data file not in the correct format. Will be starting with an empty NoteBook");
135+
initialDataNoteBook = new NoteBook();
136+
} catch (IOException e) {
137+
logger.warning("Problem while reading from the file. Will be starting with an empty NoteBook");
138+
initialDataNoteBook = new NoteBook();
139+
}
140+
141+
return new ModelManager(initialDataAddressBook, initialDataMeetingBook, initialDataNoteBook, userPrefs);
120142
}
121143

122144
private void initLogging(Config config) {

src/main/java/seedu/address/logic/Logic.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
import seedu.address.model.Model;
1313
import seedu.address.model.meeting.Meeting;
1414
import seedu.address.model.meeting.ReadOnlyMeetingBook;
15+
import seedu.address.model.note.Note;
16+
import seedu.address.model.note.ReadOnlyNoteBook;
1517
import seedu.address.model.person.Person;
1618
import seedu.address.model.person.ReadOnlyAddressBook;
1719

@@ -53,6 +55,12 @@ public interface Logic {
5355
/** Returns an unmodifiable view of the filtered list of meetings */
5456
ObservableList<Meeting> getFilteredMeetingList();
5557

58+
ReadOnlyNoteBook getNoteBook();
59+
60+
ObservableList<Note> getFilteredNoteList();
61+
62+
Path getNoteBookFilePath();
63+
5664
/**
5765
* Returns the user prefs' GUI settings.
5866
*/

src/main/java/seedu/address/logic/LogicManager.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
import seedu.address.model.Model;
1818
import seedu.address.model.meeting.Meeting;
1919
import seedu.address.model.meeting.ReadOnlyMeetingBook;
20+
import seedu.address.model.note.Note;
21+
import seedu.address.model.note.ReadOnlyNoteBook;
2022
import seedu.address.model.person.Person;
2123
import seedu.address.model.person.ReadOnlyAddressBook;
2224
import seedu.address.storage.Storage;
@@ -52,6 +54,7 @@ public CommandResult execute(String commandText) throws CommandException, ParseE
5254
try {
5355
storage.saveAddressBook(model.getAddressBook());
5456
storage.saveMeetingBook(model.getMeetingBook());
57+
storage.saveNoteBook(model.getNoteBook());
5558
} catch (IOException ioe) {
5659
throw new CommandException(FILE_OPS_ERROR_MESSAGE + ioe, ioe);
5760
}
@@ -93,6 +96,24 @@ public GuiSettings getGuiSettings() {
9396
public void setGuiSettings(GuiSettings guiSettings) {
9497
model.setGuiSettings(guiSettings);
9598
}
99+
100+
//======================================Notebook methods ============================================
101+
@Override
102+
public ReadOnlyNoteBook getNoteBook() {
103+
return model.getNoteBook();
104+
}
105+
106+
@Override
107+
public ObservableList<Note> getFilteredNoteList() {
108+
return model.getFilteredNoteList();
109+
}
110+
111+
@Override
112+
public Path getNoteBookFilePath() {
113+
return model.getNoteBookFilePath();
114+
}
115+
116+
96117
//======================================Timetable UI methods ============================================
97118

98119
@Override
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package seedu.address.logic.commands.notes;
2+
3+
import static java.util.Objects.requireNonNull;
4+
import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS;
5+
import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL;
6+
import static seedu.address.logic.parser.CliSyntax.PREFIX_GROUP;
7+
import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;
8+
import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE;
9+
import static seedu.address.logic.parser.CliSyntax.PREFIX_PRIORITY;
10+
11+
import seedu.address.logic.commands.Command;
12+
import seedu.address.logic.commands.CommandResult;
13+
import seedu.address.logic.commands.exceptions.CommandException;
14+
import seedu.address.model.Model;
15+
import seedu.address.model.note.Note;
16+
17+
public class AddNoteCommand extends Command {
18+
19+
public static final String COMMAND_WORD = "addn";
20+
21+
public static final String MESSAGE_USAGE = COMMAND_WORD + ": Adds a note to the note book. "
22+
+ "Parameters: "
23+
+ PREFIX_NAME + "NAME "
24+
+ "[" + PREFIX_PRIORITY + "PRIORITY]...\n"
25+
+ "Example: " + COMMAND_WORD + " "
26+
+ PREFIX_NAME + "Complete CS2103 Tutorial "
27+
+ PREFIX_PRIORITY + "5 ";
28+
29+
public static final String MESSAGE_SUCCESS = "New note added: %1$s";
30+
public static final String MESSAGE_DUPLICATE_NOTE = "This note already exists in the note book";
31+
32+
private final Note toAdd;
33+
34+
/**
35+
* Creates an AddNoteCommand to add the specified {@code Note}
36+
*/
37+
public AddNoteCommand(Note note) {
38+
requireNonNull(note);
39+
this.toAdd = note;
40+
}
41+
42+
@Override
43+
public CommandResult execute(Model model) throws CommandException {
44+
requireNonNull(model);
45+
46+
if (model.hasNote(toAdd)) {
47+
throw new CommandException(MESSAGE_DUPLICATE_NOTE);
48+
}
49+
50+
model.addNote(toAdd);
51+
return new CommandResult(String.format(MESSAGE_SUCCESS, toAdd));
52+
}
53+
54+
@Override
55+
public boolean equals(Object other) {
56+
return other == this // short circuit if same object
57+
|| (other instanceof AddNoteCommand // instanceof handles nulls
58+
&& toAdd.equals(((AddNoteCommand) other).toAdd));
59+
}
60+
}

src/main/java/seedu/address/logic/parser/MeetBuddyParser.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import seedu.address.logic.commands.HelpCommand;
1414
import seedu.address.logic.commands.ListAllCommand;
1515
import seedu.address.logic.commands.meetings.*;
16+
import seedu.address.logic.commands.notes.AddNoteCommand;
1617
import seedu.address.logic.commands.persons.AddPersonCommand;
1718
import seedu.address.logic.commands.persons.ClearPersonCommand;
1819
import seedu.address.logic.commands.persons.DeletePersonCommand;
@@ -27,6 +28,7 @@
2728
import seedu.address.logic.parser.connections.DeletePersonToMeetingConnectionParser;
2829
import seedu.address.logic.parser.exceptions.ParseException;
2930
import seedu.address.logic.parser.meetings.*;
31+
import seedu.address.logic.parser.notes.AddNoteCommandParser;
3032
import seedu.address.logic.parser.persons.AddPersonCommandParser;
3133
import seedu.address.logic.parser.persons.DeletePersonCommandParser;
3234
import seedu.address.logic.parser.persons.EditPersonCommandParser;
@@ -107,6 +109,11 @@ public Command parseCommand(String userInput) throws ParseException {
107109

108110
case UnsortMeetingCommand.COMMAND_WORD:
109111
return new UnsortMeetingCommand();
112+
113+
//======================= Note =====================================
114+
case AddNoteCommand.COMMAND_WORD:
115+
return new AddNoteCommandParser().parse(arguments);
116+
110117
//======================= Timetable =====================================
111118

112119
case SetTimetableCommand.COMMAND_WORD:

src/main/java/seedu/address/logic/parser/ParserUtil.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import seedu.address.model.meeting.Description;
99
import seedu.address.model.meeting.MeetingName;
1010
import seedu.address.model.meeting.Priority;
11+
import seedu.address.model.note.Content;
1112
import seedu.address.model.person.Address;
1213
import seedu.address.model.person.Email;
1314
import seedu.address.model.person.PersonName;
@@ -196,4 +197,18 @@ public static Set<Index> parsePersonsConnection(Collection<String> oneBasedIndex
196197
}
197198
return indexSet;
198199
}
200+
201+
// =========================== ParserUtil for Note ==============================
202+
203+
/**
204+
* Parses a {@code String content} into a {@code Content}.
205+
* Leading and trailing whitespaces will be trimmed.
206+
*
207+
*/
208+
public static Content parseNoteContent(String content) {
209+
requireNonNull(content);
210+
String trimmedContent = content.trim();
211+
return new Content(trimmedContent);
212+
}
213+
199214
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package seedu.address.logic.parser.notes;
2+
3+
import static seedu.address.commons.core.Messages.MESSAGE_INVALID_COMMAND_FORMAT;
4+
import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME;
5+
import static seedu.address.logic.parser.CliSyntax.PREFIX_PRIORITY;
6+
7+
import java.util.stream.Stream;
8+
9+
import seedu.address.logic.commands.notes.AddNoteCommand;
10+
import seedu.address.logic.parser.ArgumentMultimap;
11+
import seedu.address.logic.parser.ArgumentTokenizer;
12+
import seedu.address.logic.parser.Parser;
13+
import seedu.address.logic.parser.ParserUtil;
14+
import seedu.address.logic.parser.Prefix;
15+
import seedu.address.logic.parser.exceptions.ParseException;
16+
import seedu.address.model.meeting.Priority;
17+
import seedu.address.model.note.Content;
18+
import seedu.address.model.note.Note;
19+
20+
/**
21+
* Parses input arguments and creates a new AddNoteCommand object
22+
*/
23+
public class AddNoteCommandParser implements Parser<AddNoteCommand> {
24+
25+
/**
26+
* Parses the given {@code String} of arguments in the context of the AddNoteCommand
27+
* and returns an AddNoteCommand object for execution.
28+
* @throws ParseException if the user input does not conform the expected format
29+
*/
30+
public AddNoteCommand parse(String args) throws ParseException {
31+
ArgumentMultimap argMultimap =
32+
ArgumentTokenizer.tokenize(args, PREFIX_NAME, PREFIX_PRIORITY);
33+
34+
if (!arePrefixesPresent(argMultimap, PREFIX_NAME)
35+
|| !argMultimap.getPreamble().isEmpty()) {
36+
throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddNoteCommand.MESSAGE_USAGE));
37+
}
38+
39+
Content content = ParserUtil.parseNoteContent(argMultimap.getValue(PREFIX_NAME).get());
40+
Priority priority;
41+
42+
if (!arePrefixesPresent(argMultimap, PREFIX_PRIORITY)) {
43+
priority = new Priority("1");
44+
} else {
45+
priority = ParserUtil.parseMeetingPriority(argMultimap.getValue(PREFIX_PRIORITY).get());
46+
}
47+
48+
Note note = new Note(content, priority);
49+
50+
return new AddNoteCommand(note);
51+
}
52+
53+
/**
54+
* Returns true if none of the prefixes contains empty {@code Optional} values in the given
55+
* {@code ArgumentMultimap}.
56+
*/
57+
private static boolean arePrefixesPresent(ArgumentMultimap argumentMultimap, Prefix... prefixes) {
58+
return Stream.of(prefixes).allMatch(prefix -> argumentMultimap.getValue(prefix).isPresent());
59+
}
60+
61+
}

src/main/java/seedu/address/model/Model.java

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package seedu.address.model;
22

3+
import static java.util.Objects.requireNonNull;
4+
35
import java.nio.file.Path;
46
import java.time.LocalDate;
57
import java.time.LocalDateTime;
@@ -16,6 +18,8 @@
1618
import seedu.address.model.group.Group;
1719
import seedu.address.model.meeting.Meeting;
1820
import seedu.address.model.meeting.ReadOnlyMeetingBook;
21+
import seedu.address.model.note.Note;
22+
import seedu.address.model.note.ReadOnlyNoteBook;
1923
import seedu.address.model.person.Person;
2024
import seedu.address.model.person.ReadOnlyAddressBook;
2125
import seedu.address.model.reminder.ReadOnlyReminderBook;
@@ -27,6 +31,7 @@ public interface Model {
2731
/** {@code Predicate} that always evaluate to true */
2832
Predicate<Person> PREDICATE_SHOW_ALL_PERSONS = unused -> true;
2933
Predicate<Meeting> PREDICATE_SHOW_ALL_MEETINGS = unused -> true;
34+
Predicate<Note> PREDICATE_SHOW_ALL_NOTES = unused -> true;
3035

3136
/**
3237
* Replaces user prefs data with the data in {@code userPrefs}.
@@ -223,6 +228,52 @@ public interface Model {
223228
*/
224229
ObservableList<Person> getFilteredPersonListByMeetingConnection(Meeting meeting);
225230

231+
// ======================= Note part of the note Model interface ============================ //
232+
233+
/**
234+
* Replaces note book data with the data in {@code noteBook}.
235+
*/
236+
void setNoteBook(ReadOnlyNoteBook noteBook);
237+
238+
/** Returns the NoteBook */
239+
ReadOnlyNoteBook getNoteBook();
240+
241+
/**
242+
* Returns true if a note with the same content as {@code note} exists in the note book.
243+
*/
244+
boolean hasNote(Note note);
245+
246+
/**
247+
* Deletes the given note.
248+
* The note must exist in the note book.
249+
*/
250+
void deleteNote(Note target);
251+
252+
/**
253+
* Adds the given note.
254+
* {@code note} must not already exist in the note book.
255+
*/
256+
void addNote(Note note);
257+
258+
/**
259+
* Replaces the given note {@code target} with {@code editedNote}.
260+
* {@code target} must exist in the note book.
261+
* The content of {@code editedNote} must not be the same as another existing note in the note book.
262+
*/
263+
void setNote(Note target, Note editedNote);
264+
265+
/** Returns an unmodifiable view of the filtered note list */
266+
ObservableList<Note> getFilteredNoteList();
267+
268+
/**
269+
* Updates the filter of the filtered note list to filter by the given {@code predicate}.
270+
* @throws NullPointerException if {@code predicate} is null.
271+
*/
272+
void updateFilteredNoteList(Predicate<Note> predicate);
273+
274+
Path getNoteBookFilePath();
275+
276+
void setNoteBookFilePath(Path noteBookFilePath);
226277

227278
//============================= Timetable settings =====================================
228279

0 commit comments

Comments
 (0)