From 3f353c5fd1aa6740ec7746ea1492b494b2dc83f9 Mon Sep 17 00:00:00 2001 From: mms37 Date: Mon, 8 Aug 2022 09:17:43 -0700 Subject: [PATCH] update --- .../control/PackageDeliveriesTracker$1.class | Bin 1779 -> 1779 bytes .../control/PackageDeliveriesTracker$2.class | Bin 930 -> 1006 bytes .../control/PackageDeliveriesTracker$3.class | Bin 1006 -> 994 bytes .../control/PackageDeliveriesTracker$4.class | Bin 974 -> 0 bytes .../control/PackageDeliveriesTracker.class | Bin 9274 -> 4820 bytes .../client/model/PackageInfo.class | Bin 3497 -> 3506 bytes .../packagedeliveries/client/view/Input.class | Bin 9752 -> 9785 bytes .../client/view/JavaSwingUI$1.class | Bin 991 -> 1087 bytes .../client/view/JavaSwingUI$2.class | Bin 1265 -> 1408 bytes .../client/view/JavaSwingUI$3.class | Bin 1145 -> 1576 bytes .../client/view/JavaSwingUI$4.class | Bin 1081 -> 1081 bytes .../JavaSwingUI$PACKAGE_FILTER_OPTION.class | Bin 1560 -> 1560 bytes .../client/view/JavaSwingUI.class | Bin 6551 -> 10619 bytes .../control/PackageDeliveriesTracker.java | 183 ++---------------- .../client/model/PackageInfo.java | 5 +- .../packagedeliveries/client/view/Input.java | 52 ++--- .../client/view/JavaSwingUI.java | 147 ++++++++++---- webappserver/docs/curlCommands.txt | 79 +++++++- webappserver/list.json | 1 + .../webappserver/control/PackageManager.java | 37 +++- .../controllers/PackageController.java | 36 ++++ .../webappserver/model/PackageInfo.java | 5 +- 22 files changed, 306 insertions(+), 239 deletions(-) delete mode 100644 assignment4/out/production/assignment4/cmpt213/assignment4/packagedeliveries/client/control/PackageDeliveriesTracker$4.class diff --git a/assignment4/out/production/assignment4/cmpt213/assignment4/packagedeliveries/client/control/PackageDeliveriesTracker$1.class b/assignment4/out/production/assignment4/cmpt213/assignment4/packagedeliveries/client/control/PackageDeliveriesTracker$1.class index 10a309bcab41ea41df879dee9bd469eec70794d0..dbd67a722bfd4b57cd328d5dc55581970a846e0b 100644 GIT binary patch delta 41 ucmey&`DH4OnFAQjCkHWGic13xWnvIx PkO9(M42%ryKpF@D_;DPY delta 104 zcmaFIzKEUc)W2Q(7#JAr7-Tkb-C<;^@tG*4C~o7El~|UjUs{rxqwiQ$lvwGLSzKb{ zGkGGD?qmxlk;z_6GdS278CY`i6H_MpG6yh*PoBqYDJ}&xh>1arK^jPNF)%W)18E=t E0H*F4y#N3J diff --git a/assignment4/out/production/assignment4/cmpt213/assignment4/packagedeliveries/client/control/PackageDeliveriesTracker$3.class b/assignment4/out/production/assignment4/cmpt213/assignment4/packagedeliveries/client/control/PackageDeliveriesTracker$3.class index 5b0f9bebd0c6c938b3d9fdcc57a2af3887a734ac..e675e2acc20768cd62410b6a571a4ce0a06de0a3 100644 GIT binary patch delta 128 zcmaFI{)m0UGe)KwpNUe6;x;~6iDilUr6rj;`i@0KiIqN?#U(aAlP5CiPPSkYne4?h z+eIQJwK%mXGchN#Dm5T6IXf{uHMpcGGcTQyK~n>wKPNFST^}N7t%=RZ$v(`1jP{e~ HF$VwudU`DZ delta 76 zcmaFF{*HaaGe)LVpNUe6ljWG4Cnqz_6cs2=Ey_&H$*f8ZNKDR7OiyKG2+^1<&*UJa g>64XMmZ+bTn3t{}TvC*omp<8nIgs)Eh($ diff --git a/assignment4/out/production/assignment4/cmpt213/assignment4/packagedeliveries/client/control/PackageDeliveriesTracker$4.class b/assignment4/out/production/assignment4/cmpt213/assignment4/packagedeliveries/client/control/PackageDeliveriesTracker$4.class deleted file mode 100644 index 3f0945029992c7f8fc5ad5d115f8bb6a85ac0d0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 974 zcmb_bO>Yx15PeRQY#RcF(w6d338Wm-9xxxdphS^S0a0mNJ`&~bZl+teUOTd#N=5xs zoRB#11Gw{d5VJ|u8$w9&YWK}Nznz_(8UOtK{Re|6Z9z76DyK0S zeNJ9ekeSiEBQs~CcSe4k3*KA{hMpPnt&YIwcDm4*-JOv@b?Z0*VX_){w<*m((3)8;n)fZ{gvL*~BBp25S>WUVi|<^CUI^ diff --git a/assignment4/out/production/assignment4/cmpt213/assignment4/packagedeliveries/client/control/PackageDeliveriesTracker.class b/assignment4/out/production/assignment4/cmpt213/assignment4/packagedeliveries/client/control/PackageDeliveriesTracker.class index 55f081ebb3774f064ad288b1fef6d7731f7cdc14..f239d1458a37267da36e44bdb4a3369466a2e464 100644 GIT binary patch delta 1758 zcmZ`)TU1nK6#o9XaE9a044fHYP=NtQ7zBk8NX0@FG%tV}W9BVA3@02IXMi~w-lCh` zFW9e{+Re7li1tzLWTy_QSc{~2ZV(s|hb-rwxo|LuLwOt1ZA zzWURh=^FrA@%=INFS`PdxMh#H+$i91LKCHqtz`H(3Q;5uJF3-OxZvj~!EAAdRnD4= zQUzrkbzW3VxEE^$9zU8?8&!l+ zAcar1_5jBcEEP5ua<^c)f(JPsLJosh412vAgEJa8^br+vv4W!wE5#*8r>cRWUAEUD zCU~8yq6KR>9>!W>cUH|>j|~bsIl9m-nw-^j>#>PrGag}ZB#cp$!56CO9MJdc^;Xv# zdk2iDNu?tUt)f9|%~9}ZR&5k_oOzXxQDAQ}IjEus+c|cifk8|@l}D0^SX6-_{@|f-ANo1= zN&-AXM5fteQnJX19;I{x)Q3qmRm8DRL4qTRAyJX{t1FHXjuaWpU6k`A$9_B|O5MBI z0ddG3m^TU{|1b^Gy0aPEXViBlqk6nUH;o8c3Z52c-I4qwu&WrwvmDRid20e5ukd@i zU86Y4@giOl36DX>D;%%lHSwD#=#$Ax1Ix$#)aTr`kMCZ_81FEVkwaKOoi z7}~@!Uz>x5IV3V#MXA5fND(c1Ja+ItS=rTLsF_(QvEN%@V}>X%YNml)WVFsdJBldD z;D24*V%*m*B1Jnqm{4&UlM1HfVtgZR6#Y<#G((X6U$sC#HJUB#!c}pyIA}vgTraM1 z;yOc_xLI5#a{Yy4cmr?J!o5ZBgbm}EE$JouZOay9)4N5wDi?VMKTh^6aKfF0Igvy1 z1X=ZTGKns@0(O}c8{Q!)e+DHwNs?zB@U9h}>%u9VCg_AX?+=by-fq~*uYsb%$VVg2 zkYxwUC$IPLzVszvJ3-RTmw|g5Rm)Gq+ck;e+BD`&5S}fZO|^vH#HCbjnbklb8+We( z%772>A!X%ojo~AlrBH^CagI(Z#CDUrlM|`#@EX=Jx_SpG8yRk*r^Qj?7`ufnr;u0T(6*+r z?E-=&j$7E7MIN^hO(J_vK_#DFiQK(*0j@5p`2=O2pw2;;JdHl;S~9XJx&U0a5ma#DHbM&4-^P3eJq7>3{Wol@6!ban?b>IO|IcSu z=>R2`&pNF~i(SQ_wndUMtnJi@iD7Mzy#DYM%nU}iUBN-^PzFax8B61tNtkK8kjBeX zD9)gT(AQ}iavhmPN*NT==gl)Dl;9RQU^Xu;EKwqSHlOhT+B$ kd_|U<@UJP+x0bwuYlKx&gqu$JgtG^EXP;?&hZ`vQ7r44@P5=M^ literal 9274 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 Vd)fZs82j&%{lhbXJJemM`~}T%pBw-H diff --git a/assignment4/out/production/assignment4/cmpt213/assignment4/packagedeliveries/client/model/PackageInfo.class b/assignment4/out/production/assignment4/cmpt213/assignment4/packagedeliveries/client/model/PackageInfo.class index 474d28871c9f0e0b791d5e5df3d32a155c94a0ba..952eff426d0c4970d31528663fa2f7b03a99d451 100644 GIT binary patch delta 1013 zcmZ`%OHY$Q6g|_&_u?x;1)5q@9w^fc$K5dh-zqIfQD8+X7?y3P3*=gK4lMSHk=W#Hs0tM zR?e9S;ynN1h_LogrOqi<(Vy&zr_!l(=YjZ0hQZY|5bx-U#rvA$?cGTg*Z5cEXW_Vk z+qk3RuBdd6zf-@l2fSA+Eq%mL$SM*9t>_&}_9q6D8lLb;Ey14iMJ?!f$>8Tq_w%Uk zW^vx8hn*c@NbooMPL|}q^y+mN=wT74WH+M|7kRM}&ZcllWKpb+c6t|_!C9yu$gv?w zR*}H~1lU|k5MVknbfKGUKG^d<4;)+*+=Db&gG7gj%O<#jzBzbimf?ns*29VIvP9WZ zmc=i$d9i^MFl<6VDBR#h;Um7BOsJrv6O{|$fzpv&QmbDLS)QK?V7#(J8C=M~J#91a50nA!WCy?tN(=O8Xd3>BgYwGrRzY_b=IenH2y4 delta 1046 zcmZuvTTc@~6#ll|?d)zBXb?eMl-5|m796B9v&U>^t%#s`0a@i+M59{|s68^FqD=ggTi=R4n-Z|0Nv-qe3Arsn}PU~*bd z+TAJ+NpOwQR~-sfN2BgwaBn=WqXtI|)FZ?Tky68t~zqgvLrfr5sSUH!)oJY$|UgSKCmet2Y!GXpeOE z#Tc&fpN?Pow{_gXU50z2(tWI;>~vFpxdlZ;R-dUQ)m#IN$fI8O=5@&R-qBY)T)9J0(C%M zL?uHFLxmh*xVl6)q%f%25Jli1L%*HgpqQ7S=4P;eGiWvD3Xq_qLQrC^s>U9Xlshm7k4vEc@8TJsog(Og7FNKx4bmL0e3V?3c9ouW_i94}G&7Z3iO Ay#N3J diff --git a/assignment4/out/production/assignment4/cmpt213/assignment4/packagedeliveries/client/view/Input.class b/assignment4/out/production/assignment4/cmpt213/assignment4/packagedeliveries/client/view/Input.class index fae189960b0c216705cf998301bb07d671e25a58..066b71a05aa400e2c95c86ca034b9ebfc311bc65 100644 GIT binary patch delta 2219 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 diff --git a/assignment4/out/production/assignment4/cmpt213/assignment4/packagedeliveries/client/view/JavaSwingUI$1.class b/assignment4/out/production/assignment4/cmpt213/assignment4/packagedeliveries/client/view/JavaSwingUI$1.class index 2d3e7c3bf5dbaf656fec7355e6c7e60c6d356e15..3153f6ed814a57c2464f97fc9e6eeac0efb15715 100644 GIT binary patch delta 375 zcmYk2%}T>i5QWbTsfm}^#;CQ8|5j~&)F_CXf}kSZbmu}4H=&jqNh8EmbmcRY_#$F$ z!G-R1?b@|3Ax=^$-o*@O=Hr~597mxSG%My{)Q&vg*$+eauI61w6%HAB z1=A>WzIS95x`G+Z#uuzKI*$bjiwc&W9@s8poAHNGykUk93X>U@1Nc-e48|&0X`nwG{=|sgAbxuqYPVX1G1vZEP delta 262 zcmYj~y-osA6okLC3ohQQ>#{0{fP&!Pl28#kY;AlIUjm=O+$S*-O(?Xtr>5gEjB~dz zo?_C}q29yj`=_}3e6GGd{h-H%utg+v3>b>Tt6uFb+zBaZkMaapUQRwZC|B5u y<~!|IX%V3@BNh&n9V&PEuQ~r~&ZUp0s;n`tf>&INYZTmYS1ARh*vS*lX?_9Fa~W6w diff --git a/assignment4/out/production/assignment4/cmpt213/assignment4/packagedeliveries/client/view/JavaSwingUI$2.class b/assignment4/out/production/assignment4/cmpt213/assignment4/packagedeliveries/client/view/JavaSwingUI$2.class index 302027718e5947ab64bb565002a5b1b201b80a77..cb2c77ca1fbd6a698a2eba194162dd19ff55a5a6 100644 GIT binary patch delta 650 zcmZvZQBTuQ6vzL!oz!)8%&i+LvcZ^c>wqdKB2|L&!jc7MjKqj9*R7kwt~Fg*;uCxX zmwg9)HoBSkV0b2e8J|svryUUzxye2Mb8pW1{cq0w9X^c6$0t920$9W2p8RP`>2fRg zp4Z;-rrBXgR`z(8>-%2I(x134|4?alJR=MNih?VMGDQ4_M$6__d69vYWyEk*LR>)t zYVTKe_cBrpQQbA$PS>oC$TF_sx`Z1FCUKJ?ae)bg*fc$QL7`k6J;LI4Q{R5GXVyGJ zLYiT%cQT)DJ9X32Pq}5g;mDZAjD)O$S>$?up617E`>s`WI^KrUZgacN@S<>z_}p__ zcGIX3Z23Q!QQYx)w-w}}GQ?f8;hLSdr*{4@BozA#LYBSkKNHr~i^lc!qo6YJAy)gJ z#mYep37{ZVNQW|5RmoP^EAka=gBP~(3Ng5(mwbB4gn;SsVrUr;;-!c9rsGg%Z zMoeG_^AuA7LB#@eI#DNlF2fzl1*iv<-o+wCAHPd*-!P+n1B)jqO0*+GOdMfqIJzF< z)|pcjB9*_w1huB|`kZ6tpJN6~xJL#d+z&jL@qjc$V_boe3a+N{h*YK`-<{T9Ha32P delta 520 zcmah_%TB^j5Iwgbl~SN0))y)wDii_nu`;^BXi$vA7!#KbxhS!MDTFQl0`?!=8vzp+ zet>`D4-n@PjPAV2oilSXbIxQQeP3SXbMXEF-~hWF8O&h97dP z+TwPVH%5JX3T7}XV@}09A`E9j>-xVb2EWbk>n&a?n?jbsohT%)6xwT1#S%1zkj*PL zZ`_WIi`7O`#ftVRpJdR<}W%3;fix{GZU3{gm$1}_wVa10(gibOw%7~u+K zc|w<9j8qTIi1Z*EZ}7bg8{-r`Bm*2_m7+cxUc)+7LPkh3Bq*1lQI>>3Q3$s$h!S49 z(FN;bfh&`tN*#P*O0VTVwm I9^pyv8wz<HWeLtQ)aOiQb|uKuQB4!mkWNGP~~Bq0_M+NP~r^>qT( zWu%ankWr9D?&N17md7Otmla&WoS&jfD~bg|R_p6-@9@;8HrO*Pb7;6mOU5FWBoq`} z!!luZf;%D7F+6UqR4<=)XX$oFd-AGlG`*^X5@E}KN|m|3(=sgWuSeZ(J2F(PNLW=+ z!FB(Dc8c-lk!u|~18>*q_jS8PcwRcA`OI@oyHjmUmaCRu1d3}4ZXoBsr7Yd_-_c^k zDFuX0KPu!h6USHoxF94cvWq=`Bholdfv^rSk-!XOfRSG!L>_R6Q<&!05_o5Ei*bWb z2aHpUd39w3QddWi)XE4kH7$-1S3hI+L&&+!ahe@~HtulDggSZL#XZiLf6OvL!F^5y z$gHJ7(_gB- zIAZ2Q7A%Y680ZuKp&M%1mrTnHJE=d`1Ak@W$6HfZrq8aw57KLkVhQaWB_a@=q9CbS zZjBYuRq0MeO*TooV^q=`6DH4;A9CZG)Pi8(jCHBapXC-C^2#t7Qqh)PMmV diff --git a/assignment4/out/production/assignment4/cmpt213/assignment4/packagedeliveries/client/view/JavaSwingUI.class b/assignment4/out/production/assignment4/cmpt213/assignment4/packagedeliveries/client/view/JavaSwingUI.class index 203df94e977253e754112480d0ef76a5b376f024..bad31c49ffe5c2798d1cf858dedddf0bb662a384 100644 GIT binary patch literal 10619 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 packageList = new ArrayList<>(); - private static PackageDeliveriesTracker instance; public static PackageDeliveriesTracker getInstance() { @@ -57,171 +51,32 @@ public class PackageDeliveriesTracker { return instance; } - public void addPackage(PackageInfo p) { - packageList.add(p); - Collections.sort(packageList); - } - - /** - * It saves the packageList to a file. - */ - public void save() { - try { - Writer w = new FileWriter(fileName); - gson.toJson(packageList, w); - w.flush(); - w.close(); - } catch (IOException e) { - e.printStackTrace(); - } + public String serializePackage(PackageInfo p) { + Type pType = new TypeToken() { + }.getType(); + return gson.toJson(p); } - /** - * It reads the json file, converts it to a list of PackageInfo objects, and then sets the type of - * each object to the appropriate type - */ - public void load() { - //File file = new File(fileName); + public ArrayList deserializePackageString(String gsonString) { try { - String json = Files.readString(Paths.get(fileName)); - Type lType = new TypeToken>() { + System.out.println(gsonString + "deserializePackageString gsonString"); + Type pType = new TypeToken>() { }.getType(); - packageList = gson.fromJson(json, lType); - for (PackageInfo p : packageList) { - if (p instanceof BookPackage) { - p.setType("book"); - } else if (p instanceof PerishablePackage) { - p.setType("perishable"); - } else if (p instanceof ElectronicPackage) { - p.setType("electronic"); - } - } - System.out.println("packages loaded"); - } catch (FileNotFoundException e) { - System.out.println("no packages to load"); - } catch (NoSuchFileException e) { - createFile(); - //throw new RuntimeException(e); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - private void createFile() { - System.out.println("CreateFile"); - try { - File packages = new File(fileName); - if(packages.createNewFile()) { - System.out.println("New file list.json created"); - } - } - catch (IOException e) { - System.out.println("No file exists, creating a new file"); - e.printStackTrace(); - } - } - - public ArrayList getAllPackages() { - ArrayList b = new ArrayList<>(); - if (packageList.size() == 0) { - b.add("No packages to show"); - } else { - Collections.sort(packageList); - for (int i = 0; i < packageList.size(); i++) { - String bString = ("Package #" + (i + 1)) + "\n" + packageList.get(i) + "\n\n"; - b.add(bString); - } - } - return b; - } - - /** - * This function takes in a list of packages, a boolean for whether or not the user wants to see - * packages that are due, and a boolean for whether or not the user wants to see all packages. It - * then returns a list of packages that are sorted by their expected delivery date - * - * @param pList the list of packages to be sorted - * @param due true if you want to sort the list by due date, false if you want to sort the list by - * expected date - * @return An ArrayList of PackageInfo objects. - */ - //due=true returns overdue packages, else upcoming packages - public ArrayList sortList(ArrayList pList, boolean due) { - ArrayList sortedList = new ArrayList<>(); - LocalDateTime today = LocalDateTime.now(); - DateTimeFormatter format = DateTimeFormatter.ofPattern("yyy-MM-dd HH:mm"); - today.format(format); - for (int i = 0; i < pList.size(); i++) { - PackageInfo p = pList.get(i); - if (!p.getDelivered()) { - if (due && today.isAfter(p.getExpectedDate())) { - sortedList.add(p); - } else if (!due && today.isBefore(p.getExpectedDate())) { - sortedList.add(p); - } - } - } - Collections.sort(sortedList); - return sortedList; - } - - public ArrayList overDuePackages() { - ArrayList b = new ArrayList<>(); - ArrayList overdue = sortList(packageList, true); - if (overdue.size() == 0) { - b.add("no overdue packages to show"); - } - for (int i = 0; i < overdue.size(); i++) { - String bString = ("Package #" + (i + 1)) + "\n" + overdue.get(i) + "\n\n"; - b.add(bString); - } - return b; - } - - public ArrayList upcomingPackages() { - ArrayList b = new ArrayList<>(); - ArrayList upcoming = sortList(packageList, false); - if (upcoming.size() == 0) { - b.add("no upcoming packages to show"); - } - for (int i = 0; i < upcoming.size(); i++) { - String bString = ("Package #" + (i + 1)) + "\n" + upcoming.get(i) + "\n\n"; - b.add(bString); - } - return b; - } - - public void removePcakage(int i) { - packageList.remove(i); - } - - public boolean isDelivered(int i) { - return packageList.get(i).getDelivered(); - } - - public void setDelivered(int i) { - packageList.get(i).setDelivered(true); - } - - public String serializePackage(PackageInfo p){ - Type pType=new TypeToken(){}.getType(); - return gson.toJson(p); - } - - public void deserializePackageString(String gsonString){ - try{ - Type pType=new TypeToken>(){}.getType(); - packageList=gson.fromJson(gsonString, pType); + if (!(packageList == null)) packageList.clear(); + packageList = gson.fromJson(gsonString, pType); System.out.println(packageList + " --> packageList"); - for (PackageInfo p: packageList){ - if (p instanceof BookPackage) p.setType("book"); - else if (p instanceof PerishablePackage) p.setType("perishable"); - else if (p instanceof ElectronicPackage) p.setType("electronic"); + if (packageList != null) { + for (PackageInfo p : packageList) { + if (p instanceof BookPackage) p.setType("book"); + else if (p instanceof PerishablePackage) p.setType("perishable"); + else if (p instanceof ElectronicPackage) p.setType("electronic"); + } } - } - catch (JsonSyntaxException e){ + } catch (JsonSyntaxException e) { e.printStackTrace(); } + return packageList; } } + diff --git a/assignment4/src/cmpt213/assignment4/packagedeliveries/client/model/PackageInfo.java b/assignment4/src/cmpt213/assignment4/packagedeliveries/client/model/PackageInfo.java index 682abf1..188c74b 100644 --- a/assignment4/src/cmpt213/assignment4/packagedeliveries/client/model/PackageInfo.java +++ b/assignment4/src/cmpt213/assignment4/packagedeliveries/client/model/PackageInfo.java @@ -80,6 +80,9 @@ public class PackageInfo implements Comparable { today.format(format); long diff = ChronoUnit.DAYS.between(today, expectedDate); String isDelivered = delivered ? "yes" : "no"; - return "Name: " + name + "\n" + "Notes: " + note + "\n" + "Price: $" + price + "\n" + "Weight: " + weight + " kg" + "\n" + "Expected Delivery Date: " + DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm").format(expectedDate) + "\n" + "Delivered? " + isDelivered + "\n" + ((diff > 0 && !delivered) ? diff + " days remaining" : abs(diff) + " days overdue"); + String remainingDays = ((diff > 0 && !delivered) ? diff + " days remaining" : abs(diff) + " days overdue"); + remainingDays = (delivered ? "" : remainingDays); + return "Name: " + name + "\n" + "Notes: " + note + "\n" + "Price: $" + price + "\n" + "Weight: " + weight + " kg" + "\n" + "Expected Delivery Date: " + DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm").format(expectedDate) + "\n" + "Delivered? " + isDelivered + "\n" + remainingDays; } } + diff --git a/assignment4/src/cmpt213/assignment4/packagedeliveries/client/view/Input.java b/assignment4/src/cmpt213/assignment4/packagedeliveries/client/view/Input.java index c29ed35..ac434bd 100644 --- a/assignment4/src/cmpt213/assignment4/packagedeliveries/client/view/Input.java +++ b/assignment4/src/cmpt213/assignment4/packagedeliveries/client/view/Input.java @@ -7,6 +7,7 @@ import cmpt213.assignment4.packagedeliveries.client.model.PackageInfo; import com.github.lgooddatepicker.components.DateTimePicker; import com.github.lgooddatepicker.optionalusertools.DateTimeChangeListener; import com.github.lgooddatepicker.zinternaltools.DateTimeChangeEvent; +import com.privatejgoodies.common.base.SystemUtils; import javax.swing.*; import java.awt.*; @@ -18,7 +19,6 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; import java.time.LocalDateTime; -import java.util.ArrayList; import java.util.stream.Collectors; public class Input extends JDialog implements ActionListener, DateTimeChangeListener { @@ -28,12 +28,12 @@ public class Input extends JDialog implements ActionListener, DateTimeChangeList private final JTextField typeTf; private final DateTimePicker dd; private final DateTimePicker ed; - private LocalDateTime deliveryDate, expiryDate; private final JTextField nameField; private final JTextField noteField; private final JTextField priceField; private final JTextField weightField; private final JTextField dateField; + private LocalDateTime deliveryDate, expiryDate; private int pType; public Input(Frame main) { @@ -186,7 +186,7 @@ public class Input extends JDialog implements ActionListener, DateTimeChangeList PackageFactory.PackageType type = PackageFactory.PackageType.Book; String pName = nameField.getText(); String pNote = noteField.getText(); - String pEndPoint = "addBook"; + String pEndPoint = "/addBook"; double pPrice = 0.0; pPrice = Double.parseDouble(priceField.getText()); if (pPrice < 0) { @@ -207,18 +207,11 @@ public class Input extends JDialog implements ActionListener, DateTimeChangeList double pHandlingFee = 0.0; if (pType == 0) { pAuthor = typeTf.getText(); - if (pAuthor.equals("")) { - JOptionPane.showMessageDialog(this, - "author name can not be empty", - "error", - JOptionPane.WARNING_MESSAGE); - return; - } } else if (pType == 1) { - pEndPoint = "addPerishable"; + pEndPoint = "/addPerishable"; type = PackageFactory.PackageType.Perishable; } else { - pEndPoint = "addElectronic"; + pEndPoint = "/addElectronic"; type = PackageFactory.PackageType.Electronic; pHandlingFee = Double.parseDouble(typeTf.getText()); if (pHandlingFee < 0) { @@ -236,12 +229,17 @@ public class Input extends JDialog implements ActionListener, DateTimeChangeList return; } PackageInfo p = PackageFactory.create(type, pName, pNote, pPrice, pWeight, false, deliveryDate, pAuthor, expiryDate, pHandlingFee); - String packageString=pInstance.serializePackage(p); - System.out.println(packageString + " packageString before"); -packageString=packageString.replace("\"","\\\""); -System.out.println(packageString + " packageString"); -String postcmd="curl -i -H \"Content-Type: application/json\" -X " +"POST -d " + packageString +" localhost:8080/"; -invokeCmd(postcmd, pEndPoint); + String packageString = pInstance.serializePackage(p); + String postcmd = null; + if (SystemUtils.IS_OS_WINDOWS) { + packageString=packageString.replace("\"","\\\""); + postcmd = "curl -i -H \"Content-Type: application/json\" -X " + "POST -d " + packageString + " localhost:8080"; // for Windows + System.out.println(postcmd + " --> postcmd"); + } + else if(SystemUtils.IS_OS_MAC) { + postcmd = "curl -i -H Content-Type: application/json -X POST -d " + packageString + " localhost:8080"; // works on MacBook + } + invokeCmd(postcmd, pEndPoint); dispose(); } catch (Exception e) { JOptionPane.showMessageDialog(this, @@ -251,19 +249,21 @@ invokeCmd(postcmd, pEndPoint); } } - private void invokeCmd(String curlcmd, String endPoint){ + private void invokeCmd(String curlcmd, String endPoint) { try { - System.out.println(curlcmd+endPoint + " curlCmd"); - Process p=Runtime.getRuntime().exec(curlcmd+endPoint); - InputStream output=p.getInputStream(); - String allP =new BufferedReader(new InputStreamReader(output, StandardCharsets.UTF_8)).lines().collect(Collectors.joining("\n")); - System.out.println(allP+" allP"); - pInstance.deserializePackageString(allP); + System.out.println(curlcmd + endPoint + " invokeCmd"); + Process p = Runtime.getRuntime().exec(curlcmd + endPoint); + InputStream output = p.getInputStream(); + String allP = new BufferedReader(new InputStreamReader(output, StandardCharsets.UTF_8)).lines().collect(Collectors.joining("\n")); +// System.out.println(allP + " allP"); +// pInstance.deserializePackageString(allP); } catch (IOException e) { - throw new RuntimeException(e); + e.printStackTrace(); + //throw new RuntimeException(e); } } } + diff --git a/assignment4/src/cmpt213/assignment4/packagedeliveries/client/view/JavaSwingUI.java b/assignment4/src/cmpt213/assignment4/packagedeliveries/client/view/JavaSwingUI.java index 112b4ff..f10b548 100644 --- a/assignment4/src/cmpt213/assignment4/packagedeliveries/client/view/JavaSwingUI.java +++ b/assignment4/src/cmpt213/assignment4/packagedeliveries/client/view/JavaSwingUI.java @@ -1,6 +1,8 @@ package cmpt213.assignment4.packagedeliveries.client.view; import cmpt213.assignment4.packagedeliveries.client.control.PackageDeliveriesTracker; +import cmpt213.assignment4.packagedeliveries.client.model.PackageInfo; +import com.privatejgoodies.common.base.SystemUtils; import javax.swing.*; import java.awt.*; @@ -8,7 +10,13 @@ import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; +import java.util.stream.Collectors; public class JavaSwingUI implements ActionListener { private final PackageDeliveriesTracker pTracker = PackageDeliveriesTracker.getInstance(); @@ -17,10 +25,9 @@ public class JavaSwingUI implements ActionListener { JScrollPane scrollView; PACKAGE_FILTER_OPTION option = PACKAGE_FILTER_OPTION.ALL; - ; - public void displayMainPage() { //pTracker.load(); +// curlGetCommand("/load"); uiFrame = new JFrame("Package deliveries tracker"); uiFrame.setSize(500, 500); uiFrame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); @@ -28,7 +35,8 @@ public class JavaSwingUI implements ActionListener { uiFrame.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { - //pTracker.save(); // TODO: replace with save endpoint + //trigger the save operation at the webserver + curlGetCommand("/exit"); super.windowClosing(e); uiFrame.dispose(); } @@ -51,48 +59,67 @@ public class JavaSwingUI implements ActionListener { uiFrame.pack(); } - private void displayPackages(ArrayList packages) { + private void displayPackages(ArrayList packages) { + ArrayList packageString = new ArrayList<>(); + if (packages != null) { + for (PackageInfo p : packages) { +// System.out.println(p.toString() + "----> p"); + packageString.add(p.toString()); + } + } else packageString.add("No packages to show"); uiPanel.removeAll(); uiPanel.setLayout(new BoxLayout(uiPanel, BoxLayout.Y_AXIS)); scrollView.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); uiPanel.add(Box.createVerticalGlue()); uiFrame.getContentPane().add(scrollView); - System.out.println(packages); - for (int i = 0; i < packages.size(); i++) { + if (packageString.size() > 0 && packageString.get(0) != "No packages to show") { + for (int i = 0; i < packages.size(); i++) { + JPanel p = new JPanel(); + JTextPane pkgPane = new JTextPane(); + pkgPane.setEditable(false); + pkgPane.setText(packageString.get(i)); + p.add(pkgPane); + if (option == PACKAGE_FILTER_OPTION.ALL) { + JButton remove = new JButton(); + int finalI = i; + int finalI2 = i; + remove.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + //pTracker.removePcakage(finalI); + curlPostCommand("/removePackage", packages.get(finalI2)); + refreshPackageList(); + } + }); + remove.setText("Remove"); + p.add(remove); + + JCheckBox delivered = new JCheckBox("Delivered?"); + delivered.setBounds(100, 100, 50, 50); + Boolean deliveredStatus = packageString.get(i).contains("Delivered? yes"); + delivered.setSelected(deliveredStatus); + int finalI1 = i; + delivered.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + delivered.setSelected(true); + curlPostCommand("/markPackageAsDelivered", packages.get(finalI2)); + refreshPackageList(); + } + }); + p.add(delivered); + } + uiPanel.add(p); + } + } else { JPanel p = new JPanel(); JTextPane pkgPane = new JTextPane(); pkgPane.setEditable(false); - pkgPane.setText(packages.get(i)); + pkgPane.setText("No packages to show"); p.add(pkgPane); - if (option == PACKAGE_FILTER_OPTION.ALL) { - JButton remove = new JButton(); - int finalI = i; - remove.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - pTracker.removePcakage(finalI); - refreshPackageList(); - } - }); - remove.setText("Remove"); - p.add(remove); - - JCheckBox delivered = new JCheckBox("Delivered?"); - delivered.setBounds(100, 100, 50, 50); - delivered.setSelected(false); // TODO: retrieve package's delivery status - int finalI1 = i; - delivered.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - delivered.setSelected(true); - //pTracker.setDelivered(finalI1); // TODO: call setDelivered endPoint - refreshPackageList(); - } - }); - p.add(delivered); - } uiPanel.add(p); } + uiFrame.validate(); uiFrame.pack(); } @@ -156,19 +183,65 @@ public class JavaSwingUI implements ActionListener { private void refreshPackageList() { switch (option) { case ALL: - ArrayList allPackages = pTracker.getAllPackages(); + ArrayList allPackages = curlGetCommand("/listAll"); +// System.out.println(allPackages + " allPackages -> refreshPackageList ALL"); displayPackages(allPackages); break; case OVERDUE: - ArrayList overDuePkg = pTracker.overDuePackages(); + ArrayList overDuePkg = curlGetCommand("/listOverduePackage"); +// System.out.println(overDuePkg + " overDuePkg -> refreshPackageList OVERDUE"); displayPackages(overDuePkg); break; case UPCOMING: - ArrayList upcomingPkg = pTracker.upcomingPackages(); + ArrayList upcomingPkg = curlGetCommand("/listUpcomingPackage"); +// System.out.println(upcomingPkg + " upcomingPkg -> refreshPackageList UPCOMING"); displayPackages(upcomingPkg); break; } } + private ArrayList curlGetCommand(String operation) { + String command = "curl -X " + "GET" + " localhost:8080" + operation; + System.out.println(command + " ==> curlGetCommand"); + try { + Process process = Runtime.getRuntime().exec(command); + InputStream stdOutput = process.getInputStream(); + String allPkg = new BufferedReader( + new InputStreamReader(stdOutput, StandardCharsets.UTF_8)) + .lines() + .collect(Collectors.joining("\n")); + return pTracker.deserializePackageString(allPkg); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + + private void curlPostCommand(String operation, PackageInfo packageInfo) { + String packageString = pTracker.serializePackage(packageInfo); + String command = null; + if (SystemUtils.IS_OS_WINDOWS) { + System.out.println(System.getProperty("os.name").toLowerCase()); + packageString=packageString.replace("\"","\\\""); + command = "curl -i -H \"Content-Type: application/json\" -X " + "POST -d " + packageString + " localhost:8080" + operation; + System.out.println(command + " ==> curlPostCommand"); + } + else if(SystemUtils.IS_OS_MAC) { + System.out.println(System.getProperty("os.name").toLowerCase()); + command = "curl -i -H Content-Type: application/json -X POST -d " + packageString + " localhost:8080" + operation; + } + try { + Process process = Runtime.getRuntime().exec(command); + InputStream stdOutput = process.getInputStream(); + String allPkg = new BufferedReader( + new InputStreamReader(stdOutput, StandardCharsets.UTF_8)) + .lines() + .collect(Collectors.joining("\n")); + return; + } catch (IOException e) { + throw new RuntimeException(e); + } + } + enum PACKAGE_FILTER_OPTION {ALL, OVERDUE, UPCOMING} } + diff --git a/webappserver/docs/curlCommands.txt b/webappserver/docs/curlCommands.txt index b1a54f1..d11e151 100644 --- a/webappserver/docs/curlCommands.txt +++ b/webappserver/docs/curlCommands.txt @@ -5,7 +5,82 @@ command : curl -i -X GET localhost:8080 Returns a message "system is up". GET /listAll +command : curl -X GET localhost:8080/listAll +Returns a serialized list of all packages as a JSON object +POST /addBook +example command (Windows): curl -i -H "Content-Type: application/json" -X POST -d {\"author\":\"test\",\"name\":\"testBook\",\"note\":\"\",\"price\":12.0,\"weight\":5.0,\"expectedDate\":\"2022-08-27T11:59\",\"delivered\":false,\"type\":\"book\"} localhost:8080/addBook +The body of the POST command represents the serialized PackageInfo object of Book type. -Test commands: -curl -i -H "Content-Type: application/json" -X POST -d '{\"author\":\"test\",\"name\":\"n\",\"note\":\"a\",\"price\":1,\"weight\":3,\"expectedDate\":\"2022-07-29T12:00\",\"delivered\":false,\"type\":\"book\"}' localhost:8080/addBook \ No newline at end of file +The type of fields are: +author: String +name: String +note: String +price: Double +weight: Double +expectedDate: YYYY-MM-DDTHH:MM (LocalDateTime) +delivered: Boolean +type: String + +Based on the type of the package, the first field has to be author, expiryDate or handlingFee +Returns the updated packageList as a JSON object. + +POST /addPerishable +example command: curl -i -H "Content-Type: application/json" -X POST -d {\"expiryDate\":\"2022-08-31T11:59\",\"name\":\"testPerishable\",\"note\":\"test\",\"price\":15.0,\"weight\":5.0,\"expectedDate\":\"2022-08-27T12:01\",\"delivered\":false,\"type\":\"perishable\"} localhost:8080/addPerishable + +The body of the POST command represents the serialized PackageInfo object of Perishable type. + +The type of fields are: +expiryDate: YYYY-MM-DDTHH:MM (LocalDateTime) +name: String +note: String +price: Double +weight: Double +expectedDate:YYYY-MM-DDTHH:MM (LocalDateTime) +delivered: Boolean +type: String + +Returns the updated packageList as a JSON object. + +POST /addElectronic +example command: curl -i -H "Content-Type: application/json" -X POST -d {\"handlingFee\":10.0,\"name\":\"testElectronic\",\"note\":\"none\",\"price\":100.0,\"weight\":10.0,\"expectedDate\":\"2022-08-20T08:30\",\"delivered\":false,\"type\":\"electronic\"} localhost:8080/addElectronic + +The body of the POST command represents the serialized PackageInfo object of Electronic type. + +The type of fields are: +handlingFee: Double +name: String +note: String +price: Double +weight: Double +expectedDate:YYYY-MM-DDTHH:MM (LocalDateTime) +delivered: Boolean +type: String + +Returns the updated packageList as a JSON object. + +POST /removePackage +example command: curl -i -H "Content-Type: application/json" -X POST -d {\"author\":\"test\",\"name\":\"testBook\",\"note\":\"\",\"price\":12.0,\"weight\":5.0,\"expectedDate\":\"2022-08-27T11:59\",\"delivered\":false,\"type\":\"book\"} localhost:8080/addBook + +User has to ensure the POST command data fields match one of the packages in the packageList. My system allows for removing only the packages in the list, so it acts as an error checking mechanism in itself. +It takes a serialized version of the object to be removed and returns the updated package-list as a JSON object. + +POST /markPackageAsDelivered +example command: curl -i -H "Content-Type: application/json" -X POST -d {\"handlingFee\":10.0,\"name\":\"testElectronic\",\"note\":\"none\",\"price\":100.0,\"weight\":10.0,\"expectedDate\":\"2022-08-20T08:30\",\"delivered\":false,\"type\":\"electronic\"} localhost:8080/markPackageAsDelivered + +User has to ensure the POST command data fields match one of the packages in the packageList. My system allows for marking as "delivered" only the packages in the list, so it acts as an error checking mechanism in itself. +It takes a serialized version of the object to be marked as "delivered" and returns the updated package-list as a JSON object. + +GET /listOverduePackage +command: curl -X GET localhost:8080/listOverduePackage +Returns all undelivered packages with expected delivery data before the current date and time, ordered by their expected delivery dates(oldest first) +It is returned as a list of JSON objects. + +GET /listUpcomingPackage +command: curl -X GET localhost:8080/listUpcomingPackage +Returns all upcoming packages with expected delivery data before the current date and time, ordered by their expected delivery dates(oldest first) +It is returned as a list of JSON objects. + +GET /exit +command: curl -X GET localhost:8080/exit +Triggers the server to save the current packageList into a JSON file (list.json) diff --git a/webappserver/list.json b/webappserver/list.json index e69de29..0951b7b 100644 --- a/webappserver/list.json +++ b/webappserver/list.json @@ -0,0 +1 @@ +[{"handlingFee":45.0,"name":"e","note":"n","price":35.0,"weight":3.0,"expectedDate":"2022-08-19T00:30","delivered":false,"type":"electronic"},{"handlingFee":10.0,"name":"testElectronic","note":"none","price":100.0,"weight":10.0,"expectedDate":"2022-08-20T08:30","delivered":true,"type":"electronic"},{"expiryDate":"2022-08-31T11:59","name":"testPerishable","note":"test","price":15.0,"weight":5.0,"expectedDate":"2022-08-27T12:01","delivered":false,"type":"perishable"}] \ No newline at end of file diff --git a/webappserver/src/main/java/cmpt213/assignment4/packagedeliveries/webappserver/control/PackageManager.java b/webappserver/src/main/java/cmpt213/assignment4/packagedeliveries/webappserver/control/PackageManager.java index 5df178a..6bab37b 100644 --- a/webappserver/src/main/java/cmpt213/assignment4/packagedeliveries/webappserver/control/PackageManager.java +++ b/webappserver/src/main/java/cmpt213/assignment4/packagedeliveries/webappserver/control/PackageManager.java @@ -22,6 +22,7 @@ import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Collections; +import java.util.Iterator; /** * It's a class that contains a main method that creates a TextMenu object, loads a list of packages @@ -53,13 +54,14 @@ public class PackageManager { public static PackageManager getInstance() { if (instance == null) { instance = new PackageManager(); + instance.load(); } return instance; } public void addPackage(PackageInfo p) { packageList.add(p); - //Collections.sort(packageList); + Collections.sort(packageList); } /** @@ -122,8 +124,7 @@ public class PackageManager { } public String getAllPackages() { - //Collections.sort(packageList); TODO: sorting raises error; check again - System.out.println(packageList + " packageList - server"); + Collections.sort(packageList); return gson.toJson(packageList); } @@ -164,19 +165,38 @@ public class PackageManager { public String upcomingPackages() { ArrayList upcoming = sortList(packageList, false); - return gson.toJson(packageList); +// System.out.println(upcoming + " --> upcoming packages"); + return gson.toJson(upcoming); } - public void removePcakage(int i) { - packageList.remove(i); + public void removePackage(PackageInfo p) { + Iterator itr = packageList.iterator(); + int index = 0; + while (itr.hasNext()) { + PackageInfo pkg = itr.next(); + if (pkg.toString().hashCode() == p.toString().hashCode()) { + break; + } + index += 1; + } + packageList.remove(index); } public boolean isDelivered(int i) { return packageList.get(i).getDelivered(); } - public void setDelivered(int i) { - packageList.get(i).setDelivered(true); + public void setDelivered(PackageInfo p) { + Iterator itr = packageList.iterator(); + int index = 0; + while (itr.hasNext()) { + PackageInfo pkg = itr.next(); + if (pkg.toString().hashCode() == p.toString().hashCode()) { + break; + } + index += 1; + } + packageList.get(index).setDelivered(true); } public PackageInfo deserializePackage(String packageGson){ @@ -204,3 +224,4 @@ public PackageInfo deserializePackage(String packageGson){ return newPackage; } } + diff --git a/webappserver/src/main/java/cmpt213/assignment4/packagedeliveries/webappserver/controllers/PackageController.java b/webappserver/src/main/java/cmpt213/assignment4/packagedeliveries/webappserver/controllers/PackageController.java index bc2cf69..55e374a 100644 --- a/webappserver/src/main/java/cmpt213/assignment4/packagedeliveries/webappserver/controllers/PackageController.java +++ b/webappserver/src/main/java/cmpt213/assignment4/packagedeliveries/webappserver/controllers/PackageController.java @@ -22,6 +22,18 @@ public class PackageController { return manager.getAllPackages(); } + @GetMapping("/listOverduePackage") + @ResponseStatus(HttpStatus.OK) + public String getOverduePackages() { + return manager.overDuePackages(); + } + + @GetMapping("/listUpcomingPackage") + @ResponseStatus(HttpStatus.OK) + public String getUpcomingPackages() { + return manager.upcomingPackages(); + } + @PostMapping("/addBook") @ResponseStatus(HttpStatus.CREATED) public String addBook(@RequestBody String bookString){ @@ -49,4 +61,28 @@ public class PackageController { manager.addPackage(p); return manager.getAllPackages(); } + + @PostMapping("/removePackage") + @ResponseStatus(HttpStatus.CREATED) + public String removePackage(@RequestBody String pkg) { + PackageInfo p = manager.deserializePackage(pkg); + manager.removePackage(p); + return manager.getAllPackages(); + } + + @PostMapping("/markPackageAsDelivered") + @ResponseStatus(HttpStatus.CREATED) + public String markPackageAsDelivered(@RequestBody String pkg) { + PackageInfo p = manager.deserializePackage(pkg); + manager.setDelivered(p); + return manager.getAllPackages(); + } + + @GetMapping("/exit") + @ResponseStatus(HttpStatus.OK) + public void savePackages() { + manager.save(); + } + } + diff --git a/webappserver/src/main/java/cmpt213/assignment4/packagedeliveries/webappserver/model/PackageInfo.java b/webappserver/src/main/java/cmpt213/assignment4/packagedeliveries/webappserver/model/PackageInfo.java index 8012b74..c6b8a43 100644 --- a/webappserver/src/main/java/cmpt213/assignment4/packagedeliveries/webappserver/model/PackageInfo.java +++ b/webappserver/src/main/java/cmpt213/assignment4/packagedeliveries/webappserver/model/PackageInfo.java @@ -85,6 +85,9 @@ public class PackageInfo implements Comparable { today.format(format); long diff = ChronoUnit.DAYS.between(today, expectedDate); String isDelivered = delivered ? "yes" : "no"; - return "Name: " + name + "\n" + "Notes: " + note + "\n" + "Price: $" + price + "\n" + "Weight: " + weight + " kg" + "\n" + "Expected Delivery Date: " + DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm").format(expectedDate) + "\n" + "Delivered? " + isDelivered + "\n" + ((diff > 0 && !delivered) ? diff + " days remaining" : abs(diff) + " days overdue"); + String remainingDays = ((diff > 0 && !delivered) ? diff + " days remaining" : abs(diff) + " days overdue"); + remainingDays = (delivered ? "" : remainingDays); + return "Name: " + name + "\n" + "Notes: " + note + "\n" + "Price: $" + price + "\n" + "Weight: " + weight + " kg" + "\n" + "Expected Delivery Date: " + DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm").format(expectedDate) + "\n" + "Delivered? " + isDelivered + "\n" + remainingDays; } } +