From c944187e3beb29a579468b1354efdcbb56fc562d Mon Sep 17 00:00:00 2001 From: Metilda Chee Heng Er Date: Sun, 22 Aug 2021 23:12:24 +0800 Subject: [PATCH 01/49] Init repo --- docs/.idea/.gitignore | 3 +++ docs/.idea/misc.xml | 6 ++++++ docs/.idea/modules.xml | 8 ++++++++ docs/.idea/vcs.xml | 6 ++++++ 4 files changed, 23 insertions(+) create mode 100644 docs/.idea/.gitignore create mode 100644 docs/.idea/misc.xml create mode 100644 docs/.idea/modules.xml create mode 100644 docs/.idea/vcs.xml diff --git a/docs/.idea/.gitignore b/docs/.idea/.gitignore new file mode 100644 index 00000000..26d33521 --- /dev/null +++ b/docs/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/docs/.idea/misc.xml b/docs/.idea/misc.xml new file mode 100644 index 00000000..639900d1 --- /dev/null +++ b/docs/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/docs/.idea/modules.xml b/docs/.idea/modules.xml new file mode 100644 index 00000000..6049cfe0 --- /dev/null +++ b/docs/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/docs/.idea/vcs.xml b/docs/.idea/vcs.xml new file mode 100644 index 00000000..6c0b8635 --- /dev/null +++ b/docs/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file From 7fd6c5c33e2a7b3b09d7c71ff8a2267135b73331 Mon Sep 17 00:00:00 2001 From: Metilda Chee Heng Er Date: Sun, 22 Aug 2021 23:13:46 +0800 Subject: [PATCH 02/49] Init repo --- .gitignore | 5 +++++ docs/.idea/modules.xml | 8 -------- 2 files changed, 5 insertions(+), 8 deletions(-) delete mode 100644 docs/.idea/modules.xml diff --git a/.gitignore b/.gitignore index f69985ef..3c86ccdd 100644 --- a/.gitignore +++ b/.gitignore @@ -13,5 +13,10 @@ src/main/resources/docs/ *.iml bin/ +/vcs.xml +/logs +/*.logs +modules.xml + /text-ui-test/ACTUAL.txt text-ui-test/EXPECTED-UNIX.TXT diff --git a/docs/.idea/modules.xml b/docs/.idea/modules.xml deleted file mode 100644 index 6049cfe0..00000000 --- a/docs/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file From 80fcbc1e39c0575a223e4a68fc525b0fe561091f Mon Sep 17 00:00:00 2001 From: Metilda Chee Heng Er Date: Sun, 22 Aug 2021 23:24:45 +0800 Subject: [PATCH 03/49] Finish echo --- src/main/java/Duke.class | Bin 0 -> 943 bytes src/main/java/Duke.java | 21 +++++++++++++++------ 2 files changed, 15 insertions(+), 6 deletions(-) create mode 100644 src/main/java/Duke.class diff --git a/src/main/java/Duke.class b/src/main/java/Duke.class new file mode 100644 index 0000000000000000000000000000000000000000..9c865fb0a336b6e2226055326ff2cb15cbb10761 GIT binary patch literal 943 zcmZuw-BQy)6#lja(uQD5OA)JJP$>;4Mf^7ij^Iycs&y<=2fc8%WyL_6)HFeP6<@$> zxhOL_;{*5{K8B;7OSncXZOeNuipVIWs@g&~?Zs&T{+SD%B7<|X zF_R1vU4E*lKgFoZr1KhdOf$qB@zF0?j$jze8^;aBaS@jk%xK7Aw%5JTSjnw(n_vSk z%H<7)R0rF4WU4SQr(j;gWnAfD`>JIa_T7^EL3nGtMNGM_;eL)2EGa0Es+>a%S7~~+ zeIb>uX}FFXG<@+s;CAc3{&ud0X}qG6AD7GPZyszuJTl$q$z&K=bDfsY9ly%$Ko+>> zZqb&IU3wNYYQo##wXpIAmy;OJzdqhKqe?^-pVxPv@@6+*t+;_#7mq9nj>`fTHrto$fp+DSo(w{CCMPAeg5-PA}F4a0ue}oEJ=XqWAuX3 c&@h7$EFnQ>N!$xhBEOJUkeMR&l@PZ27sQp>@Bjb+ literal 0 HcmV?d00001 diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 5d313334..b6a11f1f 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -1,10 +1,19 @@ +import java.util.Locale; +import java.util.Scanner; + + public class Duke { + private final static String GOOD_BYE = "bye"; + public static void main(String[] args) { - String logo = " ____ _ \n" - + "| _ \\ _ _| | _____ \n" - + "| | | | | | | |/ / _ \\\n" - + "| |_| | |_| | < __/\n" - + "|____/ \\__,_|_|\\_\\___|\n"; - System.out.println("Hello from\n" + logo); + System.out.println("Hello! I'm Duke\n" + + "What can I do for you?"); + Scanner in = new Scanner(System.in); + String input = in.nextLine(); + while (!input.toLowerCase(Locale.ROOT).equals(GOOD_BYE)) { + System.out.println(input); + input = in.nextLine(); + } + System.out.println(GOOD_BYE); } } From 742f1dafa1241062c0d6c98d2127155375087f76 Mon Sep 17 00:00:00 2001 From: Metilda Chee Heng Er Date: Sun, 22 Aug 2021 23:25:45 +0800 Subject: [PATCH 04/49] Add better finals --- src/main/java/Duke.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index b6a11f1f..9d32580e 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -3,17 +3,18 @@ public class Duke { - private final static String GOOD_BYE = "bye"; + private final static String END_PROGRAM = "bye"; + private final static String END_STATEMENT = "Bye. Hope to see you again soon!"; public static void main(String[] args) { System.out.println("Hello! I'm Duke\n" + "What can I do for you?"); Scanner in = new Scanner(System.in); String input = in.nextLine(); - while (!input.toLowerCase(Locale.ROOT).equals(GOOD_BYE)) { + while (!input.toLowerCase(Locale.ROOT).equals(END_PROGRAM)) { System.out.println(input); input = in.nextLine(); } - System.out.println(GOOD_BYE); + System.out.println("Bye. Hope to see you again soon!"); } } From 2b350e7335e8e6cc7248c362fed5ca44672142f7 Mon Sep 17 00:00:00 2001 From: Metilda Chee Heng Er Date: Sun, 22 Aug 2021 23:36:02 +0800 Subject: [PATCH 05/49] Add Task class --- src/main/java/Duke.java | 26 +++++++++++++++++++------- src/main/java/Task.java | 19 +++++++++++++++++++ 2 files changed, 38 insertions(+), 7 deletions(-) create mode 100644 src/main/java/Task.java diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 9d32580e..5634b8a7 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -1,20 +1,32 @@ +import java.util.ArrayList; import java.util.Locale; import java.util.Scanner; public class Duke { - private final static String END_PROGRAM = "bye"; - private final static String END_STATEMENT = "Bye. Hope to see you again soon!"; + private final static String DETECT_END = "bye"; + private final static String STMT_END = "Bye. Hope to see you again soon!"; + private final static String STMT_START = "Hello! I'm Duke\nWhat can I do for you?"; + private final static String DETECT_LIST = "list"; public static void main(String[] args) { - System.out.println("Hello! I'm Duke\n" + - "What can I do for you?"); + + System.out.println(STMT_START); Scanner in = new Scanner(System.in); String input = in.nextLine(); - while (!input.toLowerCase(Locale.ROOT).equals(END_PROGRAM)) { - System.out.println(input); + ArrayList list = new ArrayList<>(); + + while (!input.toLowerCase(Locale.ROOT).equals(DETECT_END)) { + if (input.toLowerCase(Locale.ROOT).equals(DETECT_LIST)) { + for (int i = 0; i < list.size(); i++) { + System.out.println(i + 1 + ". " + list.get(i).toString()); + } + } else { + list.add(new Task(input)); + System.out.println("added: " + input); + } input = in.nextLine(); } - System.out.println("Bye. Hope to see you again soon!"); + System.out.println(STMT_END); } } diff --git a/src/main/java/Task.java b/src/main/java/Task.java new file mode 100644 index 00000000..e4f09d5c --- /dev/null +++ b/src/main/java/Task.java @@ -0,0 +1,19 @@ +public class Task { + String description; + + public Task(String description) { + this.description = description; + } + + public String getDescription() { + return description; + } + + public void setDescription(String desc) { + description = desc; + } + + public String toString() { + return description; + } +} From f5980dcdce7de7e6946c35a1da8417061765afea Mon Sep 17 00:00:00 2001 From: Metilda Chee Heng Er Date: Sun, 22 Aug 2021 23:41:39 +0800 Subject: [PATCH 06/49] Reshuffle --- src/main/java/Duke.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 5634b8a7..36a7102f 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -5,9 +5,9 @@ public class Duke { private final static String DETECT_END = "bye"; + private final static String DETECT_LIST = "list"; private final static String STMT_END = "Bye. Hope to see you again soon!"; private final static String STMT_START = "Hello! I'm Duke\nWhat can I do for you?"; - private final static String DETECT_LIST = "list"; public static void main(String[] args) { From 7ccc73616c4267f9153791ceb27caf295933c0ce Mon Sep 17 00:00:00 2001 From: metildachee Date: Sun, 5 Sep 2021 15:22:20 +0800 Subject: [PATCH 07/49] Some small refactor --- src/main/java/Duke.class | Bin 943 -> 2162 bytes src/main/java/Duke.java | 18 +++++++++++++----- src/main/java/Task.class | Bin 0 -> 474 bytes 3 files changed, 13 insertions(+), 5 deletions(-) create mode 100644 src/main/java/Task.class diff --git a/src/main/java/Duke.class b/src/main/java/Duke.class index 9c865fb0a336b6e2226055326ff2cb15cbb10761..128475df35d08e529e6ba8a76cf4b8007842f479 100644 GIT binary patch literal 2162 zcmaJ?-B%Mw6#q>KY*-eAAbx<_#bOD_N3FKDhGH>5NgF^(3Po#mNJd!L?8NK_jcwoh zN7z30h3E1RES}TTXa9!&B|SabJDY?ohnzm_&fGiqcfaqp<9Xb#&maQh879Rw77i$S~-$bD6nB=F!~JEJHN4&3E~v&7IB3v{$s8%{W76 zLOQO;9dDJ}CBe{9L!^>v!bj4X#Tr`ox9QBx3h~>fEXVSu8Cqf^s|?|U%n|lf%5ua~ zDZe3#8NOi?Cv01;$8auIHC^&7dvc~&aIaJ(wAmCk zmCA5;CqC`NTX-(VaH*+ayeg=ye9%FoadIqa3=QPWU@w9HGD%kP0La-E9NZ~ zVEb%oM@*=^8h9T=23E1A;adaixNqPAzM~u{cMUwm_YB>4r1V^`$P0_Y+mbo=R2v>e z@Yn#yhK8(x9E5=}Jc(daF}Db>Oi&05!nWn0nHanH9UTu_KBGENmP#jecyEtEWdUUof^ zrvq6cU|+QmmYlpxE$b0j@H{nc%cfALvE)dgQdMho8u4V^%;{KAqRNfya6#}en=l!} z**xD7GzeMlty$hyeI#6l;aD=Dz6Nfhub$K6ZZc>E<+M#L)mLl5;P|Q5JjSp2KXRWU zpw1S#TgtuuSgk=%y221r{n|)U(kYZ0NvaPXxfMK6b|a2>?x}&T=icv_l+1E}a95U> zGe=iO;D~bD;mMSICW;B}s=f@4Ruvv^nxHoEw8U*!LrFDunPI5WC6==*cSP-0sup6N zXFXXgYxse#o0OD0r2>PIRQ;T=x$6q5&dXp*xX4@3f&}(!b4TwxL}OKABOX4+$Egb+lz_ zV6=kJZ@9dVmVxl&(SZuWf1$O4wnJz@1(BZ_+k5x7(iigeMF|Ufz;twx@lK4On?8{K z(7y<=e@JN57rsiYF^tztUZ+)=>>a&YLHin+yLw1El!b<`U1(7v(Lme6g_Yob0a2?NS)hVD|yudS394ESqPNsxD5Bo72j@Aebse2fAH#b`*HV zVuqq15qM9-njd(AiIP+M+h8N?`a!#zW-Tr-7roXiGbRof4dyK_arwWQjwsO= zefh3IMWAo=_Pqp)a=7L*Pw}o;T;-aa+I!q{J5L05=^x9ZKdCwoWLw+y`o_aMyPN&~ zT>o1>dM^rfL8=kDt^IrMqx){NBRe)52fc2~+wxVARBmN807c63<3W(;I?M81kx`5V zd4yVpyl+G=nno2N>DZkn~6F-2o@wajG^yWO~5aA*JlX zkfj%7WRU`8*{k1Q6+`0bw list) { + for (int i = 0; i < list.size(); i++) { + System.out.println(i + 1 + ". " + list.get(i).toString()); + } + } + + public static void add(ArrayList list, Task task) { + list.add(task); + System.out.println("added: " + task); + } + public static void main(String[] args) { System.out.println(STMT_START); @@ -18,12 +29,9 @@ public static void main(String[] args) { while (!input.toLowerCase(Locale.ROOT).equals(DETECT_END)) { if (input.toLowerCase(Locale.ROOT).equals(DETECT_LIST)) { - for (int i = 0; i < list.size(); i++) { - System.out.println(i + 1 + ". " + list.get(i).toString()); - } + list(list); } else { - list.add(new Task(input)); - System.out.println("added: " + input); + add(list, new Task(input)); } input = in.nextLine(); } diff --git a/src/main/java/Task.class b/src/main/java/Task.class new file mode 100644 index 0000000000000000000000000000000000000000..b684cba80b5b15f2bd84e203e2881f2a55244ca9 GIT binary patch literal 474 zcma)2yH3L}6g^Hu(}XmA(6TYWlmv;63?LQ|Qw2k-?n!DzE+s*U%XfhULSoxDD3DnP3ru2nC-`{=?CIaSVK9vHkp~~dV;y#weIEv@2c&XG^fAxEQuq{Dcxq)lw z{KsCv8Rd&2k=Lpcw8v3-cT)A}!b0E04(jx;ssiob-f!cXOte7F4<2T!0h4L4?PzFrJywnb9M+!kc8; Date: Sun, 5 Sep 2021 17:04:27 +0800 Subject: [PATCH 08/49] Finish Level 3 - Mark as done --- src/main/java/Duke.class | Bin 2162 -> 3950 bytes src/main/java/Duke.java | 39 +++++++++++++++++++++++++++------------ src/main/java/Task.class | Bin 474 -> 646 bytes src/main/java/Task.java | 9 ++++++++- src/main/java/Todo.class | Bin 0 -> 1076 bytes src/main/java/Todo.java | 22 ++++++++++++++++++++++ 6 files changed, 57 insertions(+), 13 deletions(-) create mode 100644 src/main/java/Todo.class create mode 100644 src/main/java/Todo.java diff --git a/src/main/java/Duke.class b/src/main/java/Duke.class index 128475df35d08e529e6ba8a76cf4b8007842f479..9f73da36b5066694f57db9e165a9f148a9105081 100644 GIT binary patch literal 3950 zcmcIn`(GSa75@$_%rXptEFlTxH6(;Ak3iFCYaym4K+Kv2lI$9q)LMt#0VeFuY*h(>$AS1wpAMykl0$^+SYe{|1Z|>otb54%eEhX@t4_q?mhQBzvrC0&;4ip z82~rq-wK9tF2?nYf*5WSpNmbngxh0~@KyzP;%#D2kD(4mGv+WKLp^51>NXi>6qjWz ziVHaft;ox;1p7Hb*ijS|bm1-qML1&H6`zufr6$~sd&Jpt6!(hX`=U6epapM_;(o#O z4h0Y3o#OML*nXFccPr?{dj#>`DBc&v`vv_0@%fyiK%f3 zvE*faNgvMX*8FhFEt=N+sDzd=+j3mpaxdt)k|CivxRFex(iLiadTK&KG?ktVWGUV< zl|FHvTumO~^E4haEz>X$C7C~YmXlH*z5IdR>IzzjH5oIklI_5VM9`d zF`Czli{rLM?E^LMjE2IQuv}x_D0+q*t;t={P)S1gRwS>RmW1u`+e2c5ED5_?Qm&p^ zoYV_m{A7GY!q%LgpUvt$WkY*zWYFRj4>p}2k+3^3&I3VNe{kgzwFDwXa(Zqceo}U+ zm@!V7B4thErA1>%n6Kh>xJ5$SN!xZEx2P8;4R^uLI<1ZPXd6DppO3fUjEYa-lPW%i zhg7@)S7dxz#b@wYo<1DKBPt%n=VW|d#TW2J6<@-a+i-My$x}_zwtgX%2MQzzG-OAv2VfJ8^;<05EReTHI z7M4FQp}lgt0Xh{=;7JLRrs6yJu8i-gcna6Vh3~8Q0e(n-E2;A{BV$FyD%Mo|2;`- zZEIMxlTx0gAVFp}CiKk0%gT2%tH5_nr9@;n=F5(2nG zRqz6S$4@jPA~u?n1fUITE_cwX(V5$_S~JPL~QoSB`~RWpAiX z8(9xDM8dAB`1re`?fO=>;P;_orJoVk5dE;+JgVxmW}wd&jjTzh3`TlK1QKo+?34ScOtK=#@6kc!du{VxyLEk1N{0gl*-J zRF9wrr;s!0`=K!I7%4HJ`f9+m42sIkU@{wZM@$ZuNL2?d!#4y~Z@@_C3t%cFS2p9CCW3ZXO0xEe;UJ}!NdQJ?ODyPaLKtjAm z^h1SFW)vxv9mDk}Vn9aXt5-$@nK@m9*`}QbB^65S@N3r#p_p z(7h1$DUj!ns?)la%^6OQe=$7Dg9LA76W^vb+v zQ*eA^{qA7yZfAL-YG=x)-l4bgq1Zwk>{NZ%Zy`w^vVzIXT?p@u#DmH6AxzY6Io zE+mZd+vsh|XcD8JW(d|^{t8y5f1N9=puWPdh#j<%e=Cl2Rfk)-<~x8ZarY>H1xI`T zzzQNW*U&JqP9+o~SA=Zg{|{gr_dEDUVS6CxBn9z>5eT{|5Y*Mbf+%G)fsYlX4(n(Z zE47ZVoU#+XQJv_--ays_`A^}Ebc04o=g=T*z>72|wuPo#N9)CFXj{eBmp6?8s}u91e$hHKchg59w_E7*3h$tgIBSA@H%=g9v&nQw^ngz4e?hrrM_&+)t5@b zmA)XVbzUk@F(n|rqS%ji9KbI0K*K@etCy*bV-kJ11O3Qi0QX}M4`GP!)FXJD98WWG z&l6vNA*N1K%04u_#7m7b5;9t4#AI~&U&3Q3*3+hlzUPOR$no*AQ`p3G$^CSBfCSfc zER^^dA{5?56L+x;c4G(jP!ii{AgMb@dJ{u%n746wf%iM*dGi;o3Ixg)Z#dgNgEi3o(7r1cY(s97^ro*(0yzhC=ea>^f-u&JFPq_K$ z$@Z_n3BI&=j^h^HyxhSnoY2;*2CrH8IT;bkw8a~|sokd|C}s`Ln9LcR)%3S4LcFby zjKMigI^MxMWGyDinau0^yh*|$$h%tdg0?Q2e)0x|`+v^#n)yPmaCL6}jKXT0`NHXo z1vjU%ouPcgSy;(AYXzsYT5-Qs39nOMaer4w+xK6pKPY%=dMaDc{;xcPUV}?++#A0% z$dJu@TsC;$rpOhW5BN~w(?pw(_*fC1snr_w#=5hXt2A!Z%Jr@QS52sGT?5AH8S8ODx+AA}Xs|CFzOLru4o$EFUlA7KYO1t0q zh9|?z&TVI6)u}E{oG&d`78+8@o-5y2U#c!jrS+w|6;Vo#WZVb-$#Y^ZR)iW$W=67m z^j(E1h1sY*3++knXY6{XEb2(OPmQ~e{r%oVGUML&L|tzn>qh*s*cDN5%H>M=`mp_=SBqF8IhkY>R@D5e~^YEDDF^R&x7OTd1GK zP#l#r&~^ss&?A>L!!(ga`^1El_f$O9!t(=1Hu1)N*HZBozTfb-2yA0O3-fEGHl9A# zf}XZuL}HPLZP6*&LyQoXACkcHA0G9ukWy{(sJO;Rw{yZva_f}QRCBaN$7RVkx-B9) z#a^|Ycr{0=?ja&0*;N`Br3qe?PIRNcNCCQpl1M~s3Ev@9+@y1huB=Fhb31eww}{M- zZ4zzK6N$Cx{hstQ*gPQkJFN6W4sOtu-oalS+v3ne`r6?ePakPznMAv=-LA*w?+J%6 zWeZW_9F!gEZB5Abrp20*-CU4e6s3JfMy)5(jqeEq1|fqAF*pFA>-&xBz~ WOSiepr=mP1xKqBI65s3XbLM~17s_z} diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 98ed50f9..591958a1 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -1,4 +1,5 @@ import java.util.ArrayList; +import java.util.Arrays; import java.util.Locale; import java.util.Scanner; @@ -6,34 +7,48 @@ public class Duke { private final static String DETECT_END = "bye"; private final static String DETECT_LIST = "list"; + private final static String DETECT_DONE = "done"; private final static String STMT_END = "Bye. Hope to see you again soon!"; private final static String STMT_START = "Hello! I'm Duke\nWhat can I do for you?"; + private final static String STMT_DONE = "Nice! I've marked this task as done: "; - public static void list(ArrayList list) { - for (int i = 0; i < list.size(); i++) { - System.out.println(i + 1 + ". " + list.get(i).toString()); - } + public static void list(ArrayList list) { + list.forEach(l -> System.out.println(l.toString())); } - public static void add(ArrayList list, Task task) { - list.add(task); - System.out.println("added: " + task); + public static void add(ArrayList list, Todo todo) { + list.add(todo); + System.out.println("added: " + todo); } - public static void main(String[] args) { + public static void markDone(ArrayList list, Integer taskId) { + list.stream().filter(t -> t.getId().equals(taskId)).forEach(t -> { + System.out.println(STMT_DONE); + t.setDone(true); + System.out.println(t.toString()); + }); + } + public static void main(String[] args) { System.out.println(STMT_START); Scanner in = new Scanner(System.in); + ArrayList list = new ArrayList<>(); String input = in.nextLine(); - ArrayList list = new ArrayList<>(); + ArrayList tokens = new ArrayList(Arrays.asList(input.split(" "))); + String instruction = tokens.get(1); - while (!input.toLowerCase(Locale.ROOT).equals(DETECT_END)) { - if (input.toLowerCase(Locale.ROOT).equals(DETECT_LIST)) { + while (!instruction.toLowerCase(Locale.ROOT).equals(DETECT_END)) { + if (instruction.toLowerCase(Locale.ROOT).equals(DETECT_LIST)) { list(list); + } else if (instruction.toLowerCase(Locale.ROOT).equals(DETECT_DONE) && tokens.size() >= 2) { + markDone(list, Integer.parseInt((tokens.get(1)))); } else { - add(list, new Task(input)); + add(list, new Todo(input, list.size())); } + input = in.nextLine(); + tokens = new ArrayList(Arrays.asList(input.split(" "))); + instruction = tokens.get(0); } System.out.println(STMT_END); } diff --git a/src/main/java/Task.class b/src/main/java/Task.class index b684cba80b5b15f2bd84e203e2881f2a55244ca9..3b16348ef4740d9825c699bea098123185c927a6 100644 GIT binary patch literal 646 zcma)2%TB^j6r9siprr!x5ML~GRjQGN3l|zU8WR$t3kdrHH_cUSO(}ktCK3}Det;ik zJQoowVd0{4(>XJ9CgJ|*tOr)@>U@L>|40Z^)p%@P$`4G!6Ae7p--lNwX zd4b>T#E}gAQ-UUkgmPli3S!}lh)3x&8OZpY;5do-+?im09E~0!brB8)q0p9rxSrhi zMb!2BBW4U=#4TP`bs8(IggnnLlWi-1gp0oU@sh5(qMT}yjl*vf!RmyQXdtenDq?oM z@!gTSgbfS3HnK2nq>Gq%iqDy*#hFS^FkD(}~@@dbv3bKU>| literal 474 zcma)2yH3L}6g^Hu(}XmA(6TYWlmv;63?LQ|Qw2k-?n!DzE+s*U%XfhULSoxDD3DnP3ru2nC-`{=?CIaSVK9vHkp~~dV;y#weIEv@2c&XG^fAxEQuq{Dcxq)lw z{KsCv8Rd&2k=Lpcw8v3-cT)A}!b0E04(jx;ssiob-f!cXOte7F4<2T!0h4L4?PzFrJywnb9M+!kc8;M_uf7C+;eB{uir;M0X)LPEHaqMz`_*^vlgyub4~~6 z^8{Elaot3T!EpTN(iIGBlbpwn>!>FT<#KbE@AKM#yW6#v@*H=&9*eBIN^A?SUU|!q zYRDd?=bDZyUXS)V!fW%+fFh6>E+r&a`Duu4;WYY>eB;VvO{^r>|(^25#CYV2WY#nUu;`9v^N9wIh3e z&Oq5h#YPp&BwW+zgZq5~|KBe|!s#&-VhWGj&SC|(s1vqY++rV!jA43@_eDdxU9R3a zYKJUeaaZ{aui`g(Oc3KdeYsKOjH@xRsKqpVoRJv3)QUXTY~&-M;DUims~1 zdy6ObtbFn_()m=A-1Ktw5XKQ{!B;{gpk;<73uI5>BKal~ g_EQs=h-NwfUB;aN#!$mO+{O&9k#AACB7F;g0PyJc2LJ#7 literal 0 HcmV?d00001 diff --git a/src/main/java/Todo.java b/src/main/java/Todo.java new file mode 100644 index 00000000..e67a822c --- /dev/null +++ b/src/main/java/Todo.java @@ -0,0 +1,22 @@ +public class Todo extends Task { + public boolean isDone; + + public Todo(String desc, Integer id) { + super(desc, id); + isDone = false; + } + + public void setDone(boolean done) { + isDone = done; + } + + public boolean isDone() { + return isDone; + } + + @Override + public String toString() { + String status = isDone ? "X" : " "; + return id + ". [" + status + "] " + super.toString(); + } +} \ No newline at end of file From 91bb2451295b398bfe25b12527b21b1bc917f81b Mon Sep 17 00:00:00 2001 From: metildachee Date: Sun, 5 Sep 2021 17:50:57 +0800 Subject: [PATCH 09/49] Finish level 4 - Todos, Events and Deadlines --- src/main/java/Deadline.class | Bin 0 -> 1231 bytes src/main/java/Deadline.java | 22 +++++++++++++++++++++ src/main/java/Duke.class | Bin 3950 -> 4694 bytes src/main/java/Duke.java | 36 ++++++++++++++++++++++++++++------- src/main/java/Event.class | Bin 0 -> 1225 bytes src/main/java/Event.java | 22 +++++++++++++++++++++ src/main/java/Todo.class | Bin 1076 -> 1079 bytes src/main/java/Todo.java | 2 +- 8 files changed, 74 insertions(+), 8 deletions(-) create mode 100644 src/main/java/Deadline.class create mode 100644 src/main/java/Deadline.java create mode 100644 src/main/java/Event.class create mode 100644 src/main/java/Event.java diff --git a/src/main/java/Deadline.class b/src/main/java/Deadline.class new file mode 100644 index 0000000000000000000000000000000000000000..797bc1faaf01903fa71127675d7a346120327cdf GIT binary patch literal 1231 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 list) { + public static void list(ArrayList list) { list.forEach(l -> System.out.println(l.toString())); } - public static void add(ArrayList list, Todo todo) { + public static void add(ArrayList list, Task todo) { list.add(todo); System.out.println("added: " + todo); } - public static void markDone(ArrayList list, Integer taskId) { + public static void markDone(ArrayList list, Integer taskId) { list.stream().filter(t -> t.getId().equals(taskId)).forEach(t -> { System.out.println(STMT_DONE); - t.setDone(true); + Todo task = (Todo) t; + task.setDone(true); System.out.println(t.toString()); }); } @@ -32,10 +36,11 @@ public static void markDone(ArrayList list, Integer taskId) { public static void main(String[] args) { System.out.println(STMT_START); Scanner in = new Scanner(System.in); - ArrayList list = new ArrayList<>(); + ArrayList list = new ArrayList<>(); String input = in.nextLine(); ArrayList tokens = new ArrayList(Arrays.asList(input.split(" "))); - String instruction = tokens.get(1); + String instruction = tokens.get(0); + Integer id = 0; while (!instruction.toLowerCase(Locale.ROOT).equals(DETECT_END)) { if (instruction.toLowerCase(Locale.ROOT).equals(DETECT_LIST)) { @@ -43,12 +48,29 @@ public static void main(String[] args) { } else if (instruction.toLowerCase(Locale.ROOT).equals(DETECT_DONE) && tokens.size() >= 2) { markDone(list, Integer.parseInt((tokens.get(1)))); } else { - add(list, new Todo(input, list.size())); + Task task = null; + System.out.println(instruction); + switch (instruction) { + case DETECT_ADD_TODO: + System.out.println("entering todo"); + task = new Todo(tokens.subList(1, tokens.size() - 1).toString(), id); + break; + case DETECT_ADD_EVENT: + ArrayList taskInfo = new ArrayList(Arrays.asList(tokens.subList(1, tokens.size() - 1).toString().split("/at"))); + task = new Event(taskInfo.get(0), taskInfo.get(1), id); + break; + case DETECT_ADD_DEADLINE: + taskInfo = new ArrayList(Arrays.asList(tokens.subList(1, tokens.size() - 1).toString().split("/by"))); + task = new Deadline(taskInfo.get(0), taskInfo.get(1), id); + break; + } + add(list, task); } input = in.nextLine(); tokens = new ArrayList(Arrays.asList(input.split(" "))); instruction = tokens.get(0); + id = list.size(); } System.out.println(STMT_END); } diff --git a/src/main/java/Event.class b/src/main/java/Event.class new file mode 100644 index 0000000000000000000000000000000000000000..e73b9ad60be54596b87073c081a45a14c1f78165 GIT binary patch literal 1225 zcma)5T~8B16g{`l-LfoH3y7#-MbLim;WtW+2~>#0q7Nl%Bs>i5q%18n&F(>LN{JHhX90-ZST(duQgy&(rS!mQZlu;K~37a5Xg75|~V2Dx6*q zBk2^QW^BybxJ8HwLr9hO#gSNS2vu7w8{bp40>OIfDbGA3EN9M#dwMpMku~WTvTq3e zMO~GIWXV(V)#1Ue^tZ%rgFW$@G%K8YG?P6~#^InH9_x}kjBI!h8Y?E*5czb+yR2t}R{FjQ+QAgiII3kqV>DvAp29RxFX;^GSGB!blgSgS)uL zAzDapukCEpPMXpgVV2XBC5#`4x-4o{5$3ID_IMT;p-e#7iR$>BHA3Gx=>PF_IUyVO z!;UNwX8yLoQ%AZkJ6EVJYF$)}_K$5m;Tu)bx_;OsxEo4Izt|8#AX({$sL~EcyZJAK zsy1XW)81IdQb0^g1>yx!fH6;p`T)}bhhMx*Q*S+KE8m_1itH*JKe-ZE|%l4->F1FT&B487Cx4s(JeBl#h8@Gn_Xh@WQazK=+x z`adC_ikEn4<#Q*n!<45;0Ab!(OKO{IgqcQhiM=*r?uw0ZuHbSDG=WDvhQc1;F&<)q MdjsYmmPfex3l+I0GXMYp literal 0 HcmV?d00001 diff --git a/src/main/java/Event.java b/src/main/java/Event.java new file mode 100644 index 00000000..58bf9ec5 --- /dev/null +++ b/src/main/java/Event.java @@ -0,0 +1,22 @@ +public class Event extends Todo { + String at; + + public Event(String description, String start, Integer id) { + super(description, id); + at = start; + } + + public String getAt() { + return at; + } + + public void setAt(String start) { + at = start; + } + + @Override + public String toString() { + String status = isDone ? "X" : " "; + return id + ". [E][" + status + "] " + super.toString() + " (at: " + at + ")"; + } +} \ No newline at end of file diff --git a/src/main/java/Todo.class b/src/main/java/Todo.class index 18e52ce045ca98c53266cf2bdfb4a5966d4fa900..c7478b5a7a64780c03824ce0c2873bbe786d9645 100644 GIT binary patch delta 20 bcmdnOv7KW>4kJ4^qn<)^NbKeU#v@DsKX?W3 delta 17 Ycmdnav4vwp4kHT(qn^U%V#Xs(051^);Q#;t diff --git a/src/main/java/Todo.java b/src/main/java/Todo.java index e67a822c..8a13013d 100644 --- a/src/main/java/Todo.java +++ b/src/main/java/Todo.java @@ -17,6 +17,6 @@ public boolean isDone() { @Override public String toString() { String status = isDone ? "X" : " "; - return id + ". [" + status + "] " + super.toString(); + return id + ". [T][" + status + "] " + super.toString(); } } \ No newline at end of file From 80bb7920bbb045e957fa7c37a8563dab691c52a4 Mon Sep 17 00:00:00 2001 From: Metilda Chee Date: Sun, 12 Sep 2021 21:59:39 +0800 Subject: [PATCH 10/49] Add ,essage class --- src/main/java/Duke$1.class | Bin 0 -> 567 bytes src/main/java/Duke.class | Bin 4694 -> 5223 bytes src/main/java/Duke.java | 35 +++++++++++++++++++++++++++-------- src/main/java/Message.class | Bin 0 -> 845 bytes src/main/java/Message.java | 4 ++++ src/main/java/Task.class | Bin 646 -> 1247 bytes src/main/java/Task.java | 1 + 7 files changed, 32 insertions(+), 8 deletions(-) create mode 100644 src/main/java/Duke$1.class create mode 100644 src/main/java/Message.class create mode 100644 src/main/java/Message.java diff --git a/src/main/java/Duke$1.class b/src/main/java/Duke$1.class new file mode 100644 index 0000000000000000000000000000000000000000..e51d60ed06c98e44db2078a64670cc3c51358962 GIT binary patch literal 567 zcmYLG+fLg+5IviiICeM11qvy>aC0HN6!jTYsY*<1HF2c4g$Ewc##to>V^?0Aeo~)X zB!p1K2lS(=&bo+7*3O)>v**l=fB(6?18{(jjT-7E430T87|elGN=zj~<5DE0R1Cbc zd(ywB_boJGnXow?fm2bhJeTfUh6OkL78lWMAilZ}615ZGBKgN0^Khuf8;ype(=Wlu z>kdBze(3cWtOse`$pXhBmZ*&^pTwz180wu}-^4P*>Y2C{dx=P=dqEbK(d;mm$;8X^ zEY~J&j%V7W_0Pl)j^6kEo{8rS&i|Lg@tKSYhUP((#A#f-s|=19jBYleq38Q?DueQ3 zEc4G|oDkCr3lW{uSohctvoeq5VXQALJ^mXlPfxuxN-`Cv(}65z*~G+alGO!d7f4ln z%oI6uKTT!cO@vZXIqS5}Rr(RkY3qgRjF=aAN%0k-G3t~7og1*bU-lKupZaTE-Xq|m5zcCb!4hjDDu%|IV8ut8i6n^donOXqgQ OxY(g+S3ObUH2(rPWN%pj literal 0 HcmV?d00001 diff --git a/src/main/java/Duke.class b/src/main/java/Duke.class index d40924f4d0c5b18928925951d51874da9837386d..55321a086738c49b353bad29a45a7b82fc9bd13a 100644 GIT binary patch literal 5223 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 I96|qo0REe@q5uE@ diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index ba8d225c..1a02f213 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -15,13 +15,15 @@ public class Duke { private final static String STMT_START = "Hello! I'm Duke\nWhat can I do for you?"; private final static String STMT_DONE = "Nice! I've marked this task as done: "; + private final static String ERROR_PREFIX = "Oops I did not quite understand that."; + public static void list(ArrayList list) { list.forEach(l -> System.out.println(l.toString())); } public static void add(ArrayList list, Task todo) { list.add(todo); - System.out.println("added: " + todo); + System.out.println("added: " + todo.toString()); } public static void markDone(ArrayList list, Integer taskId) { @@ -33,6 +35,18 @@ public static void markDone(ArrayList list, Integer taskId) { }); } + public static void printErrorMessage(Message m) { + switch (m) { + case ERROR_UNRECOGNISED: + System.out.println(ERROR_PREFIX + "Unrecognised operation."); + break; + case ERROR_INVALID: + System.out.println(ERROR_PREFIX + "Invalid input."); + break; + } + } + + public static void main(String[] args) { System.out.println(STMT_START); Scanner in = new Scanner(System.in); @@ -41,6 +55,7 @@ public static void main(String[] args) { ArrayList tokens = new ArrayList(Arrays.asList(input.split(" "))); String instruction = tokens.get(0); Integer id = 0; + String taskInfo = ""; while (!instruction.toLowerCase(Locale.ROOT).equals(DETECT_END)) { if (instruction.toLowerCase(Locale.ROOT).equals(DETECT_LIST)) { @@ -49,27 +64,31 @@ public static void main(String[] args) { markDone(list, Integer.parseInt((tokens.get(1)))); } else { Task task = null; - System.out.println(instruction); switch (instruction) { case DETECT_ADD_TODO: - System.out.println("entering todo"); - task = new Todo(tokens.subList(1, tokens.size() - 1).toString(), id); + System.out.println(taskInfo); + task = new Todo(taskInfo, id); break; case DETECT_ADD_EVENT: - ArrayList taskInfo = new ArrayList(Arrays.asList(tokens.subList(1, tokens.size() - 1).toString().split("/at"))); - task = new Event(taskInfo.get(0), taskInfo.get(1), id); + ArrayList addInfo = new ArrayList(Arrays.asList(taskInfo.split("/at"))); + task = new Event(addInfo.get(0), addInfo.get(1), id); break; case DETECT_ADD_DEADLINE: - taskInfo = new ArrayList(Arrays.asList(tokens.subList(1, tokens.size() - 1).toString().split("/by"))); - task = new Deadline(taskInfo.get(0), taskInfo.get(1), id); + ArrayList deadlineInfo = new ArrayList(Arrays.asList(taskInfo.split("/by"))); + task = new Deadline(deadlineInfo.get(0), deadlineInfo.get(1), id); break; } + + if (task == null) { + printErrorMessage(Message.ERROR_UNRECOGNISED); + } add(list, task); } input = in.nextLine(); tokens = new ArrayList(Arrays.asList(input.split(" "))); instruction = tokens.get(0); + taskInfo = tokens.subList(1, tokens.size()).toString(); id = list.size(); } System.out.println(STMT_END); diff --git a/src/main/java/Message.class b/src/main/java/Message.class new file mode 100644 index 0000000000000000000000000000000000000000..45219b82fb81e8786faf3839672e585f177367ee GIT binary patch literal 845 zcmZuuZEMp|6n<`Anl`2{t980=bM8%(PB;AErBTJ!a_PewL zHxy-`{ZZn%S!@F}7jil0KIb{ldCu=Y-+uw9V_$*5puBg(&>6ZpFi09?WEjd;x7+D{ zI&F8YM(16-X@FE2Gl=QLokp9=LBk-bYKew$JT5dQIXhw0-etg|8Z*oAwBl zs(fqoB2&DBZNlwRv_&`n)G5?&DBPj=g(8OM^v}d^q?GpaVulyutXgKZTRgl2Tf__8 zatJa121Gi5Qrla*!OGVKa-A{)jFQR?PnsBzC<`pfKf%t#DMb5BnnJM`du36Bk(3=L uWt%^!s=O}V;ORBQIM|TlK)J=UYp8P-g;<q3q#G-9M>RqA42TO<~cuCsegHJ;{DMPn2&F++hf8x(j zBbxBw5Aa7B&#(oz*ch|f*_}Dx`ObGPyFY)O{Q$6qavCwj9Spe`MuK7dh#&Kk$5pfR z_TWg=4MSo}DrsIY#Pfyy6p~0eNV^z;+Xt_n1V*$8rMu*m-8(0ey7bPM%2bUnc)OgT zn4>PnFwQX3<}Fdts?N=OX%6WvFkG2{VIvpK3and zSB6otZ%36(^#L!nj0RV5Nuxs}L%OQFeqHQH8!%;Sux_hKEq|%C35?G>uZ20(jbJQ+ z^)yPj@8E&$?L&s#pDB{+Shqweqz&7>!|O)-Ck!8>wdesu(pOwHJQ3vfv~G1f(eC%e zM@rV`SUc&60q_qId^p#A#Vwkq7=0!7rjeo*b_{791~s1S49m3JMw~8SzW5#N3!K%p zGh73{VWPNpikaf-DHcAHo#8gE)8uIxhLFGn9NH&|HAU7OR(gyJ^kf!Q{EC@Rm#&HP zLzmV&xJ#=I9)&Jkg^m*_PZ2`sGG$_ONnBB6e>=bwY046^@PE{^lyZ^WVpzo*J(J{m SkM2i!Lc27*J;ifuV(vGk&?vtE literal 646 zcma)2%TB^j6r9siprr!x5ML~GRjQGN3l|zU8WR$t3kdrHH_cUSO(}ktCK3}Det;ik zJQoowVd0{4(>XJ9CgJ|*tOr)@>U@L>|40Z^)p%@P$`4G!6Ae7p--lNwX zd4b>T#E}gAQ-UUkgmPli3S!}lh)3x&8OZpY;5do-+?im09E~0!brB8)q0p9rxSrhi zMb!2BBW4U=#4TP`bs8(IggnnLlWi-1gp0oU@sh5(qMT}yjl*vf!RmyQXdtenDq?oM z@!gTSgbfS3HnK2nq>Gq%iqDy*#hFS^FkD(}~@@dbv3bKU>| diff --git a/src/main/java/Task.java b/src/main/java/Task.java index d4668a79..3160aee3 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -3,6 +3,7 @@ public class Task { Integer id; public Task(String description, Integer id) { + System.out.println("set task: " + description + id); this.id = id; this.description = description; } From e1e06d7e5e1281bf289f8bf44c17fe5eea2fe137 Mon Sep 17 00:00:00 2001 From: Metilda Chee Date: Sun, 12 Sep 2021 22:01:04 +0800 Subject: [PATCH 11/49] Add .gitignore :3 --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 3c86ccdd..e27c23c5 100644 --- a/.gitignore +++ b/.gitignore @@ -18,5 +18,7 @@ bin/ /*.logs modules.xml +/*.class + /text-ui-test/ACTUAL.txt text-ui-test/EXPECTED-UNIX.TXT From bbd5f6ff259e51ad6b517bff7d3e373c5dec3351 Mon Sep 17 00:00:00 2001 From: Metilda Chee Date: Sat, 18 Sep 2021 17:17:23 +0800 Subject: [PATCH 12/49] Add maven support --- pom.xml | 16 ++++++++++++++++ src/main/java/Duke$1.class | Bin 567 -> 618 bytes src/main/java/Duke.class | Bin 5223 -> 5477 bytes src/main/java/Duke.java | 23 +++++++++++++++++------ src/main/java/Message.class | Bin 845 -> 902 bytes src/main/java/Message.java | 3 ++- src/main/java/Todo.class | Bin 1079 -> 1079 bytes src/main/java/Todo.java | 2 +- 8 files changed, 36 insertions(+), 8 deletions(-) create mode 100644 pom.xml diff --git a/pom.xml b/pom.xml new file mode 100644 index 00000000..364628f1 --- /dev/null +++ b/pom.xml @@ -0,0 +1,16 @@ + + + 4.0.0 + + metchee + duke + 1.0-SNAPSHOT + + + 11 + 11 + + + \ No newline at end of file diff --git a/src/main/java/Duke$1.class b/src/main/java/Duke$1.class index e51d60ed06c98e44db2078a64670cc3c51358962..e84ac63a66f3a2594f2e3b74fd5a3c74e10627e0 100644 GIT binary patch delta 220 zcmX|*I}QP16otQkOlBC0kr3kj{yjR0XtWApLP8=cokft?gUlk-6eJ1@um}ra58|3a zbH8)$xhJ_-^JO}Z&+QHj=p3A9CW1jWMh;iu487T6wVsUT3!B2>y;V(rqZ;+RoGUj? zl-N%ZrbtOx7PluP3i|#@>D?LoOy)w|njSI7CkZ1YNRcE>m4;B$r6)9~NX-h$S~7@Z eEp17>|G=asfk9oWh|@A#!A8>-I>9$0-0&B2EE+Zd delta 170 zcmW-axedZV6hz;ySJ)T_4nSDkhrR0}Xn~jzi87EV0=W_*Bm!bY5fnfXh_REIH#1-Q zUw3!u`}cSPJL+rtiDIUWHD^;b7vrmm29p;I$XX&{#$3KoIuVJWZeAuFZ&>;a88f0_ oiOr>W*n`PP*Faa5mJ0HYbP7zEpoQo;G8l)Sx+JWa6ph z5*1y9w@653Xiaj&NW^2Icye$!!(; zGMtGgA{+aRWYQe+B8W`_o6$pX#FK=|E*le1Mb=2C8#6KeOo zqrgoF5!9r)JJS_UnkwE&ppXUwTNU&P#9&%!*D7B>1{A~vwqu9&v}<+qPU(gN=}ps- z?A>&x5(%?U=GVTkM}xqiz%C3~OWh$~2Ez(Q1m1<+R?K~6g^F7V@ZvpquY%hIvbf!P z*xjNUxKrSLc)#_6duhwv1n1UKQ*LLEzy~mk;4ya%8;P`vy#$wJM#Cz6NMJ8MOt`|@ zr3M=o_9*xWp~9vhVI=z_D|YvpgK}S9ydC=mEZlDe)dtVU1U`;WSRHD8gNlRfFqTSk zG=WbFdI%vhJV?>vm=KyeBy8h>=k+ z!S*Ypy@ouFOWY(OTEzLRwKD?NUPa7*QsTFcDmckOmKTF)IDzAmo398|;Hy?rt(_Hs z3v~f@QzvtLM&RrChV>?8fm6k|to>>OecLLi;rcN=FYq0Fm!PE0%yOoLx7)Nu9%(hc zFYp8W&~kh0oEhw~!rqgv-w_&Qy;?K1IX>+Y*J&%Poua>5FKPL**EReH|5b27;0?m# zV?HN2$Z_9uv+H~O9&+(M$u00toG-_DUQjjilBSSPpq_;FvUn<6#<>}>m>G+Ps2sBx zG*emy1pbbHloMBmx2bEBk>1h1a0@GgQaM}TZ#b`#&bD@Qv8_sT2xakPIx{qEmnyFj z#2VQ~oe3kIHq#2#a7LG_C!QQhS^hHJ#hp@PQCW?3O<6GeWBde!pK`}La2Kj@rbND% z<)4+v2Uz}jiTnu5zbKK9u>8vs`7xG%RU)5e`PU`#22^G7Ldn9j4ERln{9EoUE*^OJ zd6u_0m*3oOaEB*A$9O{cJwK%yP#DbZ1E&pL!1>5kEj-B@EZP1#Fu@BI?pz&OB15U_{-{0@6`WAUhgW zboV&koyQ%4yYjf_AdOv;?`8P_Dw_-VV2(PX>NxHz;G;QeyM#DkBkFWl9*5kAp*QO; zp2`RXe3~N^@Ia0fimJLh>UFefx;Kx9j&Ne@c{tHFkX^}>TK6+U2l?Gn<2rLazdLkq z;1S#N0%x0+Lx|-gwj6Xxxt!(4Y}w;((<(K29QX5(KUpL?j}{&=W=L0ThQ@kzMfXhL zSX9knn`A~;0$<7_dyyO86!N{gugH(?E2bfB3ex7yMVqP1bc!jQ=+(tV6H#LF<*3@M zs|B3O!58&T^Jbq3?`ZKPz9ws%&rS4Z|L+0Gy}KvzlnrHCZI1JJI*)Hgm1gGKKET|C zRk93D+ok0|KXxFAeRPNp(}Ua{)1~$RnwX6?s9awaxQcsWDMDOlt!U5UYAi!1KUd*x zxDFlcqLZDhWH-w(h!q&&`6z4mV>N$nuE7zkr4ZIp6aQCuD>l$o=%%%}mIknqc3?Bz z#(xA3;RZU4n|TX2(nGk3j$$i!ejlAcjGl){XRwXVp`TtscEI7pc88Bc%6eZ8{~H`j zRqz)D-3o*PQtB9;-#cNPrM^CvXuioiy;RGCZ zP0W=vJRd~N-U(GI+VfAd>jV$1L<&sw?JUxSl~ poa7+|L^EvJPvulm)KnHVSJ?V0l9x_^eJ$fR%2k?6^Qad3{{W>9HT?hp delta 2309 zcmZ`)33O9M6up!DOHT2=N@rIsebxH}~Cnb7%f!N6F42{iW_r zn*mg^tc`lPl~sx=Ykuy;P}po}X$%D;X28=j(+vBg!Isbv4L*irC8Jk$XtuvO81Mu` zGiOCjE-7U5ckBZ_(^ofQo>msN$s z{y9EkR1{Cra6QojEg{n4xRGNqPNqO4IF|xpEa6xRK@QCHha+ZnD6s-xlc-j+?YD5; zira*#R-9CiWgN?8rZ(LlnLer|Kvu0JooGv-MZ;pJIMK!D?O2G67n#oN$IXJgL6KLhaDJ+4vxpMNjzuIw?D!0BsPmZ_JO+etc#;J zo)))iM_M&JD}L4T*>fVtQ8I8Hp67T0FEXeRGdh|)qk4<#iYMvlhnG2C!KBupaSvUqVtC*6u#b=`h`2ztn;Po&UGBfNv^m4X)%emezUNBEr-yn^t%DR>p(_fqg0!rM~tGlbty!Q+qD>R0Ifq(3#gS*y<`)OAP(mt zzD{F67V)#)_>{U9d`5uIf=m`pS7E-CO^21<2Fd3Txo?vBIWg&LNHEWK4US1>k6<2g z2PIiw5Q~l)l^~0mL2Oyf@olImiKA-B{RHS&Mvp8-j`d6S3)_(8u8t$W6;9bbjk>aQ zOJb?n`{73*=!*@*{g4QJ9Z!{Lc=y;b?WEhUY@fd;O7=;S@ zv#dk|p(dPwD{&&0k!dS2l4W8v8-y{el>P@|!|BSYL^Yd&Q`uac#xBD+wi@GEC(dMD zIE!t?MD_|Mvo}%8zC<1S0q3xNm}0SDYU0p(k$!+?Q&oJeqDBQ*QUC8dOyBX4ZXBbc zA4OS42G1${3n%Tx2z?)HN4a$DIu5&gjylHB*2>Mzm5bd%i!JHGI^SU0iLDf&&#rIM z0J=29qRiZKxtF>tsQ}_r$i~2mDB_ yLYzwMp list) { + public static void list(ArrayList list) throws Exception { list.forEach(l -> System.out.println(l.toString())); } @@ -38,10 +38,13 @@ public static void markDone(ArrayList list, Integer taskId) { public static void printErrorMessage(Message m) { switch (m) { case ERROR_UNRECOGNISED: - System.out.println(ERROR_PREFIX + "Unrecognised operation."); + System.out.println(ERROR_PREFIX + " Unrecognised operation."); break; case ERROR_INVALID: - System.out.println(ERROR_PREFIX + "Invalid input."); + System.out.println(ERROR_PREFIX + " Invalid input."); + break; + case EMPTY_LIST: + System.out.println(ERROR_PREFIX + " Empty list."); break; } } @@ -59,7 +62,11 @@ public static void main(String[] args) { while (!instruction.toLowerCase(Locale.ROOT).equals(DETECT_END)) { if (instruction.toLowerCase(Locale.ROOT).equals(DETECT_LIST)) { - list(list); + try { + list(list); + } catch (Exception e) { + printErrorMessage(Message.EMPTY_LIST); + } } else if (instruction.toLowerCase(Locale.ROOT).equals(DETECT_DONE) && tokens.size() >= 2) { markDone(list, Integer.parseInt((tokens.get(1)))); } else { @@ -79,15 +86,19 @@ public static void main(String[] args) { break; } - if (task == null) { + try { + add(list, task); + } catch (Exception e) { printErrorMessage(Message.ERROR_UNRECOGNISED); } - add(list, task); + } input = in.nextLine(); + System.out.println("input: " + input); tokens = new ArrayList(Arrays.asList(input.split(" "))); instruction = tokens.get(0); + System.out.println("instruction: " + instruction); taskInfo = tokens.subList(1, tokens.size()).toString(); id = list.size(); } diff --git a/src/main/java/Message.class b/src/main/java/Message.class index 45219b82fb81e8786faf3839672e585f177367ee..bdcba2d96ebabc52398f1a900d5a79b8df44adfb 100644 GIT binary patch delta 498 zcmZWkO;5r=6r6482W!z%)JjDWL=g~BuX4}>2Mr{~f=R={cp#oU@dLPd@J9F}S`r`{ z4QCVolJRwI>cQP)-_F~aH?v>rqsBkKUq1jea5Cb(hRVR3?W>M=+q!T&aWE_!Sb@o) z6>iR3-KI-~UaQ?74DRmxryLei8cYMLSQ|a%mTYWjNE>jlIhuBL8(RjpksYU4DY>O1 zuEXFobkD#(isMT*8`@+ZJ4-`>3Q&!Q)d;HT1m?t0sDFSWNlS$CRD;ERB&J9%U_BFJ zDATEmH%5F1m548iF1J{Dj`amt#2-ciDF_Nl7-S*S2DEY|GehR(-}FQ3NT`}T_($kc zM~u3Ft-gbKvJctyVm>t2Q+#kYvWy&c)bLOZ)z_iA_C{iBN1h=!fh<5iCV(cut|9=R cqcB0@FPSCu5)u^Lp?i=@!f(zxjzr$$A7!sNp8x;= delta 420 zcmZXQO-=$q5QV><24-l6Ur}U45%6yY^#m^T0&a*4;?`>zcJ3#fz#9l84$){>n{Xv# zO-pn!T}f45)q7Ph{p79-=Ii_I6S(3sHutI=KekI%YA$7;I*s_bS8B5Dvg6ZYH(uX) zO#+`iI@3snmB6EDQ1pEI45kk%nKWgazHXDJ08)!-tp)g$Ws(_aPP$Off1t*CjvkG3bKFtp7#)x52uMh2cnAbaD!V{LDTZW~7+X7*cZ2Bo z25T!sLq|ga639{tK7cQwjIoQ7iVW9G~`_nwJ2@#??+p8f=|jr%?v6cma9X5b2n zU7hyF+glGx@K93l1C$Zidvj<6ZZCael2{4W~R9(MKXL9B31F#krs)zLsFM^Psm^^zlj-!Uhn zgZOE0K)sUHZ(9(tkBrIEY@~;~advDD(~655K0<6L+_XZs^54?RL+9hVhe%MCc4M!* zzbE?*5d_bZBpy8;=roN}g-t;-kDMkw*vkJnt1T|MV@&^Kh*j?7aCq)#O<+}IMVlCF zc~n?>uf9#6>x^?KFxp3#U`5CkG%S#}YoxJ6Zn*LT|NXJv13rJ1i7Zp_3}0gw%NBlz z`ocnBC9JL$66-8uEoJ+Rx|XGGu^-@7XFp@6TG?THZX=xF{3(`!uS7Ugk~7T(RItdo iz)79pp~6+tG^e0-w3t2eU*~D#Hanly9o)q|EdK-Tgiz4{ delta 577 zcmYjN%Wl&^6g^`n9@}x#HZ6q`V%+j*Ng;t!V8aHeK$Y56vOrW_46W6MM4l*i+4cii zMP4C3fDH>kphy*hJwL#PZ>czASfJ5;ojG&vojY+S?!%vFr{4iQz9@J$T!9M_;Yk3FxAP_et$;|yXxg2mbfP1cl7aS zKYrR9knVN$fo{E0uT_8mQvrNbDDs>Z1-Oot0CSiZn0c&qmS!V0+=;UzeUMH&SaoqD zKoe^MB_m^kO8X=mz4kzP$zi*bje5!9_)TN>CT-jIS zQkU4^Pqwx09}fkBtt5#@PX;PY<1{}L?`(;C`8R9T76|hnRv2Q5%ka1cPHP5dR$|6~ z&{y-ey>McEDz2yLtFY Date: Sat, 18 Sep 2021 17:19:55 +0800 Subject: [PATCH 13/49] Edit pom.xml file --- pom.xml | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 364628f1..12273332 100644 --- a/pom.xml +++ b/pom.xml @@ -12,5 +12,35 @@ 11 11 - + + + + + + maven-surefire-plugin + 2.22.2 + + + maven-failsafe-plugin + 2.22.2 + + + + + + + + org.junit.jupiter + junit-jupiter-api + 5.7.0 + test + + + org.junit.jupiter + junit-jupiter-engine + 5.7.0 + test + + + \ No newline at end of file From a839ab311a470fb1edc2bf4e0fbf9adbb639166d Mon Sep 17 00:00:00 2001 From: Metilda Chee Date: Sat, 18 Sep 2021 17:53:13 +0800 Subject: [PATCH 14/49] Fix .toString() bug (finally) --- src/main/java/Deadline.java | 2 +- src/main/java/Duke.class | Bin 5477 -> 5725 bytes src/main/java/Duke.java | 18 ++++++++++++++---- src/main/java/Event.java | 2 +- src/test/java/TestTodoCases.java | 0 5 files changed, 16 insertions(+), 6 deletions(-) create mode 100644 src/test/java/TestTodoCases.java diff --git a/src/main/java/Deadline.java b/src/main/java/Deadline.java index 432bd684..8a895ec6 100644 --- a/src/main/java/Deadline.java +++ b/src/main/java/Deadline.java @@ -17,6 +17,6 @@ public void setBy(String due) { @Override public String toString() { String status = isDone ? "X" : " "; - return id + ". [D][" + status + "] " + super.toString() + " (by: " + by + ")"; + return id + ". [D][" + status + "] " + super.getDescription() + " (by: " + by + ")"; } } \ No newline at end of file diff --git a/src/main/java/Duke.class b/src/main/java/Duke.class index 641f6287eba9b639d31689deedecb3b70bd38699..838e282ade922b0154f338ae30db6f666e0b6a85 100644 GIT binary patch delta 2249 zcma)7XLJ-*6#njPnc3M%vTR7=ge0VsCQ&$tvcZB$6eJKx0v?J7hGY^VVH4PeBUsjg zqJpA4ML|&%G>SD*HZd_Y8`A8BW=HHD?BJbEl>Os5?m4sXefNI1&bx1p6dW#6cb(|k z0$>ykX;XJO2B^@mM8jn`pI{F(E-@{^6&kKYNbFYfLe~(eNWoG9R2aBk!!q1JkQbOO zO-8LrD9fw3#8_k$HyQqh;?gT66q8VJ2U3Fa2r<15E^dB9pb2CsPj$@cVUf4ca9utr{N2BLua4{KT56 zGb_ec*AQG42eR8eG}5PONZk zvHwiS5u`dbzT*;b)K(G;6WgT>0&0{a<+G_g`k66<4RaWFP9bQGV1@C8qh zgtbVz3r9f*sEs#-53oh3xm=GWRSUXU!>8AMim$Q`NML?q z3Vz|Oov9n~EAJ%y#$rA`ygMe`on?9k1Si@p>|wk$f}M_GYJ$3n>s`T*^|P9<^OMidjBae7s>`~w z1JC=ER@8SxW9)q?j9Hzi??98!-Hn}7b+@fIE8X3fo<5Lmc3Cz<`)u}}veCNns_5}1 z<-G1wigcwDZ?wYgbG74bF2690=@Z(KaC#Tsvra~in9(ma!~)&Xh5Zr9|80B`zZ~w7 z&)IrnI6LqjU~g?);Bvm~S79S{P!Db6qa{Vo={^kQl7~UTa6V!q_#ll$I(!&{5{N6} zmCzWRjR`mhlW{I)U^Hs^`l?4M=AzvCqOsdC?06iz9?Kt&3wdD2VI3;ChVj^gO1=Om zQW>gf5~`^Nlc@nyXelnDWtd89F^xJflX@_lQ<_CPV9-vOv={ZX9}V;s=7i`t8YLSp zkrd38V$mceV4jo$zm$b$DHknLA?8cN5s=Q|&x3V@%Mf>xvr}Z8lrc$$Cd2sWpYL-6 zsF$%(9ee`CGE!JTadBF5+>qZ;Jcbp&L;eGPk80goJOCkU#>=@`)(J_q`gw@^S+EV; zD+>9ozt56_Fa|_={Lkzs^1uKCxu@woI2rIFlkey(_Q}^|?@+O{*QJZ!{KxF!v&YyZ z`szqyI^V?+zBtf7rTNsYk^nn7nJ$q`3a=Jt6uEde1Wr<6qka@miIfDQ)Ce9(>6F!{ c$?4PNMf3$!#CBfJW)!dRD0Dg%)0xo!21rx!YybcN delta 1926 zcmZWp3s6*L6#mY>?%lgrSQZw%h{!W}6{!X^OncbNveH6(Ta=la+PUkF?o2y#_nz;Z?>zo<&-st!^kymh zE_Ck(Fq~4_m3`)D84C!o;vU>9VWEl!+$UNr!z}l!cmNNIW0o6+JVY=~ulFi&V~L7K z5JRwd=gxE2_+%_2m};tgeg(yNRK+qpM(8hYvN^}+XI4m9L5QC1p6|}Bao5huExK!l zcaFcRuGWg1u}X!&YJ#Jvyu7UZj!C8EMFnNWrMFBdDkNCPj`R9_?pfY^J@6AMp2SmP ziTEWn#56Quw{dajd(#s$TyZWtJtj58CwZv?|g5qU&f0}@p#>ynyOl_gqN5yktqt=(4oSN?Su@mh@wS{ z95-kOwlt95Q?9|Wpnu=(= zE=E|BV;nFc#lay`^wYhi;%&SmPMS05J+a)HPVb8jYgTF-4yyP79}*;=*I&r3;6gK| zWL79hz{e^M;S+Junnp`RnzGyUJt19;G^Puit=E9xMW1a)B+e=L7w08hP;rs4J)oM1 z3@Z=BrB*~*$izjFS;Z;z+0n-eSs^Pa64_Lwk}6L1+glRB2XT8mUXLq@?1*7floB~H@i$?3ALDPs za2et!;b@p*KNF6H;qQ29_~XOE|Giw|Kz{Qk!JO3zYG;9Pod0z*ATgPD14i_UY4!ox zx<%nr0Zz8W;si@3W;WsnmJIljwLBIq^@DdRP8=5%3sGmUh~9a!0g$D1kdGGk4Uk)oLbSZ8j6 zmZOXECTW&Vw7cYH%V@^9) zKMU2UMI)`FCfdl;VF=FDdcKLSjY)1O#t7Vsk<2P!-Y8}kVh)NhpXGYKTUKE-UwvcH ziV{k~ILbgNU57Hd9^h8JbC%m^6QgD4r=e^u(O)Bpeg diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 7560b28f..26f4bb25 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -58,7 +58,13 @@ public static void main(String[] args) { ArrayList tokens = new ArrayList(Arrays.asList(input.split(" "))); String instruction = tokens.get(0); Integer id = 0; - String taskInfo = ""; + String taskInfo = tokens + .subList(1, tokens.size()) + .toString() + .replace(",", "") + .replace("[", "") + .replace("]", "") + .trim(); while (!instruction.toLowerCase(Locale.ROOT).equals(DETECT_END)) { if (instruction.toLowerCase(Locale.ROOT).equals(DETECT_LIST)) { @@ -73,7 +79,6 @@ public static void main(String[] args) { Task task = null; switch (instruction) { case DETECT_ADD_TODO: - System.out.println(taskInfo); task = new Todo(taskInfo, id); break; case DETECT_ADD_EVENT: @@ -91,7 +96,6 @@ public static void main(String[] args) { } catch (Exception e) { printErrorMessage(Message.ERROR_UNRECOGNISED); } - } input = in.nextLine(); @@ -99,7 +103,13 @@ public static void main(String[] args) { tokens = new ArrayList(Arrays.asList(input.split(" "))); instruction = tokens.get(0); System.out.println("instruction: " + instruction); - taskInfo = tokens.subList(1, tokens.size()).toString(); + taskInfo = tokens + .subList(1, tokens.size()) + .toString() + .replace(",", "") + .replace("[", "") + .replace("]", "") + .trim(); id = list.size(); } System.out.println(STMT_END); diff --git a/src/main/java/Event.java b/src/main/java/Event.java index 58bf9ec5..a86d77d4 100644 --- a/src/main/java/Event.java +++ b/src/main/java/Event.java @@ -17,6 +17,6 @@ public void setAt(String start) { @Override public String toString() { String status = isDone ? "X" : " "; - return id + ". [E][" + status + "] " + super.toString() + " (at: " + at + ")"; + return id + ". [E][" + status + "] " + super.getDescription() + " (at: " + at + ")"; } } \ No newline at end of file diff --git a/src/test/java/TestTodoCases.java b/src/test/java/TestTodoCases.java new file mode 100644 index 00000000..e69de29b From 16e5ce64b9a4e09d98da58c1324d5ceaa7590cce Mon Sep 17 00:00:00 2001 From: Metilda Chee Date: Sat, 18 Sep 2021 18:25:27 +0800 Subject: [PATCH 15/49] Add delete functionality --- src/main/java/Deadline.class | Bin 1231 -> 1248 bytes src/main/java/Duke$1.class | Bin 618 -> 673 bytes src/main/java/Duke.class | Bin 5725 -> 6326 bytes src/main/java/Duke.java | 28 +++++++++++++++++++++++++++- src/main/java/Event.class | Bin 1225 -> 1242 bytes src/main/java/Message.class | Bin 902 -> 963 bytes src/main/java/Message.java | 1 + src/test/java/TestTodoCases.java | 9 +++++++++ 8 files changed, 37 insertions(+), 1 deletion(-) diff --git a/src/main/java/Deadline.class b/src/main/java/Deadline.class index 797bc1faaf01903fa71127675d7a346120327cdf..7a75c7a4950b1693f2631663bedee4ef8675a042 100644 GIT binary patch literal 1248 zcma)5TTc@~6#h=3-K8uS3y3ISMbKWjc)w6$B5jDoq7Nl#Bs@&pNm*KUn%#kff174=C7_bm`FbIcW7o?~*Tu%}rWesFv@&xP*BF0KG;aGcyD8zMba2ubufu*4CGb`VT-w|TPJY(GO(Y4EhoUa?%Bu+d&ei+83$*ZbK-dc>-y!P;`yWk@ z7znFj{O;m*YdSHcceqn|Rpo+>6uHQ6jtMJU zDrr%vZ;9qPgoO-Y^zXJ4;w5$DSLB9kScWazW!TE*WG6|H;@{9`!awqXnOmGG(!8O#@zsvkAO53##emmIfG znzD!aZm4x{%LlTebKyp{A@ZWpD7jkZY&_-%NXyCH!rm_JB`KLIpR6V+O>j0nPx|?W z2m%>cct%+0O14)H7FG$f|2F0EXeEqWJPi?ky2L+^8L$1kkFuUH$EQW~u?BE5*`-rZ zX7M|$uY4xl=5?5FVaA-lL0GJv$8_6shNVG`X1>Ata^Vs?SH^i=z#U!<$sC7Zf{10Z zm*CA58j>iFG~w7Xc0>+Z6;dg{}G<>$%Oe7&ymB_Z}q`0;Q#;t literal 1231 zcma)5T~8B16g{`l-Lh<{77$UvilF`A!*7%t6Dc7Qi$0X7k?=5WCuQlf)9el;{U`bh zeAPrl!h=7+A7#AT7G0zvWV3f>?!9x)xp!uM{XYH)U>QXV7Oo9p2-ib%BY~*|ro-vY zFp^1g)~ty+6L$!)YMYQQ?}6%=?y+p{EEtD_Zg{*8d5D|Ps;iWctY}edZi-e1 z*~DFfRZ$0iO|Cm3Q*up;y372FVU;$L$l4f&Z6k*~fj;n`u~ERhjd7$2msXY1f%Zjf zQ|et+4^jpe5?HjcgnLYVg2&Zusk-6~|F@5j?V~$VXS79z6RatZh0;ep52sET?UQNY zJ|1w07BkyxJKMCAp-i^gUdd37FtIP1vZTD4(C;0+%d9jFXHKQ zP9`3PO<5+){%e8b9jd16U8Jt4by3sGZ<~0=_o}Q^^PokrH#|@JC07K2WTl^?N_!aH z{=X7l-Ic*?cVqEft*16_wOg`J`gR22ZFNu9bTL|6527Sox8i77G_gXMJ5ygjZG`Fb z^Kgrwp~Vl7_~$#wc97>ujId4dY90gZ0qlHX;RuwU|AE*yUh^emJHk;Q4uij8nC!ib zbZ_Srk0EM2{~fWff43MNr^R*@V{Ai`8N~PljC|n~yw&lJFhPnl`7QMFU$dkze}0@OG#A(zK!yMZ0J3KrsQ>@~ delta 163 zcmZ3;`ih0?)W2Q(7#J9A7_=vHePw26kee*aSjDI@c?P4Jsw_}~Q9y!$n}G+!V&Gtq zXHWpria=f+12d4tz+gW4F{2stMh51|+DwuGObkjuF*dM_I)gHhEy%zY&dwmp;0q@h jSQu1*5=;!L3~E4{g+U!iYJx@78MJ^j7uYHwLx2MS9#awS diff --git a/src/main/java/Duke.class b/src/main/java/Duke.class index 838e282ade922b0154f338ae30db6f666e0b6a85..cc0cda86bcb3bc60cc55412195524bad61b4c343 100644 GIT binary patch delta 3318 zcma)833OCf8UFq^%X>5P2w@<=uq2Z`BmoL&Bop>zAOn+xWmpnQ(;@RhhJ=|kGr<7b zftI#Vpxdifs8w6kltm?}okY-zf~d82u~N0R*0#24t;K>>+5PWh(&U_;<8kJ^ckg%a zzyJUJ?|Z#8InDm;wd2nKm_-YF>@P|_J5EMlcmkGM4A5n2!aFH)wG} zMv-rle`9cSaB5pHvSDi7`i)vsyuywNs8Zp@LjAfeCs7TbjKwOJU=(4*Ahj>Ihl2(YO|x;`SA8*4!Q1rs!rZ>Q`3P*x%3L5n} zrUew#cbLk}O@wLsd{e;)@22+n7I#}X7N4Sk$>)gG@s-iewvam#jk}w}kr0~}i*|N2 zX-u*~KW{3bu%2liYi(80hE4h`bC%MAs0s_(^(J#pVGCj^;&2m`h}ISNha>FnW&*K8 zUDzUHtBP&-oPN~2$Z^I z9>U1MEPK0}wDx#78nK}PPpSAWo+jA6HA@5ajeg&X0Kw)@<%0{yk3JRs_?~`P&Uc<* zJ)vlX)mGyNDxSd)^*7~w#g8AU_%TlDX-auQ!B05RA+1e|Go2qlRq->NVhx*u9j#Ty zvQYf2ieCuDX)9}&)Yh%8ZLC|c*jpJ84*gQa^P(!0mSC)U2=b8Wdw1Kv~dH$1Ix zv}GwySdpXPANpQfKAqQlZN;v$_@|1G@Gq|Gm=>?%$gz<{4U<;sdG~dq3 z*Y6GJN9~2#junBL6!sES@ABn!%Nv(2_b&9UQOHWj=W@^29gcU&sh@Ww(FZb~1Hwf{5}ssyX$U^T`0@~Zobi<*_yxvShv1hOUmJp7W_*1B zCs@I0jN{WfsPG(P8iJb{OGEI7j7>vuEo1W_CJUc@t~#y{BAH#7$cPodQrrjX;R%t# zZ{8Np%CLzO3=_%vy7Y0S#-81Xgp0Svk&S81OnZ#%Jd?=5t6Y&hll6n?1qB8}8ce)7 zk%eX=16e6jl}Y)a8l>maixWd+=fH)c6xlE)<3lSz z=AHzO2r5Zp(S8*6BEwmmL_Uv$o8x(**nmkaUEQ-&qD1%g9^t=a*pUMfg%S={ zDT*-}(=i2=n2H+Qgj!w?U!c7UuAOA?C8O`B;W3!+05%BD>wrNv7eHNWWpG>3yz_VH}6uLU=O^KY^C|UTo|` z#D4;6eIIVC;m~%}3NYE(nZ#%N@%cX7=`p*^CLXBWR-UPmq#MhlqCUN+Hr0~KGe1!3SWR&*fTiw*@QF_tak7PG( z{FvgnL6KwVu{;h}DJ#8UML)jJR`la!H&uL0e%c_PJV2f|K%PL?0R5S6QiZ0U8=8nb zY>vk!mDydkB%V9M@dcLhV?tTWLLPH1XF3k>I3v^i>KYy^T{h$<9{?BkVYV*Xmu4RFqwg zl%s;>4}xVzisj8g7WD+)u6L;eEb0)JcRWg|OXkJbOr=~NMy+&T{U9Mq?wnE2ChWoecnHVv4tKB1++Z%y zMY_WH#sPf~9*$ZyA5$MUoW&T=UyyEY($o2f&gLUpi8|h0%Cluy$=`uDV+ES{*fuk2 z3`SjRfnvK9|B#eoEa$8ZaK-H7LKE3015$~9Ks#9ceYja4HnTKJrYX**hJ zAKK^vMCc%*bQ0}!3LW$cVsrsrbP?Ow+%0qsTO~7YmuyH#8Q3lrVuv&xcSv(_r&NWV z(qh~tEyLZ?8r&l#8nH`SkKNJ++$+VgN7{~k(k|R*oK_!3TxZi2nMTNHk)g`y8hBUp z9B7tt%swR|-q$cq#spra;ltH&!>3=wRHiw03G!uZOSg+#Gu4&6+?B-5Hj!hWaDK?a zFFuL0{t~W}3%taQO7zOXn_)D!2QGOId>*%nd^l0SU-X46ldtKN%2jjM<+1T&3gDH6G89FOAC3D9_+&4f%7_hWZeNCk*?5uD^-#guKxmmiP8B0 delta 2750 zcma)833OD|8UFq^%X{3`nnlQ#g;Z!tu3KWVj>c(wbTWyU8UO1+RfTsTSdYDzDydi-NrSDyZ1{IA0O;}A(Tf>Qj zu|3Rh@xk6m%!m?f6$_hHtR>hRhX%qLE+;HEC+uZr!0xxV5H7Vq-0q?E=Jobk+F+iw zFDh>*lxi+vP6Y)O^|5QTcI}T&dw!9(h2cd1LO@8U9d?_*yE4hnn`vkA`d?ja+Z&~S)NL?el$ zjy3p_z#)8@aFJOre9fGVimwo6S*b>i*!E!4-k$I-nW+n_Fd}d-zDCfSS~qldZEI=n z=p?vWGCi)72JaVm0ADvZX{Fw8u%F&|jDtwxh`=b0nzw4D+8R70kj9w#u(q^K2KcbR zgshI%ZzTE~;=SCQM`V`q-nfQG36Aida4e}|iYdKeqc_U^Q}Gy6I+>#51Rj@7`VOJO zyn$w!ue#>U`!44nG?FU5$NEiDU&l#2C3#O1LK&Xhd@IXq9(0NFQ+Z@`__4rGWG%c+?d@&t+cvFlZ)#{;v%a~bsnH8NioNWr zSi{fE{dy_AXdcolOHSYy0>8wscrzrz$wn>>=TNa#E};UvB=8%&Y?j!HZAlz7U(yel z*SQyX#I*Sh?MQBEP(lUfbJ>rl3OQM$w>R7yDk2YNGikomDi&lT-hKe?NE$3{|2mw`2mqOLNHm5c9Vz<(ir!LKSTrWYD_x)*H zGmgG7L_>Tv*wTnk!3a5Q<4A;@DZia3)7Y2Bhtjy-dxQ5QY24)f*z|C~8q)YgNcB5L z@u@UE>m5$x3&V8$U3@p=JK+nA6fr(#;XJ#<9>&KRo3ni-sS{m()$bg`w?og^fWS8HaDURQr ziBGCLDOE1Xs62B)MNHy!mtXuxMa)q7en<=WwQ)Q*0(ZzYiXWx8B34JZV^tIQDR>ET z*ZxO$nCN#*;CYMr|Mn=reYCnda&C!S8)vNbrra} z8n3!pcpq<(r6}UnSA#k%=P!~5{#}d9xC<-zK#fSX(?)bqCpOV`{>r!!SI{l!qG4>MG5&@)hHeh) z8hQ){okW2*XD8+Irf29#_>6(4pg1&Apnh%05-r7Xg3WeF0>3cerZ zhG|63d5%s~abCqn6+(rfrltq*Rb~KvDh}(5&mpLyfF~#?N95%|*eI7~Q69|!(Zv>?M@3YUk(6d66_&h`0<7p|ugiFZN24kVQZ@YV E01BI0EdT%j diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 26f4bb25..0019ae9c 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -5,15 +5,19 @@ public class Duke { + // TODO: Change these to enums private final static String DETECT_END = "bye"; private final static String DETECT_LIST = "list"; private final static String DETECT_DONE = "done"; private final static String DETECT_ADD_TODO = "todo"; private final static String DETECT_ADD_EVENT = "event"; private final static String DETECT_ADD_DEADLINE = "deadline"; + private final static String DETECT_DELETE = "delete"; + private final static String STMT_END = "Bye. Hope to see you again soon!"; private final static String STMT_START = "Hello! I'm Duke\nWhat can I do for you?"; private final static String STMT_DONE = "Nice! I've marked this task as done: "; + private final static String STMT_DELETE = "Noted. I've removed this task: "; private final static String ERROR_PREFIX = "Oops I did not quite understand that."; @@ -35,6 +39,17 @@ public static void markDone(ArrayList list, Integer taskId) { }); } + public static void markDelete(ArrayList list, Integer taskId) throws Exception { + for (int i = 0; i < list.size(); i++) { + if (list.get(i).getId() != null && list.get(i).getId().equals(taskId)) { + System.out.println(STMT_DELETE); + System.out.println(list.get(i).toString()); + list.remove(list.get(i)); + return; + } + } + } + public static void printErrorMessage(Message m) { switch (m) { case ERROR_UNRECOGNISED: @@ -46,6 +61,9 @@ public static void printErrorMessage(Message m) { case EMPTY_LIST: System.out.println(ERROR_PREFIX + " Empty list."); break; + case UNKNOWN_OBJECT: + System.out.println(ERROR_PREFIX + " Could not find resource."); + break; } } @@ -58,7 +76,7 @@ public static void main(String[] args) { ArrayList tokens = new ArrayList(Arrays.asList(input.split(" "))); String instruction = tokens.get(0); Integer id = 0; - String taskInfo = tokens + String taskInfo = tokens // TODO: Fix this (duh) .subList(1, tokens.size()) .toString() .replace(",", "") @@ -75,6 +93,13 @@ public static void main(String[] args) { } } else if (instruction.toLowerCase(Locale.ROOT).equals(DETECT_DONE) && tokens.size() >= 2) { markDone(list, Integer.parseInt((tokens.get(1)))); + } else if (instruction.toLowerCase(Locale.ROOT).equals(DETECT_DELETE) && tokens.size() >= 2) { + try { + markDelete(list, Integer.parseInt((tokens.get(1)))); + } catch (Exception e) { + printErrorMessage(Message.UNKNOWN_OBJECT); + } + } else { Task task = null; switch (instruction) { @@ -110,6 +135,7 @@ public static void main(String[] args) { .replace("[", "") .replace("]", "") .trim(); + System.out.println("task info:" + taskInfo); id = list.size(); } System.out.println(STMT_END); diff --git a/src/main/java/Event.class b/src/main/java/Event.class index e73b9ad60be54596b87073c081a45a14c1f78165..7aef9a5153b276533e1fe2a8c35ac4fe5ceea1c0 100644 GIT binary patch literal 1242 zcma)5TTc^F5dNmH-BK2c1w<6EB4{sMyk96W!2*$3^q~Zegoi_WQkIrI&F+DOf14tXFmWeV>ylpdTjJMun;BmZmEhQM3-I9 z)h`I?bn!qOi^aO|s*5G8gVQxz( zeYc@qc}t4b=R=Oo6}t|UhMo*DII8EG&ZH)SCt?U#bO-yaNouQ z)8>bSnLmK8cdTl%eV1CDUl(Pq{1d{*aJFs77U(PCRq8UBDJoSvYJ{&~XQM6!Zk;q_ z7x$ge+}`dT$g<9dr__chhFMnHXCrtBc4n1rEoNR9X6qKF& z4*M&g3Ab4e@?V$*=cgYwTW2uQj+|s|P_67Y*k3L}qD^C*+=`<7h5>ig81EhDpHiMw+R%u!b3F1ZlR~ hh&U@YGF(Bf=`@FV)-fhp;P(-p@X4h46wi^z_;1f4ESvxU literal 1225 zcma)5T~8B16g{`l-LfoH3y7#-MbLim;WtW+2~>#0q7Nl%Bs>i5q%18n&F(>LN{JHhX90-ZST(duQgy&(rS!mQZlu;K~37a5Xg75|~V2Dx6*q zBk2^QW^BybxJ8HwLr9hO#gSNS2vu7w8{bp40>OIfDbGA3EN9M#dwMpMku~WTvTq3e zMO~GIWXV(V)#1Ue^tZ%rgFW$@G%K8YG?P6~#^InH9_x}kjBI!h8Y?E*5czb+yR2t}R{FjQ+QAgiII3kqV>DvAp29RxFX;^GSGB!blgSgS)uL zAzDapukCEpPMXpgVV2XBC5#`4x-4o{5$3ID_IMT;p-e#7iR$>BHA3Gx=>PF_IUyVO z!;UNwX8yLoQ%AZkJ6EVJYF$)}_K$5m;Tu)bx_;OsxEo4Izt|8#AX({$sL~EcyZJAK zsy1XW)81IdQb0^g1>yx!fH6;p`T)}bhhMx*Q*S+KE8m_1itH*JKe-ZE|%l4->F1FT&B487Cx4s(JeBl#h8@Gn_Xh@WQazK=+x z`adC_ikEn4<#Q*n!<45;0Ab!(OKO{IgqcQhiM=*r?uw0ZuHbSDG=WDvhQc1;F&<)q MdjsYmmPfex3l+I0GXMYp diff --git a/src/main/java/Message.class b/src/main/java/Message.class index bdcba2d96ebabc52398f1a900d5a79b8df44adfb..bc432fe3af1fc2ae435ed333dba738eaffe775e6 100644 GIT binary patch delta 496 zcmZXQOHaZ;6ot>Uv{Qy6m6uRK9zKxb3l%rIFd8?Sz@ieZONoMlhdvflXx#u5Te15;Y1318*FK!Du!%Vk**6v)iFFQx4C&%Ye zFwB}rBIV!ZV;N*QQYPk*^B*cP8}l3m6GbfeUtPmS*+d1^zQgM2vVo`p(?CLyMcssh zM*o@(HJiq1{j!ql9p;gM4p?^RAC?it8XBZuC#upNE)l?bMtY3QBN4*}ox1EX(igG$ zr&nZEB$+cpehfCPSHgTyq<^mjl{UbgMq!B3)0F!bRTMNW5r&^kX(2*Ypvd3AJT-vo zdXWI!^|S!O_4EL7cY3gaZ8RqqSHBiF*ncI9VMUW5B-C^X@ex)B eu>Qkl>D$7Xae9kQ&Nbp)nxx=2{ti*tZ~XwCfjdzE delta 456 zcmZXO%}&BV6ot=BTc(U9mikkyAc7zQ0_s*{;({F}#s(9@$^~&R4?yC=eZz}rNrd

FTW0ZTk$e-#H%)hu1fQ zV+jW<0=9)!tOc)yB^Mci4GSJNgRidXB4=R>`Ei?7(>W7K6P5%+*}^U=<2yDrT$-Yf zPkCl!dsv1|XdsC_R7h7PD$*S-86x$B^c>Cu5krm6g!*Ho_fY@Sb5)fNtIe=J2V2zh zC=|HrpNB>p7>QavJ4N Date: Sat, 18 Sep 2021 18:26:42 +0800 Subject: [PATCH 16/49] Refresh gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index e27c23c5..1a94201b 100644 --- a/.gitignore +++ b/.gitignore @@ -19,6 +19,7 @@ bin/ modules.xml /*.class +*.class /text-ui-test/ACTUAL.txt text-ui-test/EXPECTED-UNIX.TXT From 338e2da4e963dd1b73f08dad8130baee82badf52 Mon Sep 17 00:00:00 2001 From: Metilda Chee Date: Sat, 18 Sep 2021 18:31:04 +0800 Subject: [PATCH 17/49] Remove .class files --- src/main/java/Deadline.class | Bin 1248 -> 0 bytes src/main/java/Duke$1.class | Bin 673 -> 0 bytes src/main/java/Duke.class | Bin 6326 -> 0 bytes src/main/java/Event.class | Bin 1242 -> 0 bytes src/main/java/Message.class | Bin 963 -> 0 bytes src/main/java/Task.class | Bin 1247 -> 0 bytes src/main/java/Todo.class | Bin 1079 -> 0 bytes 7 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/main/java/Deadline.class delete mode 100644 src/main/java/Duke$1.class delete mode 100644 src/main/java/Duke.class delete mode 100644 src/main/java/Event.class delete mode 100644 src/main/java/Message.class delete mode 100644 src/main/java/Task.class delete mode 100644 src/main/java/Todo.class diff --git a/src/main/java/Deadline.class b/src/main/java/Deadline.class deleted file mode 100644 index 7a75c7a4950b1693f2631663bedee4ef8675a042..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1248 zcma)5TTc@~6#h=3-K8uS3y3ISMbKWjc)w6$B5jDoq7Nl#Bs@&pNm*KUn%#kff174=C7_bm`FbIcW7o?~*Tu%}rWesFv@&xP*BF0KG;aGcyD8zMba2ubufu*4CGb`VT-w|TPJY(GO(Y4EhoUa?%Bu+d&ei+83$*ZbK-dc>-y!P;`yWk@ z7znFj{O;m*YdSHcceqn|Rpo+>6uHQ6jtMJU zDrr%vZ;9qPgoO-Y^zXJ4;w5$DSLB9kScWazW!TE*WG6|H;@{9`!awqXnOmGG(!8O#@zsvkAO53##emmIfG znzD!aZm4x{%LlTebKyp{A@ZWpD7jkZY&_-%NXyCH!rm_JB`KLIpR6V+O>j0nPx|?W z2m%>cct%+0O14)H7FG$f|2F0EXeEqWJPi?ky2L+^8L$1kkFuUH$EQW~u?BE5*`-rZ zX7M|$uY4xl=5?5FVaA-lL0GJv$8_6shNVG`X1>Ata^Vs?SH^i=z#U!<$sC7Zf{10Z zm*CA58j>iFG~w7Xc0>+Z6;dg{}G<>$%Oe7&ymB_Z}q`0;Q#;t diff --git a/src/main/java/Duke$1.class b/src/main/java/Duke$1.class deleted file mode 100644 index 5d0c61205502396dee79e5e63aa6982c908401c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 673 zcmY*W+iuf95Ivi?acrE{l+uQBD-dW>pcP2;g$k)84w%L^iqlr850T@n61T=izLbCA z2Y3b~gb?Zn@KK0aQ#C@e_RN`?J!d@o`_Ioa06W-JQ9@aUq+t#f2HE0i>P~{ais6iVRi5C1}*t$xnFW3BzK;{TO8a)bc(wE+k4vrb6=b8Wx~akJ0Zt z{o%gdH`>lC+jNZ%gK{A)CRx;Q1xqwWoQ#9W3mMAImMLSIVfENM^|nGUnrzvzoBPvl zz{9bTByl24>Kd*IliEKM(>~bknH^ENuHlBLsD|}+@NU>M-GNBo(r{a(=lAVB+c~s{ z&dWDOdm!TugFf?eM#tRG7^*vd7(_w#q8RCbL2AciTGK)=h`61lqoc{dP6MJ#Mn$kSCL^20a{qKU<`X*`zkkYq&z+1WhJUdJgpYi1Pjq#b%` z%2R!f9$<~0j_Gyr1R|o$UECvV5c`BOML_ol*x4`j8|1Izt9{31$@vUvub?YL=Vo-3 zXk|uk5|s=31rii2VFg!FCyxh&>v)Q1gxlCfhp>eE4@c;k- diff --git a/src/main/java/Duke.class b/src/main/java/Duke.class deleted file mode 100644 index cc0cda86bcb3bc60cc55412195524bad61b4c343..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6326 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 GhW~$uSypfW diff --git a/src/main/java/Event.class b/src/main/java/Event.class deleted file mode 100644 index 7aef9a5153b276533e1fe2a8c35ac4fe5ceea1c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1242 zcma)5TTc^F5dNmH-BK2c1w<6EB4{sMyk96W!2*$3^q~Zegoi_WQkIrI&F+DOf14tXFmWeV>ylpdTjJMun;BmZmEhQM3-I9 z)h`I?bn!qOi^aO|s*5G8gVQxz( zeYc@qc}t4b=R=Oo6}t|UhMo*DII8EG&ZH)SCt?U#bO-yaNouQ z)8>bSnLmK8cdTl%eV1CDUl(Pq{1d{*aJFs77U(PCRq8UBDJoSvYJ{&~XQM6!Zk;q_ z7x$ge+}`dT$g<9dr__chhFMnHXCrtBc4n1rEoNR9X6qKF& z4*M&g3Ab4e@?V$*=cgYwTW2uQj+|s|P_67Y*k3L}qD^C*+=`<7h5>ig81EhDpHiMw+R%u!b3F1ZlR~ hh&U@YGF(Bf=`@FV)-fhp;P(-p@X4h46wi^z_;1f4ESvxU diff --git a/src/main/java/Message.class b/src/main/java/Message.class deleted file mode 100644 index bc432fe3af1fc2ae435ed333dba738eaffe775e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 963 zcmZuv+int36kUhgz<4M~TeP&;TC3%v#j5xMX{vN;PVzz`qEfFq%yL&Bxsr8KdP zM$>0M%DB%d0twC}v$OVP?aP|qf4=_$kjF~}E(Ybq9t^Cu9RP!e!wVlnL@Sq#a-*u3 zwSw_RFPhpBL!dOt%!yP#M?jp3))j1U#Bq;W%@QLt&h%{cE4gZyX1-gr(JS-Et1LXv>j_W>Qk;ek*twa`Brx_>-yZ1 zVx#=D@E}K5H+!Rg%RcUiK769~o;c#+J`EqEzs7sGCVmlsEa@*TsVyzZ3xs1rOOZ+O z$4FD%6GGc$#iNc9{)UxntbQTHut#5?jM3zzT4tK>l3q2!Qdd~J23yQ`2_fK;{F`vo z3n;1d#w9ktE|5PZj|=-@RR}O?l7)x7KwS9=R(Fr#HtU`-6tnIf(=qD4F@ok|Uq7Bf z+(Ycuno#6^5JTjF`w}}Ba7*yeBY`5pBd-Li1iL;7f>%gfAUvBjN=Fk@25FTT5$_Uy PL5*Cvnf^H;5zqbw^jWQa diff --git a/src/main/java/Task.class b/src/main/java/Task.class deleted file mode 100644 index 96cf3e38717c99dbbe152508500e73bb220be2fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1247 zcma)6TTc@~6#k}#Zd+C^g>q3q#G-9M>RqA42TO<~cuCsegHJ;{DMPn2&F++hf8x(j zBbxBw5Aa7B&#(oz*ch|f*_}Dx`ObGPyFY)O{Q$6qavCwj9Spe`MuK7dh#&Kk$5pfR z_TWg=4MSo}DrsIY#Pfyy6p~0eNV^z;+Xt_n1V*$8rMu*m-8(0ey7bPM%2bUnc)OgT zn4>PnFwQX3<}Fdts?N=OX%6WvFkG2{VIvpK3and zSB6otZ%36(^#L!nj0RV5Nuxs}L%OQFeqHQH8!%;Sux_hKEq|%C35?G>uZ20(jbJQ+ z^)yPj@8E&$?L&s#pDB{+Shqweqz&7>!|O)-Ck!8>wdesu(pOwHJQ3vfv~G1f(eC%e zM@rV`SUc&60q_qId^p#A#Vwkq7=0!7rjeo*b_{791~s1S49m3JMw~8SzW5#N3!K%p zGh73{VWPNpikaf-DHcAHo#8gE)8uIxhLFGn9NH&|HAU7OR(gyJ^kf!Q{EC@Rm#&HP zLzmV&xJ#=I9)&Jkg^m*_PZ2`sGG$_ONnBB6e>=bwY046^@PE{^lyZ^WVpzo*J(J{m SkM2i!Lc27*J;ifuV(vGk&?vtE diff --git a/src/main/java/Todo.class b/src/main/java/Todo.class deleted file mode 100644 index ece7333a525ce107a47aa7b8826469a6c364c44c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1079 zcmaJ=T~8B16g{^s-EF&2Y*9o6D;8}Fg5NJCCR&3Mi$1hL1L0w4C$O~aG`j-{|3rU* zFFt6ZA>qLv;Eyui>DIW|#%y-x&fRm*z30x|pTEw309eD5G-8NbNH`cnl8|VMphHNm zxt^<^5=y1|p*Rt%UE%GoHni`0`_+hN!_#tK`qlDQ3N}&}(hf3k43BCn=5d1;%98}z zwlTrmdmEFy6%0J*Ade|R%xx3$BUnvsR~$^^D#6w&Oi!39l_TImQ8|`#&A}|L6Q++u zN7j_r68fF157-K{@N__U9hLK^_+heP&xnjHvZmUsEn9az`R4d&Px?)<*JY0tNFC}< zl(x%Tgm|gEO&D)z(dul9ULR(mNSOS$yM%N@9s4c0?i!|)>Ent4G4{DqI?%r8ZAyKh z+CesnavBvZSy(pG?-GiC`CRWrb>!gE!fvdKmR9~L;X||!17Jw{N_g$A42pH7I>)`} zT@T;>g}~-%PmX}^M0)vl?@+dMHQLJoMNM?O4Oh#mja5R1Rth`K-5uI35W(5-Jn7fE zA_!z);Q?WBNaU#6Ej%L3{~yW|8Vbct9>^Ha5D%xBV73x$@jt=q9G{jE=Lc{qOUq}V zO8h&luYLSHuM_=m2A$++i(_t}Fo;}WUc;QM%wC8w(+#9KM~0CZt{}`b$2;+tvC21C zpV?p)CcN*Q;FbReUQJOiIjtd?H_(r;bK{>dmdn=pcxkC}hRf%e0lqLI*5?RQ=8?q| l7T9Yc<~*}-i)j}7pxd~^yUp|^ephghPieO9;~^en<~Pl2_hbM7 From 569f44710af88b4818abe2a9c08d57c6f4f6c0aa Mon Sep 17 00:00:00 2001 From: Metilda Chee Date: Sat, 18 Sep 2021 18:32:25 +0800 Subject: [PATCH 18/49] Update readme --- README.md | 23 +---------------------- 1 file changed, 1 insertion(+), 22 deletions(-) diff --git a/README.md b/README.md index 8715d4d9..c60697e3 100644 --- a/README.md +++ b/README.md @@ -1,24 +1,3 @@ # Duke project template -This is a project template for a greenfield Java project. It's named after the Java mascot _Duke_. Given below are instructions on how to use it. - -## Setting up in Intellij - -Prerequisites: JDK 11, update Intellij to the most recent version. - -1. Open Intellij (if you are not in the welcome screen, click `File` > `Close Project` to close the existing project first) -1. Open the project into Intellij as follows: - 1. Click `Open`. - 1. Select the project directory, and click `OK`. - 1. If there are any further prompts, accept the defaults. -1. Configure the project to use **JDK 11** (not other versions) as explained in [here](https://www.jetbrains.com/help/idea/sdk.html#set-up-jdk).
- In the same dialog, set the **Project language level** field to the `SDK default` option. -3. After that, locate the `src/main/java/Duke.java` file, right-click it, and choose `Run Duke.main()` (if the code editor is showing compile errors, try restarting the IDE). If the setup is correct, you should see something like the below as the output: - ``` - Hello from - ____ _ - | _ \ _ _| | _____ - | | | | | | | |/ / _ \ - | |_| | |_| | < __/ - |____/ \__,_|_|\_\___| - ``` +Progress: [Trello board](https://trello.com/b/OP3BJpuz/duke_) \ No newline at end of file From 921e18e4650cef38fc0a87cd7fbbbaea58dd5c60 Mon Sep 17 00:00:00 2001 From: Metilda Chee Date: Mon, 25 Oct 2021 09:11:17 +0800 Subject: [PATCH 19/49] Refactor based createTask --- src/main/java/Duke.java | 28 +++++++------------- src/main/java/FileAccessor.java | 39 +++++++++++++++++++++++++++ src/main/java/Task.java | 28 ++++++++++++++++++++ src/main/java/TaskFile.java | 47 +++++++++++++++++++++++++++++++++ 4 files changed, 124 insertions(+), 18 deletions(-) create mode 100644 src/main/java/FileAccessor.java create mode 100644 src/main/java/TaskFile.java diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 0019ae9c..1a15437c 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -1,3 +1,4 @@ +import java.io.File; import java.util.ArrayList; import java.util.Arrays; import java.util.Locale; @@ -9,9 +10,6 @@ public class Duke { private final static String DETECT_END = "bye"; private final static String DETECT_LIST = "list"; private final static String DETECT_DONE = "done"; - private final static String DETECT_ADD_TODO = "todo"; - private final static String DETECT_ADD_EVENT = "event"; - private final static String DETECT_ADD_DEADLINE = "deadline"; private final static String DETECT_DELETE = "delete"; private final static String STMT_END = "Bye. Hope to see you again soon!"; @@ -21,6 +19,8 @@ public class Duke { private final static String ERROR_PREFIX = "Oops I did not quite understand that."; + private final static String FILEPATH_TASK = ""; + public static void list(ArrayList list) throws Exception { list.forEach(l -> System.out.println(l.toString())); } @@ -72,6 +72,11 @@ public static void main(String[] args) { System.out.println(STMT_START); Scanner in = new Scanner(System.in); ArrayList list = new ArrayList<>(); + try { + list = new TaskFile(FILEPATH_TASK).load(); + } catch (Exception e) { + System.out.println("got error loading file" + e); + } String input = in.nextLine(); ArrayList tokens = new ArrayList(Arrays.asList(input.split(" "))); String instruction = tokens.get(0); @@ -99,22 +104,9 @@ public static void main(String[] args) { } catch (Exception e) { printErrorMessage(Message.UNKNOWN_OBJECT); } - } else { - Task task = null; - switch (instruction) { - case DETECT_ADD_TODO: - task = new Todo(taskInfo, id); - break; - case DETECT_ADD_EVENT: - ArrayList addInfo = new ArrayList(Arrays.asList(taskInfo.split("/at"))); - task = new Event(addInfo.get(0), addInfo.get(1), id); - break; - case DETECT_ADD_DEADLINE: - ArrayList deadlineInfo = new ArrayList(Arrays.asList(taskInfo.split("/by"))); - task = new Deadline(deadlineInfo.get(0), deadlineInfo.get(1), id); - break; - } + Task task = new Task(); + task.createTask(taskInfo, instruction); try { add(list, task); diff --git a/src/main/java/FileAccessor.java b/src/main/java/FileAccessor.java new file mode 100644 index 00000000..cb7b6868 --- /dev/null +++ b/src/main/java/FileAccessor.java @@ -0,0 +1,39 @@ +import java.io.File; +import java.io.FileNotFoundException; + +public class FileAccessor { + File file; + + String path; + + public FileAccessor(String path) { + this.path = path; + } + + public File getFile() { + return file; + } + + public void setFile(File file) { + this.file = file; + } + + public String getPath() { + return path; + } + + public void setPath(String path) { + this.path = path; + } + + public boolean isInit() { + if (file == null) { + return false; + } + return true; + } + + public void init() throws Exception { + this.file = new File(this.path); + } +} diff --git a/src/main/java/Task.java b/src/main/java/Task.java index 3160aee3..49c67d74 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -1,6 +1,18 @@ +import java.util.ArrayList; +import java.util.Arrays; + public class Task { + private final static String DETECT_ADD_TODO = "todo"; + private final static String DETECT_ADD_EVENT = "event"; + private final static String DETECT_ADD_DEADLINE = "deadline"; + String description; Integer id; + Task task; + + public Task() { + + } public Task(String description, Integer id) { System.out.println("set task: " + description + id); @@ -23,5 +35,21 @@ public void setDescription(String desc) { public String toString() { return description; } + + public void createTask(String taskInfo, String instruction) { + switch (instruction) { + case DETECT_ADD_TODO: + task = new Todo(taskInfo, id); + break; + case DETECT_ADD_EVENT: + ArrayList addInfo = new ArrayList(Arrays.asList(taskInfo.split("/at"))); + task = new Event(addInfo.get(0), addInfo.get(1), id); + break; + case DETECT_ADD_DEADLINE: + ArrayList deadlineInfo = new ArrayList(Arrays.asList(taskInfo.split("/by"))); + task = new Deadline(deadlineInfo.get(0), deadlineInfo.get(1), id); + break; + } + } } diff --git a/src/main/java/TaskFile.java b/src/main/java/TaskFile.java new file mode 100644 index 00000000..726133ab --- /dev/null +++ b/src/main/java/TaskFile.java @@ -0,0 +1,47 @@ +import java.util.ArrayList; +import java.util.Objects; +import java.util.Scanner; + +public class TaskFile extends FileAccessor { + public TaskFile(String path) { + super(path); + } + + public void add(Task t) throws Exception { + + } + + public void delete(Task t) throws Exception { + + } + + public ArrayList load() throws Exception { + // load the file + // read the first line + // convert into a task + // add into the list + init(); + Scanner s = new Scanner(file); + while (s.hasNext()) { + System.out.println(s.nextLine()); + } + } + + public Task parseLineToTask(String l, int id) throws Exception { + if (Objects.equals(l, "")) { + throw new Exception("no content"); + } + + String[] parts = l.split(","); + String taskType = parts[0]; + String taskStatus = parts[1]; + String taskDesc = parts[2]; + Task t = null; + switch (taskType) { + case "T": + Task + } + + } + +} From 642a5ab7fe7b28fbc29dbc2f652ddce88dbe2909 Mon Sep 17 00:00:00 2001 From: Metilda Chee Date: Mon, 25 Oct 2021 09:31:30 +0800 Subject: [PATCH 20/49] Add TaskFile to save --- src/main/java/Duke.java | 5 ++--- src/main/java/Task.java | 6 ++++++ src/main/java/TaskFile.java | 25 +++++++++++-------------- 3 files changed, 19 insertions(+), 17 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 1a15437c..503d62e6 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -105,10 +105,9 @@ public static void main(String[] args) { printErrorMessage(Message.UNKNOWN_OBJECT); } } else { - Task task = new Task(); - task.createTask(taskInfo, instruction); - try { + Task task = new Task(); + task.createTask(taskInfo, instruction); add(list, task); } catch (Exception e) { printErrorMessage(Message.ERROR_UNRECOGNISED); diff --git a/src/main/java/Task.java b/src/main/java/Task.java index 49c67d74..cb991868 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -51,5 +51,11 @@ public void createTask(String taskInfo, String instruction) { break; } } + + public void addStatus(boolean status) throws Exception { + Todo t = (Todo) task; + t.setDone(status); + task = (Task) t; + } } diff --git a/src/main/java/TaskFile.java b/src/main/java/TaskFile.java index 726133ab..a0e7108a 100644 --- a/src/main/java/TaskFile.java +++ b/src/main/java/TaskFile.java @@ -16,15 +16,15 @@ public void delete(Task t) throws Exception { } public ArrayList load() throws Exception { - // load the file - // read the first line - // convert into a task - // add into the list init(); + ArrayList list = new ArrayList(); + int id = 0; Scanner s = new Scanner(file); while (s.hasNext()) { - System.out.println(s.nextLine()); + list.add(parseLineToTask(s.nextLine(), id)); + id++; } + return list; } public Task parseLineToTask(String l, int id) throws Exception { @@ -34,14 +34,11 @@ public Task parseLineToTask(String l, int id) throws Exception { String[] parts = l.split(","); String taskType = parts[0]; - String taskStatus = parts[1]; - String taskDesc = parts[2]; - Task t = null; - switch (taskType) { - case "T": - Task - } - + String taskDesc = parts[1]; + boolean taskStatus = Boolean.parseBoolean(parts[2]); + Task task = new Task(); + task.createTask(taskDesc, taskType); + task.addStatus(taskStatus); + return task; } - } From 3bf24247aff8f67775dc72dc29bc4034c8e89586 Mon Sep 17 00:00:00 2001 From: Metilda Chee Date: Mon, 25 Oct 2021 09:39:33 +0800 Subject: [PATCH 21/49] Update checkpoint --- src/main/java/Duke.java | 7 +------ src/main/java/TaskFile.java | 11 +++++++++++ 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 503d62e6..841a7ceb 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -25,11 +25,6 @@ public static void list(ArrayList list) throws Exception { list.forEach(l -> System.out.println(l.toString())); } - public static void add(ArrayList list, Task todo) { - list.add(todo); - System.out.println("added: " + todo.toString()); - } - public static void markDone(ArrayList list, Integer taskId) { list.stream().filter(t -> t.getId().equals(taskId)).forEach(t -> { System.out.println(STMT_DONE); @@ -108,7 +103,7 @@ public static void main(String[] args) { try { Task task = new Task(); task.createTask(taskInfo, instruction); - add(list, task); + list.add(task); } catch (Exception e) { printErrorMessage(Message.ERROR_UNRECOGNISED); } diff --git a/src/main/java/TaskFile.java b/src/main/java/TaskFile.java index a0e7108a..b721b4fb 100644 --- a/src/main/java/TaskFile.java +++ b/src/main/java/TaskFile.java @@ -27,6 +27,7 @@ public ArrayList load() throws Exception { return list; } + //deadline,party to be at 26/20/2021,0 public Task parseLineToTask(String l, int id) throws Exception { if (Objects.equals(l, "")) { throw new Exception("no content"); @@ -41,4 +42,14 @@ public Task parseLineToTask(String l, int id) throws Exception { task.addStatus(taskStatus); return task; } + + public String parseTaskToLine(Task e) throws Exception { + if (e == null) { + throw new Exception("task to parse is empty"); + } + + Todo todo = (Todo) e; + // fix parsing + return "fix me"; + } } From 2dfc2d211dd154eca24b158372a419c5a2fce13b Mon Sep 17 00:00:00 2001 From: Metilda Chee Date: Wed, 3 Nov 2021 16:57:31 +0800 Subject: [PATCH 22/49] Add save function --- src/main/java/Deadline.java | 5 ++++ src/main/java/Event.java | 5 ++++ src/main/java/Task.java | 8 ++++++ src/main/java/TaskFile.java | 42 ++++++++++++++++++++------------ src/main/java/Todo.java | 12 ++++++++- src/test/java/TestTodoCases.java | 9 ------- 6 files changed, 55 insertions(+), 26 deletions(-) delete mode 100644 src/test/java/TestTodoCases.java diff --git a/src/main/java/Deadline.java b/src/main/java/Deadline.java index 8a895ec6..b230c33a 100644 --- a/src/main/java/Deadline.java +++ b/src/main/java/Deadline.java @@ -19,4 +19,9 @@ public String toString() { String status = isDone ? "X" : " "; return id + ". [D][" + status + "] " + super.getDescription() + " (by: " + by + ")"; } + + @Override + public String getType() { + return "deadline"; + } } \ No newline at end of file diff --git a/src/main/java/Event.java b/src/main/java/Event.java index a86d77d4..76d93ca0 100644 --- a/src/main/java/Event.java +++ b/src/main/java/Event.java @@ -19,4 +19,9 @@ public String toString() { String status = isDone ? "X" : " "; return id + ". [E][" + status + "] " + super.getDescription() + " (at: " + at + ")"; } + + @Override + public String getType() { + return "event"; + } } \ No newline at end of file diff --git a/src/main/java/Task.java b/src/main/java/Task.java index cb991868..ad7fe56e 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -14,6 +14,10 @@ public Task() { } + public String toTask() { + return getType() + "," + getDescription(); + } + public Task(String description, Integer id) { System.out.println("set task: " + description + id); this.id = id; @@ -36,6 +40,10 @@ public String toString() { return description; } + public String getType() { + return "task"; + } + public void createTask(String taskInfo, String instruction) { switch (instruction) { case DETECT_ADD_TODO: diff --git a/src/main/java/TaskFile.java b/src/main/java/TaskFile.java index b721b4fb..32aae5bb 100644 --- a/src/main/java/TaskFile.java +++ b/src/main/java/TaskFile.java @@ -1,4 +1,7 @@ +import java.io.FileWriter; +import java.io.IOException; import java.util.ArrayList; +import java.util.Arrays; import java.util.Objects; import java.util.Scanner; @@ -7,14 +10,6 @@ public TaskFile(String path) { super(path); } - public void add(Task t) throws Exception { - - } - - public void delete(Task t) throws Exception { - - } - public ArrayList load() throws Exception { init(); ArrayList list = new ArrayList(); @@ -27,6 +22,29 @@ public ArrayList load() throws Exception { return list; } + public String parseTaskToLine(Task e) throws Exception { + if (e == null) { + throw new Exception("task to parse is empty"); + } + Todo t = (Todo) e; + return t.toTask(); + } + + public void save(ArrayList tasks) throws Exception { + FileWriter fw = new FileWriter(path); + tasks.forEach(t -> { + try { + String task = parseTaskToLine(t); + fw.write(task); + System.out.println("task written properly" + task); + } catch (Exception e) { + e.printStackTrace(); + } + }); + fw.close(); + System.out.println("file has been saved properly"); + } + //deadline,party to be at 26/20/2021,0 public Task parseLineToTask(String l, int id) throws Exception { if (Objects.equals(l, "")) { @@ -43,13 +61,5 @@ public Task parseLineToTask(String l, int id) throws Exception { return task; } - public String parseTaskToLine(Task e) throws Exception { - if (e == null) { - throw new Exception("task to parse is empty"); - } - Todo todo = (Todo) e; - // fix parsing - return "fix me"; - } } diff --git a/src/main/java/Todo.java b/src/main/java/Todo.java index a3aadd57..28969a9f 100644 --- a/src/main/java/Todo.java +++ b/src/main/java/Todo.java @@ -1,4 +1,4 @@ -public class Todo extends Task { +public class Todo extends Task { public boolean isDone; public Todo(String desc, Integer id) { @@ -19,4 +19,14 @@ public String toString() { String status = isDone ? "X" : " "; return id + ". [T][" + status + "] " + super.toString(); } + + @Override + public String toTask() { + return super.toTask() + "," + (isDone ? 1 : 0); + } + + @Override + public String getType() { + return "todo"; + } } \ No newline at end of file diff --git a/src/test/java/TestTodoCases.java b/src/test/java/TestTodoCases.java deleted file mode 100644 index 4bac781c..00000000 --- a/src/test/java/TestTodoCases.java +++ /dev/null @@ -1,9 +0,0 @@ -import static org.junit.Assert.*; - -public class TestTodoCases { - Todo todo = new Todo(); - - @Test - public void testTodoCreate() { - } -} \ No newline at end of file From 82fea0c1ff47de65f5c9ef7aa3519049911f240e Mon Sep 17 00:00:00 2001 From: Metilda Chee Date: Wed, 3 Nov 2021 19:51:16 +0800 Subject: [PATCH 23/49] Finish save feature --- Logging.txt | 8 ++++ Logging.txt.lck | 0 duke.txt | 1 + pom.xml | 5 +++ src/main/java/Deadline.java | 2 +- src/main/java/Duke.java | 42 +++++++++++++----- src/main/java/Event.java | 2 +- src/main/java/FileAccessor.java | 16 +++++-- src/main/java/Global.java | 7 +++ src/main/java/Task.java | 59 ++++++++++++-------------- src/main/java/TaskFile.java | 75 +++++++++++++++++++-------------- src/main/java/TaskManager.java | 24 +++++++++++ src/main/java/Todo.java | 6 ++- 13 files changed, 166 insertions(+), 81 deletions(-) create mode 100644 Logging.txt create mode 100644 Logging.txt.lck create mode 100644 duke.txt create mode 100644 src/main/java/Global.java create mode 100644 src/main/java/TaskManager.java diff --git a/Logging.txt b/Logging.txt new file mode 100644 index 00000000..88871611 --- /dev/null +++ b/Logging.txt @@ -0,0 +1,8 @@ +Nov 03, 2021 7:50:42 PM Task +INFO: set task, details: 0 description: wash clothes +Nov 03, 2021 7:50:42 PM TaskFile load +INFO: added task successfully to list0. [T][ ] wash clothes +Nov 03, 2021 7:50:49 PM Task +INFO: set task, details: 1 description: +Nov 03, 2021 7:50:54 PM Task +INFO: set task, details: 2 description: wash clothes diff --git a/Logging.txt.lck b/Logging.txt.lck new file mode 100644 index 00000000..e69de29b diff --git a/duke.txt b/duke.txt new file mode 100644 index 00000000..71d935c3 --- /dev/null +++ b/duke.txt @@ -0,0 +1 @@ +todo,wash clothes,0 \ No newline at end of file diff --git a/pom.xml b/pom.xml index 12273332..23c2d31b 100644 --- a/pom.xml +++ b/pom.xml @@ -41,6 +41,11 @@ 5.7.0 test + + org.springframework + spring-beans + 5.3.0 + \ No newline at end of file diff --git a/src/main/java/Deadline.java b/src/main/java/Deadline.java index b230c33a..f0b3bb98 100644 --- a/src/main/java/Deadline.java +++ b/src/main/java/Deadline.java @@ -1,7 +1,7 @@ public class Deadline extends Todo { String by; - public Deadline(String description, String due, Integer id) { + public Deadline(String description, String due, int id) { super(description, id); by = due; } diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 841a7ceb..04edcf06 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -1,12 +1,17 @@ import java.io.File; +import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.Locale; import java.util.Scanner; +import java.util.logging.FileHandler; +import java.util.logging.Level; +import java.util.logging.Logger; +import java.util.logging.SimpleFormatter; public class Duke { - // TODO: Change these to enums + // TODO: Change these to enums or configurations private final static String DETECT_END = "bye"; private final static String DETECT_LIST = "list"; private final static String DETECT_DONE = "done"; @@ -19,7 +24,7 @@ public class Duke { private final static String ERROR_PREFIX = "Oops I did not quite understand that."; - private final static String FILEPATH_TASK = ""; + private final static String FILEPATH_TASK = "~/go/src/github.com/metildachee/duke/duke.txt"; public static void list(ArrayList list) throws Exception { list.forEach(l -> System.out.println(l.toString())); @@ -63,15 +68,28 @@ public static void printErrorMessage(Message m) { } - public static void main(String[] args) { + public static void main(String[] args) throws IOException { + // TODO: Abstract out to a logger class + Logger logger = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME); + logger.setLevel(Level.FINEST); + FileHandler fileTxt = new FileHandler("Logging.txt"); + + SimpleFormatter formatterTxt = new SimpleFormatter(); + fileTxt.setFormatter(formatterTxt); + logger.addHandler(fileTxt); + + // Program starts System.out.println(STMT_START); Scanner in = new Scanner(System.in); ArrayList list = new ArrayList<>(); - try { - list = new TaskFile(FILEPATH_TASK).load(); - } catch (Exception e) { - System.out.println("got error loading file" + e); - } + + // + TaskManager manager = new TaskManager(); + list = new TaskFile(FILEPATH_TASK).load(manager); + + // counter + Global global = new Global(); + String input = in.nextLine(); ArrayList tokens = new ArrayList(Arrays.asList(input.split(" "))); String instruction = tokens.get(0); @@ -101,10 +119,10 @@ public static void main(String[] args) { } } else { try { - Task task = new Task(); - task.createTask(taskInfo, instruction); - list.add(task); + Task t = manager.createTask(taskInfo, instruction); + list.add(t); } catch (Exception e) { + System.out.println("got exception, error: " + e); printErrorMessage(Message.ERROR_UNRECOGNISED); } } @@ -124,6 +142,8 @@ public static void main(String[] args) { System.out.println("task info:" + taskInfo); id = list.size(); } + + new TaskFile(FILEPATH_TASK).save(list); System.out.println(STMT_END); } } diff --git a/src/main/java/Event.java b/src/main/java/Event.java index 76d93ca0..c8f0f41a 100644 --- a/src/main/java/Event.java +++ b/src/main/java/Event.java @@ -1,7 +1,7 @@ public class Event extends Todo { String at; - public Event(String description, String start, Integer id) { + public Event(String description, String start, int id) { super(description, id); at = start; } diff --git a/src/main/java/FileAccessor.java b/src/main/java/FileAccessor.java index cb7b6868..e988977c 100644 --- a/src/main/java/FileAccessor.java +++ b/src/main/java/FileAccessor.java @@ -3,11 +3,10 @@ public class FileAccessor { File file; - String path; public FileAccessor(String path) { - this.path = path; + this.path = "duke.txt"; } public File getFile() { @@ -34,6 +33,17 @@ public boolean isInit() { } public void init() throws Exception { - this.file = new File(this.path); + System.out.println("init file path: " + path); + try { + this.file = new File(this.path); + System.out.println("path " + path); + path = this.file.getPath(); + boolean created = file.createNewFile(); + if (created) { + System.out.println("no file detected, a new file has been created: " + this.path); + } + } catch (Exception e) { + System.out.println("got err: " + e); + } } } diff --git a/src/main/java/Global.java b/src/main/java/Global.java new file mode 100644 index 00000000..46a44d80 --- /dev/null +++ b/src/main/java/Global.java @@ -0,0 +1,7 @@ +public class Global { + int id = 0; + + public int getId() { + return id++; + } +} diff --git a/src/main/java/Task.java b/src/main/java/Task.java index ad7fe56e..5abe805a 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -1,27 +1,20 @@ import java.util.ArrayList; import java.util.Arrays; +import java.util.logging.Logger; public class Task { - private final static String DETECT_ADD_TODO = "todo"; - private final static String DETECT_ADD_EVENT = "event"; - private final static String DETECT_ADD_DEADLINE = "deadline"; - + private static final Logger logger = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME); String description; Integer id; - Task task; - - public Task() { - - } public String toTask() { return getType() + "," + getDescription(); } - public Task(String description, Integer id) { - System.out.println("set task: " + description + id); + public Task(String description, int id) { this.id = id; this.description = description; + logger.info("set task, details: " + id + " description: " + description); } public Integer getId() { @@ -43,27 +36,27 @@ public String toString() { public String getType() { return "task"; } - - public void createTask(String taskInfo, String instruction) { - switch (instruction) { - case DETECT_ADD_TODO: - task = new Todo(taskInfo, id); - break; - case DETECT_ADD_EVENT: - ArrayList addInfo = new ArrayList(Arrays.asList(taskInfo.split("/at"))); - task = new Event(addInfo.get(0), addInfo.get(1), id); - break; - case DETECT_ADD_DEADLINE: - ArrayList deadlineInfo = new ArrayList(Arrays.asList(taskInfo.split("/by"))); - task = new Deadline(deadlineInfo.get(0), deadlineInfo.get(1), id); - break; - } - } - - public void addStatus(boolean status) throws Exception { - Todo t = (Todo) task; - t.setDone(status); - task = (Task) t; - } +// +// public void createTask(String taskInfo, String instruction) { +// switch (instruction) { +// case DETECT_ADD_TODO: +// task = new Todo(taskInfo, id); +// break; +// case DETECT_ADD_EVENT: +// ArrayList addInfo = new ArrayList(Arrays.asList(taskInfo.split("/at"))); +// task = new Event(addInfo.get(0), addInfo.get(1), id); +// break; +// case DETECT_ADD_DEADLINE: +// ArrayList deadlineInfo = new ArrayList(Arrays.asList(taskInfo.split("/by"))); +// task = new Deadline(deadlineInfo.get(0), deadlineInfo.get(1), id); +// break; +// } +// } +// +// public void addStatus(boolean status) throws Exception { +// Todo t = (Todo) task; +// t.setDone(status); +// task = (Task) t; +// } } diff --git a/src/main/java/TaskFile.java b/src/main/java/TaskFile.java index 32aae5bb..010b61c3 100644 --- a/src/main/java/TaskFile.java +++ b/src/main/java/TaskFile.java @@ -4,49 +4,62 @@ import java.util.Arrays; import java.util.Objects; import java.util.Scanner; +import java.util.logging.Logger; public class TaskFile extends FileAccessor { + private static final Logger logger = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME); + public TaskFile(String path) { super(path); } - public ArrayList load() throws Exception { - init(); - ArrayList list = new ArrayList(); - int id = 0; - Scanner s = new Scanner(file); - while (s.hasNext()) { - list.add(parseLineToTask(s.nextLine(), id)); - id++; + public ArrayList load(TaskManager tm) { + try { + init(); + ArrayList list = new ArrayList(); + int id = 0; + Scanner s = new Scanner(file); + while (s.hasNext()) { + Task t = parseLineToTask(s.nextLine(), id, tm); + list.add(t); + logger.info("added task successfully to list" + t); + id++; + } + return list; + } catch (Exception e) { + logger.info("got error loading file, error: " + e); } - return list; + return new ArrayList(); } public String parseTaskToLine(Task e) throws Exception { if (e == null) { throw new Exception("task to parse is empty"); } - Todo t = (Todo) e; - return t.toTask(); + return e.toTask(); } - public void save(ArrayList tasks) throws Exception { - FileWriter fw = new FileWriter(path); - tasks.forEach(t -> { - try { - String task = parseTaskToLine(t); - fw.write(task); - System.out.println("task written properly" + task); - } catch (Exception e) { - e.printStackTrace(); - } - }); - fw.close(); - System.out.println("file has been saved properly"); + public void save(ArrayList tasks) { + try { + FileWriter fw = new FileWriter(path); + tasks.forEach(t -> { + try { + String task = parseTaskToLine(t); + fw.write(task + "\n"); + logger.info("task written properly" + task); + } catch (Exception e) { + e.printStackTrace(); + } + }); + fw.close(); + logger.info("file has been saved properly"); + } catch (Exception e) { + System.out.println("saving failed, error: " + e); + } } //deadline,party to be at 26/20/2021,0 - public Task parseLineToTask(String l, int id) throws Exception { + public Task parseLineToTask(String l, int id, TaskManager tm) throws Exception { if (Objects.equals(l, "")) { throw new Exception("no content"); } @@ -55,11 +68,11 @@ public Task parseLineToTask(String l, int id) throws Exception { String taskType = parts[0]; String taskDesc = parts[1]; boolean taskStatus = Boolean.parseBoolean(parts[2]); - Task task = new Task(); - task.createTask(taskDesc, taskType); - task.addStatus(taskStatus); - return task; + Task t = tm.createTask(taskDesc, taskType); + if (!Objects.equals(t.getType(), "task")) { + Todo todo = (Todo) t; + todo.setDone(taskStatus); + } + return t; } - - } diff --git a/src/main/java/TaskManager.java b/src/main/java/TaskManager.java new file mode 100644 index 00000000..d52960a4 --- /dev/null +++ b/src/main/java/TaskManager.java @@ -0,0 +1,24 @@ +import java.util.ArrayList; +import java.util.Arrays; + +public class TaskManager { + private final static String DETECT_ADD_TODO = "todo"; + private final static String DETECT_ADD_EVENT = "event"; + private final static String DETECT_ADD_DEADLINE = "deadline"; + + Global global = new Global(); + + public Task createTask(String taskInfo, String instruction) { + switch (instruction) { + case DETECT_ADD_TODO: + return new Todo(taskInfo, global.getId()); + case DETECT_ADD_EVENT: + ArrayList addInfo = new ArrayList(Arrays.asList(taskInfo.split("/at"))); + return new Event(addInfo.get(0), addInfo.get(1), global.getId()); + case DETECT_ADD_DEADLINE: + ArrayList deadlineInfo = new ArrayList(Arrays.asList(taskInfo.split("/by"))); + return new Deadline(deadlineInfo.get(0), deadlineInfo.get(1), global.getId()); + } + return new Task(taskInfo, global.getId()); + } +} diff --git a/src/main/java/Todo.java b/src/main/java/Todo.java index 28969a9f..d2bc7c46 100644 --- a/src/main/java/Todo.java +++ b/src/main/java/Todo.java @@ -1,7 +1,11 @@ +import java.util.logging.Level; +import java.util.logging.Logger; + public class Todo extends Task { + private static final Logger logger = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME); public boolean isDone; - public Todo(String desc, Integer id) { + public Todo(String desc, int id) { super(desc, id); isDone = false; } From d71918f7b316f34653cdc480f014405f482413e6 Mon Sep 17 00:00:00 2001 From: Metilda Chee Date: Thu, 4 Nov 2021 09:07:03 +0800 Subject: [PATCH 24/49] Add Gradle support and add create test cases --- Logging.txt.lck | 0 build.gradle | 46 +++++++++++++++++++++ gradle/wrapper/gradle-wrapper.properties | 5 +++ pom.xml | 51 ------------------------ src/test/java/TaskManagerTest.java | 34 ++++++++++++++++ 5 files changed, 85 insertions(+), 51 deletions(-) delete mode 100644 Logging.txt.lck create mode 100644 build.gradle create mode 100644 gradle/wrapper/gradle-wrapper.properties delete mode 100644 pom.xml create mode 100644 src/test/java/TaskManagerTest.java diff --git a/Logging.txt.lck b/Logging.txt.lck deleted file mode 100644 index e69de29b..00000000 diff --git a/build.gradle b/build.gradle new file mode 100644 index 00000000..3cc1272e --- /dev/null +++ b/build.gradle @@ -0,0 +1,46 @@ +plugins { + id 'java' + id 'application' + id 'checkstyle' + id 'com.github.johnrengelman.shadow' version '5.1.0' +} + +repositories { + mavenCentral() +} + +dependencies { + testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.5.0' + testRuntimeOnly group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: '5.5.0' +} + +test { + useJUnitPlatform() + + testLogging { + events "passed", "skipped", "failed" + + showExceptions true + exceptionFormat "full" + showCauses true + showStackTraces true + showStandardStreams = false + } +} + +application { + mainClassName = "seedu.duke.Duke" +} + +shadowJar { + archiveBaseName = "duke" + archiveClassifier = null +} + +checkstyle { + toolVersion = '8.29' +} + +run{ + standardInput = System.in +} \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..c14115d7 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.2-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists \ No newline at end of file diff --git a/pom.xml b/pom.xml deleted file mode 100644 index 23c2d31b..00000000 --- a/pom.xml +++ /dev/null @@ -1,51 +0,0 @@ - - - 4.0.0 - - metchee - duke - 1.0-SNAPSHOT - - - 11 - 11 - - - - - - - maven-surefire-plugin - 2.22.2 - - - maven-failsafe-plugin - 2.22.2 - - - - - - - - org.junit.jupiter - junit-jupiter-api - 5.7.0 - test - - - org.junit.jupiter - junit-jupiter-engine - 5.7.0 - test - - - org.springframework - spring-beans - 5.3.0 - - - - \ No newline at end of file diff --git a/src/test/java/TaskManagerTest.java b/src/test/java/TaskManagerTest.java new file mode 100644 index 00000000..c85c4888 --- /dev/null +++ b/src/test/java/TaskManagerTest.java @@ -0,0 +1,34 @@ +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; + +public class TaskManagerTest { + + @Test + public void createTodo() { + String eventType = "todo"; + String eventInfo = "read books"; + + TaskManager tm = new TaskManager(); + Task t = tm.createTask(eventInfo, eventType); + Todo e = (Todo) t; + assertEquals(e.getType(), eventType); + assertEquals(e.getDescription(), eventInfo); + } + + @Test + public void createEventTest() { + String eventType = "event"; + String eventDesc = "project meeting"; + String eventTime = "Mon 2-4pm"; + String eventInfo = eventDesc + "/at" + eventTime; + + TaskManager tm = new TaskManager(); + Task t = tm.createTask(eventInfo, eventType); + assertEquals(t.getType(), eventType); + Event e = (Event) t; + assertEquals(e.getDescription(), eventDesc); + assertEquals(e.getAt(), eventTime); + } +} \ No newline at end of file From e3624d0df519cd399a0a5e6808f11604cbc7c996 Mon Sep 17 00:00:00 2001 From: Metilda Chee Date: Thu, 4 Nov 2021 09:08:43 +0800 Subject: [PATCH 25/49] Delete logs --- Logging.txt | 8 -------- src/main/java/Duke.java | 2 +- 2 files changed, 1 insertion(+), 9 deletions(-) delete mode 100644 Logging.txt diff --git a/Logging.txt b/Logging.txt deleted file mode 100644 index 88871611..00000000 --- a/Logging.txt +++ /dev/null @@ -1,8 +0,0 @@ -Nov 03, 2021 7:50:42 PM Task -INFO: set task, details: 0 description: wash clothes -Nov 03, 2021 7:50:42 PM TaskFile load -INFO: added task successfully to list0. [T][ ] wash clothes -Nov 03, 2021 7:50:49 PM Task -INFO: set task, details: 1 description: -Nov 03, 2021 7:50:54 PM Task -INFO: set task, details: 2 description: wash clothes diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 04edcf06..0c76be86 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -72,7 +72,7 @@ public static void main(String[] args) throws IOException { // TODO: Abstract out to a logger class Logger logger = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME); logger.setLevel(Level.FINEST); - FileHandler fileTxt = new FileHandler("Logging.txt"); + FileHandler fileTxt = new FileHandler("duke_info.logs"); SimpleFormatter formatterTxt = new SimpleFormatter(); fileTxt.setFormatter(formatterTxt); From 17d467541fe8a648d68adbf6563a9fb0356fac0e Mon Sep 17 00:00:00 2001 From: Metilda Chee Date: Thu, 4 Nov 2021 11:17:12 +0800 Subject: [PATCH 26/49] Finalise gradle support --- build.gradle | 23 +-- duke.txt | 4 +- gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 59536 bytes gradle/wrapper/gradle-wrapper.properties | 4 +- gradlew | 234 +++++++++++++++++++++++ gradlew.bat | 89 +++++++++ src/main/java/TaskManager.java | 11 ++ src/test/java/TaskManagerTest.java | 1 - 8 files changed, 348 insertions(+), 18 deletions(-) create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100755 gradlew create mode 100644 gradlew.bat diff --git a/build.gradle b/build.gradle index 3cc1272e..304a2dac 100644 --- a/build.gradle +++ b/build.gradle @@ -10,26 +10,20 @@ repositories { } dependencies { - testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.5.0' - testRuntimeOnly group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: '5.5.0' + testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: '5.7.0' + testRuntimeOnly group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: '5.7.0' + testCompileOnly 'junit:junit:4.12' + testRuntimeOnly 'org.junit.vintage:junit-vintage-engine:5.1.0' } test { - useJUnitPlatform() - - testLogging { - events "passed", "skipped", "failed" - - showExceptions true - exceptionFormat "full" - showCauses true - showStackTraces true - showStandardStreams = false + useJUnitPlatform { + includeEngines 'junit-vintage' } } application { - mainClassName = "seedu.duke.Duke" + mainClassName = "Duke" } shadowJar { @@ -41,6 +35,7 @@ checkstyle { toolVersion = '8.29' } -run{ +run { standardInput = System.in + enableAssertions = true } \ No newline at end of file diff --git a/duke.txt b/duke.txt index 71d935c3..4be37407 100644 --- a/duke.txt +++ b/duke.txt @@ -1 +1,3 @@ -todo,wash clothes,0 \ No newline at end of file +todo,wash clothes,0 +todo,deadline,0 +todo,read books,0 diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..7454180f2ae8848c63b8b4dea2cb829da983f2fa GIT binary patch literal 59536 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 QuEJmfE|#`Dqx|px0L@K;Y5)KL literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index c14115d7..ffed3a25 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists \ No newline at end of file +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100755 index 00000000..1b6c7873 --- /dev/null +++ b/gradlew @@ -0,0 +1,234 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# within the Gradle project. +# +# You can find Gradle at https://github.com/gradle/gradle/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit + +APP_NAME="Gradle" +APP_BASE_NAME=${0##*/} + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 00000000..ac1b06f9 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/src/main/java/TaskManager.java b/src/main/java/TaskManager.java index d52960a4..2941c36f 100644 --- a/src/main/java/TaskManager.java +++ b/src/main/java/TaskManager.java @@ -22,3 +22,14 @@ public Task createTask(String taskInfo, String instruction) { return new Task(taskInfo, global.getId()); } } + + +// testLogging { +// events "passed", "skipped", "failed" +// +// showExceptions true +// exceptionFormat "full" +// showCauses true +// showStackTraces true +// showStandardStreams = false +// } \ No newline at end of file diff --git a/src/test/java/TaskManagerTest.java b/src/test/java/TaskManagerTest.java index c85c4888..56d7f13d 100644 --- a/src/test/java/TaskManagerTest.java +++ b/src/test/java/TaskManagerTest.java @@ -1,7 +1,6 @@ import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.fail; public class TaskManagerTest { From db8a4506162b8e8705c5a0addcd11c205536977e Mon Sep 17 00:00:00 2001 From: Metilda Chee Date: Thu, 4 Nov 2021 11:24:07 +0800 Subject: [PATCH 27/49] Finish test cases --- src/test/java/TaskManagerTest.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/test/java/TaskManagerTest.java b/src/test/java/TaskManagerTest.java index 56d7f13d..d6c10b19 100644 --- a/src/test/java/TaskManagerTest.java +++ b/src/test/java/TaskManagerTest.java @@ -5,13 +5,14 @@ public class TaskManagerTest { @Test - public void createTodo() { + public void createTodoTest() { String eventType = "todo"; String eventInfo = "read books"; TaskManager tm = new TaskManager(); Task t = tm.createTask(eventInfo, eventType); Todo e = (Todo) t; + System.out.println(e.toString()); assertEquals(e.getType(), eventType); assertEquals(e.getDescription(), eventInfo); } @@ -27,6 +28,7 @@ public void createEventTest() { Task t = tm.createTask(eventInfo, eventType); assertEquals(t.getType(), eventType); Event e = (Event) t; + System.out.println(e.toString()); assertEquals(e.getDescription(), eventDesc); assertEquals(e.getAt(), eventTime); } From faf62b322b4f2af7cb455c76b5db339ddc050730 Mon Sep 17 00:00:00 2001 From: Metilda Chee Date: Thu, 4 Nov 2021 11:36:25 +0800 Subject: [PATCH 28/49] Add parser and date, time in Event --- src/main/java/Event.java | 32 ++++++++++++++++++++++++++++---- src/main/java/TaskManager.java | 13 +------------ 2 files changed, 29 insertions(+), 16 deletions(-) diff --git a/src/main/java/Event.java b/src/main/java/Event.java index c8f0f41a..6128e9bf 100644 --- a/src/main/java/Event.java +++ b/src/main/java/Event.java @@ -1,17 +1,41 @@ +import java.time.LocalDate; +import java.time.format.DateTimeParseException; +import java.util.Objects; +import java.util.logging.Logger; + public class Event extends Todo { - String at; + LocalDate at; + private static final Logger logger = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME); public Event(String description, String start, int id) { super(description, id); - at = start; + setAt(start); + } + + public LocalDate parseStringToDate(String date) { + LocalDate parsedDate = null; + try { + parsedDate = LocalDate.parse(date); + } catch (DateTimeParseException e) { + logger.info("parse date time got error" + e.getMessage()); + } + return parsedDate; } - public String getAt() { + public LocalDate getAt() { return at; } public void setAt(String start) { - at = start; + if (Objects.equals(start, "")) { + return; + } + LocalDate date = parseStringToDate(start); + if (date == null) { + logger.info("parsing date got null"); + } else { + at = date; + } } @Override diff --git a/src/main/java/TaskManager.java b/src/main/java/TaskManager.java index 2941c36f..069fdd0f 100644 --- a/src/main/java/TaskManager.java +++ b/src/main/java/TaskManager.java @@ -21,15 +21,4 @@ public Task createTask(String taskInfo, String instruction) { } return new Task(taskInfo, global.getId()); } -} - - -// testLogging { -// events "passed", "skipped", "failed" -// -// showExceptions true -// exceptionFormat "full" -// showCauses true -// showStackTraces true -// showStandardStreams = false -// } \ No newline at end of file +} \ No newline at end of file From 31cb0862deafb9321598b9d41c8b744e10c6bfb3 Mon Sep 17 00:00:00 2001 From: Metilda Chee Date: Thu, 4 Nov 2021 11:37:56 +0800 Subject: [PATCH 29/49] Update toString() method for Event --- src/main/java/Event.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/Event.java b/src/main/java/Event.java index 6128e9bf..f22befae 100644 --- a/src/main/java/Event.java +++ b/src/main/java/Event.java @@ -1,4 +1,5 @@ import java.time.LocalDate; +import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; import java.util.Objects; import java.util.logging.Logger; @@ -41,7 +42,7 @@ public void setAt(String start) { @Override public String toString() { String status = isDone ? "X" : " "; - return id + ". [E][" + status + "] " + super.getDescription() + " (at: " + at + ")"; + return id + ". [E][" + status + "] " + super.getDescription() + " (at: " + at.format(DateTimeFormatter.ofPattern("MMM d yyyy")) + ")"; } @Override From 7474172a0b57d02145af9e67903eae1865a64b45 Mon Sep 17 00:00:00 2001 From: Metilda Chee Date: Thu, 4 Nov 2021 12:20:58 +0800 Subject: [PATCH 30/49] Rebuild Deadline class --- src/main/java/Deadline.java | 75 ++++++++++++++++++++++++++---- src/main/java/Event.java | 39 +++------------- src/test/java/TaskManagerTest.java | 32 ++++++++++++- 3 files changed, 104 insertions(+), 42 deletions(-) diff --git a/src/main/java/Deadline.java b/src/main/java/Deadline.java index f0b3bb98..9c1b2fbe 100644 --- a/src/main/java/Deadline.java +++ b/src/main/java/Deadline.java @@ -1,27 +1,86 @@ +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Objects; +import java.util.logging.Logger; + public class Deadline extends Todo { - String by; + LocalDate date; + long endTime; + + private static final Logger logger = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME); + + public Deadline(String description, String end, int id) { + super(description, id); - public Deadline(String description, String due, int id) { + ArrayList tokens = new ArrayList(Arrays.asList(end.split(" "))); + setDate(tokens.get(0)); + setEndTime(tokens.get(1)); + } + + public Deadline(String description, int id) { super(description, id); - by = due; + date = null; } - public String getBy() { - return by; + public Deadline(String description, LocalDate date, long time, int id) { + super(description, id); + this.date = date; + endTime = time; } - public void setBy(String due) { - by = due; + public LocalDate getDate() { + return date; + } + + public void setDate(String date) { + if (Objects.equals(date, "")) { + return; + } + LocalDate parsedDate = handlerParseStringToDate(date); + if (parsedDate == null) { + logger.info("parsing date got null"); + } else { + this.date = parsedDate; + } + } + + public void setEndTime(String time) { + DateFormat formatter = new SimpleDateFormat("HH:mm"); + try { + this.endTime = formatter.parse(time).getTime(); + } catch (ParseException p) { + logger.info("parsing time got null"); + } + } + + public long getEndTime() { + return endTime; } @Override public String toString() { String status = isDone ? "X" : " "; - return id + ". [D][" + status + "] " + super.getDescription() + " (by: " + by + ")"; + return id + ". [D][" + status + "] " + super.getDescription() + " (at: " + date.format(DateTimeFormatter.ofPattern("MMM d yyyy")) + ")"; } @Override public String getType() { return "deadline"; } + + public LocalDate handlerParseStringToDate(String date) { + LocalDate parsedDate = null; + try { + parsedDate = LocalDate.parse(date); + } catch (DateTimeParseException e) { + logger.info("parse date time got error" + e.getMessage()); + } + return parsedDate; + } } \ No newline at end of file diff --git a/src/main/java/Event.java b/src/main/java/Event.java index f22befae..2dc65323 100644 --- a/src/main/java/Event.java +++ b/src/main/java/Event.java @@ -1,48 +1,23 @@ +import java.sql.Time; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; import java.util.Objects; import java.util.logging.Logger; -public class Event extends Todo { - LocalDate at; - private static final Logger logger = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME); - - public Event(String description, String start, int id) { - super(description, id); - setAt(start); - } +public class Event extends Deadline { + long startTime; - public LocalDate parseStringToDate(String date) { - LocalDate parsedDate = null; - try { - parsedDate = LocalDate.parse(date); - } catch (DateTimeParseException e) { - logger.info("parse date time got error" + e.getMessage()); - } - return parsedDate; - } - - public LocalDate getAt() { - return at; - } + private static final Logger logger = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME); - public void setAt(String start) { - if (Objects.equals(start, "")) { - return; - } - LocalDate date = parseStringToDate(start); - if (date == null) { - logger.info("parsing date got null"); - } else { - at = date; - } + public Event(String description, String date, int id) { + super(description, date, id); } @Override public String toString() { String status = isDone ? "X" : " "; - return id + ". [E][" + status + "] " + super.getDescription() + " (at: " + at.format(DateTimeFormatter.ofPattern("MMM d yyyy")) + ")"; + return id + ". [E][" + status + "] " + super.getDescription() + " (at: " + date.format(DateTimeFormatter.ofPattern("MMM d yyyy")) + ")"; } @Override diff --git a/src/test/java/TaskManagerTest.java b/src/test/java/TaskManagerTest.java index d6c10b19..c63fabed 100644 --- a/src/test/java/TaskManagerTest.java +++ b/src/test/java/TaskManagerTest.java @@ -4,6 +4,10 @@ public class TaskManagerTest { + /* + Todos: + tasks without any date/time attached to it + */ @Test public void createTodoTest() { String eventType = "todo"; @@ -17,11 +21,15 @@ public void createTodoTest() { assertEquals(e.getDescription(), eventInfo); } + /* + Events: + tasks that start at a specific time and ends at a specific time e.g., team project meeting on 2/10/2019 2-4pm + */ @Test public void createEventTest() { String eventType = "event"; String eventDesc = "project meeting"; - String eventTime = "Mon 2-4pm"; + String eventTime = "2/12/2019 1800"; String eventInfo = eventDesc + "/at" + eventTime; TaskManager tm = new TaskManager(); @@ -30,6 +38,26 @@ public void createEventTest() { Event e = (Event) t; System.out.println(e.toString()); assertEquals(e.getDescription(), eventDesc); - assertEquals(e.getAt(), eventTime); + assertEquals(e.getDate(), eventTime); + } + + /* + Deadlines: + tasks that need to be done before a specific date/time e.g., submit report by 11/10/2019 5pm + */ + @Test + public void createDeadlineTest() { + String eventType = "deadline"; + String eventDesc = "submit report"; + String eventTime = "2/12/2019 1800"; + String eventInfo = eventDesc + "/by" + eventTime; + + TaskManager tm = new TaskManager(); + Task t = tm.createTask(eventInfo, eventType); + assertEquals(t.getType(), eventType); + Event e = (Event) t; + System.out.println(e.toString()); + assertEquals(e.getDescription(), eventDesc); + assertEquals(e.getDate(), eventTime); } } \ No newline at end of file From bb39e18d3d480c91922feed5f53075241cc21cd4 Mon Sep 17 00:00:00 2001 From: Metilda Chee Date: Thu, 4 Nov 2021 13:05:28 +0800 Subject: [PATCH 31/49] Finish test cases for deadline and events --- src/main/java/Deadline.java | 14 +++++++++++--- src/main/java/Event.java | 24 +++++++++++++++++++++++- src/test/java/TaskManagerTest.java | 18 +++++++++++------- 3 files changed, 45 insertions(+), 11 deletions(-) diff --git a/src/main/java/Deadline.java b/src/main/java/Deadline.java index 9c1b2fbe..709ec60e 100644 --- a/src/main/java/Deadline.java +++ b/src/main/java/Deadline.java @@ -15,10 +15,10 @@ public class Deadline extends Todo { private static final Logger logger = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME); - public Deadline(String description, String end, int id) { + public Deadline(String description, String endDateTime, int id) { super(description, id); - ArrayList tokens = new ArrayList(Arrays.asList(end.split(" "))); + ArrayList tokens = new ArrayList(Arrays.asList(endDateTime.split(" "))); setDate(tokens.get(0)); setEndTime(tokens.get(1)); } @@ -34,11 +34,18 @@ public Deadline(String description, LocalDate date, long time, int id) { endTime = time; } + public Deadline(String description, String date, String endTime, int id) { + super(description, id); + setDate(date); + setEndTime(endTime); + } + public LocalDate getDate() { return date; } public void setDate(String date) { + logger.info("set date " + date); if (Objects.equals(date, "")) { return; } @@ -51,11 +58,12 @@ public void setDate(String date) { } public void setEndTime(String time) { + logger.info("set end_time " + time); DateFormat formatter = new SimpleDateFormat("HH:mm"); try { this.endTime = formatter.parse(time).getTime(); } catch (ParseException p) { - logger.info("parsing time got null"); + logger.info("parsing time got exception" + p.getMessage()); } } diff --git a/src/main/java/Event.java b/src/main/java/Event.java index 2dc65323..44472b74 100644 --- a/src/main/java/Event.java +++ b/src/main/java/Event.java @@ -1,7 +1,12 @@ import java.sql.Time; +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; +import java.util.ArrayList; +import java.util.Arrays; import java.util.Objects; import java.util.logging.Logger; @@ -11,7 +16,24 @@ public class Event extends Deadline { private static final Logger logger = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME); public Event(String description, String date, int id) { - super(description, date, id); + super(description, + (String) new ArrayList(Arrays.asList(date.split(" "))).get(0), + (String) new ArrayList(Arrays.asList(Arrays.asList(date.split(" ")).get(1).split("-"))).get(1), + id); + setStartTime((String) new ArrayList(Arrays.asList(Arrays.asList(date.split(" ")).get(1).split("-"))).get(0)); + } + + public void setStartTime(String startTime) { + if (Objects.equals(startTime, "")) { + logger.info("empty time"); + return; + } + DateFormat formatter = new SimpleDateFormat("HH:mm"); + try { + this.startTime = formatter.parse(startTime).getTime(); + } catch (ParseException p) { + logger.info("parsing time got null"); + } } @Override diff --git a/src/test/java/TaskManagerTest.java b/src/test/java/TaskManagerTest.java index c63fabed..84225ef0 100644 --- a/src/test/java/TaskManagerTest.java +++ b/src/test/java/TaskManagerTest.java @@ -1,3 +1,4 @@ +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -29,8 +30,10 @@ public void createTodoTest() { public void createEventTest() { String eventType = "event"; String eventDesc = "project meeting"; - String eventTime = "2/12/2019 1800"; - String eventInfo = eventDesc + "/at" + eventTime; + String eventStartTime = "18:00"; + String eventEndTime = "21:00"; + String eventDate = "2019-12-01"; + String eventInfo = eventDesc + "/at" + eventDate + " " + eventStartTime + "-" + eventEndTime; TaskManager tm = new TaskManager(); Task t = tm.createTask(eventInfo, eventType); @@ -38,7 +41,7 @@ public void createEventTest() { Event e = (Event) t; System.out.println(e.toString()); assertEquals(e.getDescription(), eventDesc); - assertEquals(e.getDate(), eventTime); + Assertions.assertEquals(e.getDate().toString(), eventDate); } /* @@ -49,15 +52,16 @@ public void createEventTest() { public void createDeadlineTest() { String eventType = "deadline"; String eventDesc = "submit report"; - String eventTime = "2/12/2019 1800"; - String eventInfo = eventDesc + "/by" + eventTime; + String eventEndTime = "21:00"; + String eventDate = "2019-12-01"; + String eventInfo = eventDesc + "/by" + eventDate + " " + eventEndTime; TaskManager tm = new TaskManager(); Task t = tm.createTask(eventInfo, eventType); assertEquals(t.getType(), eventType); - Event e = (Event) t; + Deadline e = (Deadline) t; System.out.println(e.toString()); assertEquals(e.getDescription(), eventDesc); - assertEquals(e.getDate(), eventTime); + Assertions.assertEquals(e.getDate().toString(), eventDate); } } \ No newline at end of file From fdfef0b1061e129f1ea04adfe97ad5f74c8d1b95 Mon Sep 17 00:00:00 2001 From: Metilda Chee Date: Thu, 4 Nov 2021 13:33:34 +0800 Subject: [PATCH 32/49] Finish find function --- duke.txt | 3 ++ src/main/java/Duke.java | 49 ++++++--------------- src/main/java/TaskFile.java | 1 + src/main/java/TaskManager.java | 69 ++++++++++++++++++++++++++++-- src/test/java/TaskManagerTest.java | 39 +++++++++++++++++ 5 files changed, 121 insertions(+), 40 deletions(-) diff --git a/duke.txt b/duke.txt index 4be37407..a5fd2bdc 100644 --- a/duke.txt +++ b/duke.txt @@ -1,3 +1,6 @@ todo,wash clothes,0 todo,deadline,0 todo,read books,0 +task, +todo,read more books,0 +todo,read more books,0 diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 0c76be86..a5535451 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -1,5 +1,6 @@ import java.io.File; import java.io.IOException; +import java.lang.reflect.Array; import java.util.ArrayList; import java.util.Arrays; import java.util.Locale; @@ -16,39 +17,16 @@ public class Duke { private final static String DETECT_LIST = "list"; private final static String DETECT_DONE = "done"; private final static String DETECT_DELETE = "delete"; + private final static String DETECT_FIND = "find"; private final static String STMT_END = "Bye. Hope to see you again soon!"; private final static String STMT_START = "Hello! I'm Duke\nWhat can I do for you?"; - private final static String STMT_DONE = "Nice! I've marked this task as done: "; - private final static String STMT_DELETE = "Noted. I've removed this task: "; + private final static String ERROR_PREFIX = "Oops I did not quite understand that."; private final static String FILEPATH_TASK = "~/go/src/github.com/metildachee/duke/duke.txt"; - public static void list(ArrayList list) throws Exception { - list.forEach(l -> System.out.println(l.toString())); - } - - public static void markDone(ArrayList list, Integer taskId) { - list.stream().filter(t -> t.getId().equals(taskId)).forEach(t -> { - System.out.println(STMT_DONE); - Todo task = (Todo) t; - task.setDone(true); - System.out.println(t.toString()); - }); - } - - public static void markDelete(ArrayList list, Integer taskId) throws Exception { - for (int i = 0; i < list.size(); i++) { - if (list.get(i).getId() != null && list.get(i).getId().equals(taskId)) { - System.out.println(STMT_DELETE); - System.out.println(list.get(i).toString()); - list.remove(list.get(i)); - return; - } - } - } public static void printErrorMessage(Message m) { switch (m) { @@ -67,7 +45,6 @@ public static void printErrorMessage(Message m) { } } - public static void main(String[] args) throws IOException { // TODO: Abstract out to a logger class Logger logger = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME); @@ -83,7 +60,7 @@ public static void main(String[] args) throws IOException { Scanner in = new Scanner(System.in); ArrayList list = new ArrayList<>(); - // + // Init task manager TaskManager manager = new TaskManager(); list = new TaskFile(FILEPATH_TASK).load(manager); @@ -105,26 +82,24 @@ public static void main(String[] args) throws IOException { while (!instruction.toLowerCase(Locale.ROOT).equals(DETECT_END)) { if (instruction.toLowerCase(Locale.ROOT).equals(DETECT_LIST)) { try { - list(list); + manager.list(); } catch (Exception e) { printErrorMessage(Message.EMPTY_LIST); } } else if (instruction.toLowerCase(Locale.ROOT).equals(DETECT_DONE) && tokens.size() >= 2) { - markDone(list, Integer.parseInt((tokens.get(1)))); + manager.markDone(Integer.parseInt((tokens.get(1)))); } else if (instruction.toLowerCase(Locale.ROOT).equals(DETECT_DELETE) && tokens.size() >= 2) { try { - markDelete(list, Integer.parseInt((tokens.get(1)))); + manager.markDelete(list, Integer.parseInt((tokens.get(1)))); } catch (Exception e) { printErrorMessage(Message.UNKNOWN_OBJECT); } + } else if (instruction.toLowerCase(Locale.ROOT).equals(DETECT_FIND) && tokens.size() >= 1) { + ArrayList li = manager.find(tokens.get(1)); + manager.list(li); } else { - try { - Task t = manager.createTask(taskInfo, instruction); - list.add(t); - } catch (Exception e) { - System.out.println("got exception, error: " + e); - printErrorMessage(Message.ERROR_UNRECOGNISED); - } + + manager.addTask(manager.createTask(taskInfo, instruction)); } input = in.nextLine(); diff --git a/src/main/java/TaskFile.java b/src/main/java/TaskFile.java index 010b61c3..a24c255e 100644 --- a/src/main/java/TaskFile.java +++ b/src/main/java/TaskFile.java @@ -25,6 +25,7 @@ public ArrayList load(TaskManager tm) { logger.info("added task successfully to list" + t); id++; } + tm.setTasks(list); return list; } catch (Exception e) { logger.info("got error loading file, error: " + e); diff --git a/src/main/java/TaskManager.java b/src/main/java/TaskManager.java index 069fdd0f..c2f6d00e 100644 --- a/src/main/java/TaskManager.java +++ b/src/main/java/TaskManager.java @@ -6,19 +6,82 @@ public class TaskManager { private final static String DETECT_ADD_EVENT = "event"; private final static String DETECT_ADD_DEADLINE = "deadline"; + private final static String STMT_DONE = "Nice! I've marked this task as done: "; + private final static String STMT_DELETE = "Noted. I've removed this task: "; + + private ArrayList tasks = new ArrayList<>(); + Global global = new Global(); + public ArrayList find(String keyword) { + ArrayList results = new ArrayList<>(); + tasks.stream().filter(t -> t.getDescription().contains(keyword)).forEach(results::add); + return results; + } + + public void setTasks(ArrayList tasks) { + this.tasks = tasks; + } + + public ArrayList getTasks() { + return tasks; + } + public Task createTask(String taskInfo, String instruction) { switch (instruction) { case DETECT_ADD_TODO: - return new Todo(taskInfo, global.getId()); + Todo t = new Todo(taskInfo, global.getId()); + addTask(t); + return t; case DETECT_ADD_EVENT: ArrayList addInfo = new ArrayList(Arrays.asList(taskInfo.split("/at"))); - return new Event(addInfo.get(0), addInfo.get(1), global.getId()); + Event e = new Event(addInfo.get(0), addInfo.get(1), global.getId()); + addTask(e); + return e; case DETECT_ADD_DEADLINE: ArrayList deadlineInfo = new ArrayList(Arrays.asList(taskInfo.split("/by"))); - return new Deadline(deadlineInfo.get(0), deadlineInfo.get(1), global.getId()); + Deadline d = new Deadline(deadlineInfo.get(0), deadlineInfo.get(1), global.getId()); + addTask(d); + return d; } return new Task(taskInfo, global.getId()); } + + public void list() { + if (tasks.toArray().length == 0) { + return; + } + tasks.forEach(l -> System.out.println(l.toString())); + } + + public void list(ArrayList l) { + if (tasks.toArray().length == 0) { + return; + } + l.forEach(x -> System.out.println(x.toString())); + } + + public void addTask(Task t) { + tasks.add(t); + } + + public void markDone(Integer taskId) { + tasks.stream().filter(t -> t.getId().equals(taskId)).forEach(t -> { + System.out.println(STMT_DONE); + Todo task = (Todo) t; + task.setDone(true); + }); + } + + public void markDelete(ArrayList list, Integer taskId) throws Exception { + for (int i = 0; i < list.size(); i++) { + if (list.get(i).getId() != null && list.get(i).getId().equals(taskId)) { + System.out.println(STMT_DELETE); + System.out.println(list.get(i).toString()); + list.remove(list.get(i)); + return; + } + } + } + } \ No newline at end of file diff --git a/src/test/java/TaskManagerTest.java b/src/test/java/TaskManagerTest.java index 84225ef0..3dc7b6f0 100644 --- a/src/test/java/TaskManagerTest.java +++ b/src/test/java/TaskManagerTest.java @@ -1,6 +1,8 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; +import java.util.ArrayList; + import static org.junit.jupiter.api.Assertions.assertEquals; public class TaskManagerTest { @@ -64,4 +66,41 @@ public void createDeadlineTest() { assertEquals(e.getDescription(), eventDesc); Assertions.assertEquals(e.getDate().toString(), eventDate); } + + @Test + public void findTest() { + // Event 1 + String eventType = "deadline"; + String eventDesc = "submit report"; + String eventEndTime = "21:00"; + String eventDate = "2019-12-01"; + String eventInfo = eventDesc + "/by" + eventDate + " " + eventEndTime; + + TaskManager tm = new TaskManager(); + Task t = tm.createTask(eventInfo, eventType); + assertEquals(t.getType(), eventType); + Deadline e = (Deadline) t; + System.out.println(e.toString()); + assertEquals(e.getDescription(), eventDesc); + Assertions.assertEquals(e.getDate().toString(), eventDate); + + // Event 2 + eventType = "event"; + eventDesc = "project meeting"; + String eventStartTime = "18:00"; + eventEndTime = "21:00"; + eventDate = "2019-12-01"; + eventInfo = eventDesc + "/at" + eventDate + " " + eventStartTime + "-" + eventEndTime; + + t = tm.createTask(eventInfo, eventType); + assertEquals(t.getType(), eventType); + Event event = (Event) t; + System.out.println(event.toString()); + assertEquals(event.getDescription(), eventDesc); + Assertions.assertEquals(event.getDate().toString(), eventDate); + + ArrayList tasks = tm.find("project"); + assertEquals(tasks.toArray().length, 1, "too many returns"); + assertEquals(tasks.get(0).getId(), 1, "did not get expected id"); + } } \ No newline at end of file From d95d6922eb18f19be4ec052f41ca666a9b296b41 Mon Sep 17 00:00:00 2001 From: Metilda Chee Date: Thu, 4 Nov 2021 22:13:27 +0800 Subject: [PATCH 33/49] Add individual feature - view based on schedule --- duke.txt | 12 +++---- src/main/java/Deadline.java | 13 ++----- src/main/java/Duke.java | 25 ++++++------- src/main/java/Parser.java | 22 ++++++++++++ src/main/java/TaskManager.java | 24 +++++++++++++ src/test/java/TaskManagerTest.java | 56 ++++++++++++++++++++++++++++-- 6 files changed, 119 insertions(+), 33 deletions(-) create mode 100644 src/main/java/Parser.java diff --git a/duke.txt b/duke.txt index a5fd2bdc..8e78f6b7 100644 --- a/duke.txt +++ b/duke.txt @@ -1,6 +1,6 @@ -todo,wash clothes,0 -todo,deadline,0 -todo,read books,0 -task, -todo,read more books,0 -todo,read more books,0 +deadline,submit report ,0 +deadline,submit report ,0 +deadline,submit ,0 +deadline,submit ,0 +event,project metting ,0 +event,project metting ,0 diff --git a/src/main/java/Deadline.java b/src/main/java/Deadline.java index 709ec60e..6f91c820 100644 --- a/src/main/java/Deadline.java +++ b/src/main/java/Deadline.java @@ -12,6 +12,7 @@ public class Deadline extends Todo { LocalDate date; long endTime; + Parser parser = new Parser(); private static final Logger logger = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME); @@ -49,7 +50,7 @@ public void setDate(String date) { if (Objects.equals(date, "")) { return; } - LocalDate parsedDate = handlerParseStringToDate(date); + LocalDate parsedDate = parser.stringToDate(date); if (parsedDate == null) { logger.info("parsing date got null"); } else { @@ -81,14 +82,4 @@ public String toString() { public String getType() { return "deadline"; } - - public LocalDate handlerParseStringToDate(String date) { - LocalDate parsedDate = null; - try { - parsedDate = LocalDate.parse(date); - } catch (DateTimeParseException e) { - logger.info("parse date time got error" + e.getMessage()); - } - return parsedDate; - } } \ No newline at end of file diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index a5535451..8b18c64b 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -18,16 +18,12 @@ public class Duke { private final static String DETECT_DONE = "done"; private final static String DETECT_DELETE = "delete"; private final static String DETECT_FIND = "find"; - + private final static String DETECT_VIEW = "view"; private final static String STMT_END = "Bye. Hope to see you again soon!"; private final static String STMT_START = "Hello! I'm Duke\nWhat can I do for you?"; - - private final static String ERROR_PREFIX = "Oops I did not quite understand that."; - private final static String FILEPATH_TASK = "~/go/src/github.com/metildachee/duke/duke.txt"; - public static void printErrorMessage(Message m) { switch (m) { case ERROR_UNRECOGNISED: @@ -46,7 +42,7 @@ public static void printErrorMessage(Message m) { } public static void main(String[] args) throws IOException { - // TODO: Abstract out to a logger class + // Init logger Logger logger = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME); logger.setLevel(Level.FINEST); FileHandler fileTxt = new FileHandler("duke_info.logs"); @@ -55,17 +51,17 @@ public static void main(String[] args) throws IOException { fileTxt.setFormatter(formatterTxt); logger.addHandler(fileTxt); - // Program starts - System.out.println(STMT_START); - Scanner in = new Scanner(System.in); - ArrayList list = new ArrayList<>(); - // Init task manager + ArrayList list = new ArrayList<>(); TaskManager manager = new TaskManager(); list = new TaskFile(FILEPATH_TASK).load(manager); - // counter - Global global = new Global(); + // Init parser + Parser parser = new Parser(); + + // Program starts + System.out.println(STMT_START); + Scanner in = new Scanner(System.in); String input = in.nextLine(); ArrayList tokens = new ArrayList(Arrays.asList(input.split(" "))); @@ -97,8 +93,9 @@ public static void main(String[] args) throws IOException { } else if (instruction.toLowerCase(Locale.ROOT).equals(DETECT_FIND) && tokens.size() >= 1) { ArrayList li = manager.find(tokens.get(1)); manager.list(li); + } else if (instruction.toLowerCase(Locale.ROOT).equals(DETECT_VIEW) && tokens.size() >= 1) { + manager.viewTasksOn(parser.stringToDate(tokens.get(1))); } else { - manager.addTask(manager.createTask(taskInfo, instruction)); } diff --git a/src/main/java/Parser.java b/src/main/java/Parser.java new file mode 100644 index 00000000..f8070647 --- /dev/null +++ b/src/main/java/Parser.java @@ -0,0 +1,22 @@ +import java.text.ParseException; +import java.time.LocalDate; +import java.time.format.DateTimeParseException; +import java.util.logging.Logger; + +public class Parser { + private static final Logger logger = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME); + + /** + * @param date + * @return date + */ + public LocalDate stringToDate(String date) { + LocalDate parsedDate = null; + try { + parsedDate = LocalDate.parse(date); + } catch (DateTimeParseException e) { + logger.info("parse date time got error" + e.getMessage()); + } + return parsedDate; + } +} diff --git a/src/main/java/TaskManager.java b/src/main/java/TaskManager.java index c2f6d00e..61d9a223 100644 --- a/src/main/java/TaskManager.java +++ b/src/main/java/TaskManager.java @@ -1,7 +1,10 @@ +import java.time.LocalDate; import java.util.ArrayList; import java.util.Arrays; +import java.util.logging.Logger; public class TaskManager { + private static final Logger logger = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME); private final static String DETECT_ADD_TODO = "todo"; private final static String DETECT_ADD_EVENT = "event"; private final static String DETECT_ADD_DEADLINE = "deadline"; @@ -84,4 +87,25 @@ public void markDelete(ArrayList list, Integer taskId) throws Exception { } } + public ArrayList viewTasksOn(LocalDate date) { + logger.info("viewTasksOn date: " + date + ", current task list: " + tasks); + ArrayList results = new ArrayList<>(); + if (date == null) { + logger.info("viewTasksOn got null date"); + return results; + } + tasks.forEach(t -> { + try { + Deadline e = (Deadline) t; + logger.finest("looking at task: " + t + " date for this task " + e.getDate()); + if (e.getDate().equals(date)) { + logger.finest("added successfully to results " + e); + results.add(e); + } + } catch (ClassCastException e) { + logger.info("casting to deadline class got error, item could be todo type, error: " + e.getMessage() + " object: " + t); + } + }); + return results; + } } \ No newline at end of file diff --git a/src/test/java/TaskManagerTest.java b/src/test/java/TaskManagerTest.java index 3dc7b6f0..3bb82bbc 100644 --- a/src/test/java/TaskManagerTest.java +++ b/src/test/java/TaskManagerTest.java @@ -2,11 +2,11 @@ import org.junit.jupiter.api.Test; import java.util.ArrayList; +import java.util.Objects; -import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.*; public class TaskManagerTest { - /* Todos: tasks without any date/time attached to it @@ -103,4 +103,56 @@ public void findTest() { assertEquals(tasks.toArray().length, 1, "too many returns"); assertEquals(tasks.get(0).getId(), 1, "did not get expected id"); } + + @Test + public void viewTest() { + TaskManager tm = new TaskManager(); + Parser p = new Parser(); + ArrayList expected = new ArrayList<>(); + // Event 1 + String eventType = "deadline"; + String eventDesc = "submit report"; + String eventEndTime = "21:00"; + String eventDate = "2019-12-01"; + String eventInfo = eventDesc + "/by" + eventDate + " " + eventEndTime; + + Task t = tm.createTask(eventInfo, eventType); + expected.add(t); + assertEquals(t.getType(), eventType); + Deadline e = (Deadline) t; + System.out.println(e.toString()); + assertEquals(e.getDescription(), eventDesc); + Assertions.assertEquals(e.getDate().toString(), eventDate); + + // Event 2 + eventType = "event"; + eventDesc = "project meeting"; + String eventStartTime = "18:00"; + eventEndTime = "21:00"; + eventDate = "2019-12-01"; + eventInfo = eventDesc + "/at" + eventDate + " " + eventStartTime + "-" + eventEndTime; + + t = tm.createTask(eventInfo, eventType); + expected.add(t); + assertEquals(t.getType(), eventType); + Event event = (Event) t; + System.out.println(event.toString()); + assertEquals(event.getDescription(), eventDesc); + Assertions.assertEquals(event.getDate().toString(), eventDate); + + // View + ArrayList tasks = tm.viewTasksOn(p.stringToDate(eventDate)); + assertEquals(2, tasks.toArray().length, "too many returns"); + expected.forEach(expect -> { + Task actual = tasks.stream().filter(task -> Objects.equals(task.getId(), expect.getId())).findFirst().orElse(null); + assertNotNull(actual); + + Deadline ex = (Deadline) expect; + Deadline a = (Deadline) actual; + assertEquals(ex.getId(), a.getId(), "id mismatches"); + assertEquals(ex.getDescription(), a.getDescription(), "description mismatches"); + assertEquals(ex.getDate(), a.getDate(), "date mismatches"); + assertEquals(ex.getEndTime(), a.getEndTime(), "end_time mismatches"); + }); + } } \ No newline at end of file From 2fab2a67de9bc573ff6f8e97af178228576d63f2 Mon Sep 17 00:00:00 2001 From: Metilda Chee Date: Sun, 7 Nov 2021 13:49:18 +0800 Subject: [PATCH 34/49] Rename --- src/main/java/Config.java | 21 +++++++++++ src/main/java/Duke.java | 37 +++++++------------ src/main/java/Event.java | 6 +-- src/main/java/Logger.java | 34 +++++++++++++++++ .../{FileAccessor.java => StorageDAO.java} | 4 +- .../java/{TaskFile.java => StorageDTO.java} | 6 +-- src/main/java/TaskManager.java | 13 +++---- src/test/java/TaskManagerTest.java | 4 +- 8 files changed, 82 insertions(+), 43 deletions(-) create mode 100644 src/main/java/Config.java create mode 100644 src/main/java/Logger.java rename src/main/java/{FileAccessor.java => StorageDAO.java} (93%) rename src/main/java/{TaskFile.java => StorageDTO.java} (94%) diff --git a/src/main/java/Config.java b/src/main/java/Config.java new file mode 100644 index 00000000..b9f195d7 --- /dev/null +++ b/src/main/java/Config.java @@ -0,0 +1,21 @@ +public class Config { + String logPath = "duke_info.logs"; + + public String getStoragePath() { + return storagePath; + } + + public void setStoragePath(String storagePath) { + this.storagePath = storagePath; + } + + String storagePath = "~/go/src/github.com/metildachee/duke/duke.txt"; + + public String getLogPath() { + return logPath; + } + + public void setLogPath(String logPath) { + this.logPath = logPath; + } +} diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 8b18c64b..d5fdbd12 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -1,14 +1,8 @@ -import java.io.File; import java.io.IOException; -import java.lang.reflect.Array; import java.util.ArrayList; import java.util.Arrays; import java.util.Locale; import java.util.Scanner; -import java.util.logging.FileHandler; -import java.util.logging.Level; -import java.util.logging.Logger; -import java.util.logging.SimpleFormatter; public class Duke { @@ -22,7 +16,6 @@ public class Duke { private final static String STMT_END = "Bye. Hope to see you again soon!"; private final static String STMT_START = "Hello! I'm Duke\nWhat can I do for you?"; private final static String ERROR_PREFIX = "Oops I did not quite understand that."; - private final static String FILEPATH_TASK = "~/go/src/github.com/metildachee/duke/duke.txt"; public static void printErrorMessage(Message m) { switch (m) { @@ -42,19 +35,17 @@ public static void printErrorMessage(Message m) { } public static void main(String[] args) throws IOException { - // Init logger - Logger logger = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME); - logger.setLevel(Level.FINEST); - FileHandler fileTxt = new FileHandler("duke_info.logs"); + // Init config + Config config = new Config(); - SimpleFormatter formatterTxt = new SimpleFormatter(); - fileTxt.setFormatter(formatterTxt); - logger.addHandler(fileTxt); + // Init logger + Logger logger = new Logger(); + logger.init(config.getLogPath()); // Init task manager - ArrayList list = new ArrayList<>(); + ArrayList list; TaskManager manager = new TaskManager(); - list = new TaskFile(FILEPATH_TASK).load(manager); + list = new StorageDTO(config.getStoragePath()).load(manager); // Init parser Parser parser = new Parser(); @@ -78,23 +69,23 @@ public static void main(String[] args) throws IOException { while (!instruction.toLowerCase(Locale.ROOT).equals(DETECT_END)) { if (instruction.toLowerCase(Locale.ROOT).equals(DETECT_LIST)) { try { - manager.list(); + manager.listTasks(); } catch (Exception e) { printErrorMessage(Message.EMPTY_LIST); } } else if (instruction.toLowerCase(Locale.ROOT).equals(DETECT_DONE) && tokens.size() >= 2) { - manager.markDone(Integer.parseInt((tokens.get(1)))); + manager.markTaskDone(Integer.parseInt((tokens.get(1)))); } else if (instruction.toLowerCase(Locale.ROOT).equals(DETECT_DELETE) && tokens.size() >= 2) { try { - manager.markDelete(list, Integer.parseInt((tokens.get(1)))); + manager.deleteTask(list, Integer.parseInt((tokens.get(1)))); } catch (Exception e) { printErrorMessage(Message.UNKNOWN_OBJECT); } } else if (instruction.toLowerCase(Locale.ROOT).equals(DETECT_FIND) && tokens.size() >= 1) { - ArrayList li = manager.find(tokens.get(1)); - manager.list(li); + ArrayList li = manager.findTask(tokens.get(1)); + manager.listTasks(li); } else if (instruction.toLowerCase(Locale.ROOT).equals(DETECT_VIEW) && tokens.size() >= 1) { - manager.viewTasksOn(parser.stringToDate(tokens.get(1))); + manager.viewTaskOn(parser.stringToDate(tokens.get(1))); } else { manager.addTask(manager.createTask(taskInfo, instruction)); } @@ -115,7 +106,7 @@ public static void main(String[] args) throws IOException { id = list.size(); } - new TaskFile(FILEPATH_TASK).save(list); + new StorageDTO(FILEPATH_TASK).save(list); System.out.println(STMT_END); } } diff --git a/src/main/java/Event.java b/src/main/java/Event.java index 44472b74..441812b1 100644 --- a/src/main/java/Event.java +++ b/src/main/java/Event.java @@ -1,19 +1,15 @@ -import java.sql.Time; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; -import java.time.LocalDate; import java.time.format.DateTimeFormatter; -import java.time.format.DateTimeParseException; import java.util.ArrayList; import java.util.Arrays; import java.util.Objects; -import java.util.logging.Logger; public class Event extends Deadline { long startTime; - private static final Logger logger = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME); + private static final Logger logger = new Logger(); public Event(String description, String date, int id) { super(description, diff --git a/src/main/java/Logger.java b/src/main/java/Logger.java new file mode 100644 index 00000000..b5177d60 --- /dev/null +++ b/src/main/java/Logger.java @@ -0,0 +1,34 @@ +import java.io.IOException; +import java.util.logging.FileHandler; +import java.util.logging.Level; +import java.util.logging.SimpleFormatter; + +public class Logger { + java.util.logging.Logger logger; + + public Logger() { + + } + + public void init(String path) { + logger = java.util.logging.Logger.getLogger(java.util.logging.Logger.GLOBAL_LOGGER_NAME); + logger.setLevel(Level.FINEST); + try { + FileHandler fileTxt = new FileHandler(path); + + SimpleFormatter formatterTxt = new SimpleFormatter(); + fileTxt.setFormatter(formatterTxt); + logger.addHandler(fileTxt); + } catch (IOException e) { + logger.info("init logger got error"); + } + } + + public java.util.logging.Logger getLogger() { + return logger; + } + + public void info(String msg) { + logger.info(msg); + } +} diff --git a/src/main/java/FileAccessor.java b/src/main/java/StorageDAO.java similarity index 93% rename from src/main/java/FileAccessor.java rename to src/main/java/StorageDAO.java index e988977c..b6f87346 100644 --- a/src/main/java/FileAccessor.java +++ b/src/main/java/StorageDAO.java @@ -1,11 +1,11 @@ import java.io.File; import java.io.FileNotFoundException; -public class FileAccessor { +public class StorageDAO { File file; String path; - public FileAccessor(String path) { + public StorageDAO(String path) { this.path = "duke.txt"; } diff --git a/src/main/java/TaskFile.java b/src/main/java/StorageDTO.java similarity index 94% rename from src/main/java/TaskFile.java rename to src/main/java/StorageDTO.java index a24c255e..018c7252 100644 --- a/src/main/java/TaskFile.java +++ b/src/main/java/StorageDTO.java @@ -1,15 +1,13 @@ import java.io.FileWriter; -import java.io.IOException; import java.util.ArrayList; -import java.util.Arrays; import java.util.Objects; import java.util.Scanner; import java.util.logging.Logger; -public class TaskFile extends FileAccessor { +public class StorageDTO extends StorageDAO { private static final Logger logger = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME); - public TaskFile(String path) { + public StorageDTO(String path) { super(path); } diff --git a/src/main/java/TaskManager.java b/src/main/java/TaskManager.java index 61d9a223..fb75ecc0 100644 --- a/src/main/java/TaskManager.java +++ b/src/main/java/TaskManager.java @@ -13,10 +13,9 @@ public class TaskManager { private final static String STMT_DELETE = "Noted. I've removed this task: "; private ArrayList tasks = new ArrayList<>(); - Global global = new Global(); - public ArrayList find(String keyword) { + public ArrayList findTask(String keyword) { ArrayList results = new ArrayList<>(); tasks.stream().filter(t -> t.getDescription().contains(keyword)).forEach(results::add); return results; @@ -50,14 +49,14 @@ public Task createTask(String taskInfo, String instruction) { return new Task(taskInfo, global.getId()); } - public void list() { + public void listTasks() { if (tasks.toArray().length == 0) { return; } tasks.forEach(l -> System.out.println(l.toString())); } - public void list(ArrayList l) { + public void listTasks(ArrayList l) { if (tasks.toArray().length == 0) { return; } @@ -68,7 +67,7 @@ public void addTask(Task t) { tasks.add(t); } - public void markDone(Integer taskId) { + public void markTaskDone(Integer taskId) { tasks.stream().filter(t -> t.getId().equals(taskId)).forEach(t -> { System.out.println(STMT_DONE); Todo task = (Todo) t; @@ -76,7 +75,7 @@ public void markDone(Integer taskId) { }); } - public void markDelete(ArrayList list, Integer taskId) throws Exception { + public void deleteTask(ArrayList list, Integer taskId) throws Exception { for (int i = 0; i < list.size(); i++) { if (list.get(i).getId() != null && list.get(i).getId().equals(taskId)) { System.out.println(STMT_DELETE); @@ -87,7 +86,7 @@ public void markDelete(ArrayList list, Integer taskId) throws Exception { } } - public ArrayList viewTasksOn(LocalDate date) { + public ArrayList viewTaskOn(LocalDate date) { logger.info("viewTasksOn date: " + date + ", current task list: " + tasks); ArrayList results = new ArrayList<>(); if (date == null) { diff --git a/src/test/java/TaskManagerTest.java b/src/test/java/TaskManagerTest.java index 3bb82bbc..1c7e2943 100644 --- a/src/test/java/TaskManagerTest.java +++ b/src/test/java/TaskManagerTest.java @@ -99,7 +99,7 @@ public void findTest() { assertEquals(event.getDescription(), eventDesc); Assertions.assertEquals(event.getDate().toString(), eventDate); - ArrayList tasks = tm.find("project"); + ArrayList tasks = tm.findTask("project"); assertEquals(tasks.toArray().length, 1, "too many returns"); assertEquals(tasks.get(0).getId(), 1, "did not get expected id"); } @@ -141,7 +141,7 @@ public void viewTest() { Assertions.assertEquals(event.getDate().toString(), eventDate); // View - ArrayList tasks = tm.viewTasksOn(p.stringToDate(eventDate)); + ArrayList tasks = tm.viewTaskOn(p.stringToDate(eventDate)); assertEquals(2, tasks.toArray().length, "too many returns"); expected.forEach(expect -> { Task actual = tasks.stream().filter(task -> Objects.equals(task.getId(), expect.getId())).findFirst().orElse(null); From c897258e79cad3a2afc26f514b51b0f4dc589aef Mon Sep 17 00:00:00 2001 From: Metilda Chee Date: Sun, 7 Nov 2021 15:03:16 +0800 Subject: [PATCH 35/49] Add parser and UI --- src/main/java/Duke.java | 111 +++++---------------------------- src/main/java/Parser.java | 107 +++++++++++++++++++++++++++++++ src/main/java/StorageDTO.java | 2 +- src/main/java/TaskManager.java | 15 +++-- src/main/java/UI.java | 83 ++++++++++++++++++++++++ 5 files changed, 217 insertions(+), 101 deletions(-) create mode 100644 src/main/java/UI.java diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index d5fdbd12..1ecbdd00 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -1,40 +1,5 @@ -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Locale; -import java.util.Scanner; - - public class Duke { - // TODO: Change these to enums or configurations - private final static String DETECT_END = "bye"; - private final static String DETECT_LIST = "list"; - private final static String DETECT_DONE = "done"; - private final static String DETECT_DELETE = "delete"; - private final static String DETECT_FIND = "find"; - private final static String DETECT_VIEW = "view"; - private final static String STMT_END = "Bye. Hope to see you again soon!"; - private final static String STMT_START = "Hello! I'm Duke\nWhat can I do for you?"; - private final static String ERROR_PREFIX = "Oops I did not quite understand that."; - - public static void printErrorMessage(Message m) { - switch (m) { - case ERROR_UNRECOGNISED: - System.out.println(ERROR_PREFIX + " Unrecognised operation."); - break; - case ERROR_INVALID: - System.out.println(ERROR_PREFIX + " Invalid input."); - break; - case EMPTY_LIST: - System.out.println(ERROR_PREFIX + " Empty list."); - break; - case UNKNOWN_OBJECT: - System.out.println(ERROR_PREFIX + " Could not find resource."); - break; - } - } - - public static void main(String[] args) throws IOException { + public static void main(String[] args) { // Init config Config config = new Config(); @@ -42,71 +7,27 @@ public static void main(String[] args) throws IOException { Logger logger = new Logger(); logger.init(config.getLogPath()); + // Init storage + StorageDTO storage = new StorageDTO(config.getStoragePath()); + // Init task manager - ArrayList list; TaskManager manager = new TaskManager(); - list = new StorageDTO(config.getStoragePath()).load(manager); + storage.loadInto(manager); - // Init parser - Parser parser = new Parser(); + // Init UI + UI ui = new UI(manager); // Program starts - System.out.println(STMT_START); - Scanner in = new Scanner(System.in); - - String input = in.nextLine(); - ArrayList tokens = new ArrayList(Arrays.asList(input.split(" "))); - String instruction = tokens.get(0); - Integer id = 0; - String taskInfo = tokens // TODO: Fix this (duh) - .subList(1, tokens.size()) - .toString() - .replace(",", "") - .replace("[", "") - .replace("]", "") - .trim(); - - while (!instruction.toLowerCase(Locale.ROOT).equals(DETECT_END)) { - if (instruction.toLowerCase(Locale.ROOT).equals(DETECT_LIST)) { - try { - manager.listTasks(); - } catch (Exception e) { - printErrorMessage(Message.EMPTY_LIST); - } - } else if (instruction.toLowerCase(Locale.ROOT).equals(DETECT_DONE) && tokens.size() >= 2) { - manager.markTaskDone(Integer.parseInt((tokens.get(1)))); - } else if (instruction.toLowerCase(Locale.ROOT).equals(DETECT_DELETE) && tokens.size() >= 2) { - try { - manager.deleteTask(list, Integer.parseInt((tokens.get(1)))); - } catch (Exception e) { - printErrorMessage(Message.UNKNOWN_OBJECT); - } - } else if (instruction.toLowerCase(Locale.ROOT).equals(DETECT_FIND) && tokens.size() >= 1) { - ArrayList li = manager.findTask(tokens.get(1)); - manager.listTasks(li); - } else if (instruction.toLowerCase(Locale.ROOT).equals(DETECT_VIEW) && tokens.size() >= 1) { - manager.viewTaskOn(parser.stringToDate(tokens.get(1))); - } else { - manager.addTask(manager.createTask(taskInfo, instruction)); - } - - input = in.nextLine(); - System.out.println("input: " + input); - tokens = new ArrayList(Arrays.asList(input.split(" "))); - instruction = tokens.get(0); - System.out.println("instruction: " + instruction); - taskInfo = tokens - .subList(1, tokens.size()) - .toString() - .replace(",", "") - .replace("[", "") - .replace("]", "") - .trim(); - System.out.println("task info:" + taskInfo); - id = list.size(); + ui.start(); + ui.getInput(); + ui.processInput(); + while (!ui.isExit()) { + ui.getInput(); + ui.parseInput(); + ui.processInput(); } - new StorageDTO(FILEPATH_TASK).save(list); - System.out.println(STMT_END); + storage.save(manager.getTasks()); + ui.end(); } } diff --git a/src/main/java/Parser.java b/src/main/java/Parser.java index f8070647..631e6b56 100644 --- a/src/main/java/Parser.java +++ b/src/main/java/Parser.java @@ -1,10 +1,49 @@ import java.text.ParseException; import java.time.LocalDate; import java.time.format.DateTimeParseException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Locale; import java.util.logging.Logger; public class Parser { private static final Logger logger = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME); + private final static String DETECT_END = "bye"; + private final static String DETECT_LIST = "list"; + private final static String DETECT_DONE = "done"; + private final static String DETECT_DELETE = "delete"; + private final static String DETECT_FIND = "find"; + private final static String DETECT_VIEW = "view"; + + ArrayList tokens = new ArrayList<>(); + + public String getInstruction() { + return instruction; + } + + public void setInstruction(String instruction) { + this.instruction = instruction; + } + + String instruction; + + public String getTaskInfo() { + return taskInfo; + } + + public void setTaskInfo(String taskInfo) { + this.taskInfo = taskInfo; + } + + String taskInfo; + + public ArrayList getTokens() { + return tokens; + } + + public void setTokens(ArrayList tokens) { + this.tokens = tokens; + } /** * @param date @@ -19,4 +58,72 @@ public LocalDate stringToDate(String date) { } return parsedDate; } + + public void parseInput(String input) { + tokens = new ArrayList(Arrays.asList(input.split(" "))); + instruction = tokens.get(0); + taskInfo = tokens + .subList(1, tokens.size()) + .toString() + .replace(",", "") + .replace("[", "") + .replace("]", "") + .trim(); + } + + public Boolean isExit() { + return instruction.toLowerCase(Locale.ROOT).equals(DETECT_END); + } + + public Boolean isExit(String i) { + return i.toLowerCase(Locale.ROOT).equals(DETECT_END); + } + + public Boolean isList() { + return instruction.toLowerCase(Locale.ROOT).equals(DETECT_LIST); + } + + public Boolean isList(String i) { + return i.toLowerCase(Locale.ROOT).equals(DETECT_LIST); + } + + public Boolean isDone() { + return instruction.toLowerCase(Locale.ROOT).equals(DETECT_LIST) && tokens.size() >= 2; + } + + public Boolean isDone(String i) { + return i.toLowerCase(Locale.ROOT).equals(DETECT_DONE) && tokens.size() >= 2; + } + + public Boolean isDelete() { + return instruction.toLowerCase(Locale.ROOT).equals(DETECT_DELETE) && tokens.size() >= 2; + } + + public Boolean isDelete(String i) { + return i.toLowerCase(Locale.ROOT).equals(DETECT_DELETE) && tokens.size() >= 2; + } + + public String getFirstToken() { + if (tokens.size() >= 1) { + return tokens.get(1); + } + + return null; + } + + public Boolean isFind() { + return instruction.toLowerCase(Locale.ROOT).equals(DETECT_FIND) && tokens.size() >= 1; + } + + public Boolean isFind(String i) { + return i.toLowerCase(Locale.ROOT).equals(DETECT_FIND) && tokens.size() >= 1; + } + + public Boolean isView() { + return instruction.toLowerCase(Locale.ROOT).equals(DETECT_VIEW) && tokens.size() >= 1; + } + + public Boolean isView(String i) { + return i.toLowerCase(Locale.ROOT).equals(DETECT_VIEW) && tokens.size() >= 1; + } } diff --git a/src/main/java/StorageDTO.java b/src/main/java/StorageDTO.java index 018c7252..dae7851e 100644 --- a/src/main/java/StorageDTO.java +++ b/src/main/java/StorageDTO.java @@ -11,7 +11,7 @@ public StorageDTO(String path) { super(path); } - public ArrayList load(TaskManager tm) { + public ArrayList loadInto(TaskManager tm) { try { init(); ArrayList list = new ArrayList(); diff --git a/src/main/java/TaskManager.java b/src/main/java/TaskManager.java index fb75ecc0..28fab3c6 100644 --- a/src/main/java/TaskManager.java +++ b/src/main/java/TaskManager.java @@ -13,6 +13,7 @@ public class TaskManager { private final static String STMT_DELETE = "Noted. I've removed this task: "; private ArrayList tasks = new ArrayList<>(); + private StorageDTO storageDTO; Global global = new Global(); public ArrayList findTask(String keyword) { @@ -75,12 +76,12 @@ public void markTaskDone(Integer taskId) { }); } - public void deleteTask(ArrayList list, Integer taskId) throws Exception { - for (int i = 0; i < list.size(); i++) { - if (list.get(i).getId() != null && list.get(i).getId().equals(taskId)) { + public void deleteTask(Integer taskId) { + for (int i = 0; i < tasks.size(); i++) { + if (tasks.get(i).getId() != null && tasks.get(i).getId().equals(taskId)) { System.out.println(STMT_DELETE); - System.out.println(list.get(i).toString()); - list.remove(list.get(i)); + System.out.println(tasks.get(i).toString()); + tasks.remove(tasks.get(i)); return; } } @@ -107,4 +108,8 @@ public ArrayList viewTaskOn(LocalDate date) { }); return results; } + + public Integer getNextId() { + return tasks.size(); + } } \ No newline at end of file diff --git a/src/main/java/UI.java b/src/main/java/UI.java new file mode 100644 index 00000000..db6f6f1d --- /dev/null +++ b/src/main/java/UI.java @@ -0,0 +1,83 @@ +import java.util.ArrayList; +import java.util.Scanner; + +public class UI { + private final static String STMT_END = "Bye. Hope to see you again soon!"; + private final static String STMT_START = "Hello! I'm Duke\nWhat can I do for you?"; + + private final static String ERROR_PREFIX = "Oops I did not quite understand that."; + + public UI(TaskManager m) { + this.manager = m; + } + + Parser parser = new Parser(); + Scanner in = new Scanner(System.in); + String input = ""; + Boolean isExit = false; + TaskManager manager; + + public void start() { + System.out.println(STMT_START); + } + + public String getInput() { + input = in.nextLine(); + return input; + } + + public void end() { + System.out.println(STMT_END); + } + + public void parseInput() { + parser.parseInput(input); + } + + public Boolean isExit() { + return isExit; + } + + public void printErrorMessage(Message m) { + switch (m) { + case ERROR_UNRECOGNISED: + System.out.println(ERROR_PREFIX + " Unrecognised operation."); + break; + case ERROR_INVALID: + System.out.println(ERROR_PREFIX + " Invalid input."); + break; + case EMPTY_LIST: + System.out.println(ERROR_PREFIX + " Empty list."); + break; + case UNKNOWN_OBJECT: + System.out.println(ERROR_PREFIX + " Could not find resource."); + break; + } + } + + public void processInput() { + String instruction = parser.getInstruction(); + String taskInfo = parser.getTaskInfo(); + String firstToken = parser.getFirstToken(); + + if (parser.isExit(instruction)) { + isExit = true; + return; + } + + if (parser.isList()) { + manager.listTasks(); + } else if (parser.isDone()) { + manager.markTaskDone(Integer.parseInt((firstToken))); + } else if (parser.isDelete()) { + manager.deleteTask(Integer.parseInt((firstToken))); + } else if (parser.isFind()) { + ArrayList li = manager.findTask(firstToken); + manager.listTasks(li); + } else if (parser.isView()) { + manager.viewTaskOn(parser.stringToDate(firstToken)); + } else { + manager.addTask(manager.createTask(taskInfo, instruction)); + } + } +} From d31fba301a2606439de7e274630877d060c1a3d6 Mon Sep 17 00:00:00 2001 From: Metilda Chee Date: Sun, 7 Nov 2021 15:06:02 +0800 Subject: [PATCH 36/49] Parse input before processing --- src/main/java/Duke.java | 1 + src/main/java/Parser.java | 1 - src/main/java/UI.java | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 1ecbdd00..1329f84d 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -20,6 +20,7 @@ public static void main(String[] args) { // Program starts ui.start(); ui.getInput(); + ui.parseInput(); ui.processInput(); while (!ui.isExit()) { ui.getInput(); diff --git a/src/main/java/Parser.java b/src/main/java/Parser.java index 631e6b56..33ecaddf 100644 --- a/src/main/java/Parser.java +++ b/src/main/java/Parser.java @@ -1,4 +1,3 @@ -import java.text.ParseException; import java.time.LocalDate; import java.time.format.DateTimeParseException; import java.util.ArrayList; diff --git a/src/main/java/UI.java b/src/main/java/UI.java index db6f6f1d..a7eaa239 100644 --- a/src/main/java/UI.java +++ b/src/main/java/UI.java @@ -60,7 +60,7 @@ public void processInput() { String taskInfo = parser.getTaskInfo(); String firstToken = parser.getFirstToken(); - if (parser.isExit(instruction)) { + if (parser.isExit()) { isExit = true; return; } From e208ecb3fab8a151cc3b2a96e6bfb596f1389e62 Mon Sep 17 00:00:00 2001 From: Metilda Chee Date: Sun, 7 Nov 2021 15:07:20 +0800 Subject: [PATCH 37/49] Fix index out of bound --- src/main/java/Parser.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/Parser.java b/src/main/java/Parser.java index 33ecaddf..7dc0b150 100644 --- a/src/main/java/Parser.java +++ b/src/main/java/Parser.java @@ -103,7 +103,7 @@ public Boolean isDelete(String i) { } public String getFirstToken() { - if (tokens.size() >= 1) { + if (tokens.size() > 1) { return tokens.get(1); } From 6496a8a63cd75eec454f137d5beaa76efbeaebcb Mon Sep 17 00:00:00 2001 From: Metilda Chee Date: Sun, 7 Nov 2021 15:19:41 +0800 Subject: [PATCH 38/49] More oop --- duke.txt | 8 ++------ src/main/java/Duke.java | 3 --- src/main/java/Parser.java | 13 +++++++++---- src/main/java/TaskManager.java | 5 +---- 4 files changed, 12 insertions(+), 17 deletions(-) diff --git a/duke.txt b/duke.txt index 8e78f6b7..1daef12c 100644 --- a/duke.txt +++ b/duke.txt @@ -1,6 +1,2 @@ -deadline,submit report ,0 -deadline,submit report ,0 -deadline,submit ,0 -deadline,submit ,0 -event,project metting ,0 -event,project metting ,0 +todo,read books,1 +todo,read books,1 diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 1329f84d..79e14f65 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -19,9 +19,6 @@ public static void main(String[] args) { // Program starts ui.start(); - ui.getInput(); - ui.parseInput(); - ui.processInput(); while (!ui.isExit()) { ui.getInput(); ui.parseInput(); diff --git a/src/main/java/Parser.java b/src/main/java/Parser.java index 7dc0b150..bc715b6a 100644 --- a/src/main/java/Parser.java +++ b/src/main/java/Parser.java @@ -79,32 +79,37 @@ public Boolean isExit(String i) { } public Boolean isList() { - return instruction.toLowerCase(Locale.ROOT).equals(DETECT_LIST); + return isList(instruction); } public Boolean isList(String i) { + logger.info("instruction: listing task"); return i.toLowerCase(Locale.ROOT).equals(DETECT_LIST); } public Boolean isDone() { - return instruction.toLowerCase(Locale.ROOT).equals(DETECT_LIST) && tokens.size() >= 2; + return isDone(instruction); } public Boolean isDone(String i) { + logger.info("instruction: done"); return i.toLowerCase(Locale.ROOT).equals(DETECT_DONE) && tokens.size() >= 2; } public Boolean isDelete() { - return instruction.toLowerCase(Locale.ROOT).equals(DETECT_DELETE) && tokens.size() >= 2; + return isDelete(instruction); } public Boolean isDelete(String i) { + logger.info("instruction: done"); return i.toLowerCase(Locale.ROOT).equals(DETECT_DELETE) && tokens.size() >= 2; } public String getFirstToken() { if (tokens.size() > 1) { - return tokens.get(1); + String firstToken = tokens.get(1); + logger.info("instruction: get first token" + firstToken); + return firstToken; } return null; diff --git a/src/main/java/TaskManager.java b/src/main/java/TaskManager.java index 28fab3c6..da52b21d 100644 --- a/src/main/java/TaskManager.java +++ b/src/main/java/TaskManager.java @@ -51,10 +51,7 @@ public Task createTask(String taskInfo, String instruction) { } public void listTasks() { - if (tasks.toArray().length == 0) { - return; - } - tasks.forEach(l -> System.out.println(l.toString())); + listTasks(tasks); } public void listTasks(ArrayList l) { From 70b428d4ae34270f9627c23b5e37b6f52011e3da Mon Sep 17 00:00:00 2001 From: Metilda Chee Date: Sun, 14 Nov 2021 10:40:06 +0800 Subject: [PATCH 39/49] Add morning greeting --- duke.txt | 4 ++-- src/main/java/UI.java | 22 ++++++++++++++++++++-- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/duke.txt b/duke.txt index 1daef12c..a72992ce 100644 --- a/duke.txt +++ b/duke.txt @@ -1,2 +1,2 @@ -todo,read books,1 -todo,read books,1 +todo,read books,0 +todo,read books,0 diff --git a/src/main/java/UI.java b/src/main/java/UI.java index a7eaa239..2656d70e 100644 --- a/src/main/java/UI.java +++ b/src/main/java/UI.java @@ -1,9 +1,9 @@ import java.util.ArrayList; +import java.util.Calendar; import java.util.Scanner; public class UI { private final static String STMT_END = "Bye. Hope to see you again soon!"; - private final static String STMT_START = "Hello! I'm Duke\nWhat can I do for you?"; private final static String ERROR_PREFIX = "Oops I did not quite understand that."; @@ -17,8 +17,26 @@ public UI(TaskManager m) { Boolean isExit = false; TaskManager manager; + public String getGreeting() { + Calendar c = Calendar.getInstance(); + int timeOfDay = c.get(Calendar.HOUR_OF_DAY); + String msg = ""; + + if (timeOfDay >= 0 && timeOfDay < 12) { + msg = "Good Morning"; + } else if (timeOfDay >= 12 && timeOfDay < 16) { + msg = "Good Afternoon"; + } else if (timeOfDay >= 16 && timeOfDay < 21) { + msg = "Good Evening"; + } else if (timeOfDay >= 21 && timeOfDay < 24) { + msg = "Good Night"; + } + msg += "I'm Dukie~\nWhat can I do for you?"; + return msg; + } + public void start() { - System.out.println(STMT_START); + System.out.println(getGreeting()); } public String getInput() { From 3eebb8d1a6774c55c566513678e340c81efac425 Mon Sep 17 00:00:00 2001 From: Metilda Chee Date: Sun, 14 Nov 2021 10:48:47 +0800 Subject: [PATCH 40/49] Fix duplicate creation bug --- duke.txt | 3 +-- duke_info.logs.lck | 0 src/main/java/TaskManager.java | 2 +- src/main/java/UI.java | 13 +++++++------ 4 files changed, 9 insertions(+), 9 deletions(-) create mode 100644 duke_info.logs.lck diff --git a/duke.txt b/duke.txt index a72992ce..8b137891 100644 --- a/duke.txt +++ b/duke.txt @@ -1,2 +1 @@ -todo,read books,0 -todo,read books,0 + diff --git a/duke_info.logs.lck b/duke_info.logs.lck new file mode 100644 index 00000000..e69de29b diff --git a/src/main/java/TaskManager.java b/src/main/java/TaskManager.java index da52b21d..8a6a1e5e 100644 --- a/src/main/java/TaskManager.java +++ b/src/main/java/TaskManager.java @@ -106,7 +106,7 @@ public ArrayList viewTaskOn(LocalDate date) { return results; } - public Integer getNextId() { + public Integer getNumOfTasks() { return tasks.size(); } } \ No newline at end of file diff --git a/src/main/java/UI.java b/src/main/java/UI.java index 2656d70e..e488d10b 100644 --- a/src/main/java/UI.java +++ b/src/main/java/UI.java @@ -23,15 +23,15 @@ public String getGreeting() { String msg = ""; if (timeOfDay >= 0 && timeOfDay < 12) { - msg = "Good Morning"; + msg = "Good morning"; } else if (timeOfDay >= 12 && timeOfDay < 16) { - msg = "Good Afternoon"; + msg = "Good afternoon"; } else if (timeOfDay >= 16 && timeOfDay < 21) { - msg = "Good Evening"; + msg = "Good evening"; } else if (timeOfDay >= 21 && timeOfDay < 24) { - msg = "Good Night"; + msg = "Good night"; } - msg += "I'm Dukie~\nWhat can I do for you?"; + msg += "! I'm Dukie~\nWhat can I do for you?"; return msg; } @@ -95,7 +95,8 @@ public void processInput() { } else if (parser.isView()) { manager.viewTaskOn(parser.stringToDate(firstToken)); } else { - manager.addTask(manager.createTask(taskInfo, instruction)); + Task t = manager.createTask(taskInfo, instruction); + System.out.println("Got it! 👌 I've add this task: \n" + t.toString() + "\nNow you have " + manager.getNumOfTasks() + " tasks in the list."); } } } From 63fa16fcdbfe7f1b4aeba57940454656c376f50a Mon Sep 17 00:00:00 2001 From: Metilda Chee Date: Sun, 14 Nov 2021 10:52:28 +0800 Subject: [PATCH 41/49] Change all log levels --- duke_info.logs.lck | 0 src/main/java/Deadline.java | 8 ++++---- src/main/java/Event.java | 4 ++-- src/main/java/Logger.java | 4 ++-- src/main/java/Parser.java | 10 +++++----- src/main/java/StorageDTO.java | 8 ++++---- src/main/java/Task.java | 2 +- src/main/java/TaskManager.java | 8 ++++---- 8 files changed, 22 insertions(+), 22 deletions(-) delete mode 100644 duke_info.logs.lck diff --git a/duke_info.logs.lck b/duke_info.logs.lck deleted file mode 100644 index e69de29b..00000000 diff --git a/src/main/java/Deadline.java b/src/main/java/Deadline.java index 6f91c820..bf0a8bc7 100644 --- a/src/main/java/Deadline.java +++ b/src/main/java/Deadline.java @@ -46,25 +46,25 @@ public LocalDate getDate() { } public void setDate(String date) { - logger.info("set date " + date); + logger.finest("set date " + date); if (Objects.equals(date, "")) { return; } LocalDate parsedDate = parser.stringToDate(date); if (parsedDate == null) { - logger.info("parsing date got null"); + logger.finest("parsing date got null"); } else { this.date = parsedDate; } } public void setEndTime(String time) { - logger.info("set end_time " + time); + logger.finest("set end_time " + time); DateFormat formatter = new SimpleDateFormat("HH:mm"); try { this.endTime = formatter.parse(time).getTime(); } catch (ParseException p) { - logger.info("parsing time got exception" + p.getMessage()); + logger.finest("parsing time got exception" + p.getMessage()); } } diff --git a/src/main/java/Event.java b/src/main/java/Event.java index 441812b1..d4edc245 100644 --- a/src/main/java/Event.java +++ b/src/main/java/Event.java @@ -21,14 +21,14 @@ public Event(String description, String date, int id) { public void setStartTime(String startTime) { if (Objects.equals(startTime, "")) { - logger.info("empty time"); + logger.finest("empty time"); return; } DateFormat formatter = new SimpleDateFormat("HH:mm"); try { this.startTime = formatter.parse(startTime).getTime(); } catch (ParseException p) { - logger.info("parsing time got null"); + logger.finest("parsing time got null"); } } diff --git a/src/main/java/Logger.java b/src/main/java/Logger.java index b5177d60..92d9edf1 100644 --- a/src/main/java/Logger.java +++ b/src/main/java/Logger.java @@ -20,7 +20,7 @@ public void init(String path) { fileTxt.setFormatter(formatterTxt); logger.addHandler(fileTxt); } catch (IOException e) { - logger.info("init logger got error"); + logger.finest("init logger got error"); } } @@ -29,6 +29,6 @@ public java.util.logging.Logger getLogger() { } public void info(String msg) { - logger.info(msg); + logger.finest(msg); } } diff --git a/src/main/java/Parser.java b/src/main/java/Parser.java index bc715b6a..99ca5e5f 100644 --- a/src/main/java/Parser.java +++ b/src/main/java/Parser.java @@ -53,7 +53,7 @@ public LocalDate stringToDate(String date) { try { parsedDate = LocalDate.parse(date); } catch (DateTimeParseException e) { - logger.info("parse date time got error" + e.getMessage()); + logger.finest("parse date time got error" + e.getMessage()); } return parsedDate; } @@ -83,7 +83,7 @@ public Boolean isList() { } public Boolean isList(String i) { - logger.info("instruction: listing task"); + logger.finest("instruction: listing task"); return i.toLowerCase(Locale.ROOT).equals(DETECT_LIST); } @@ -92,7 +92,7 @@ public Boolean isDone() { } public Boolean isDone(String i) { - logger.info("instruction: done"); + logger.finest("instruction: done"); return i.toLowerCase(Locale.ROOT).equals(DETECT_DONE) && tokens.size() >= 2; } @@ -101,14 +101,14 @@ public Boolean isDelete() { } public Boolean isDelete(String i) { - logger.info("instruction: done"); + logger.finest("instruction: done"); return i.toLowerCase(Locale.ROOT).equals(DETECT_DELETE) && tokens.size() >= 2; } public String getFirstToken() { if (tokens.size() > 1) { String firstToken = tokens.get(1); - logger.info("instruction: get first token" + firstToken); + logger.finest("instruction: get first token" + firstToken); return firstToken; } diff --git a/src/main/java/StorageDTO.java b/src/main/java/StorageDTO.java index dae7851e..6dbd605f 100644 --- a/src/main/java/StorageDTO.java +++ b/src/main/java/StorageDTO.java @@ -20,13 +20,13 @@ public ArrayList loadInto(TaskManager tm) { while (s.hasNext()) { Task t = parseLineToTask(s.nextLine(), id, tm); list.add(t); - logger.info("added task successfully to list" + t); + logger.finest("added task successfully to list" + t); id++; } tm.setTasks(list); return list; } catch (Exception e) { - logger.info("got error loading file, error: " + e); + logger.finest("got error loading file, error: " + e); } return new ArrayList(); } @@ -45,13 +45,13 @@ public void save(ArrayList tasks) { try { String task = parseTaskToLine(t); fw.write(task + "\n"); - logger.info("task written properly" + task); + logger.finest("task written properly" + task); } catch (Exception e) { e.printStackTrace(); } }); fw.close(); - logger.info("file has been saved properly"); + logger.finest("file has been saved properly"); } catch (Exception e) { System.out.println("saving failed, error: " + e); } diff --git a/src/main/java/Task.java b/src/main/java/Task.java index 5abe805a..4cb0fbb1 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -14,7 +14,7 @@ public String toTask() { public Task(String description, int id) { this.id = id; this.description = description; - logger.info("set task, details: " + id + " description: " + description); + logger.finest("set task, details: " + id + " description: " + description); } public Integer getId() { diff --git a/src/main/java/TaskManager.java b/src/main/java/TaskManager.java index 8a6a1e5e..c29be1bb 100644 --- a/src/main/java/TaskManager.java +++ b/src/main/java/TaskManager.java @@ -85,10 +85,10 @@ public void deleteTask(Integer taskId) { } public ArrayList viewTaskOn(LocalDate date) { - logger.info("viewTasksOn date: " + date + ", current task list: " + tasks); + logger.finest("viewTasksOn date: " + date + ", current task list: " + tasks); ArrayList results = new ArrayList<>(); if (date == null) { - logger.info("viewTasksOn got null date"); + logger.finest("viewTasksOn got null date"); return results; } tasks.forEach(t -> { @@ -100,13 +100,13 @@ public ArrayList viewTaskOn(LocalDate date) { results.add(e); } } catch (ClassCastException e) { - logger.info("casting to deadline class got error, item could be todo type, error: " + e.getMessage() + " object: " + t); + logger.finest("casting to deadline class got error, item could be todo type, error: " + e.getMessage() + " object: " + t); } }); return results; } public Integer getNumOfTasks() { - return tasks.size(); + return tasks.size() + 1; } } \ No newline at end of file From 3256352f4a6d353e15848a1af2d50bebab9b0445 Mon Sep 17 00:00:00 2001 From: Metilda Chee Date: Sun, 14 Nov 2021 12:43:44 +0800 Subject: [PATCH 42/49] Fix marking as done --- duke.txt | 1 - duke_info.logs.1 | 24 +++++++++++++++++ duke_info.logs.1.lck | 0 duke_info.logs.2 | 24 +++++++++++++++++ duke_info.logs.2.lck | 0 duke_info.logs.3 | 14 ++++++++++ duke_info.logs.3.lck | 0 duke_info.logs.4 | 26 ++++++++++++++++++ duke_info.logs.5 | 26 ++++++++++++++++++ duke_info.logs.6 | 26 ++++++++++++++++++ duke_info.logs.7 | 6 +++++ duke_info.logs.8 | 6 +++++ duke_info.logs.9 | 6 +++++ duke_info.logs.lck | 0 src/main/java/Deadline.java | 18 +++++++------ src/main/java/Event.java | 11 ++++---- src/main/java/Global.java | 2 +- src/main/java/Logger.java | 10 +++++-- src/main/java/Parser.java | 17 +++++++----- src/main/java/StorageDTO.java | 8 +++--- src/main/java/Task.java | 1 - src/main/java/TaskManager.java | 48 +++++++++++++++++++++------------- src/main/java/Todo.java | 6 ++--- src/main/java/UI.java | 8 +++--- 24 files changed, 234 insertions(+), 54 deletions(-) create mode 100644 duke_info.logs.1 create mode 100644 duke_info.logs.1.lck create mode 100644 duke_info.logs.2 create mode 100644 duke_info.logs.2.lck create mode 100644 duke_info.logs.3 create mode 100644 duke_info.logs.3.lck create mode 100644 duke_info.logs.4 create mode 100644 duke_info.logs.5 create mode 100644 duke_info.logs.6 create mode 100644 duke_info.logs.7 create mode 100644 duke_info.logs.8 create mode 100644 duke_info.logs.9 create mode 100644 duke_info.logs.lck diff --git a/duke.txt b/duke.txt index 8b137891..e69de29b 100644 --- a/duke.txt +++ b/duke.txt @@ -1 +0,0 @@ - diff --git a/duke_info.logs.1 b/duke_info.logs.1 new file mode 100644 index 00000000..7f3dbeac --- /dev/null +++ b/duke_info.logs.1 @@ -0,0 +1,24 @@ +Nov 14, 2021 12:41:04 PM Logger info +FINEST: instruction: listing task +Nov 14, 2021 12:41:15 PM Logger info +FINEST: instruction: get first tokenread +Nov 14, 2021 12:41:15 PM Logger info +FINEST: instruction: listing task +Nov 14, 2021 12:41:15 PM Logger info +FINEST: instruction: done +Nov 14, 2021 12:41:15 PM Logger info +FINEST: instruction: done +Nov 14, 2021 12:41:18 PM Logger info +FINEST: instruction: get first token1 +Nov 14, 2021 12:41:18 PM Logger info +FINEST: instruction: listing task +Nov 14, 2021 12:41:18 PM Logger info +FINEST: instruction: done +Nov 14, 2021 12:41:22 PM Logger info +FINEST: instruction: listing task +Nov 14, 2021 12:41:26 PM Logger info +FINEST: instruction: get first token3 +Nov 14, 2021 12:41:26 PM Logger info +FINEST: instruction: listing task +Nov 14, 2021 12:41:26 PM Logger info +FINEST: instruction: done diff --git a/duke_info.logs.1.lck b/duke_info.logs.1.lck new file mode 100644 index 00000000..e69de29b diff --git a/duke_info.logs.2 b/duke_info.logs.2 new file mode 100644 index 00000000..7f3dbeac --- /dev/null +++ b/duke_info.logs.2 @@ -0,0 +1,24 @@ +Nov 14, 2021 12:41:04 PM Logger info +FINEST: instruction: listing task +Nov 14, 2021 12:41:15 PM Logger info +FINEST: instruction: get first tokenread +Nov 14, 2021 12:41:15 PM Logger info +FINEST: instruction: listing task +Nov 14, 2021 12:41:15 PM Logger info +FINEST: instruction: done +Nov 14, 2021 12:41:15 PM Logger info +FINEST: instruction: done +Nov 14, 2021 12:41:18 PM Logger info +FINEST: instruction: get first token1 +Nov 14, 2021 12:41:18 PM Logger info +FINEST: instruction: listing task +Nov 14, 2021 12:41:18 PM Logger info +FINEST: instruction: done +Nov 14, 2021 12:41:22 PM Logger info +FINEST: instruction: listing task +Nov 14, 2021 12:41:26 PM Logger info +FINEST: instruction: get first token3 +Nov 14, 2021 12:41:26 PM Logger info +FINEST: instruction: listing task +Nov 14, 2021 12:41:26 PM Logger info +FINEST: instruction: done diff --git a/duke_info.logs.2.lck b/duke_info.logs.2.lck new file mode 100644 index 00000000..e69de29b diff --git a/duke_info.logs.3 b/duke_info.logs.3 new file mode 100644 index 00000000..c71dfc8f --- /dev/null +++ b/duke_info.logs.3 @@ -0,0 +1,14 @@ +Nov 14, 2021 12:41:18 PM Logger info +FINEST: instruction: get first token1 +Nov 14, 2021 12:41:18 PM Logger info +FINEST: instruction: listing task +Nov 14, 2021 12:41:18 PM Logger info +FINEST: instruction: done +Nov 14, 2021 12:41:22 PM Logger info +FINEST: instruction: listing task +Nov 14, 2021 12:41:26 PM Logger info +FINEST: instruction: get first token3 +Nov 14, 2021 12:41:26 PM Logger info +FINEST: instruction: listing task +Nov 14, 2021 12:41:26 PM Logger info +FINEST: instruction: done diff --git a/duke_info.logs.3.lck b/duke_info.logs.3.lck new file mode 100644 index 00000000..e69de29b diff --git a/duke_info.logs.4 b/duke_info.logs.4 new file mode 100644 index 00000000..a0c4c973 --- /dev/null +++ b/duke_info.logs.4 @@ -0,0 +1,26 @@ +Nov 14, 2021 12:06:41 PM Logger info +FINEST: get description: submit report +Nov 14, 2021 12:06:41 PM Logger info +FINEST: get endDateTime: 2019-12-01 21:00 +Nov 14, 2021 12:06:41 PM Logger info +FINEST: set tokens: [2019-12-01, 21:00] +Nov 14, 2021 12:06:41 PM Logger info +FINEST: set date: 2019-12-01 +Nov 14, 2021 12:06:41 PM Logger info +FINEST: set end_time: 21:00 +Nov 14, 2021 12:06:47 PM Logger info +FINEST: instruction: get first tokenproject +Nov 14, 2021 12:06:47 PM Logger info +FINEST: instruction: listing task +Nov 14, 2021 12:06:47 PM Logger info +FINEST: instruction: done +Nov 14, 2021 12:06:47 PM Logger info +FINEST: instruction: done +Nov 14, 2021 12:06:47 PM Logger info +FINEST: add info for event: [project meeting , 2019-12-01 18:00-21:00] +Nov 14, 2021 12:06:50 PM Logger info +FINEST: instruction: get first token3 +Nov 14, 2021 12:06:50 PM Logger info +FINEST: instruction: listing task +Nov 14, 2021 12:06:50 PM Logger info +FINEST: instruction: done diff --git a/duke_info.logs.5 b/duke_info.logs.5 new file mode 100644 index 00000000..a0c4c973 --- /dev/null +++ b/duke_info.logs.5 @@ -0,0 +1,26 @@ +Nov 14, 2021 12:06:41 PM Logger info +FINEST: get description: submit report +Nov 14, 2021 12:06:41 PM Logger info +FINEST: get endDateTime: 2019-12-01 21:00 +Nov 14, 2021 12:06:41 PM Logger info +FINEST: set tokens: [2019-12-01, 21:00] +Nov 14, 2021 12:06:41 PM Logger info +FINEST: set date: 2019-12-01 +Nov 14, 2021 12:06:41 PM Logger info +FINEST: set end_time: 21:00 +Nov 14, 2021 12:06:47 PM Logger info +FINEST: instruction: get first tokenproject +Nov 14, 2021 12:06:47 PM Logger info +FINEST: instruction: listing task +Nov 14, 2021 12:06:47 PM Logger info +FINEST: instruction: done +Nov 14, 2021 12:06:47 PM Logger info +FINEST: instruction: done +Nov 14, 2021 12:06:47 PM Logger info +FINEST: add info for event: [project meeting , 2019-12-01 18:00-21:00] +Nov 14, 2021 12:06:50 PM Logger info +FINEST: instruction: get first token3 +Nov 14, 2021 12:06:50 PM Logger info +FINEST: instruction: listing task +Nov 14, 2021 12:06:50 PM Logger info +FINEST: instruction: done diff --git a/duke_info.logs.6 b/duke_info.logs.6 new file mode 100644 index 00000000..a0c4c973 --- /dev/null +++ b/duke_info.logs.6 @@ -0,0 +1,26 @@ +Nov 14, 2021 12:06:41 PM Logger info +FINEST: get description: submit report +Nov 14, 2021 12:06:41 PM Logger info +FINEST: get endDateTime: 2019-12-01 21:00 +Nov 14, 2021 12:06:41 PM Logger info +FINEST: set tokens: [2019-12-01, 21:00] +Nov 14, 2021 12:06:41 PM Logger info +FINEST: set date: 2019-12-01 +Nov 14, 2021 12:06:41 PM Logger info +FINEST: set end_time: 21:00 +Nov 14, 2021 12:06:47 PM Logger info +FINEST: instruction: get first tokenproject +Nov 14, 2021 12:06:47 PM Logger info +FINEST: instruction: listing task +Nov 14, 2021 12:06:47 PM Logger info +FINEST: instruction: done +Nov 14, 2021 12:06:47 PM Logger info +FINEST: instruction: done +Nov 14, 2021 12:06:47 PM Logger info +FINEST: add info for event: [project meeting , 2019-12-01 18:00-21:00] +Nov 14, 2021 12:06:50 PM Logger info +FINEST: instruction: get first token3 +Nov 14, 2021 12:06:50 PM Logger info +FINEST: instruction: listing task +Nov 14, 2021 12:06:50 PM Logger info +FINEST: instruction: done diff --git a/duke_info.logs.7 b/duke_info.logs.7 new file mode 100644 index 00000000..ca3e80bf --- /dev/null +++ b/duke_info.logs.7 @@ -0,0 +1,6 @@ +Nov 14, 2021 12:06:50 PM Logger info +FINEST: instruction: get first token3 +Nov 14, 2021 12:06:50 PM Logger info +FINEST: instruction: listing task +Nov 14, 2021 12:06:50 PM Logger info +FINEST: instruction: done diff --git a/duke_info.logs.8 b/duke_info.logs.8 new file mode 100644 index 00000000..ca3e80bf --- /dev/null +++ b/duke_info.logs.8 @@ -0,0 +1,6 @@ +Nov 14, 2021 12:06:50 PM Logger info +FINEST: instruction: get first token3 +Nov 14, 2021 12:06:50 PM Logger info +FINEST: instruction: listing task +Nov 14, 2021 12:06:50 PM Logger info +FINEST: instruction: done diff --git a/duke_info.logs.9 b/duke_info.logs.9 new file mode 100644 index 00000000..ca3e80bf --- /dev/null +++ b/duke_info.logs.9 @@ -0,0 +1,6 @@ +Nov 14, 2021 12:06:50 PM Logger info +FINEST: instruction: get first token3 +Nov 14, 2021 12:06:50 PM Logger info +FINEST: instruction: listing task +Nov 14, 2021 12:06:50 PM Logger info +FINEST: instruction: done diff --git a/duke_info.logs.lck b/duke_info.logs.lck new file mode 100644 index 00000000..e69de29b diff --git a/src/main/java/Deadline.java b/src/main/java/Deadline.java index bf0a8bc7..a92779ef 100644 --- a/src/main/java/Deadline.java +++ b/src/main/java/Deadline.java @@ -7,19 +7,21 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Objects; -import java.util.logging.Logger; public class Deadline extends Todo { LocalDate date; long endTime; Parser parser = new Parser(); - - private static final Logger logger = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME); + Logger logger = new Logger(); public Deadline(String description, String endDateTime, int id) { super(description, id); - ArrayList tokens = new ArrayList(Arrays.asList(endDateTime.split(" "))); + logger.init(""); + logger.info("get description: " + description); + logger.info("get endDateTime: " + endDateTime.trim()); + ArrayList tokens = new ArrayList(Arrays.asList(endDateTime.trim().split(" "))); + logger.info("set tokens: " + tokens); setDate(tokens.get(0)); setEndTime(tokens.get(1)); } @@ -46,25 +48,25 @@ public LocalDate getDate() { } public void setDate(String date) { - logger.finest("set date " + date); + logger.info("set date: " + date); if (Objects.equals(date, "")) { return; } LocalDate parsedDate = parser.stringToDate(date); if (parsedDate == null) { - logger.finest("parsing date got null"); + logger.info("parsing date got null"); } else { this.date = parsedDate; } } public void setEndTime(String time) { - logger.finest("set end_time " + time); + logger.info("set end_time: " + time); DateFormat formatter = new SimpleDateFormat("HH:mm"); try { this.endTime = formatter.parse(time).getTime(); } catch (ParseException p) { - logger.finest("parsing time got exception" + p.getMessage()); + logger.info("parsing time got exception" + p.getMessage()); } } diff --git a/src/main/java/Event.java b/src/main/java/Event.java index d4edc245..1dfd2197 100644 --- a/src/main/java/Event.java +++ b/src/main/java/Event.java @@ -13,22 +13,23 @@ public class Event extends Deadline { public Event(String description, String date, int id) { super(description, - (String) new ArrayList(Arrays.asList(date.split(" "))).get(0), - (String) new ArrayList(Arrays.asList(Arrays.asList(date.split(" ")).get(1).split("-"))).get(1), + (String) new ArrayList(Arrays.asList(date.trim().split(" "))).get(0), + (String) new ArrayList(Arrays.asList(Arrays.asList(date.trim().split(" ")).get(1).split("-"))).get(1), id); - setStartTime((String) new ArrayList(Arrays.asList(Arrays.asList(date.split(" ")).get(1).split("-"))).get(0)); + setStartTime((String) new ArrayList(Arrays.asList(Arrays.asList(date.trim().split(" ")).get(1).split("-"))).get(0)); + logger.init(""); } public void setStartTime(String startTime) { if (Objects.equals(startTime, "")) { - logger.finest("empty time"); + logger.info("empty time"); return; } DateFormat formatter = new SimpleDateFormat("HH:mm"); try { this.startTime = formatter.parse(startTime).getTime(); } catch (ParseException p) { - logger.finest("parsing time got null"); + logger.info("parsing time got null"); } } diff --git a/src/main/java/Global.java b/src/main/java/Global.java index 46a44d80..0ff6539b 100644 --- a/src/main/java/Global.java +++ b/src/main/java/Global.java @@ -2,6 +2,6 @@ public class Global { int id = 0; public int getId() { - return id++; + return ++id; } } diff --git a/src/main/java/Logger.java b/src/main/java/Logger.java index 92d9edf1..6f5949ea 100644 --- a/src/main/java/Logger.java +++ b/src/main/java/Logger.java @@ -1,4 +1,5 @@ import java.io.IOException; +import java.util.Objects; import java.util.logging.FileHandler; import java.util.logging.Level; import java.util.logging.SimpleFormatter; @@ -11,6 +12,9 @@ public Logger() { } public void init(String path) { + if (Objects.equals(path, "")) { + path = "duke_info.logs"; + } logger = java.util.logging.Logger.getLogger(java.util.logging.Logger.GLOBAL_LOGGER_NAME); logger.setLevel(Level.FINEST); try { @@ -20,7 +24,7 @@ public void init(String path) { fileTxt.setFormatter(formatterTxt); logger.addHandler(fileTxt); } catch (IOException e) { - logger.finest("init logger got error"); + logger.info("init logger got error"); } } @@ -29,6 +33,8 @@ public java.util.logging.Logger getLogger() { } public void info(String msg) { - logger.finest(msg); + if (logger != null) { + logger.finest(msg); + } } } diff --git a/src/main/java/Parser.java b/src/main/java/Parser.java index 99ca5e5f..083c8cf7 100644 --- a/src/main/java/Parser.java +++ b/src/main/java/Parser.java @@ -3,10 +3,9 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Locale; -import java.util.logging.Logger; public class Parser { - private static final Logger logger = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME); + Logger logger = new Logger(); private final static String DETECT_END = "bye"; private final static String DETECT_LIST = "list"; private final static String DETECT_DONE = "done"; @@ -16,6 +15,10 @@ public class Parser { ArrayList tokens = new ArrayList<>(); + public Parser() { + logger.init(""); + } + public String getInstruction() { return instruction; } @@ -53,7 +56,7 @@ public LocalDate stringToDate(String date) { try { parsedDate = LocalDate.parse(date); } catch (DateTimeParseException e) { - logger.finest("parse date time got error" + e.getMessage()); + logger.info("parse date time got error" + e.getMessage()); } return parsedDate; } @@ -83,7 +86,7 @@ public Boolean isList() { } public Boolean isList(String i) { - logger.finest("instruction: listing task"); + logger.info("instruction: listing task"); return i.toLowerCase(Locale.ROOT).equals(DETECT_LIST); } @@ -92,7 +95,7 @@ public Boolean isDone() { } public Boolean isDone(String i) { - logger.finest("instruction: done"); + logger.info("instruction: done"); return i.toLowerCase(Locale.ROOT).equals(DETECT_DONE) && tokens.size() >= 2; } @@ -101,14 +104,14 @@ public Boolean isDelete() { } public Boolean isDelete(String i) { - logger.finest("instruction: done"); + logger.info("instruction: done"); return i.toLowerCase(Locale.ROOT).equals(DETECT_DELETE) && tokens.size() >= 2; } public String getFirstToken() { if (tokens.size() > 1) { String firstToken = tokens.get(1); - logger.finest("instruction: get first token" + firstToken); + logger.info("instruction: get first token" + firstToken); return firstToken; } diff --git a/src/main/java/StorageDTO.java b/src/main/java/StorageDTO.java index 6dbd605f..dae7851e 100644 --- a/src/main/java/StorageDTO.java +++ b/src/main/java/StorageDTO.java @@ -20,13 +20,13 @@ public ArrayList loadInto(TaskManager tm) { while (s.hasNext()) { Task t = parseLineToTask(s.nextLine(), id, tm); list.add(t); - logger.finest("added task successfully to list" + t); + logger.info("added task successfully to list" + t); id++; } tm.setTasks(list); return list; } catch (Exception e) { - logger.finest("got error loading file, error: " + e); + logger.info("got error loading file, error: " + e); } return new ArrayList(); } @@ -45,13 +45,13 @@ public void save(ArrayList tasks) { try { String task = parseTaskToLine(t); fw.write(task + "\n"); - logger.finest("task written properly" + task); + logger.info("task written properly" + task); } catch (Exception e) { e.printStackTrace(); } }); fw.close(); - logger.finest("file has been saved properly"); + logger.info("file has been saved properly"); } catch (Exception e) { System.out.println("saving failed, error: " + e); } diff --git a/src/main/java/Task.java b/src/main/java/Task.java index 4cb0fbb1..a0cc3465 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -14,7 +14,6 @@ public String toTask() { public Task(String description, int id) { this.id = id; this.description = description; - logger.finest("set task, details: " + id + " description: " + description); } public Integer getId() { diff --git a/src/main/java/TaskManager.java b/src/main/java/TaskManager.java index c29be1bb..842aa6d0 100644 --- a/src/main/java/TaskManager.java +++ b/src/main/java/TaskManager.java @@ -1,21 +1,22 @@ import java.time.LocalDate; import java.util.ArrayList; import java.util.Arrays; -import java.util.logging.Logger; +import java.util.Objects; +import java.util.concurrent.atomic.AtomicReference; public class TaskManager { - private static final Logger logger = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME); private final static String DETECT_ADD_TODO = "todo"; private final static String DETECT_ADD_EVENT = "event"; private final static String DETECT_ADD_DEADLINE = "deadline"; - - private final static String STMT_DONE = "Nice! I've marked this task as done: "; private final static String STMT_DELETE = "Noted. I've removed this task: "; - + Logger logger = new Logger(); private ArrayList tasks = new ArrayList<>(); - private StorageDTO storageDTO; Global global = new Global(); + public TaskManager() { + logger.init(""); + } + public ArrayList findTask(String keyword) { ArrayList results = new ArrayList<>(); tasks.stream().filter(t -> t.getDescription().contains(keyword)).forEach(results::add); @@ -38,6 +39,7 @@ public Task createTask(String taskInfo, String instruction) { return t; case DETECT_ADD_EVENT: ArrayList addInfo = new ArrayList(Arrays.asList(taskInfo.split("/at"))); + logger.info("add info for event: " + addInfo); Event e = new Event(addInfo.get(0), addInfo.get(1), global.getId()); addTask(e); return e; @@ -65,12 +67,22 @@ public void addTask(Task t) { tasks.add(t); } - public void markTaskDone(Integer taskId) { - tasks.stream().filter(t -> t.getId().equals(taskId)).forEach(t -> { - System.out.println(STMT_DONE); - Todo task = (Todo) t; - task.setDone(true); - }); + public Task markTaskDone(Integer taskId) { + Task tx = null; + if (tasks == null) { + return null; + } + for (int i = 0; i < tasks.size(); i++) { + Task t = tasks.get(i); + if (Objects.equals(t.getId(), taskId)) { + tx = t; + Todo todo = (Todo) t; + todo.setDone(true); + t = (Task) todo; + tasks.set(i, t); + } + } + return tx; } public void deleteTask(Integer taskId) { @@ -85,28 +97,28 @@ public void deleteTask(Integer taskId) { } public ArrayList viewTaskOn(LocalDate date) { - logger.finest("viewTasksOn date: " + date + ", current task list: " + tasks); + logger.info("viewTasksOn date: " + date + ", current task list: " + tasks); ArrayList results = new ArrayList<>(); if (date == null) { - logger.finest("viewTasksOn got null date"); + logger.info("viewTasksOn got null date"); return results; } tasks.forEach(t -> { try { Deadline e = (Deadline) t; - logger.finest("looking at task: " + t + " date for this task " + e.getDate()); + logger.info("looking at task: " + t + " date for this task " + e.getDate()); if (e.getDate().equals(date)) { - logger.finest("added successfully to results " + e); + logger.info("added successfully to results " + e); results.add(e); } } catch (ClassCastException e) { - logger.finest("casting to deadline class got error, item could be todo type, error: " + e.getMessage() + " object: " + t); + logger.info("casting to deadline class got error, item could be todo type, error: " + e.getMessage() + " object: " + t); } }); return results; } public Integer getNumOfTasks() { - return tasks.size() + 1; + return tasks.size(); } } \ No newline at end of file diff --git a/src/main/java/Todo.java b/src/main/java/Todo.java index d2bc7c46..966b4282 100644 --- a/src/main/java/Todo.java +++ b/src/main/java/Todo.java @@ -1,13 +1,11 @@ -import java.util.logging.Level; -import java.util.logging.Logger; - public class Todo extends Task { - private static final Logger logger = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME); + Logger logger = new Logger(); public boolean isDone; public Todo(String desc, int id) { super(desc, id); isDone = false; + logger.init(""); } public void setDone(boolean done) { diff --git a/src/main/java/UI.java b/src/main/java/UI.java index e488d10b..6d935627 100644 --- a/src/main/java/UI.java +++ b/src/main/java/UI.java @@ -1,10 +1,11 @@ import java.util.ArrayList; import java.util.Calendar; import java.util.Scanner; +import java.util.concurrent.atomic.AtomicReference; public class UI { private final static String STMT_END = "Bye. Hope to see you again soon!"; - + private final static String STMT_DONE = "Nice! I've marked this task as done: "; private final static String ERROR_PREFIX = "Oops I did not quite understand that."; public UI(TaskManager m) { @@ -86,7 +87,8 @@ public void processInput() { if (parser.isList()) { manager.listTasks(); } else if (parser.isDone()) { - manager.markTaskDone(Integer.parseInt((firstToken))); + Task t = manager.markTaskDone(Integer.parseInt((firstToken))); + System.out.println(t == null ? "🤡 Oops that item doesn't exist, try \"list\" to see all your tasks." : STMT_DONE + "\n" + t); } else if (parser.isDelete()) { manager.deleteTask(Integer.parseInt((firstToken))); } else if (parser.isFind()) { @@ -96,7 +98,7 @@ public void processInput() { manager.viewTaskOn(parser.stringToDate(firstToken)); } else { Task t = manager.createTask(taskInfo, instruction); - System.out.println("Got it! 👌 I've add this task: \n" + t.toString() + "\nNow you have " + manager.getNumOfTasks() + " tasks in the list."); + System.out.println("Got it! 👌 I've add this " + t.getType() + ": \n" + t.toString() + "\nNow you have " + manager.getNumOfTasks() + " tasks in the list."); } } } From 5cca19f54093cd276984ef94c6a170a2ee83d984 Mon Sep 17 00:00:00 2001 From: Metilda Chee Date: Sun, 14 Nov 2021 12:44:10 +0800 Subject: [PATCH 43/49] Remove all logs --- duke_info.logs.1 | 24 ------------------------ duke_info.logs.1.lck | 0 duke_info.logs.2 | 24 ------------------------ duke_info.logs.2.lck | 0 duke_info.logs.3 | 14 -------------- duke_info.logs.3.lck | 0 duke_info.logs.4 | 26 -------------------------- duke_info.logs.5 | 26 -------------------------- duke_info.logs.6 | 26 -------------------------- duke_info.logs.7 | 6 ------ duke_info.logs.8 | 6 ------ duke_info.logs.9 | 6 ------ duke_info.logs.lck | 0 13 files changed, 158 deletions(-) delete mode 100644 duke_info.logs.1 delete mode 100644 duke_info.logs.1.lck delete mode 100644 duke_info.logs.2 delete mode 100644 duke_info.logs.2.lck delete mode 100644 duke_info.logs.3 delete mode 100644 duke_info.logs.3.lck delete mode 100644 duke_info.logs.4 delete mode 100644 duke_info.logs.5 delete mode 100644 duke_info.logs.6 delete mode 100644 duke_info.logs.7 delete mode 100644 duke_info.logs.8 delete mode 100644 duke_info.logs.9 delete mode 100644 duke_info.logs.lck diff --git a/duke_info.logs.1 b/duke_info.logs.1 deleted file mode 100644 index 7f3dbeac..00000000 --- a/duke_info.logs.1 +++ /dev/null @@ -1,24 +0,0 @@ -Nov 14, 2021 12:41:04 PM Logger info -FINEST: instruction: listing task -Nov 14, 2021 12:41:15 PM Logger info -FINEST: instruction: get first tokenread -Nov 14, 2021 12:41:15 PM Logger info -FINEST: instruction: listing task -Nov 14, 2021 12:41:15 PM Logger info -FINEST: instruction: done -Nov 14, 2021 12:41:15 PM Logger info -FINEST: instruction: done -Nov 14, 2021 12:41:18 PM Logger info -FINEST: instruction: get first token1 -Nov 14, 2021 12:41:18 PM Logger info -FINEST: instruction: listing task -Nov 14, 2021 12:41:18 PM Logger info -FINEST: instruction: done -Nov 14, 2021 12:41:22 PM Logger info -FINEST: instruction: listing task -Nov 14, 2021 12:41:26 PM Logger info -FINEST: instruction: get first token3 -Nov 14, 2021 12:41:26 PM Logger info -FINEST: instruction: listing task -Nov 14, 2021 12:41:26 PM Logger info -FINEST: instruction: done diff --git a/duke_info.logs.1.lck b/duke_info.logs.1.lck deleted file mode 100644 index e69de29b..00000000 diff --git a/duke_info.logs.2 b/duke_info.logs.2 deleted file mode 100644 index 7f3dbeac..00000000 --- a/duke_info.logs.2 +++ /dev/null @@ -1,24 +0,0 @@ -Nov 14, 2021 12:41:04 PM Logger info -FINEST: instruction: listing task -Nov 14, 2021 12:41:15 PM Logger info -FINEST: instruction: get first tokenread -Nov 14, 2021 12:41:15 PM Logger info -FINEST: instruction: listing task -Nov 14, 2021 12:41:15 PM Logger info -FINEST: instruction: done -Nov 14, 2021 12:41:15 PM Logger info -FINEST: instruction: done -Nov 14, 2021 12:41:18 PM Logger info -FINEST: instruction: get first token1 -Nov 14, 2021 12:41:18 PM Logger info -FINEST: instruction: listing task -Nov 14, 2021 12:41:18 PM Logger info -FINEST: instruction: done -Nov 14, 2021 12:41:22 PM Logger info -FINEST: instruction: listing task -Nov 14, 2021 12:41:26 PM Logger info -FINEST: instruction: get first token3 -Nov 14, 2021 12:41:26 PM Logger info -FINEST: instruction: listing task -Nov 14, 2021 12:41:26 PM Logger info -FINEST: instruction: done diff --git a/duke_info.logs.2.lck b/duke_info.logs.2.lck deleted file mode 100644 index e69de29b..00000000 diff --git a/duke_info.logs.3 b/duke_info.logs.3 deleted file mode 100644 index c71dfc8f..00000000 --- a/duke_info.logs.3 +++ /dev/null @@ -1,14 +0,0 @@ -Nov 14, 2021 12:41:18 PM Logger info -FINEST: instruction: get first token1 -Nov 14, 2021 12:41:18 PM Logger info -FINEST: instruction: listing task -Nov 14, 2021 12:41:18 PM Logger info -FINEST: instruction: done -Nov 14, 2021 12:41:22 PM Logger info -FINEST: instruction: listing task -Nov 14, 2021 12:41:26 PM Logger info -FINEST: instruction: get first token3 -Nov 14, 2021 12:41:26 PM Logger info -FINEST: instruction: listing task -Nov 14, 2021 12:41:26 PM Logger info -FINEST: instruction: done diff --git a/duke_info.logs.3.lck b/duke_info.logs.3.lck deleted file mode 100644 index e69de29b..00000000 diff --git a/duke_info.logs.4 b/duke_info.logs.4 deleted file mode 100644 index a0c4c973..00000000 --- a/duke_info.logs.4 +++ /dev/null @@ -1,26 +0,0 @@ -Nov 14, 2021 12:06:41 PM Logger info -FINEST: get description: submit report -Nov 14, 2021 12:06:41 PM Logger info -FINEST: get endDateTime: 2019-12-01 21:00 -Nov 14, 2021 12:06:41 PM Logger info -FINEST: set tokens: [2019-12-01, 21:00] -Nov 14, 2021 12:06:41 PM Logger info -FINEST: set date: 2019-12-01 -Nov 14, 2021 12:06:41 PM Logger info -FINEST: set end_time: 21:00 -Nov 14, 2021 12:06:47 PM Logger info -FINEST: instruction: get first tokenproject -Nov 14, 2021 12:06:47 PM Logger info -FINEST: instruction: listing task -Nov 14, 2021 12:06:47 PM Logger info -FINEST: instruction: done -Nov 14, 2021 12:06:47 PM Logger info -FINEST: instruction: done -Nov 14, 2021 12:06:47 PM Logger info -FINEST: add info for event: [project meeting , 2019-12-01 18:00-21:00] -Nov 14, 2021 12:06:50 PM Logger info -FINEST: instruction: get first token3 -Nov 14, 2021 12:06:50 PM Logger info -FINEST: instruction: listing task -Nov 14, 2021 12:06:50 PM Logger info -FINEST: instruction: done diff --git a/duke_info.logs.5 b/duke_info.logs.5 deleted file mode 100644 index a0c4c973..00000000 --- a/duke_info.logs.5 +++ /dev/null @@ -1,26 +0,0 @@ -Nov 14, 2021 12:06:41 PM Logger info -FINEST: get description: submit report -Nov 14, 2021 12:06:41 PM Logger info -FINEST: get endDateTime: 2019-12-01 21:00 -Nov 14, 2021 12:06:41 PM Logger info -FINEST: set tokens: [2019-12-01, 21:00] -Nov 14, 2021 12:06:41 PM Logger info -FINEST: set date: 2019-12-01 -Nov 14, 2021 12:06:41 PM Logger info -FINEST: set end_time: 21:00 -Nov 14, 2021 12:06:47 PM Logger info -FINEST: instruction: get first tokenproject -Nov 14, 2021 12:06:47 PM Logger info -FINEST: instruction: listing task -Nov 14, 2021 12:06:47 PM Logger info -FINEST: instruction: done -Nov 14, 2021 12:06:47 PM Logger info -FINEST: instruction: done -Nov 14, 2021 12:06:47 PM Logger info -FINEST: add info for event: [project meeting , 2019-12-01 18:00-21:00] -Nov 14, 2021 12:06:50 PM Logger info -FINEST: instruction: get first token3 -Nov 14, 2021 12:06:50 PM Logger info -FINEST: instruction: listing task -Nov 14, 2021 12:06:50 PM Logger info -FINEST: instruction: done diff --git a/duke_info.logs.6 b/duke_info.logs.6 deleted file mode 100644 index a0c4c973..00000000 --- a/duke_info.logs.6 +++ /dev/null @@ -1,26 +0,0 @@ -Nov 14, 2021 12:06:41 PM Logger info -FINEST: get description: submit report -Nov 14, 2021 12:06:41 PM Logger info -FINEST: get endDateTime: 2019-12-01 21:00 -Nov 14, 2021 12:06:41 PM Logger info -FINEST: set tokens: [2019-12-01, 21:00] -Nov 14, 2021 12:06:41 PM Logger info -FINEST: set date: 2019-12-01 -Nov 14, 2021 12:06:41 PM Logger info -FINEST: set end_time: 21:00 -Nov 14, 2021 12:06:47 PM Logger info -FINEST: instruction: get first tokenproject -Nov 14, 2021 12:06:47 PM Logger info -FINEST: instruction: listing task -Nov 14, 2021 12:06:47 PM Logger info -FINEST: instruction: done -Nov 14, 2021 12:06:47 PM Logger info -FINEST: instruction: done -Nov 14, 2021 12:06:47 PM Logger info -FINEST: add info for event: [project meeting , 2019-12-01 18:00-21:00] -Nov 14, 2021 12:06:50 PM Logger info -FINEST: instruction: get first token3 -Nov 14, 2021 12:06:50 PM Logger info -FINEST: instruction: listing task -Nov 14, 2021 12:06:50 PM Logger info -FINEST: instruction: done diff --git a/duke_info.logs.7 b/duke_info.logs.7 deleted file mode 100644 index ca3e80bf..00000000 --- a/duke_info.logs.7 +++ /dev/null @@ -1,6 +0,0 @@ -Nov 14, 2021 12:06:50 PM Logger info -FINEST: instruction: get first token3 -Nov 14, 2021 12:06:50 PM Logger info -FINEST: instruction: listing task -Nov 14, 2021 12:06:50 PM Logger info -FINEST: instruction: done diff --git a/duke_info.logs.8 b/duke_info.logs.8 deleted file mode 100644 index ca3e80bf..00000000 --- a/duke_info.logs.8 +++ /dev/null @@ -1,6 +0,0 @@ -Nov 14, 2021 12:06:50 PM Logger info -FINEST: instruction: get first token3 -Nov 14, 2021 12:06:50 PM Logger info -FINEST: instruction: listing task -Nov 14, 2021 12:06:50 PM Logger info -FINEST: instruction: done diff --git a/duke_info.logs.9 b/duke_info.logs.9 deleted file mode 100644 index ca3e80bf..00000000 --- a/duke_info.logs.9 +++ /dev/null @@ -1,6 +0,0 @@ -Nov 14, 2021 12:06:50 PM Logger info -FINEST: instruction: get first token3 -Nov 14, 2021 12:06:50 PM Logger info -FINEST: instruction: listing task -Nov 14, 2021 12:06:50 PM Logger info -FINEST: instruction: done diff --git a/duke_info.logs.lck b/duke_info.logs.lck deleted file mode 100644 index e69de29b..00000000 From 58accfdcc8f6be385284bdcf901c6137549f905e Mon Sep 17 00:00:00 2001 From: Metilda Chee Date: Sun, 14 Nov 2021 13:51:43 +0800 Subject: [PATCH 44/49] Add detection for non-relevant commands --- duke_info.logs.1 | 12 ++++++++++++ duke_info.logs.2 | 12 ++++++++++++ src/main/java/Parser.java | 16 +++++++++++++++- src/main/java/UI.java | 5 ++++- 4 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 duke_info.logs.1 create mode 100644 duke_info.logs.2 diff --git a/duke_info.logs.1 b/duke_info.logs.1 new file mode 100644 index 00000000..06261755 --- /dev/null +++ b/duke_info.logs.1 @@ -0,0 +1,12 @@ +Nov 14, 2021 1:49:26 PM Logger info +FINEST: instruction: listing task +Nov 14, 2021 1:49:26 PM Logger info +FINEST: instruction: done +Nov 14, 2021 1:49:31 PM Logger info +FINEST: instruction: listing task +Nov 14, 2021 1:49:31 PM Logger info +FINEST: instruction: done +Nov 14, 2021 1:49:39 PM Logger info +FINEST: instruction: listing task +Nov 14, 2021 1:49:39 PM Logger info +FINEST: instruction: done diff --git a/duke_info.logs.2 b/duke_info.logs.2 new file mode 100644 index 00000000..06261755 --- /dev/null +++ b/duke_info.logs.2 @@ -0,0 +1,12 @@ +Nov 14, 2021 1:49:26 PM Logger info +FINEST: instruction: listing task +Nov 14, 2021 1:49:26 PM Logger info +FINEST: instruction: done +Nov 14, 2021 1:49:31 PM Logger info +FINEST: instruction: listing task +Nov 14, 2021 1:49:31 PM Logger info +FINEST: instruction: done +Nov 14, 2021 1:49:39 PM Logger info +FINEST: instruction: listing task +Nov 14, 2021 1:49:39 PM Logger info +FINEST: instruction: done diff --git a/src/main/java/Parser.java b/src/main/java/Parser.java index 083c8cf7..d2b4a200 100644 --- a/src/main/java/Parser.java +++ b/src/main/java/Parser.java @@ -12,6 +12,9 @@ public class Parser { private final static String DETECT_DELETE = "delete"; private final static String DETECT_FIND = "find"; private final static String DETECT_VIEW = "view"; + private final static String DETECT_EVENT = "event"; + private final static String DETECT_DEADLINE = "deadline"; + private final static String DETECT_TODO = "todo"; ArrayList tokens = new ArrayList<>(); @@ -104,7 +107,6 @@ public Boolean isDelete() { } public Boolean isDelete(String i) { - logger.info("instruction: done"); return i.toLowerCase(Locale.ROOT).equals(DETECT_DELETE) && tokens.size() >= 2; } @@ -133,4 +135,16 @@ public Boolean isView() { public Boolean isView(String i) { return i.toLowerCase(Locale.ROOT).equals(DETECT_VIEW) && tokens.size() >= 1; } + + public Boolean isAdd() { + return instruction.toLowerCase(Locale.ROOT).equals(DETECT_EVENT) && tokens.size() >= 1 || + instruction.toLowerCase(Locale.ROOT).equals(DETECT_DEADLINE) && tokens.size() >= 1 || + instruction.toLowerCase(Locale.ROOT).equals(DETECT_TODO) && tokens.size() >= 1; + } + + public Boolean isAdd(String i) { + return i.toLowerCase(Locale.ROOT).equals(DETECT_EVENT) && tokens.size() >= 1 || + i.toLowerCase(Locale.ROOT).equals(DETECT_DEADLINE) && tokens.size() >= 1 || + i.toLowerCase(Locale.ROOT).equals(DETECT_TODO) && tokens.size() >= 1; + } } diff --git a/src/main/java/UI.java b/src/main/java/UI.java index 6d935627..8c0f6cca 100644 --- a/src/main/java/UI.java +++ b/src/main/java/UI.java @@ -1,3 +1,4 @@ +import java.awt.datatransfer.SystemFlavorMap; import java.util.ArrayList; import java.util.Calendar; import java.util.Scanner; @@ -96,9 +97,11 @@ public void processInput() { manager.listTasks(li); } else if (parser.isView()) { manager.viewTaskOn(parser.stringToDate(firstToken)); - } else { + } else if (parser.isAdd()) { Task t = manager.createTask(taskInfo, instruction); System.out.println("Got it! 👌 I've add this " + t.getType() + ": \n" + t.toString() + "\nNow you have " + manager.getNumOfTasks() + " tasks in the list."); + } else { + System.out.println("🤡 Dukie did not understand the command, try again?"); } } } From df51a7b6cb26023439d608b5148c8432d5cee0e3 Mon Sep 17 00:00:00 2001 From: Metilda Chee Date: Sun, 14 Nov 2021 13:52:25 +0800 Subject: [PATCH 45/49] Update gitignore --- .gitignore | 1 + duke_info.logs.1 | 12 ------------ duke_info.logs.2 | 12 ------------ 3 files changed, 1 insertion(+), 24 deletions(-) delete mode 100644 duke_info.logs.1 delete mode 100644 duke_info.logs.2 diff --git a/.gitignore b/.gitignore index 1a94201b..bba24a33 100644 --- a/.gitignore +++ b/.gitignore @@ -16,6 +16,7 @@ bin/ /vcs.xml /logs /*.logs +/*.logs.* modules.xml /*.class diff --git a/duke_info.logs.1 b/duke_info.logs.1 deleted file mode 100644 index 06261755..00000000 --- a/duke_info.logs.1 +++ /dev/null @@ -1,12 +0,0 @@ -Nov 14, 2021 1:49:26 PM Logger info -FINEST: instruction: listing task -Nov 14, 2021 1:49:26 PM Logger info -FINEST: instruction: done -Nov 14, 2021 1:49:31 PM Logger info -FINEST: instruction: listing task -Nov 14, 2021 1:49:31 PM Logger info -FINEST: instruction: done -Nov 14, 2021 1:49:39 PM Logger info -FINEST: instruction: listing task -Nov 14, 2021 1:49:39 PM Logger info -FINEST: instruction: done diff --git a/duke_info.logs.2 b/duke_info.logs.2 deleted file mode 100644 index 06261755..00000000 --- a/duke_info.logs.2 +++ /dev/null @@ -1,12 +0,0 @@ -Nov 14, 2021 1:49:26 PM Logger info -FINEST: instruction: listing task -Nov 14, 2021 1:49:26 PM Logger info -FINEST: instruction: done -Nov 14, 2021 1:49:31 PM Logger info -FINEST: instruction: listing task -Nov 14, 2021 1:49:31 PM Logger info -FINEST: instruction: done -Nov 14, 2021 1:49:39 PM Logger info -FINEST: instruction: listing task -Nov 14, 2021 1:49:39 PM Logger info -FINEST: instruction: done From 5f68085f81f5b51d98eafac4885aac90f092955e Mon Sep 17 00:00:00 2001 From: Metilda Chee Date: Sun, 14 Nov 2021 14:09:21 +0800 Subject: [PATCH 46/49] Abstract remove --- src/main/java/TaskManager.java | 24 +++++++++++++----------- src/main/java/UI.java | 7 +++++-- 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/src/main/java/TaskManager.java b/src/main/java/TaskManager.java index 842aa6d0..6529dfa0 100644 --- a/src/main/java/TaskManager.java +++ b/src/main/java/TaskManager.java @@ -2,13 +2,11 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Objects; -import java.util.concurrent.atomic.AtomicReference; public class TaskManager { private final static String DETECT_ADD_TODO = "todo"; private final static String DETECT_ADD_EVENT = "event"; private final static String DETECT_ADD_DEADLINE = "deadline"; - private final static String STMT_DELETE = "Noted. I've removed this task: "; Logger logger = new Logger(); private ArrayList tasks = new ArrayList<>(); Global global = new Global(); @@ -34,22 +32,22 @@ public ArrayList getTasks() { public Task createTask(String taskInfo, String instruction) { switch (instruction) { case DETECT_ADD_TODO: - Todo t = new Todo(taskInfo, global.getId()); + Todo t = new Todo(taskInfo, getId()); addTask(t); return t; case DETECT_ADD_EVENT: ArrayList addInfo = new ArrayList(Arrays.asList(taskInfo.split("/at"))); logger.info("add info for event: " + addInfo); - Event e = new Event(addInfo.get(0), addInfo.get(1), global.getId()); + Event e = new Event(addInfo.get(0), addInfo.get(1), getId()); addTask(e); return e; case DETECT_ADD_DEADLINE: ArrayList deadlineInfo = new ArrayList(Arrays.asList(taskInfo.split("/by"))); - Deadline d = new Deadline(deadlineInfo.get(0), deadlineInfo.get(1), global.getId()); + Deadline d = new Deadline(deadlineInfo.get(0), deadlineInfo.get(1), getId()); addTask(d); return d; } - return new Task(taskInfo, global.getId()); + return new Task(taskInfo, getId()); } public void listTasks() { @@ -85,15 +83,15 @@ public Task markTaskDone(Integer taskId) { return tx; } - public void deleteTask(Integer taskId) { + public Task deleteTask(Integer taskId) { for (int i = 0; i < tasks.size(); i++) { if (tasks.get(i).getId() != null && tasks.get(i).getId().equals(taskId)) { - System.out.println(STMT_DELETE); - System.out.println(tasks.get(i).toString()); - tasks.remove(tasks.get(i)); - return; + Task t = tasks.get(i); + tasks.remove(t); + return t; } } + return null; } public ArrayList viewTaskOn(LocalDate date) { @@ -118,6 +116,10 @@ public ArrayList viewTaskOn(LocalDate date) { return results; } + public Integer getId() { + return getNumOfTasks(); + } + public Integer getNumOfTasks() { return tasks.size(); } diff --git a/src/main/java/UI.java b/src/main/java/UI.java index 8c0f6cca..0ab0eba7 100644 --- a/src/main/java/UI.java +++ b/src/main/java/UI.java @@ -8,6 +8,7 @@ public class UI { private final static String STMT_END = "Bye. Hope to see you again soon!"; private final static String STMT_DONE = "Nice! I've marked this task as done: "; private final static String ERROR_PREFIX = "Oops I did not quite understand that."; + private final static String STMT_DELETE = "Noted. I've removed this task: "; public UI(TaskManager m) { this.manager = m; @@ -91,7 +92,8 @@ public void processInput() { Task t = manager.markTaskDone(Integer.parseInt((firstToken))); System.out.println(t == null ? "🤡 Oops that item doesn't exist, try \"list\" to see all your tasks." : STMT_DONE + "\n" + t); } else if (parser.isDelete()) { - manager.deleteTask(Integer.parseInt((firstToken))); + Task t = manager.deleteTask(Integer.parseInt((firstToken))); + System.out.println(t == null ? "🤡 Oops that item doesn't exist, try \"list\" to see all your tasks." : STMT_DELETE + "\n " + t); } else if (parser.isFind()) { ArrayList li = manager.findTask(firstToken); manager.listTasks(li); @@ -99,9 +101,10 @@ public void processInput() { manager.viewTaskOn(parser.stringToDate(firstToken)); } else if (parser.isAdd()) { Task t = manager.createTask(taskInfo, instruction); - System.out.println("Got it! 👌 I've add this " + t.getType() + ": \n" + t.toString() + "\nNow you have " + manager.getNumOfTasks() + " tasks in the list."); + System.out.println("Got it! 👌 I've add this " + t.getType() + ": \n" + t.toString()); } else { System.out.println("🤡 Dukie did not understand the command, try again?"); } + System.out.println("You have " + manager.getNumOfTasks() + " tasks in the list."); } } From 71858ef4167c00b7888510266350403181436af5 Mon Sep 17 00:00:00 2001 From: Metilda Chee Date: Sun, 14 Nov 2021 18:15:58 +0800 Subject: [PATCH 47/49] Wrap up: --- duke.txt | 2 ++ src/main/java/Deadline.java | 37 ++++++++++++++++++++---- src/main/java/Event.java | 26 ++++++++++++++--- src/main/java/Parser.java | 16 +++++++---- src/main/java/StorageDAO.java | 20 ++++++------- src/main/java/StorageDTO.java | 29 +++++++++++++++---- src/main/java/Task.java | 27 ++---------------- src/main/java/TaskManager.java | 24 +++++++++++++--- src/main/java/Todo.java | 2 +- src/main/java/UI.java | 45 ++++++++++++++++++------------ src/test/java/TaskManagerTest.java | 17 ----------- 11 files changed, 149 insertions(+), 96 deletions(-) diff --git a/duke.txt b/duke.txt index e69de29b..2d8b52cc 100644 --- a/duke.txt +++ b/duke.txt @@ -0,0 +1,2 @@ +todo,borrow book,1 +deadline,clean room /by 2019-12-23 21:00,1 diff --git a/src/main/java/Deadline.java b/src/main/java/Deadline.java index a92779ef..3a30e846 100644 --- a/src/main/java/Deadline.java +++ b/src/main/java/Deadline.java @@ -7,10 +7,13 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Objects; +import java.util.concurrent.TimeUnit; public class Deadline extends Todo { - LocalDate date; - long endTime; + protected LocalDate date; + protected long endTime; + + String savable; Parser parser = new Parser(); Logger logger = new Logger(); @@ -24,6 +27,7 @@ public Deadline(String description, String endDateTime, int id) { logger.info("set tokens: " + tokens); setDate(tokens.get(0)); setEndTime(tokens.get(1)); + setSavable(description + "/by" + endDateTime); } public Deadline(String description, int id) { @@ -64,20 +68,41 @@ public void setEndTime(String time) { logger.info("set end_time: " + time); DateFormat formatter = new SimpleDateFormat("HH:mm"); try { - this.endTime = formatter.parse(time).getTime(); + this.endTime = formatter.parse(time).getTime() + 27000000; } catch (ParseException p) { logger.info("parsing time got exception" + p.getMessage()); } } - public long getEndTime() { - return endTime; + public String getEndTime() { + return String.format("%02d:%02d", + TimeUnit.MILLISECONDS.toHours(endTime), + TimeUnit.MILLISECONDS.toMinutes(endTime) - + TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(endTime))); + + } + + public String getSavable() { + return savable; + } + + public void setSavable(String savable) { + this.savable = savable; + } + + @Override + public String toTask() { + return getType() + "," + getSavable() + "," + (isDone ? "1" : "0"); } @Override public String toString() { String status = isDone ? "X" : " "; - return id + ". [D][" + status + "] " + super.getDescription() + " (at: " + date.format(DateTimeFormatter.ofPattern("MMM d yyyy")) + ")"; + return id + ". [D][" + status + "] " + super.getDescription().trim() + + (date == null ? "" : " (at: " + date.format(DateTimeFormatter.ofPattern("MMM d yyyy"))) + + (endTime == 0 ? "" : " by: " + getEndTime()) + + ")"; + } @Override diff --git a/src/main/java/Event.java b/src/main/java/Event.java index 1dfd2197..8f8cffa5 100644 --- a/src/main/java/Event.java +++ b/src/main/java/Event.java @@ -1,16 +1,29 @@ import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; import java.util.ArrayList; import java.util.Arrays; +import java.util.Date; import java.util.Objects; +import java.util.concurrent.TimeUnit; public class Event extends Deadline { - long startTime; - + protected long startTime; private static final Logger logger = new Logger(); + public String getStartTime() { + assert startTime != 0; + return String.format("%02d:%02d", + TimeUnit.MILLISECONDS.toHours(startTime), + TimeUnit.MILLISECONDS.toMinutes(startTime) - + TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(startTime))); + } + public Event(String description, String date, int id) { super(description, (String) new ArrayList(Arrays.asList(date.trim().split(" "))).get(0), @@ -18,6 +31,7 @@ public Event(String description, String date, int id) { id); setStartTime((String) new ArrayList(Arrays.asList(Arrays.asList(date.trim().split(" ")).get(1).split("-"))).get(0)); logger.init(""); + setSavable(description + "/at" + date); } public void setStartTime(String startTime) { @@ -27,7 +41,7 @@ public void setStartTime(String startTime) { } DateFormat formatter = new SimpleDateFormat("HH:mm"); try { - this.startTime = formatter.parse(startTime).getTime(); + this.startTime = formatter.parse(startTime).getTime() + 27000000; } catch (ParseException p) { logger.info("parsing time got null"); } @@ -36,7 +50,11 @@ public void setStartTime(String startTime) { @Override public String toString() { String status = isDone ? "X" : " "; - return id + ". [E][" + status + "] " + super.getDescription() + " (at: " + date.format(DateTimeFormatter.ofPattern("MMM d yyyy")) + ")"; + return id + ". [E][" + status + "] " + super.getDescription() + + (date == null ? "" : " (at: " + date.format(DateTimeFormatter.ofPattern("MMM d yyyy"))) + + (startTime == 0 ? "" : " from: " + getStartTime()) + + (endTime == 0 ? "" : " to: " + getEndTime()) + + ")"; } @Override diff --git a/src/main/java/Parser.java b/src/main/java/Parser.java index d2b4a200..248c143d 100644 --- a/src/main/java/Parser.java +++ b/src/main/java/Parser.java @@ -5,7 +5,7 @@ import java.util.Locale; public class Parser { - Logger logger = new Logger(); + private final Logger logger = new Logger(); private final static String DETECT_END = "bye"; private final static String DETECT_LIST = "list"; private final static String DETECT_DONE = "done"; @@ -16,7 +16,7 @@ public class Parser { private final static String DETECT_DEADLINE = "deadline"; private final static String DETECT_TODO = "todo"; - ArrayList tokens = new ArrayList<>(); + private ArrayList tokens = new ArrayList<>(); public Parser() { logger.init(""); @@ -30,7 +30,7 @@ public void setInstruction(String instruction) { this.instruction = instruction; } - String instruction; + private String instruction; public String getTaskInfo() { return taskInfo; @@ -40,7 +40,7 @@ public void setTaskInfo(String taskInfo) { this.taskInfo = taskInfo; } - String taskInfo; + private String taskInfo; public ArrayList getTokens() { return tokens; @@ -51,8 +51,12 @@ public void setTokens(ArrayList tokens) { } /** - * @param date - * @return date + * Returns a String date into a LocalDate date. + * Return will be null if error occurs. + * + * @param date the date to parse + * @return date the parsed date + * @see LocalDate */ public LocalDate stringToDate(String date) { LocalDate parsedDate = null; diff --git a/src/main/java/StorageDAO.java b/src/main/java/StorageDAO.java index b6f87346..09c7b4ca 100644 --- a/src/main/java/StorageDAO.java +++ b/src/main/java/StorageDAO.java @@ -2,11 +2,14 @@ import java.io.FileNotFoundException; public class StorageDAO { - File file; - String path; + protected File file; + protected String path; + + private final Logger logger = new Logger(); public StorageDAO(String path) { this.path = "duke.txt"; + logger.init(""); } public File getFile() { @@ -26,24 +29,21 @@ public void setPath(String path) { } public boolean isInit() { - if (file == null) { - return false; - } - return true; + return file != null; } public void init() throws Exception { - System.out.println("init file path: " + path); + logger.info("init file path: " + path); try { this.file = new File(this.path); - System.out.println("path " + path); + logger.info("path " + path); path = this.file.getPath(); boolean created = file.createNewFile(); if (created) { - System.out.println("no file detected, a new file has been created: " + this.path); + logger.info("no file detected, a new file has been created: " + this.path); } } catch (Exception e) { - System.out.println("got err: " + e); + logger.info("got err: " + e); } } } diff --git a/src/main/java/StorageDTO.java b/src/main/java/StorageDTO.java index dae7851e..f8520b5f 100644 --- a/src/main/java/StorageDTO.java +++ b/src/main/java/StorageDTO.java @@ -2,13 +2,13 @@ import java.util.ArrayList; import java.util.Objects; import java.util.Scanner; -import java.util.logging.Logger; public class StorageDTO extends StorageDAO { - private static final Logger logger = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME); + private final Logger logger = new Logger(); public StorageDTO(String path) { super(path); + logger.init(""); } public ArrayList loadInto(TaskManager tm) { @@ -35,6 +35,26 @@ public String parseTaskToLine(Task e) throws Exception { if (e == null) { throw new Exception("task to parse is empty"); } + try { + Event event = (Event) e; + return event.toTask(); + } catch (ClassCastException exception) { + logger.info("casting task from file to event class got error"); + } + + try { + Deadline deadline = (Deadline) e; + return deadline.toTask(); + } catch (ClassCastException exception) { + logger.info("casting task from file to deadline class got error"); + } + + try { + Todo todo = (Todo) e; + return todo.toTask(); + } catch (ClassCastException exception) { + logger.info("casting task from file to todo class got error"); + } return e.toTask(); } @@ -57,7 +77,6 @@ public void save(ArrayList tasks) { } } - //deadline,party to be at 26/20/2021,0 public Task parseLineToTask(String l, int id, TaskManager tm) throws Exception { if (Objects.equals(l, "")) { throw new Exception("no content"); @@ -66,11 +85,11 @@ public Task parseLineToTask(String l, int id, TaskManager tm) throws Exception { String[] parts = l.split(","); String taskType = parts[0]; String taskDesc = parts[1]; - boolean taskStatus = Boolean.parseBoolean(parts[2]); + int taskStatus = Integer.parseInt(parts[2]); Task t = tm.createTask(taskDesc, taskType); if (!Objects.equals(t.getType(), "task")) { Todo todo = (Todo) t; - todo.setDone(taskStatus); + todo.setDone(taskStatus != 0); } return t; } diff --git a/src/main/java/Task.java b/src/main/java/Task.java index a0cc3465..7f4d1683 100644 --- a/src/main/java/Task.java +++ b/src/main/java/Task.java @@ -3,9 +3,8 @@ import java.util.logging.Logger; public class Task { - private static final Logger logger = Logger.getLogger(Logger.GLOBAL_LOGGER_NAME); - String description; - Integer id; + protected String description; + protected Integer id; public String toTask() { return getType() + "," + getDescription(); @@ -35,27 +34,5 @@ public String toString() { public String getType() { return "task"; } -// -// public void createTask(String taskInfo, String instruction) { -// switch (instruction) { -// case DETECT_ADD_TODO: -// task = new Todo(taskInfo, id); -// break; -// case DETECT_ADD_EVENT: -// ArrayList addInfo = new ArrayList(Arrays.asList(taskInfo.split("/at"))); -// task = new Event(addInfo.get(0), addInfo.get(1), id); -// break; -// case DETECT_ADD_DEADLINE: -// ArrayList deadlineInfo = new ArrayList(Arrays.asList(taskInfo.split("/by"))); -// task = new Deadline(deadlineInfo.get(0), deadlineInfo.get(1), id); -// break; -// } -// } -// -// public void addStatus(boolean status) throws Exception { -// Todo t = (Todo) task; -// t.setDone(status); -// task = (Task) t; -// } } diff --git a/src/main/java/TaskManager.java b/src/main/java/TaskManager.java index 6529dfa0..801f72e3 100644 --- a/src/main/java/TaskManager.java +++ b/src/main/java/TaskManager.java @@ -7,9 +7,8 @@ public class TaskManager { private final static String DETECT_ADD_TODO = "todo"; private final static String DETECT_ADD_EVENT = "event"; private final static String DETECT_ADD_DEADLINE = "deadline"; - Logger logger = new Logger(); + private final Logger logger = new Logger(); private ArrayList tasks = new ArrayList<>(); - Global global = new Global(); public TaskManager() { logger.init(""); @@ -29,8 +28,25 @@ public ArrayList getTasks() { return tasks; } - public Task createTask(String taskInfo, String instruction) { - switch (instruction) { + /** + * Returns a Task object based on the task's information and type. + * The task information for {@link Todo} has no restrictions. + * The task information for {@link Deadline} must contain "/by", event date and end time. + * The task information for {@link Event} must contain "/at", event date, start and end time. + * The taskType must be either {@link Todo}, {@link Event} or {@link Deadline} + * + * @param taskInfo the information of the task + * @param taskType the type of the task, e.g. event, deadline or todo + * @return Task + * @see Task + * @see Todo + * @see Deadline + * @see Event + */ + public Task createTask(String taskInfo, String taskType) { + assert !Objects.equals(taskInfo, ""); + assert (Objects.equals(taskType, "event") || Objects.equals(taskType, "todo") || Objects.equals(taskType, "deadline")); + switch (taskType.trim()) { case DETECT_ADD_TODO: Todo t = new Todo(taskInfo, getId()); addTask(t); diff --git a/src/main/java/Todo.java b/src/main/java/Todo.java index 966b4282..932620a7 100644 --- a/src/main/java/Todo.java +++ b/src/main/java/Todo.java @@ -1,10 +1,10 @@ public class Todo extends Task { - Logger logger = new Logger(); public boolean isDone; public Todo(String desc, int id) { super(desc, id); isDone = false; + Logger logger = new Logger(); logger.init(""); } diff --git a/src/main/java/UI.java b/src/main/java/UI.java index 0ab0eba7..8186e81a 100644 --- a/src/main/java/UI.java +++ b/src/main/java/UI.java @@ -5,20 +5,20 @@ import java.util.concurrent.atomic.AtomicReference; public class UI { - private final static String STMT_END = "Bye. Hope to see you again soon!"; - private final static String STMT_DONE = "Nice! I've marked this task as done: "; - private final static String ERROR_PREFIX = "Oops I did not quite understand that."; - private final static String STMT_DELETE = "Noted. I've removed this task: "; + private final static String STMT_END = "Bye 👋🏻😢. Dukie hopes to see you again soon!"; + private final static String STMT_DONE = "Nice! 🚀 Dukie has marked this task as done: "; + private final static String ERROR_PREFIX = "Oops Dukie did not quite understand that."; + private final static String STMT_DELETE = "Noted 👁👄👁. Dukie has removed this task: "; public UI(TaskManager m) { this.manager = m; } - Parser parser = new Parser(); - Scanner in = new Scanner(System.in); - String input = ""; - Boolean isExit = false; - TaskManager manager; + private final Parser parser = new Parser(); + private final Scanner in = new Scanner(System.in); + private final TaskManager manager; + private String input = ""; + private Boolean isExit = false; public String getGreeting() { Calendar c = Calendar.getInstance(); @@ -26,15 +26,15 @@ public String getGreeting() { String msg = ""; if (timeOfDay >= 0 && timeOfDay < 12) { - msg = "Good morning"; + msg = "Good morning ⛅️"; } else if (timeOfDay >= 12 && timeOfDay < 16) { - msg = "Good afternoon"; + msg = "Good afternoon ☀️"; } else if (timeOfDay >= 16 && timeOfDay < 21) { - msg = "Good evening"; + msg = "Good evening 🌥"; } else if (timeOfDay >= 21 && timeOfDay < 24) { - msg = "Good night"; + msg = "Good night 🌙"; } - msg += "! I'm Dukie~\nWhat can I do for you?"; + msg += "! I'm Dukie 😇~\nWhat can I do for you?"; return msg; } @@ -96,15 +96,24 @@ public void processInput() { System.out.println(t == null ? "🤡 Oops that item doesn't exist, try \"list\" to see all your tasks." : STMT_DELETE + "\n " + t); } else if (parser.isFind()) { ArrayList li = manager.findTask(firstToken); - manager.listTasks(li); + if (li.size() == 0) { + System.out.println("🤡 No tasks with keyword \"" + firstToken + "\", try \"list\" to see all your tasks."); + } else { + manager.listTasks(li); + } } else if (parser.isView()) { - manager.viewTaskOn(parser.stringToDate(firstToken)); + ArrayList li = manager.viewTaskOn(parser.stringToDate(firstToken)); + if (li.size() == 0) { + System.out.println("🤡 No tasks on \"" + firstToken + "\", try \"list\" to see all your tasks."); + } else { + manager.listTasks(li); + } } else if (parser.isAdd()) { Task t = manager.createTask(taskInfo, instruction); - System.out.println("Got it! 👌 I've add this " + t.getType() + ": \n" + t.toString()); + System.out.println("Got it! 👌 I've added this " + t.getType() + ": \n" + t.toString()); } else { System.out.println("🤡 Dukie did not understand the command, try again?"); } - System.out.println("You have " + manager.getNumOfTasks() + " tasks in the list."); + System.out.println("You have " + manager.getNumOfTasks() + " task(s) in the main list 😇."); } } diff --git a/src/test/java/TaskManagerTest.java b/src/test/java/TaskManagerTest.java index 1c7e2943..8cecb2e8 100644 --- a/src/test/java/TaskManagerTest.java +++ b/src/test/java/TaskManagerTest.java @@ -7,10 +7,6 @@ import static org.junit.jupiter.api.Assertions.*; public class TaskManagerTest { - /* - Todos: - tasks without any date/time attached to it - */ @Test public void createTodoTest() { String eventType = "todo"; @@ -24,10 +20,6 @@ public void createTodoTest() { assertEquals(e.getDescription(), eventInfo); } - /* - Events: - tasks that start at a specific time and ends at a specific time e.g., team project meeting on 2/10/2019 2-4pm - */ @Test public void createEventTest() { String eventType = "event"; @@ -46,10 +38,6 @@ public void createEventTest() { Assertions.assertEquals(e.getDate().toString(), eventDate); } - /* - Deadlines: - tasks that need to be done before a specific date/time e.g., submit report by 11/10/2019 5pm - */ @Test public void createDeadlineTest() { String eventType = "deadline"; @@ -115,7 +103,6 @@ public void viewTest() { String eventEndTime = "21:00"; String eventDate = "2019-12-01"; String eventInfo = eventDesc + "/by" + eventDate + " " + eventEndTime; - Task t = tm.createTask(eventInfo, eventType); expected.add(t); assertEquals(t.getType(), eventType); @@ -123,7 +110,6 @@ public void viewTest() { System.out.println(e.toString()); assertEquals(e.getDescription(), eventDesc); Assertions.assertEquals(e.getDate().toString(), eventDate); - // Event 2 eventType = "event"; eventDesc = "project meeting"; @@ -131,7 +117,6 @@ public void viewTest() { eventEndTime = "21:00"; eventDate = "2019-12-01"; eventInfo = eventDesc + "/at" + eventDate + " " + eventStartTime + "-" + eventEndTime; - t = tm.createTask(eventInfo, eventType); expected.add(t); assertEquals(t.getType(), eventType); @@ -139,14 +124,12 @@ public void viewTest() { System.out.println(event.toString()); assertEquals(event.getDescription(), eventDesc); Assertions.assertEquals(event.getDate().toString(), eventDate); - // View ArrayList tasks = tm.viewTaskOn(p.stringToDate(eventDate)); assertEquals(2, tasks.toArray().length, "too many returns"); expected.forEach(expect -> { Task actual = tasks.stream().filter(task -> Objects.equals(task.getId(), expect.getId())).findFirst().orElse(null); assertNotNull(actual); - Deadline ex = (Deadline) expect; Deadline a = (Deadline) actual; assertEquals(ex.getId(), a.getId(), "id mismatches"); From 99e03763fd100e815e4035481475a1f747566552 Mon Sep 17 00:00:00 2001 From: Metilda Chee Date: Sun, 14 Nov 2021 19:34:43 +0800 Subject: [PATCH 48/49] Abstract Duke out --- duke.txt | 1 + src/main/java/App.java | 30 +++++++++++++++++++ src/main/java/Duke.java | 30 ++----------------- src/main/java/Global.java | 7 ----- src/main/java/Message.java | 6 ---- src/main/java/{UI.java => UserInterface.java} | 21 ++----------- 6 files changed, 36 insertions(+), 59 deletions(-) create mode 100644 src/main/java/App.java delete mode 100644 src/main/java/Global.java delete mode 100644 src/main/java/Message.java rename src/main/java/{UI.java => UserInterface.java} (85%) diff --git a/duke.txt b/duke.txt index 2d8b52cc..6c606b73 100644 --- a/duke.txt +++ b/duke.txt @@ -1,2 +1,3 @@ todo,borrow book,1 deadline,clean room /by 2019-12-23 21:00,1 +todo,read books,1 diff --git a/src/main/java/App.java b/src/main/java/App.java new file mode 100644 index 00000000..c14b6a99 --- /dev/null +++ b/src/main/java/App.java @@ -0,0 +1,30 @@ +public class App { + private TaskManager manager; + private Config config; + private StorageDTO storage; + private UserInterface ui; + + public void init() { + config = new Config(); + storage = new StorageDTO(config.getStoragePath()); + manager = new TaskManager(); + storage.loadInto(manager); + ui = new UserInterface(manager); + } + + public void run() { + if (manager == null || config == null || storage == null || ui == null) { + System.out.println("nil init for manager or config or storage or UI"); + return; + } + ui.start(); + while (!ui.isExit()) { + ui.getInput(); + ui.parseInput(); + ui.processInput(); + } + + storage.save(manager.getTasks()); + ui.end(); + } +} diff --git a/src/main/java/Duke.java b/src/main/java/Duke.java index 79e14f65..18259d0f 100644 --- a/src/main/java/Duke.java +++ b/src/main/java/Duke.java @@ -1,31 +1,7 @@ public class Duke { public static void main(String[] args) { - // Init config - Config config = new Config(); - - // Init logger - Logger logger = new Logger(); - logger.init(config.getLogPath()); - - // Init storage - StorageDTO storage = new StorageDTO(config.getStoragePath()); - - // Init task manager - TaskManager manager = new TaskManager(); - storage.loadInto(manager); - - // Init UI - UI ui = new UI(manager); - - // Program starts - ui.start(); - while (!ui.isExit()) { - ui.getInput(); - ui.parseInput(); - ui.processInput(); - } - - storage.save(manager.getTasks()); - ui.end(); + App duke = new App(); + duke.init(); + duke.run(); } } diff --git a/src/main/java/Global.java b/src/main/java/Global.java deleted file mode 100644 index 0ff6539b..00000000 --- a/src/main/java/Global.java +++ /dev/null @@ -1,7 +0,0 @@ -public class Global { - int id = 0; - - public int getId() { - return ++id; - } -} diff --git a/src/main/java/Message.java b/src/main/java/Message.java deleted file mode 100644 index 54ce394b..00000000 --- a/src/main/java/Message.java +++ /dev/null @@ -1,6 +0,0 @@ -public enum Message { - ERROR_UNRECOGNISED, - ERROR_INVALID, - EMPTY_LIST, - UNKNOWN_OBJECT, -} \ No newline at end of file diff --git a/src/main/java/UI.java b/src/main/java/UserInterface.java similarity index 85% rename from src/main/java/UI.java rename to src/main/java/UserInterface.java index 8186e81a..ff0df196 100644 --- a/src/main/java/UI.java +++ b/src/main/java/UserInterface.java @@ -4,13 +4,13 @@ import java.util.Scanner; import java.util.concurrent.atomic.AtomicReference; -public class UI { +public class UserInterface { private final static String STMT_END = "Bye 👋🏻😢. Dukie hopes to see you again soon!"; private final static String STMT_DONE = "Nice! 🚀 Dukie has marked this task as done: "; private final static String ERROR_PREFIX = "Oops Dukie did not quite understand that."; private final static String STMT_DELETE = "Noted 👁👄👁. Dukie has removed this task: "; - public UI(TaskManager m) { + public UserInterface(TaskManager m) { this.manager = m; } @@ -59,23 +59,6 @@ public Boolean isExit() { return isExit; } - public void printErrorMessage(Message m) { - switch (m) { - case ERROR_UNRECOGNISED: - System.out.println(ERROR_PREFIX + " Unrecognised operation."); - break; - case ERROR_INVALID: - System.out.println(ERROR_PREFIX + " Invalid input."); - break; - case EMPTY_LIST: - System.out.println(ERROR_PREFIX + " Empty list."); - break; - case UNKNOWN_OBJECT: - System.out.println(ERROR_PREFIX + " Could not find resource."); - break; - } - } - public void processInput() { String instruction = parser.getInstruction(); String taskInfo = parser.getTaskInfo(); From c65a83e9351ad47c16bc41cd4c70bbf825c65a64 Mon Sep 17 00:00:00 2001 From: Metilda Chee Date: Sun, 14 Nov 2021 22:28:35 +0800 Subject: [PATCH 49/49] Update code --- duke.txt | 1 + src/main/java/Parser.java | 2 +- src/main/java/UserInterface.java | 4 ++-- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/duke.txt b/duke.txt index 6c606b73..63424470 100644 --- a/duke.txt +++ b/duke.txt @@ -1,3 +1,4 @@ todo,borrow book,1 deadline,clean room /by 2019-12-23 21:00,1 todo,read books,1 +event,hackathon /at 2021-12-25 18:00-21:00,0 diff --git a/src/main/java/Parser.java b/src/main/java/Parser.java index 248c143d..5616f53b 100644 --- a/src/main/java/Parser.java +++ b/src/main/java/Parser.java @@ -133,7 +133,7 @@ public Boolean isFind(String i) { } public Boolean isView() { - return instruction.toLowerCase(Locale.ROOT).equals(DETECT_VIEW) && tokens.size() >= 1; + return instruction.toLowerCase(Locale.ROOT).equals(DETECT_VIEW) && tokens.size() >= 2; } public Boolean isView(String i) { diff --git a/src/main/java/UserInterface.java b/src/main/java/UserInterface.java index ff0df196..e2d20b03 100644 --- a/src/main/java/UserInterface.java +++ b/src/main/java/UserInterface.java @@ -73,10 +73,10 @@ public void processInput() { manager.listTasks(); } else if (parser.isDone()) { Task t = manager.markTaskDone(Integer.parseInt((firstToken))); - System.out.println(t == null ? "🤡 Oops that item doesn't exist, try \"list\" to see all your tasks." : STMT_DONE + "\n" + t); + System.out.println(t == null ? "🤡 Oops this task doesn't exist, try \"list\" to see all your tasks." : STMT_DONE + "\n" + t); } else if (parser.isDelete()) { Task t = manager.deleteTask(Integer.parseInt((firstToken))); - System.out.println(t == null ? "🤡 Oops that item doesn't exist, try \"list\" to see all your tasks." : STMT_DELETE + "\n " + t); + System.out.println(t == null ? "🤡 Oops this task doesn't exist, try \"list\" to see all your tasks." : STMT_DELETE + "\n " + t); } else if (parser.isFind()) { ArrayList li = manager.findTask(firstToken); if (li.size() == 0) {