Skip to content

Commit 6aa88c1

Browse files
authored
Merge pull request #70 from skinnychenpi/PersonMeeting
Person meeting
2 parents 8eb1ef7 + f10e2e9 commit 6aa88c1

9 files changed

Lines changed: 271 additions & 10 deletions

File tree

config/checkstyle/checkstyle.xml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22
<!DOCTYPE module PUBLIC
3-
"-//Checkstyle//DTD Checkstyle Configuration 1.3//EN"
4-
"https://checkstyle.org/dtds/configuration_1_3.dtd">
3+
"-//Checkstyle//DTD Checkstyle Configuration 1.3//EN"
4+
"https://checkstyle.org/dtds/configuration_1_3.dtd">
55

66
<!--
77
This configuration file enforces rules for a modified version of the module's code standard at
@@ -400,4 +400,4 @@
400400
</module>
401401

402402
</module>
403-
</module>
403+
</module>
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
package seedu.address.model.connection;
2+
3+
import java.util.HashMap;
4+
5+
import seedu.address.model.connection.exceptions.ConnectionNoFoundException;
6+
import seedu.address.model.meeting.Meeting;
7+
import seedu.address.model.meeting.UniqueMeetingList;
8+
import seedu.address.model.person.Person;
9+
import seedu.address.model.person.UniquePersonList;
10+
11+
/**
12+
* Represents a connection between persons and meetings.
13+
* Uses two hashmaps to store the connections, use both meeting and person as a connection.
14+
* In default, if the connection is not stated, the connection class object will not record the connections.
15+
* i.e: those meeting and person will not appear in the hashmap, both key and values(in the UniqueXXXList).
16+
*/
17+
public class PersonMeetingConnection {
18+
private HashMap<Meeting, UniquePersonList> personsInMeeting;
19+
private HashMap<Person, UniqueMeetingList> meetingsInPerson;
20+
21+
/**
22+
* Constructs a {@code PersonMeetingConnection}.
23+
*/
24+
public PersonMeetingConnection() {
25+
personsInMeeting = new HashMap<>();
26+
meetingsInPerson = new HashMap<>();
27+
}
28+
/**
29+
* Returns true if a given person and a given meeting exist a connection.
30+
*/
31+
private boolean existPersonMeetingConnection(Person person, Meeting meeting) {
32+
UniquePersonList personList = personsInMeeting.get(meeting);
33+
UniqueMeetingList meetingList = meetingsInPerson.get(person);
34+
if (personList == null || meetingList == null) {
35+
return false;
36+
}
37+
return personList.contains(person) && meetingList.contains(meeting);
38+
}
39+
/**
40+
* Returns a UniqueMeetingList object with the person as the key.
41+
* Empty list will be returned if there is no value found in the hashMap.
42+
*/
43+
public UniqueMeetingList getMeetingsByPerson(Person person) {
44+
return meetingsInPerson.getOrDefault(person, new UniqueMeetingList());
45+
}
46+
47+
/**
48+
* Returns a UniquePersonList object with the meeting as the key.
49+
* Empty list will be returned if there is no value found in the hashMap.
50+
*/
51+
public UniquePersonList getPersonsByMeeting(Meeting meeting) {
52+
return personsInMeeting.getOrDefault(meeting, new UniquePersonList());
53+
}
54+
/**
55+
* Returns a UniqueMeetingList object with the person as the key.
56+
* Empty list will be returned if there is no value found in the hashMap.
57+
*/
58+
public void addPersonMeetingConnection(Person person, Meeting meeting) {
59+
UniquePersonList personList = personsInMeeting.getOrDefault(meeting, new UniquePersonList());
60+
UniqueMeetingList meetingList = meetingsInPerson.getOrDefault(person, new UniqueMeetingList());
61+
personList.add(person);
62+
meetingList.add(meeting);
63+
personsInMeeting.put(meeting, personList);
64+
meetingsInPerson.put(person, meetingList);
65+
}
66+
/**
67+
* This method delete a single connection between a meeting and a person.
68+
*/
69+
public void deleteSinglePersonMeetingConnection(Person person, Meeting meeting) {
70+
if (!existPersonMeetingConnection(person, meeting)) {
71+
throw new ConnectionNoFoundException();
72+
}
73+
UniquePersonList personList = personsInMeeting.get(meeting);
74+
UniqueMeetingList meetingList = meetingsInPerson.get(person);
75+
personList.remove(person);
76+
meetingList.remove(meeting);
77+
personsInMeeting.put(meeting, personList);
78+
meetingsInPerson.put(person, meetingList);
79+
}
80+
/**
81+
* This method delete a all connections related to a given person.
82+
*/
83+
public void deleteAllPersonMeetingConnectionByPerson(Person person) {
84+
if (meetingsInPerson.get(person) != null) {
85+
UniqueMeetingList meetings = meetingsInPerson.get(person);
86+
for (Meeting meeting : meetings) {
87+
UniquePersonList persons = personsInMeeting.get(meeting);
88+
persons.remove(person);
89+
personsInMeeting.put(meeting, persons);
90+
}
91+
meetingsInPerson.remove(person);
92+
}
93+
}
94+
/**
95+
* This method delete a all connections related to a given meeting.
96+
*/
97+
public void deleteAllPersonMeetingConnectionByMeeting(Meeting meeting) {
98+
if (personsInMeeting.get(meeting) != null) {
99+
UniquePersonList persons = personsInMeeting.get(meeting);
100+
for (Person person : persons) {
101+
UniqueMeetingList meetings = meetingsInPerson.get(person);
102+
meetings.remove(meeting);
103+
meetingsInPerson.put(person, meetings);
104+
}
105+
personsInMeeting.remove(meeting);
106+
}
107+
}
108+
109+
110+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package seedu.address.model.connection.exceptions;
2+
3+
/**
4+
* Signals that the operation will result in the connections between meetings and persons doesn't exist.
5+
*/
6+
public class ConnectionNoFoundException extends RuntimeException {
7+
public ConnectionNoFoundException() {
8+
super("The linkage between the meeting and the person does not exist.");
9+
}
10+
}

src/main/java/seedu/address/model/meeting/MeetingBook.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package seedu.address.model.meeting;
22

3+
34
import static java.util.Objects.requireNonNull;
45

56
import java.util.List;
@@ -75,7 +76,6 @@ public void addMeeting(Meeting m) {
7576
*/
7677
public void setMeeting(Meeting target, Meeting editedMeeting) {
7778
requireNonNull(editedMeeting);
78-
7979
meetings.setMeeting(target, editedMeeting);
8080
}
8181

src/test/java/seedu/address/logic/commands/meetings/AddMeetingCommandTest.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@ public void execute_meetingAcceptedByModel_addSuccessful() throws Exception {
4040
Meeting validMeeting = new MeetingBuilder().build();
4141

4242
CommandResult commandResult = new AddMeetingCommand(validMeeting).execute(modelStub);
43-
4443
assertEquals(String.format(AddMeetingCommand.MESSAGE_SUCCESS, validMeeting), commandResult.getFeedbackToUser());
4544
assertEquals(Arrays.asList(validMeeting), modelStub.meetingsAdded);
4645
}

src/test/java/seedu/address/logic/commands/meetings/MeetingCommandTestUtil.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package seedu.address.logic.commands.meetings;
22

3+
34
import static org.junit.jupiter.api.Assertions.assertEquals;
45
import static org.junit.jupiter.api.Assertions.assertTrue;
56
import static seedu.address.logic.parser.CliSyntax.PREFIX_DESCRIPTION;

src/test/java/seedu/address/logic/parser/meetings/AddMeetingCommandParserTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
package seedu.address.logic.parser.meetings;
21

2+
package seedu.address.logic.parser.meetings;
33
import static seedu.address.commons.core.Messages.MESSAGE_INVALID_COMMAND_FORMAT;
44
import static seedu.address.logic.commands.meetings.MeetingCommandTestUtil.DESCRIPTION_DESC_MEETING1;
55
import static seedu.address.logic.commands.meetings.MeetingCommandTestUtil.DESCRIPTION_DESC_MEETING2;
@@ -142,8 +142,8 @@ public void parse_invalidValue_failure() {
142142

143143

144144
// non-empty preamble
145-
assertParseFailure(parser, PREAMBLE_NON_EMPTY + NAME_DESC_MEETING1 + START_DESC_MEETING1 + END_DESC_MEETING1
146-
+ PRIORITY_DESC_MEETING1 + DESCRIPTION_DESC_MEETING1
145+
assertParseFailure(parser, PREAMBLE_NON_EMPTY + NAME_DESC_MEETING1 + START_DESC_MEETING1
146+
+ END_DESC_MEETING1 + PRIORITY_DESC_MEETING1 + DESCRIPTION_DESC_MEETING1
147147
+ GROUP_DESC_FRIEND,
148148
String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddMeetingCommand.MESSAGE_USAGE));
149149
}

src/test/java/seedu/address/logic/parser/persons/EditPersonCommandParserTest.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,8 +104,9 @@ public void parse_invalidValue_failure() {
104104
+ GROUP_DESC_HUSBAND, Group.MESSAGE_CONSTRAINTS);
105105

106106
// multiple invalid values, but only the first invalid value is captured
107-
assertParseFailure(parser, "1" + INVALID_NAME_DESC + INVALID_EMAIL_DESC + VALID_ADDRESS_AMY + VALID_PHONE_AMY,
108-
PersonName.MESSAGE_CONSTRAINTS);
107+
assertParseFailure(parser, "1" + INVALID_NAME_DESC + INVALID_EMAIL_DESC
108+
+ VALID_ADDRESS_AMY + VALID_PHONE_AMY,
109+
PersonName.MESSAGE_CONSTRAINTS);
109110
}
110111

111112
@Test
Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
package seedu.address.model.connection;
2+
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
import static org.junit.jupiter.api.Assertions.assertNotEquals;
5+
import static seedu.address.testutil.TypicalMeetings.MEETING1;
6+
import static seedu.address.testutil.TypicalMeetings.MEETING2;
7+
import static seedu.address.testutil.TypicalMeetings.MEETING3;
8+
import static seedu.address.testutil.TypicalMeetings.MEETING4;
9+
import static seedu.address.testutil.TypicalPersons.AMY;
10+
import static seedu.address.testutil.TypicalPersons.BOB;
11+
import static seedu.address.testutil.TypicalPersons.CARL;
12+
import static seedu.address.testutil.TypicalPersons.HOON;
13+
14+
import org.junit.jupiter.api.Test;
15+
16+
import seedu.address.model.meeting.UniqueMeetingList;
17+
import seedu.address.model.person.UniquePersonList;
18+
19+
20+
class PersonMeetingConnectionTest {
21+
private PersonMeetingConnection connection = new PersonMeetingConnection();
22+
private PersonMeetingConnectionTest() {
23+
connection.addPersonMeetingConnection(AMY, MEETING1);
24+
connection.addPersonMeetingConnection(AMY, MEETING2);
25+
connection.addPersonMeetingConnection(AMY, MEETING3);
26+
27+
connection.addPersonMeetingConnection(BOB, MEETING1);
28+
connection.addPersonMeetingConnection(BOB, MEETING2);
29+
connection.addPersonMeetingConnection(BOB, MEETING3);
30+
31+
}
32+
33+
@Test
34+
void getMeetingsByPerson() {
35+
UniqueMeetingList expected = new UniqueMeetingList();
36+
expected.add(MEETING1);
37+
expected.add(MEETING2);
38+
expected.add(MEETING3);
39+
assertEquals(connection.getMeetingsByPerson(AMY), expected);
40+
assertEquals(connection.getMeetingsByPerson(BOB), expected);
41+
assertNotEquals(connection.getMeetingsByPerson(CARL), expected);
42+
assertNotEquals(connection.getMeetingsByPerson(HOON), null);
43+
44+
}
45+
46+
@Test
47+
void getPersonsByMeeting() {
48+
UniquePersonList expected = new UniquePersonList();
49+
expected.add(AMY);
50+
expected.add(BOB);
51+
assertEquals(connection.getPersonsByMeeting(MEETING1), expected);
52+
assertEquals(connection.getPersonsByMeeting(MEETING2), expected);
53+
assertEquals(connection.getPersonsByMeeting(MEETING3), expected);
54+
assertNotEquals(connection.getPersonsByMeeting(MEETING4), expected);
55+
assertNotEquals(connection.getPersonsByMeeting(MEETING4), null);
56+
}
57+
58+
@Test
59+
void addPersonMeetingConnection() {
60+
connection.addPersonMeetingConnection(AMY, MEETING4);
61+
connection.addPersonMeetingConnection(BOB, MEETING4);
62+
63+
64+
UniqueMeetingList expectedMeetings = new UniqueMeetingList();
65+
expectedMeetings.add(MEETING1);
66+
expectedMeetings.add(MEETING2);
67+
expectedMeetings.add(MEETING3);
68+
expectedMeetings.add(MEETING4);
69+
70+
assertEquals(connection.getMeetingsByPerson(AMY), expectedMeetings);
71+
assertEquals(connection.getMeetingsByPerson(BOB), expectedMeetings);
72+
assertNotEquals(connection.getMeetingsByPerson(CARL), expectedMeetings);
73+
assertNotEquals(connection.getMeetingsByPerson(HOON), null);
74+
75+
UniquePersonList expectedPersons = new UniquePersonList();
76+
expectedPersons.add(AMY);
77+
expectedPersons.add(BOB);
78+
assertEquals(connection.getPersonsByMeeting(MEETING1), expectedPersons);
79+
assertEquals(connection.getPersonsByMeeting(MEETING2), expectedPersons);
80+
assertEquals(connection.getPersonsByMeeting(MEETING3), expectedPersons);
81+
assertEquals(connection.getPersonsByMeeting(MEETING4), expectedPersons);
82+
83+
84+
}
85+
86+
@Test
87+
void deleteSinglePersonMeetingConnection() {
88+
connection.deleteSinglePersonMeetingConnection(BOB, MEETING3);
89+
connection.deleteSinglePersonMeetingConnection(AMY, MEETING3);
90+
91+
92+
UniqueMeetingList expectedMeetings = new UniqueMeetingList();
93+
expectedMeetings.add(MEETING1);
94+
expectedMeetings.add(MEETING2);
95+
assertEquals(connection.getMeetingsByPerson(AMY), expectedMeetings);
96+
assertEquals(connection.getMeetingsByPerson(BOB), expectedMeetings);
97+
assertNotEquals(connection.getMeetingsByPerson(CARL), expectedMeetings);
98+
assertNotEquals(connection.getMeetingsByPerson(HOON), null);
99+
100+
UniquePersonList expectedPersons = new UniquePersonList();
101+
expectedPersons.add(AMY);
102+
expectedPersons.add(BOB);
103+
assertEquals(connection.getPersonsByMeeting(MEETING1), expectedPersons);
104+
assertEquals(connection.getPersonsByMeeting(MEETING2), expectedPersons);
105+
assertNotEquals(connection.getPersonsByMeeting(MEETING4), expectedPersons);
106+
assertNotEquals(connection.getPersonsByMeeting(MEETING4), null);
107+
108+
}
109+
110+
@Test
111+
void deleteAllPersonMeetingConnectionByPerson() {
112+
connection.deleteAllPersonMeetingConnectionByPerson(AMY);
113+
connection.deleteAllPersonMeetingConnectionByPerson(CARL);
114+
115+
UniqueMeetingList expectedMeetings = new UniqueMeetingList();
116+
expectedMeetings.add(MEETING1);
117+
expectedMeetings.add(MEETING2);
118+
expectedMeetings.add(MEETING3);
119+
assertEquals(connection.getMeetingsByPerson(AMY), new UniqueMeetingList());
120+
assertEquals(connection.getMeetingsByPerson(BOB), expectedMeetings);
121+
assertEquals(connection.getMeetingsByPerson(CARL), new UniqueMeetingList());
122+
123+
124+
}
125+
126+
@Test
127+
void deleteAllPersonMeetingConnectionByMeeting() {
128+
connection.deleteAllPersonMeetingConnectionByMeeting(MEETING1);
129+
connection.deleteAllPersonMeetingConnectionByMeeting(MEETING4);
130+
131+
UniquePersonList expectedPersons = new UniquePersonList();
132+
expectedPersons.add(AMY);
133+
expectedPersons.add(BOB);
134+
135+
assertEquals(connection.getPersonsByMeeting(MEETING1), new UniquePersonList());
136+
assertEquals(connection.getPersonsByMeeting(MEETING2), expectedPersons);
137+
assertEquals(connection.getPersonsByMeeting(MEETING3), expectedPersons);
138+
assertEquals(connection.getPersonsByMeeting(MEETING4), new UniquePersonList());
139+
}
140+
}

0 commit comments

Comments
 (0)