From dd2e92b8dc829feb7af99f3281e12a4f219b5654 Mon Sep 17 00:00:00 2001 From: pkpaing Date: Thu, 23 Mar 2023 18:00:42 +0800 Subject: [PATCH 1/2] Updated DG (Import), Fixed Import command bug --- docs/DeveloperGuide.md | 72 ++++++++++++++++++ docs/diagrams/ImportActivityDiagram.puml | 15 ++++ docs/diagrams/ImportSequenceDiagram.puml | 67 ++++++++++++++++ docs/images/ImportActivityDiagram.png | Bin 0 -> 15721 bytes docs/images/ImportSequenceDiagram.png | Bin 0 -> 34236 bytes .../address/logic/commands/ImportCommand.java | 4 +- 6 files changed, 157 insertions(+), 1 deletion(-) create mode 100644 docs/diagrams/ImportActivityDiagram.puml create mode 100644 docs/diagrams/ImportSequenceDiagram.puml create mode 100644 docs/images/ImportActivityDiagram.png create mode 100644 docs/images/ImportSequenceDiagram.png diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 961bc906aac..c19a2c7cf46 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -22,6 +22,7 @@ connections with their peers during their time in University. System: BookFace +``` Use case: UC1 - Add Contact Actor: User @@ -37,7 +38,9 @@ Extensions: 2a. BookFace detects incomplete/invalid details entered. BookFace displays an example of valid details. System repeats Step 1-2 until valid details are entered. +``` +``` Use case: UC2 - Delete Contact Actor: User @@ -53,7 +56,9 @@ Extensions: 2a. BookFace detects incomplete/invalid index entered. BookFace displays an example of a valid index. System repeats Step 1-2 until valid information is entered. +``` +``` Use case: UC3 - Edit Contact Actor: User @@ -69,7 +74,9 @@ Extensions: 2a. BookFace detects incomplete/invalid details entered. BookFace displays an example of valid details. System repeats Step 1-2 until valid details are entered. +``` +``` Use case: UC4 - Find Contact Actor: User @@ -85,7 +92,9 @@ Extensions: 2a. BookFace detects no name entered. BookFace displays an example of a valid name. System repeats Step 1-2 until a name is entered. +``` +``` Use case: UC5 - List Contacts Actor: User @@ -94,7 +103,9 @@ MSS: 1. User chooses to view all contacts. 2. BookFace displays all the user's contacts. Use case ends. +``` +``` Use case: UC6 - Get Help on Commands Actor: User @@ -103,7 +114,9 @@ MSS: 1. User chooses to view instructions on how to use BookFace. 2. BookFace displays a url to its User Guide. Use case ends. +``` +``` Use case: UC7 - Add Image for a Contact Actor: User MSS: @@ -117,7 +130,9 @@ Extensions: 2a. BookFace detects invalid/incomplete filepath or index. BookFace displays an example of a valid filepath and index. System repeats Step 1-2 until valid information is entered. +``` +``` Use case: UC8 - Delete Image for a Contact Actor: User @@ -136,7 +151,9 @@ System repeats Step 1-2 until valid information is entered. 2b. BookFace detects that the contact does not have an image added. Use case ends. +``` +``` Use case: UC9 - Import Contacts from a Faculty Actor: User @@ -152,6 +169,7 @@ Extensions: 2a. BookFace detects incomplete/invalid details entered. BookFace displays an example of valid details. System repeats Step 1-2 until valid details are entered. +``` **Glossary** : * Student: A user who belongs to a faculty and attends one or more classes with other students @@ -265,3 +283,57 @@ directory. - Cons: - Application will take up increasingly more unnecessary storage during its lifetime of usage +## Import Contacts Feature +### Import Contacts Implementation +The import feature is facilitated by the classes `ImportCommand`, `ImportCommandParser`, +`SocContacts` and `ChsContacts`. The `ImportCommandParser` first parses through the user +command to obtain the desired faculty to be imported. An instance of +a `ImportCommand` containing the desired faculty from either `SocContacts` or +`ChsContacts` is then returned. `ImportCommand#execute` is then called, +which calls `Model#addPerson` to add the unique contacts into BookFace. + +Given below is an example usage scenario for how the import mechanism behaves. + +Step 1: User starts up the application and sees their list of contacts. + +Step 2: User decides to import contacts from faculty SOC and input +`import soc`. `ImportCommandParser#parse` is then called to parse +this input for the desired faculty. + +> **Note**: If the user inputs a faculty that does not exist, +> an error will be returned to the user +> + +Step 3: If the faculty was valid, `ImportCommand#execute` is called +with the valid faculty that was parsed + +Step 4: `Model#addPerson` is called for however +many non-duplicate contacts are to be added. + + +The following sequence diagram shows how the import command works. + +![ImportSequenceDiagram](images/ImportSequenceDiagram.png) + + +The following activity diagram summarizes what happens when a user executes an +import command: + +![ImportActivityDiagram](images/ImportActivityDiagram.png) + +### Design Considerations: +- **Alternative 1 (current choice):** ImportCommand#execute takes in a string to +determine which faculty of in-built contacts to import + - Pros: + - User input is easily parsed (as it is just a string), faster to read and + execute the command + - Cons: + - Possibly bad OOP design, ImportCommand#execute should take in a Faculty object + +- **Alternative 2:** ImportCommand#execute takes in a Faculty object instead of a string +to determine which faculty of in-built contacts to import + - Pros: + - Better OOP design then simply taking in a string + - Cons: + - Input will take longer to parse as the string input has to be parsed into + a faculty object to be used as input to ImportCommand#execute diff --git a/docs/diagrams/ImportActivityDiagram.puml b/docs/diagrams/ImportActivityDiagram.puml new file mode 100644 index 00000000000..9d36dc0a591 --- /dev/null +++ b/docs/diagrams/ImportActivityDiagram.puml @@ -0,0 +1,15 @@ +@startuml +start +:User executes import command; +'Since the beta syntax does not support placing the condition outside the +'diamond we place it as the true branch instead. + +if () then ([faculty is valid]) + :Faculty contacts are retrieved; + :Non-duplicate contacts are added; + : Display success message; +else ([else]) + : Display error message; +endif +stop +@enduml \ No newline at end of file diff --git a/docs/diagrams/ImportSequenceDiagram.puml b/docs/diagrams/ImportSequenceDiagram.puml new file mode 100644 index 00000000000..c4dce21b8e9 --- /dev/null +++ b/docs/diagrams/ImportSequenceDiagram.puml @@ -0,0 +1,67 @@ +@startuml +!include style.puml + +box Logic LOGIC_COLOR_T1 +participant ":LogicManager" as LogicManager LOGIC_COLOR +participant ":AddressBookParser" as AddressBookParser LOGIC_COLOR +participant ":ImportCommandParser" as ImportCommandParser LOGIC_COLOR +participant "d:ImportCommand" as ImportCommand LOGIC_COLOR +participant ":CommandResult" as CommandResult LOGIC_COLOR +end box + +box Model MODEL_COLOR_T1 +participant ":Model" as Model MODEL_COLOR +end box + +[-> LogicManager : execute("import soc") +activate LogicManager + +LogicManager -> AddressBookParser : parseCommand("import soc") +activate AddressBookParser + +create ImportCommandParser +AddressBookParser -> ImportCommandParser +activate ImportCommandParser + +AddressBookParser -> ImportCommandParser : parse("soc") +activate ImportCommandParser + +create ImportCommand +ImportCommandParser -> ImportCommand +activate ImportCommand + +ImportCommand --> ImportCommandParser : d +deactivate ImportCommand + +ImportCommandParser --> AddressBookParser : d +deactivate ImportCommandParser +'Hidden arrow to position the destroy marker below the end of the activation bar. +ImportCommandParser -[hidden]-> AddressBookParser +destroy ImportCommandParser + +AddressBookParser --> LogicManager : d +deactivate AddressBookParser + +LogicManager -> ImportCommand : execute() +activate ImportCommand + + +ImportCommand -> Model : addPerson(toAdd) +activate Model + +Model --> ImportCommand +deactivate Model + +create CommandResult +ImportCommand -> CommandResult +activate CommandResult + +CommandResult --> ImportCommand +deactivate CommandResult + +ImportCommand --> LogicManager : result +deactivate ImportCommand + +[<--LogicManager +deactivate LogicManager +@enduml diff --git a/docs/images/ImportActivityDiagram.png b/docs/images/ImportActivityDiagram.png new file mode 100644 index 0000000000000000000000000000000000000000..51475c79efcf1caced5a62f6091a8d6bad1300b7 GIT binary patch literal 15721 zcmbWecRbbo|37YJWMo7#vqe_rAW8NXGO|adIvgu|XUis0$jlxY$H)ptNJI$7ijZW6 zLdN%T>bgFk-~0Rf{_**KuiNdqoa?;KYdxQj=i_m|-yip9q>i=<TKczAe}YO0EQ zczF0P;9n#u0eth4wZsVi2)HWUa=q>7 zYmQK%JF$uR;|~AV%0cR@LxFUj_?iljF{LLstNaK)sF6<9h=y+ZFvj=Gx170B6Z-7iOjhHw!!6c>l#7!i-BsolS-Gj+ z73tc&Hx|A=kiy;xJF%M86gbpde6^xq*!rR0DL+qpkx8=lFaHle2=Z^rLX}vmrJEmA+SPMFoOm z(;~b^wxPb=S8krbESe5H{8IU`|Gne)QTlGpX9T5qc+y&GigNm%7ONRvzNhcLICkb{ zIq4FS80B<=l%PH0TtrR@r*zb--oo4#9Y(X$1G^?3cWLL<;{~bX?dscw^MW_rjEtVIEo<*@9pzdY-0=HeR8ZWqv-Y)U zIX6t6lw%~8$pxPyMBlFvA+IVPg5(O(SNI=%q%|8`{fV|4rDDBOjw`W6q%jj zSb(3#Pri2hKB&T;+p<&(%R;Zs4xrbY1;`2+ks7=c1OCLnq*MoC=^0xQ_b}w?d2i@TNn=geFq~ z_o1ST4)-A|P!_4^OAfDn;^;KbCI`HX@GjvTh7T_2Np|W~N))LW2^>9B9OFs(|L`|r zZq8=4G!OCMJO?pcGD7vnjSoFNy7$mX1*xaS)gg@V4CmS%>bg2RU%q@9X>5S<`MDAq z6Vv(8Qh`hi=DkhH*Vot8b-O*3JlO@^W~ZyGs}M$!z)2<+2nR#^Y@?#1qaz{$r?L>9 zWyaOEsY(qj>JdILRIb}=Q@<$QEd7mJ{SS9HzoZD6KF!QrKSw{_;@4=V z$P$~Y64#$88!%b#JU%||qMqPVSR0s-mX?;9dcS&n{yh(d*i^Yiv%pv5 z`wD2|zI?5;T8Alt0zQs9{Cx*HUd{NMLN(dg3k&a(1#cE;C(|XxPw;YaDf||E5rV9K za`uw#X$FRO#%kTDn}&u6{{v5{S$W3dzAFxs^6GM7x>SgPZ$!`&&HN= zUAlBhTH3TTMB2$ux^mdp{PCYSp%VhUI2OWMuAF+*c&+K3!-SzTD`sF3is# zui@8+LR{3*K_v$vt79j0CqBN^aF+X2W?C0;d}O2R?*3EZluSrsL8kxyd{0u&E7Lj$ z)ipL5?<}1%#jLpFxhN5nI)`TGFUp#h4K54M?!BP#AlykfCn52xhcC0#vh}F>*K}HX zdUPVhTJe`$Ve{AUr9UQuM%?a`B3`kK-+oQ6_qKG-iPal7Zk(ZexcL6tP{EC0VoHmE z!yU(#J!0w5=UvffbCq+@ak59A&E7lI`JWuC$Ju;VDjU~Z8VyPe3*{&cPel!@(wrMu z&uzqBt?iRMckNn>LO4|nleqV0=NSzRjS=)>U)pGeWosBEGZoY2ZihPQ^sfY648J2f z=+B;2Lq7{gR#R1sgspUi!dz~{xp!@CA1h@@d$3(`y>Dp9Ae`8f#23}htM&ZzYb|wk zZ1uf3lgKxB4?edAueTl_K~Bud^V(YM?Cccg(q&_1Wo2e2U(dRY_E@(#J?-^1!EcEVso2^AK)L2reis_aZmTi9N>adjL)k;Hjn!r+^ zA}6QI^iswCX7Q%0A`1 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 literal 0 HcmV?d00001 diff --git a/docs/images/ImportSequenceDiagram.png b/docs/images/ImportSequenceDiagram.png new file mode 100644 index 0000000000000000000000000000000000000000..6b4d15a07dae4c38f40bdc3202a5f63f9db2f0ea GIT binary patch literal 34236 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%0D3*J2mQ#VFEqek3gRN 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%0A;AOTvEgkWG6=(sxeCO`+7BS{IrL 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 literal 0 HcmV?d00001 diff --git a/src/main/java/seedu/address/logic/commands/ImportCommand.java b/src/main/java/seedu/address/logic/commands/ImportCommand.java index c636ba78ec5..a951ea23e85 100644 --- a/src/main/java/seedu/address/logic/commands/ImportCommand.java +++ b/src/main/java/seedu/address/logic/commands/ImportCommand.java @@ -43,6 +43,7 @@ public CommandResult execute(Model model) throws CommandException { requireNonNull(model); String duplicates = ""; String successes = ""; + int duplicateCounter = 0; ArrayList importList = new ArrayList(); if (faculty.equalsIgnoreCase("soc")) { @@ -56,6 +57,7 @@ public CommandResult execute(Model model) throws CommandException { for (Person toAdd : importList) { if (model.hasPerson(toAdd)) { duplicates += toAdd.getName() + MESSAGE_DUPLICATE_IMPORT + "\n"; + duplicateCounter++; continue; } else { duplicates += toAdd.getName() + " was successfully imported\n"; @@ -63,7 +65,7 @@ public CommandResult execute(Model model) throws CommandException { } model.addPerson(toAdd); } - if (duplicates.length() > 0) { + if (duplicateCounter == importList.size()) { throw new CommandException(duplicates); } return new CommandResult(String.format(MESSAGE_SUCCESS + successes)); From e875e7981bc657518fa58feb0b876947661bd3e9 Mon Sep 17 00:00:00 2001 From: pkpaing Date: Thu, 23 Mar 2023 18:08:08 +0800 Subject: [PATCH 2/2] Fixed Checkstyle --- docs/DeveloperGuide.md | 16 ++++++++-------- docs/diagrams/ImportActivityDiagram.puml | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index c19a2c7cf46..1cfa2ad3031 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -227,7 +227,7 @@ The following activity diagram summarizes what happens when a user executes add- - Path is easily invalidated (e.g. user moves/deletes/renames the image) ## Delete Image Feature ### Delete Image Implementation -The delete-image feature is facilitated by the classes `DeleteImageCommand`, +The delete-image feature is facilitated by the classes `DeleteImageCommand`, `DeleteImageCommandParser`, `ImageUtil`, and `ParserUtil`. The `DeleteImageCommandParser` first parses through the user command to obtain the desired index through using `ParserUtil#parseIndex`. Following which an @@ -243,7 +243,7 @@ which have already had an image added. Step 2: The user decides that the image given to the contact at index 4 is not suitable, and wants to delete it. The user inputs `delete-image 4`. -`DeleteImageCommandParser#parse` is then called to parse this input for the +`DeleteImageCommandParser#parse` is then called to parse this input for the desired index. > **Note**: If the user inputs an index of a contact which currently does not have @@ -276,7 +276,7 @@ directory. - Ensures application does not consume excess storage - Cons: - Extra complexity in requiring file i/o operations - + - **Alternative 2:** Disregard deleting the image file from program directory. - Pros: - Easier to implement @@ -285,18 +285,18 @@ directory. its lifetime of usage ## Import Contacts Feature ### Import Contacts Implementation -The import feature is facilitated by the classes `ImportCommand`, `ImportCommandParser`, +The import feature is facilitated by the classes `ImportCommand`, `ImportCommandParser`, `SocContacts` and `ChsContacts`. The `ImportCommandParser` first parses through the user command to obtain the desired faculty to be imported. An instance of -a `ImportCommand` containing the desired faculty from either `SocContacts` or -`ChsContacts` is then returned. `ImportCommand#execute` is then called, +a `ImportCommand` containing the desired faculty from either `SocContacts` or +`ChsContacts` is then returned. `ImportCommand#execute` is then called, which calls `Model#addPerson` to add the unique contacts into BookFace. Given below is an example usage scenario for how the import mechanism behaves. -Step 1: User starts up the application and sees their list of contacts. +Step 1: User starts up the application and sees their list of contacts. -Step 2: User decides to import contacts from faculty SOC and input +Step 2: User decides to import contacts from faculty SOC and input `import soc`. `ImportCommandParser#parse` is then called to parse this input for the desired faculty. diff --git a/docs/diagrams/ImportActivityDiagram.puml b/docs/diagrams/ImportActivityDiagram.puml index 9d36dc0a591..100499c17f4 100644 --- a/docs/diagrams/ImportActivityDiagram.puml +++ b/docs/diagrams/ImportActivityDiagram.puml @@ -12,4 +12,4 @@ else ([else]) : Display error message; endif stop -@enduml \ No newline at end of file +@enduml