From 30bfa6f243a4a883a992ba32b52c31c5140b29a7 Mon Sep 17 00:00:00 2001 From: boris Date: Fri, 12 Apr 2024 09:39:31 +0100 Subject: [PATCH] vault backup: 2024-04-12 09:39:31 --- .obsidian/workspace.json | 31 ++- .../Project/Part 2/Library.class | Bin 9113 -> 0 bytes .../Programming 2/Project/Part 2/Library.ctxt | 45 ---- .../Project/Part 2/LibraryReservation.class | Bin 3144 -> 0 bytes .../Project/Part 2/LibraryReservation.ctxt | 46 ---- .../Project/Part 2/package.bluej | 209 +++++++++------- .../Programming 2/Project/Part 4 Complete.zip | Bin 0 -> 76686 bytes .../AudioVisual.class | Bin 1294 -> 1294 bytes .../AudioVisual.ctxt | 1 + .../AudioVisual.java | 7 +- .../{Part 2 => Part 4 Complete}/Book.class | Bin 1366 -> 1366 bytes .../{Part 2 => Part 4 Complete}/Book.ctxt | 2 +- .../{Part 2 => Part 4 Complete}/Book.java | 9 +- .../{Part 2 => Part 4 Complete}/CD.class | Bin 1498 -> 1498 bytes .../{Part 2 => Part 4 Complete}/CD.ctxt | 2 +- .../{Part 2 => Part 4 Complete}/CD.java | 8 +- .../{Part 2 => Part 4 Complete}/DVD.class | Bin 1149 -> 1149 bytes .../{Part 2 => Part 4 Complete}/DVD.ctxt | 2 +- .../{Part 2 => Part 4 Complete}/DVD.java | 8 +- .../DateUtil.class | Bin .../{Part 2 => Part 4 Complete}/DateUtil.ctxt | 0 .../{Part 2 => Part 4 Complete}/DateUtil.java | 0 .../{Part 2 => Part 4 Complete}/Diary$1.class | Bin .../Diary$DayInDiary$Entry.class | Bin .../Diary$DayInDiary.class | Bin .../{Part 2 => Part 4 Complete}/Diary.class | Bin .../{Part 2 => Part 4 Complete}/Diary.ctxt | 0 .../{Part 2 => Part 4 Complete}/Diary.java | 0 .../Project/Part 4 Complete/Library.class | Bin 0 -> 10208 bytes .../Project/Part 4 Complete/Library.ctxt | 65 +++++ .../{Part 2 => Part 4 Complete}/Library.java | 231 +++++++++++++----- .../LibraryItem.class | Bin 2455 -> 2455 bytes .../LibraryItem.ctxt | 4 +- .../LibraryItem.java | 20 +- .../Part 4 Complete/LibraryReservation.class | Bin 0 -> 3132 bytes .../Part 4 Complete/LibraryReservation.ctxt | 42 ++++ .../LibraryReservation.java | 179 +++++++------- .../LibraryUser.class | Bin 2336 -> 2336 bytes .../LibraryUser.ctxt | 8 +- .../LibraryUser.java | 49 ++-- .../Periodical.class | Bin 1199 -> 1199 bytes .../Periodical.ctxt | 2 +- .../Periodical.java | 8 +- .../PrintedItem.class | Bin 1549 -> 1549 bytes .../PrintedItem.ctxt | 1 + .../PrintedItem.java | 7 +- .../{Part 2 => Part 4 Complete}/README.TXT | 0 .../data/item_data_1.txt | 0 .../data/item_data_1_v2.txt | 0 .../data/item_data_2.txt | 0 .../data/item_data_2_generic_test.txt | 0 .../data/items_all.txt | 0 .../data/items_and_user_data.txt | 0 .../data/library_user_data.txt | 0 .../data/testreservationwrite.txt | 0 .../data/testuserwrite.txt | 0 .../{Part 2 => Part 4 Complete}/doc/Book.html | 0 .../doc/DateUtil.html | 0 .../doc/Diary.html | 0 .../doc/Library.html | 0 .../doc/LibraryItem.html | 0 .../doc/allclasses-frame.html | 0 .../doc/allclasses-noframe.html | 0 .../doc/constant-values.html | 0 .../doc/index.html | 0 .../doc/logfile.txt | 0 .../doc/package-frame.html | 0 .../doc/package-list | 0 .../doc/package-summary.html | 0 .../doc/resources/inherit.gif | Bin .../doc/stylesheet.css | 0 .../{Part 2 => Part 4 Complete}/nullnull | 0 .../Project/Part 4 Complete/package.bluej | 179 ++++++++++++++ 73 files changed, 762 insertions(+), 403 deletions(-) delete mode 100644 Semester 2/Programming 2/Project/Part 2/Library.class delete mode 100644 Semester 2/Programming 2/Project/Part 2/Library.ctxt delete mode 100644 Semester 2/Programming 2/Project/Part 2/LibraryReservation.class delete mode 100644 Semester 2/Programming 2/Project/Part 2/LibraryReservation.ctxt create mode 100644 Semester 2/Programming 2/Project/Part 4 Complete.zip rename Semester 2/Programming 2/Project/{Part 2 => Part 4 Complete}/AudioVisual.class (95%) rename Semester 2/Programming 2/Project/{Part 2 => Part 4 Complete}/AudioVisual.ctxt (78%) rename Semester 2/Programming 2/Project/{Part 2 => Part 4 Complete}/AudioVisual.java (87%) rename Semester 2/Programming 2/Project/{Part 2 => Part 4 Complete}/Book.class (63%) rename Semester 2/Programming 2/Project/{Part 2 => Part 4 Complete}/Book.ctxt (87%) rename Semester 2/Programming 2/Project/{Part 2 => Part 4 Complete}/Book.java (88%) rename Semester 2/Programming 2/Project/{Part 2 => Part 4 Complete}/CD.class (91%) rename Semester 2/Programming 2/Project/{Part 2 => Part 4 Complete}/CD.ctxt (87%) rename Semester 2/Programming 2/Project/{Part 2 => Part 4 Complete}/CD.java (91%) rename Semester 2/Programming 2/Project/{Part 2 => Part 4 Complete}/DVD.class (94%) rename Semester 2/Programming 2/Project/{Part 2 => Part 4 Complete}/DVD.ctxt (84%) rename Semester 2/Programming 2/Project/{Part 2 => Part 4 Complete}/DVD.java (89%) rename Semester 2/Programming 2/Project/{Part 2 => Part 4 Complete}/DateUtil.class (100%) rename Semester 2/Programming 2/Project/{Part 2 => Part 4 Complete}/DateUtil.ctxt (100%) rename Semester 2/Programming 2/Project/{Part 2 => Part 4 Complete}/DateUtil.java (100%) rename Semester 2/Programming 2/Project/{Part 2 => Part 4 Complete}/Diary$1.class (100%) rename Semester 2/Programming 2/Project/{Part 2 => Part 4 Complete}/Diary$DayInDiary$Entry.class (100%) rename Semester 2/Programming 2/Project/{Part 2 => Part 4 Complete}/Diary$DayInDiary.class (100%) rename Semester 2/Programming 2/Project/{Part 2 => Part 4 Complete}/Diary.class (100%) rename Semester 2/Programming 2/Project/{Part 2 => Part 4 Complete}/Diary.ctxt (100%) rename Semester 2/Programming 2/Project/{Part 2 => Part 4 Complete}/Diary.java (100%) create mode 100644 Semester 2/Programming 2/Project/Part 4 Complete/Library.class create mode 100644 Semester 2/Programming 2/Project/Part 4 Complete/Library.ctxt rename Semester 2/Programming 2/Project/{Part 2 => Part 4 Complete}/Library.java (71%) rename Semester 2/Programming 2/Project/{Part 2 => Part 4 Complete}/LibraryItem.class (65%) rename Semester 2/Programming 2/Project/{Part 2 => Part 4 Complete}/LibraryItem.ctxt (75%) rename Semester 2/Programming 2/Project/{Part 2 => Part 4 Complete}/LibraryItem.java (87%) create mode 100644 Semester 2/Programming 2/Project/Part 4 Complete/LibraryReservation.class create mode 100644 Semester 2/Programming 2/Project/Part 4 Complete/LibraryReservation.ctxt rename Semester 2/Programming 2/Project/{Part 2 => Part 4 Complete}/LibraryReservation.java (83%) rename Semester 2/Programming 2/Project/{Part 2 => Part 4 Complete}/LibraryUser.class (61%) rename Semester 2/Programming 2/Project/{Part 2 => Part 4 Complete}/LibraryUser.ctxt (76%) rename Semester 2/Programming 2/Project/{Part 2 => Part 4 Complete}/LibraryUser.java (67%) rename Semester 2/Programming 2/Project/{Part 2 => Part 4 Complete}/Periodical.class (94%) rename Semester 2/Programming 2/Project/{Part 2 => Part 4 Complete}/Periodical.ctxt (85%) rename Semester 2/Programming 2/Project/{Part 2 => Part 4 Complete}/Periodical.java (90%) rename Semester 2/Programming 2/Project/{Part 2 => Part 4 Complete}/PrintedItem.class (95%) rename Semester 2/Programming 2/Project/{Part 2 => Part 4 Complete}/PrintedItem.ctxt (82%) rename Semester 2/Programming 2/Project/{Part 2 => Part 4 Complete}/PrintedItem.java (90%) rename Semester 2/Programming 2/Project/{Part 2 => Part 4 Complete}/README.TXT (100%) rename Semester 2/Programming 2/Project/{Part 2 => Part 4 Complete}/data/item_data_1.txt (100%) rename Semester 2/Programming 2/Project/{Part 2 => Part 4 Complete}/data/item_data_1_v2.txt (100%) rename Semester 2/Programming 2/Project/{Part 2 => Part 4 Complete}/data/item_data_2.txt (100%) rename Semester 2/Programming 2/Project/{Part 2 => Part 4 Complete}/data/item_data_2_generic_test.txt (100%) rename Semester 2/Programming 2/Project/{Part 2 => Part 4 Complete}/data/items_all.txt (100%) rename Semester 2/Programming 2/Project/{Part 2 => Part 4 Complete}/data/items_and_user_data.txt (100%) rename Semester 2/Programming 2/Project/{Part 2 => Part 4 Complete}/data/library_user_data.txt (100%) rename Semester 2/Programming 2/Project/{Part 2 => Part 4 Complete}/data/testreservationwrite.txt (100%) rename Semester 2/Programming 2/Project/{Part 2 => Part 4 Complete}/data/testuserwrite.txt (100%) rename Semester 2/Programming 2/Project/{Part 2 => Part 4 Complete}/doc/Book.html (100%) rename Semester 2/Programming 2/Project/{Part 2 => Part 4 Complete}/doc/DateUtil.html (100%) rename Semester 2/Programming 2/Project/{Part 2 => Part 4 Complete}/doc/Diary.html (100%) rename Semester 2/Programming 2/Project/{Part 2 => Part 4 Complete}/doc/Library.html (100%) rename Semester 2/Programming 2/Project/{Part 2 => Part 4 Complete}/doc/LibraryItem.html (100%) rename Semester 2/Programming 2/Project/{Part 2 => Part 4 Complete}/doc/allclasses-frame.html (100%) rename Semester 2/Programming 2/Project/{Part 2 => Part 4 Complete}/doc/allclasses-noframe.html (100%) rename Semester 2/Programming 2/Project/{Part 2 => Part 4 Complete}/doc/constant-values.html (100%) rename Semester 2/Programming 2/Project/{Part 2 => Part 4 Complete}/doc/index.html (100%) rename Semester 2/Programming 2/Project/{Part 2 => Part 4 Complete}/doc/logfile.txt (100%) rename Semester 2/Programming 2/Project/{Part 2 => Part 4 Complete}/doc/package-frame.html (100%) rename Semester 2/Programming 2/Project/{Part 2 => Part 4 Complete}/doc/package-list (100%) rename Semester 2/Programming 2/Project/{Part 2 => Part 4 Complete}/doc/package-summary.html (100%) rename Semester 2/Programming 2/Project/{Part 2 => Part 4 Complete}/doc/resources/inherit.gif (100%) rename Semester 2/Programming 2/Project/{Part 2 => Part 4 Complete}/doc/stylesheet.css (100%) rename Semester 2/Programming 2/Project/{Part 2 => Part 4 Complete}/nullnull (100%) create mode 100644 Semester 2/Programming 2/Project/Part 4 Complete/package.bluej diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json index d5e25c3..8782533 100644 --- a/.obsidian/workspace.json +++ b/.obsidian/workspace.json @@ -70,8 +70,7 @@ } ], "direction": "horizontal", - "width": 200, - "collapsed": true + "width": 200 }, "right": { "id": "ee8f6df41634f71e", @@ -156,7 +155,7 @@ } ], "direction": "horizontal", - "width": 200 + "width": 417.5 }, "left-ribbon": { "hiddenItems": { @@ -167,42 +166,42 @@ "switcher:Open quick switcher": false } }, - "active": "f5285cbbb611ecba", + "active": "671043c113c40804", "lastOpenFiles": [ - "Semester 2/Programming 2/Assessment 4 Notes", + "Semester 2/Programming 2/Project/Part 2/package.bluej", + "Semester 2/Programming 2/Project/Part 2", + "Semester 2/Programming 2/Project/Part 4 Complete.zip", + "Semester 2/Programming 2/Project/Part 4 Complete/doc/resources/inherit.gif", + "Semester 2/Programming 2/Project/Part 4 Complete/doc/stylesheet.css", + "Semester 2/Programming 2/Project/Part 4 Complete/doc/resources", + "Semester 2/Programming 2/Project/Part 4 Complete/doc/package-summary.html", + "Semester 2/Programming 2/Project/Part 4 Complete/doc/package-list", + "Semester 2/Programming 2/Project/Part 4 Complete/doc/package-frame.html", + "Semester 2/Programming 2/Project/Part 4 Complete/doc/logfile.txt", + "Semester 2/Programming 2/Project/Part 4 Complete/doc/index.html", + "Semester 2/Programming 2/Project/Part 4 Complete/doc/constant-values.html", "images/Pasted image 20240319234142.png", "images/Pasted image 20240319225420.png", "Semester 2/Programming 2/Week 10 Revision/Q4.md", "Semester 2/Programming 2/Week 10 Revision/Q5.md", "images/Pasted image 20240319224232.png", "Semester 2/Programming 2/Week 10 Revision/Q3.md", - "Semester 2/Database Systems/Exercise Booklet.pdf", - "Semester 2/Database Systems/Booklet of Lecture Slides for Semester Two (2).pdf", "Semester 2/Database Systems/Week 10/Week 10 Database Systems.md", "images/Pasted image 20240319163053.png", "images/Pasted image 20240319162824.png", "images/Pasted image 20240319161202.png", "images/Pasted image 20240319160609.png", "Semester 2/Programming 2/Week 10 Revision/Q1.md", - "Semester 2/Programming 2/Week 10 Revision", "Semester 2/Database Systems/Week 2/Week 2 Database Systems.md", "Semester 2/Database Systems/Week 1/Week 1 Database Systems.md", "Semester 1/Database Systems/Week 10/Week 10 Database Systems.md", "Semester 2/Database Systems/Week 3/Week 3 Database Systems.md", "Semester 2/Database Systems/Week 4/Week 4 Database Systems.md", - "Semester 2/Database Systems/Week 10", "Semester 2/Database Systems/Week 9/Week 9 Database Systems.md", "images/Pasted image 20240312161933.png", "images/Pasted image 20240312161927.png", - "images/Pasted image 20240312161656.png", "Semester 2/Database Systems/Week 8/Week 8 Database Systems.md", - "Semester 2/Database Systems/Week 9", - "Semester 2/Untitled", - "Semester 2/Programming 2/Project/Part 2/__SHELL1.class", - "Semester 2/Programming 2/Project/Part 2/__SHELL1.java", - "Semester 2/Programming 2/Project/Part 2/Library.java#", "Semester 2/Database Systems/Week 7/Week 7 Database Systems.md", - "Semester 2/Programming 2/Project/Part 2/Book.java#", "Semester 2/Database Systems/Week 6/Week 6 Database Systems.md", "Semester 2/Computer Systems Internals & Linux/Week 6/Week 6 Computer Systems Internals.md", "Semester 2/Programming 2/Assessment 3 Revision/Parameter Passing WS3.md", diff --git a/Semester 2/Programming 2/Project/Part 2/Library.class b/Semester 2/Programming 2/Project/Part 2/Library.class deleted file mode 100644 index 03f2c79b5c77be8274d47eb0335e725f6ac793e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9113 zcmbVS3w%`Nl|LslnLD|;gb)}=czHpPBqY3)C=*3U0uo5VBM5@1OlEG9fyqpmM*>z` zpS9IiZPjYTx7DaJ za_76}e&6}d`Jewe-?`h%bTsAKMXBK&uq>ghjZ$$$FkzchMZrvJB2AJCs< z?uT;wkw(XLnn~~Y)+~Sp_@mParV?f@^0P;0FBfa<(`i1vg9~ez%zhb_$VK;aDb%o0 z%9FUPlqYk!T&8GT;peH?pQrgb;OFTY&w#~pSE+FotdrqPn98$sp3QS$CC}CPG(Vd< zHS#>U%-8sIjTgvpp#Z>3psh%{4Nr)p)TOTj%F`oi5-deqQS5W%8(4cB%36 za*bE$v_%$e;WOoOmRuJ3d8Pa|2ukp+p3fF@&JkIypI7-g=;uZN#plZ9Jh`m)^ZD|- zMlNgp+~ntGKezblu%FlYdA-IL=(G<3xO16jknI^aG3k`&p zX428vQV1Fm$j)d_Je1BPEv98-pPp;q#zOI)rJd|pXXCn9ila$7WRb!7UwtmO7kR}7MhwnR7-+Yw4e<=zo`)4kCYK+5?ofC0{= zB`z?PSLYrmmy~`1glW>42f0-On|qalQLW0TC;3(C0km|cL*e~^#4%@v+S`eN%XOw1 zc}ra4Mp0dwEP%^2EoYZ|8dIRhid)H0+H#3I5}00HGoA!Y9L3*OAy+6KiAJzaCRdD~ zs_|~7vYc}9srYzU(SwL$%!>Dl44#xz9@6@}KtL46A(n8@n!ehB2n zsdOj_BRp0-!Zd3z2~LdPv?Y`dVQzOa)Cc;N+p0o?>80yM0%x@DXv}I#!25vfA!M*C zmgo_8m1P4gKJ8cgvd5* zX3`2pPG$9^h?NdSW1WaUc*8W+Hc$n_5n}fW7xf$|N-cmE)%Gs_81hh(2V@d=^BVo> zL;cqJSf~dF1Jm@r(EbS^WC~6|rSU--FKMj-G0Ro4a8VwJN+JqJRbjJh1u`DtguMXM zA5U!VZV4R%ADoCOpXDJO_F$>Tm*8;I_)^d-rs`nW z+_ldNrwvqueH!mKIL3Vj$2nnezo@cjx{_4m0|qA<8HYs~9$?zOJ&`c`Lh(bUU~jgz zq)frB2arb0?nKfIXOc-Po;H#BJyx9=jfcUX6pkazwS{KaAv0ulhr%e$W}@3%zD(mm zgAdZ%sEh?$?L(|76OBczq``;ya)Up`SIFo}gFh``RJqt-wkVRPOjO|{to;mMrSa7U zU⋙UKo5GUvKbd`39*)*5g|)mPUgHOAV3L~(Yr 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 TxpLHbpRB{~|AbwO=%4=wvhn*O diff --git a/Semester 2/Programming 2/Project/Part 2/Library.ctxt b/Semester 2/Programming 2/Project/Part 2/Library.ctxt deleted file mode 100644 index 51b5b4d..0000000 --- a/Semester 2/Programming 2/Project/Part 2/Library.ctxt +++ /dev/null @@ -1,45 +0,0 @@ -#BlueJ class context -comment0.params= -comment0.target=Library() -comment0.text=\n\ Constructor\ for\ objects\ of\ class\ Library\n -comment1.params=item -comment1.target=void\ storeItem(LibraryItem) -comment1.text=\n\ Inserts\ object\ value\ item\ alongside\ key\ of\ @itemCode\ into\ @itemsMap.\n -comment10.params= -comment10.target=void\ writeUserData() -comment10.text=\n\ A\ method\ to\ output\ all\ user\ data\ to\ a\ file\ using\ a\ fileDialog\ to\ specify\ file\ location.\n\ \n -comment11.params= -comment11.target=void\ readLibraryReservationData() -comment11.text=\n\ Read\ Library\ Reservation\ Data\ from\ a\ file\ specified\ by\ the\ user.\n -comment12.params= -comment12.target=void\ readData() -comment12.text=\n\ A\ method\ to\ read\ all\ data\ from\ files\ using\ a\ fileDialog\ to\ specify\ file\ location.\n\ This\ will\ create\ the\ corresponding\ objects\ depending\ on\ flags\ contained\ in\ the\ file\n\ and\ populate\ it's\ fields.\n\ \n\ Default\ flag\ value\:\ "book",\ to\ support\ legacy\ files.\ This\ will\ not\ interfere\ with\ \n\ files\ of\ different\ flag\ orders.\n -comment13.params=userID\ itemCode\ startDate\ noOfDays -comment13.target=boolean\ makeLibraryReservation(java.lang.String,\ java.lang.String,\ java.lang.String,\ int) -comment13.text=\n\ Create\ a\ reservation\ to\ allow\ a\ user\ to\ reserve\ an\ item\ from\ the\ library.\n -comment14.params=reservationNo -comment14.target=void\ deleteLibraryReservation(java.lang.String) -comment2.params=user -comment2.target=void\ storeUser(LibraryUser) -comment2.text=\n\ Inserts\ object\ value\ user\ alongside\ key\ of\ @userID\ into\ @customerMap.\n\ If\ the\ userID\ is\ set\ to\ unknown,\ it\ will\ call\ @generateUserID.\n -comment3.params=reservation -comment3.target=void\ storeLibraryReservation(LibraryReservation) -comment3.text=\n\ Inserts\ object\ value\ reservation\ alongside\ key\ of\ @reservationNo\ into\ @libraryReservationMap.\n -comment4.params= -comment4.target=java.lang.String\ generateReservationNo() -comment4.text=\n\ Generate\ a\ sequential\ reservation\ number.\ Since\ Maps\ do\ not\ have\ an\ index,\ we\ cannot\ simply\ get\ the\ last\ value,\ \n\ and\ recursion\ would\ be\ too\ intensive\ for\ this\ application.\ As\ a\ placeholder\ for\ the\ file\ output,\ a\ field\ variable\n\ is\ used\ to\ hold\ the\ last\ highest\ value\ for\ the\ reservation\ number.\ Unlike\ @generateUserID,\ this\ has\ a\ maximum\ value\n\ hardcoded\ to\ the\ spec.\ This\ likely\ will\ not\ be\ an\ issue\ since\ we\ can\ still\ have\ 1,000,000\ reservations.\n -comment5.params=prefix\ length -comment5.target=java.lang.String\ generateUserID(java.lang.String,\ int) -comment5.text=\n\ Returns\ a\ random\ unique\ user\ ID\ by\ specifying\ \n\ @prefix\ -\ arbitrary\ alphanumeric\ prefix\n\ @length\ -\ length\ of\ numeric\ ID\n\ and\ returning\ a\ unique\ user\ id\n\ @uuid\ -\ a\ unique\ string\ starting\ with\ @prefix,\ and\ concat.\ with\ a\ random\ number\n\ \n\ Example\:\ length\ \=\ 6,\ expected\ result\ should\ be\ under\ 999,999\ and\ above\ 99,999.\n\ If\ we\ just\ use\ 10^(length),\ this\ would\ generate\ any\ number\ under\ 1,000,000.\n\ This\ is\ an\ issue\ since\ any\ integers\ below\ 100,000\ can\ be\ used,\ which\ would\ be\ incorrect.\n\ By\ using\ the\ offset\ of\ a\ factor\ of\ 10\ below\ the\ desired\ length\ we\ can\ generate\ between\ 0\ and\ 899,999.\n\ After\ this,\ we\ can\ add\ 100,000\ back\ to\ the\ number\ to\ ensure\ a\ baseline\ length\ is\ maintained.\n\ \n\ Note\:\ I\ am\ aware\ that\ this\ is\ overengineered,\ and\ that\ several\ random\ integers\ of\ amount\ @length\ could\ be\ used,\ \n\ but\ this\ is\ considerably\ more\ efficient\ since\ there\ is\ no\ iteration\ involved\ in\ the\ creation\ of\ the\ ID.\ O(1)\n -comment6.params= -comment6.target=void\ printLibraryReservations() -comment6.text=\n\ Prints\ to\ the\ terminal,\ in\ a\ human-readable\ format,\ library\ reservation\ in\ the\ itemList\n\ \n\ Contains\ a\ marker\ at\ the\ start\ and\ end\ to\ visualise\ in\ terminal\ output.\n -comment7.params= -comment7.target=void\ printAll() -comment7.text=\n\ Prints\ to\ the\ terminal,\ in\ a\ human-readable\ format,\ all\ items\ in\ the\ itemList\n\ \n\ Contains\ a\ marker\ at\ the\ start\ and\ end\ to\ visualise\ in\ terminal\ output.\n -comment8.params=start\ end -comment8.target=void\ printDiaryEntries(java.lang.String,\ java.lang.String) -comment9.params= -comment9.target=void\ writeLibraryReservationData() -comment9.text=\n\ Write\ all\ current\ library\ reservations\ to\ a\ file\ specified\ by\ the\ user.\n -numComments=15 diff --git a/Semester 2/Programming 2/Project/Part 2/LibraryReservation.class b/Semester 2/Programming 2/Project/Part 2/LibraryReservation.class deleted file mode 100644 index 082b381f5c2abd386ed8b3be7a63c58db4bc85da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3144 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ⅇ#aQSUs7C0s#Iy+Wr}b8-P3iw6FZ{z;|@E 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 delta 25 gcmeC<>f_pQiG^2}frUYjL5M-0L7c&G@_iP4082#$Q2+n{ diff --git a/Semester 2/Programming 2/Project/Part 2/AudioVisual.ctxt b/Semester 2/Programming 2/Project/Part 4 Complete/AudioVisual.ctxt similarity index 78% rename from Semester 2/Programming 2/Project/Part 2/AudioVisual.ctxt rename to Semester 2/Programming 2/Project/Part 4 Complete/AudioVisual.ctxt index f36b616..e411e1b 100644 --- a/Semester 2/Programming 2/Project/Part 2/AudioVisual.ctxt +++ b/Semester 2/Programming 2/Project/Part 4 Complete/AudioVisual.ctxt @@ -10,4 +10,5 @@ comment2.target=void\ printDetails() comment2.text=\n\ Field\ Mutator\ End\n comment3.params=detailScanner comment3.target=void\ readItemData(java.util.Scanner) +comment3.text=\n\ Populate\ the\ fields\ with\ details\ from\ the\ scanner\n\ Takes\ Parameters\n\ \ Scanner\ @detailScanner\n numComments=4 diff --git a/Semester 2/Programming 2/Project/Part 2/AudioVisual.java b/Semester 2/Programming 2/Project/Part 4 Complete/AudioVisual.java similarity index 87% rename from Semester 2/Programming 2/Project/Part 2/AudioVisual.java rename to Semester 2/Programming 2/Project/Part 4 Complete/AudioVisual.java index 3db6f9d..86d9410 100644 --- a/Semester 2/Programming 2/Project/Part 2/AudioVisual.java +++ b/Semester 2/Programming 2/Project/Part 4 Complete/AudioVisual.java @@ -3,7 +3,7 @@ * Subclass of LibraryItem to create objects of audio and visual items in a library. * * @George Wilkinson - * @1.0 + * @1.2 */ import java.util.Scanner; @@ -41,6 +41,11 @@ public abstract class AudioVisual extends LibraryItem super.printDetails(); } + /** + * Populate the fields with details from the scanner + * Takes Parameters + * Scanner @detailScanner + */ public void readItemData( Scanner detailScanner ){ if ( detailScanner != null ) { this.playingTime = Integer.parseInt( detailScanner.next().trim() ); diff --git a/Semester 2/Programming 2/Project/Part 2/Book.class b/Semester 2/Programming 2/Project/Part 4 Complete/Book.class similarity index 63% rename from Semester 2/Programming 2/Project/Part 2/Book.class rename to Semester 2/Programming 2/Project/Part 4 Complete/Book.class index 317197a721138a487f0f83ad9a9f66226f1e810c..ae7c711c87156263767289adbaff4acef4fa41e5 100644 GIT binary patch delta 89 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 customerMap.keySet() ); + } + + /** + * Return the keys of @itemsMap as a list. + */ + public ArrayList getItemCodes() + { + return new ArrayList( itemsMap.keySet() ); + } + + /** + * Return the keys of @libraryReservationMap as a list. + */ + public ArrayList getReservationNos() + { + return new ArrayList( libraryReservationMap.keySet() ); + } + + /** + * Return the values of @customerMap as a list. + */ + public ArrayList getUsers() + { + return new ArrayList( customerMap.values() ); + } + + /** + * Return the values of @itemsMap as a list. + */ + public ArrayList getItems() + { + return new ArrayList( itemsMap.values() ); + } + + /** + * Return the values of @libraryReservationMap as a list. + */ + public ArrayList getLibraryReservations() + { + return new ArrayList( libraryReservationMap.values() ); + } + + /** + * Accessor End + */ /** * Storing Objects Start @@ -79,9 +136,9 @@ public class Library customerMap.put( user.getUserID(), user ); // Store the user along with the userID. } - /* + /** * Inserts object value reservation alongside key of @reservationNo into @libraryReservationMap. - */ + **/ private void storeLibraryReservation( LibraryReservation reservation ) { libraryReservationMap.put( reservation.getReservationNo(), reservation ); @@ -97,13 +154,20 @@ public class Library * Generate IDs Start */ - /* - * Generate a sequential reservation number. Since Maps do not have an index, we cannot simply get the last value, - * and recursion would be too intensive for this application. As a placeholder for the file output, a field variable - * is used to hold the last highest value for the reservation number. Unlike @generateUserID, this has a maximum value - * hardcoded to the spec. This likely will not be an issue since we can still have 1,000,000 reservations. - */ - public String generateReservationNo() + /** + * Generate a sequential reservation number padded with 0s to a length of 6. + * + * Since we are not storing in a file at this point, we obtain the size of the Map, and add 1 to determine the current number. + * This is due to the event of program restart, if a field variable is used, the first reservation generated will be of ID "000001" + * no matter what. This causes an issue if a file is read to load the reservations into the Library, since IDs will conflict and + * the value will be overwritten, causing data integrity loss. + * Unlike @generateUserID, this has a maximum value hardcoded to the spec. + * This likely will not be an issue since we can still have 1,000,000 reservations. + * + * Returns + * String @candidateNo - a proposed lowest number that is checked and interated if conflicting. + **/ + private String generateReservationNo() { /* * Originally, I did not check if the number was already taken, however the last part of step 4 introduced deletion. @@ -118,12 +182,15 @@ public class Library return candidateNo; } - /* - * Returns a random unique user ID by specifying - * @prefix - arbitrary alphanumeric prefix - * @length - length of numeric ID - * and returning a unique user id - * @uuid - a unique string starting with @prefix, and concat. with a random number + /** + * Generate a unique user identifier to apply to users when the UUID is unknown. + * This generates a number of @length length using the Random class, and prefixes @prefix. + * + * Takes Parameters + * String @prefix - arbitrary alphanumeric prefix + * String @length - length of numeric ID + * Returns + * String @uuid - a unique string starting with @prefix, and concat. with a random number * * Example: length = 6, expected result should be under 999,999 and above 99,999. * If we just use 10^(length), this would generate any number under 1,000,000. @@ -133,7 +200,7 @@ public class Library * * Note: I am aware that this is overengineered, and that several random integers of amount @length could be used, * but this is considerably more efficient since there is no iteration involved in the creation of the ID. O(1) - */ + **/ private String generateUserID( String prefix, int length ) { Random random = new Random(); @@ -174,11 +241,11 @@ public class Library * Print Object Details Start */ - /* - * Prints to the terminal, in a human-readable format, library reservation in the itemList + /** + * Prints to the terminal, in a human-readable format, all LibraryReservation(s) * * Contains a marker at the start and end to visualise in terminal output. - */ + **/ public void printLibraryReservations() { System.out.println( "Reservation Details Start" ); for ( LibraryReservation reservation : libraryReservationMap.values() ){ @@ -188,11 +255,16 @@ public class Library System.out.println( "---------------\nReservation Details End\n" ); } - /* - * Prints to the terminal, in a human-readable format, all items in the itemList + /** + * Prints to the terminal, in a human-readable format, all: + * LibraryItem(s) + * LibraryUser(s) + * LibraryReservation(s) * - * Contains a marker at the start and end to visualise in terminal output. - */ + * Contains a marker at the start and end of each type to visualise in terminal output. + * For printing the LibraryReservation(s), the corresponding method is called to reduce + * code duplication. + **/ public void printAll() { System.out.println("\n\nItem Details Start"); @@ -212,6 +284,15 @@ public class Library printLibraryReservations(); } + /** + * Print, to the terminal all reservation entries in the diary. + * Takes Parameters + * String @start + * String @end + * + * This converts both string inputs to Date formats, and calls the printEntries + * method in the diary class. + */ public void printDiaryEntries( String start, String end ) { diary.printEntries( DateUtil.convertStringToDate( start ), DateUtil.convertStringToDate( end ) ); @@ -225,9 +306,10 @@ public class Library * Write Files Start */ - /* + /** * Write all current library reservations to a file specified by the user. - */ + * For each user, this passes a printWriter object to the writeData method of LibraryReservation. + **/ public void writeLibraryReservationData() { try { @@ -246,19 +328,19 @@ public class Library } } - /* + /** * A method to output all user data to a file using a fileDialog to specify file location. - * - */ + * For each user, this passes a printWriter object to the writeData method of LibraryUser. + **/ public void writeUserData() { try { Frame frame = null; // Initialise null frame FileDialog fileBox = new FileDialog( frame, "Save", FileDialog.SAVE ); // Initialise file dialog box to save written data. fileBox.setVisible( true ); - PrintWriter writer = new PrintWriter( new File( fileBox.getDirectory() + fileBox.getFile() ) ); + PrintWriter writer = new PrintWriter( new File( fileBox.getDirectory() + fileBox.getFile() ) ); // Create PrintWriter to write user data to. // for ( LibraryUser user : userList ){ - writer.println("[Library User data]"); + writer.println("[Library User data]"); // Write the type header into the file. for ( LibraryUser user : customerMap.values() ) { user.writeData( writer ); } @@ -277,9 +359,11 @@ public class Library * Read Files Start */ - /* + /** * Read Library Reservation Data from a file specified by the user. - */ + * This passes a scanner to the readData method in LibraryReservation for each + * line of the file. + **/ public void readLibraryReservationData() { try { @@ -300,16 +384,19 @@ public class Library catch( IOException e ) { // Catch any IO Exceptions that may occur from improper file selection. System.err.println( "Caught IOException: " + e.getMessage() + "\nAn I/O Exception has occurred, please check file is readable and correct format." ); } + catch ( NoSuchElementException e ) { // In the event of incorrect formats from a readable file, this prevents a program crash. + System.err.println( "Caught Exception: " + e.getMessage() + "\nEnsure File contains the correct information." ); + } } - /* + /** * A method to read all data from files using a fileDialog to specify file location. * This will create the corresponding objects depending on flags contained in the file * and populate it's fields. * * Default flag value: "book", to support legacy files. This will not interfere with * files of different flag orders. - */ + **/ public void readData() { Frame frame = null; // Initialise a null frame @@ -318,7 +405,7 @@ public class Library try { Scanner fileScanner = new Scanner( new File( fileBox.getDirectory() + fileBox.getFile() ) ); - String typeFlag = "book"; // Set a default flag to support legacy files. + String itemType = "book"; // Set a default flag to support legacy files. while( fileScanner.hasNextLine() ) { @@ -331,18 +418,18 @@ public class Library else if ( lineItem.startsWith("[" ) ) { if ( lineItem.toLowerCase().contains("book") ) - typeFlag = "book"; + itemType = "book"; else if ( lineItem.toLowerCase().contains("periodical") ) - typeFlag = "periodical"; + itemType = "periodical"; else if ( lineItem.toLowerCase().contains("cd") ) - typeFlag = "cd"; + itemType = "cd"; else if ( lineItem.toLowerCase().contains("dvd") ) - typeFlag = "dvd"; + itemType = "dvd"; else if ( lineItem.toLowerCase().contains("user") ) - typeFlag = "user"; + itemType = "user"; else { System.out.println( "Flag detected, but no accepted format...\n Cannot store item in Library. Changing Flag to generic and skipping the following: "); - typeFlag = "generic"; + itemType = "generic"; } } @@ -352,36 +439,36 @@ public class Library else { Scanner detailScanner = new Scanner ( lineItem ).useDelimiter(","); // Create a new scanner to grab the values in a comma separated list LibraryItem item = null; // Initialise LibraryItem object. Java compiler was being cautious here, so I have to assign the value null. - if ( typeFlag.equals( "book" ) ) { + if ( itemType.equals( "book" ) ) { // Process Book Data item = new Book(); } - else if ( typeFlag.equals( "periodical" ) ) { + else if ( itemType.equals( "periodical" ) ) { // Process Periodic Data item = new Periodical(); } - else if ( typeFlag.equals( "cd" ) ) { + else if ( itemType.equals( "cd" ) ) { //Process CD Data item = new CD(); } - else if ( typeFlag.equals( "dvd" ) ) { + else if ( itemType.equals( "dvd" ) ) { //Process DVD Data item = new DVD(); } - else if ( typeFlag.equals( "user" ) ) { + else if ( itemType.equals( "user" ) ) { //Process User Data LibraryUser user = new LibraryUser(); user.readData( detailScanner ); storeUser( user ); continue; } - else if ( typeFlag.equals( "generic" ) ) { + else if ( itemType.equals( "generic" ) ) { // Output unaccepted lines to terminal System.out.println( lineItem ); continue; } - item.readItemData( detailScanner ); + item.readItemData( detailScanner ); // Deduped from if statements storeItem( item ); detailScanner.close(); } @@ -391,6 +478,9 @@ public class Library catch( IOException e ) { // Catch any IO Exceptions that may occur from improper file selection. System.err.println( "Caught IOException: " + e.getMessage() + "\nAn I/O Exception has occurred, please check file is readable and correct format." ); } + catch ( NoSuchElementException e ) { // In the event of incorrect formats from a readable file, this prevents a program crash. + System.err.println( "Caught Exception: " + e.getMessage() + "\nEnsure File contains the correct information." ); + } } /** @@ -401,9 +491,18 @@ public class Library * Other Methods */ - /* - * Create a reservation to allow a user to reserve an item from the library. - */ + /** + * Create a reservation to allow a user to reserve an item from the library. Ensures a reservation is not already + * in place for a conflicting itemCode. + * Takes parameters + * String @userID + * String @itemCode + * String @startDate + * int @noOfDays + * + * Returns + * boolean + **/ public boolean makeLibraryReservation( String userID, String itemCode, String startDate, int noOfDays ) { if ( !customerMap.containsKey( userID ) ) @@ -433,8 +532,8 @@ public class Library * Unneeded, since addReservations returns any item currently on loan. Dates do not need to be checked for every day in loan. * Date end = DateUtil.incrementDate( start, noOfDays-1 ); */ - String rID = generateReservationNo(); - LibraryReservation reservation = new LibraryReservation( rID, itemCode, userID, startDate, noOfDays ); + String rID = generateReservationNo(); // Generate a sequential ID for the reservation. + LibraryReservation reservation = new LibraryReservation( rID, itemCode, userID, startDate, noOfDays ); // Create new reservation, passing parameters to the constructor. /** Instead of the following For loop, I could've implemented * Arrays.asList( diary.getReservation( start, end ).contains( reservation ) * Although this would've been easier, this implementation is more in the scope of what we have learned. @@ -443,20 +542,32 @@ public class Library { if ( diaryReservation.toString().equals( reservation.toString() ) ) { - return false; + System.err.println( "This item is already reserved" ); + return false; // Reservation unsuccessful } } storeLibraryReservation( reservation ); - return true; + itemsMap.get( itemCode ).setOnLoan( true ); // Set the loan status for the item when the reservation is made + return true; // Reservation successful } + /** + * Allows the deletion of a library reservation. + * + * Takes Parameter + * String @reservationNo + * + * Removes the corresponding value from the hashMap and diary. + */ public void deleteLibraryReservation( String reservationNo ) { if ( libraryReservationMap.containsKey( reservationNo ) ) { - diary.deleteReservation( libraryReservationMap.get( reservationNo ) ); - libraryReservationMap.remove( reservationNo ); + // Since the application does not know the time, or use timers, this is the best I can do to remove the loan status. + itemsMap.get ( libraryReservationMap.get( reservationNo ).getItemCode() ).setOnLoan( false ); + diary.deleteReservation( libraryReservationMap.get( reservationNo ) ); // Remove the reservation from the diary + libraryReservationMap.remove( reservationNo ); // Remove the reservation from the Map. } } } diff --git a/Semester 2/Programming 2/Project/Part 2/LibraryItem.class b/Semester 2/Programming 2/Project/Part 4 Complete/LibraryItem.class similarity index 65% rename from Semester 2/Programming 2/Project/Part 2/LibraryItem.class rename to Semester 2/Programming 2/Project/Part 4 Complete/LibraryItem.class index 3755f8a1326f62b78d6887aa670f598d1c2ec9e6..ed5411106373ff3d618f1871204779dbc490b19f 100644 GIT binary patch delta 189 zcmbO(JY9H0GAkq3VV5$nyd7iSaA7E# IoW^Mg08xP}NB{r; delta 189 zcmbO(JY9H0GAkqZaz4BGVU+$nypB$wxUlB-0sK7%~|688R897_t~N7_u467;+d~81g2k HaT)>uRFNw# diff --git a/Semester 2/Programming 2/Project/Part 2/LibraryItem.ctxt b/Semester 2/Programming 2/Project/Part 4 Complete/LibraryItem.ctxt similarity index 75% rename from Semester 2/Programming 2/Project/Part 2/LibraryItem.ctxt rename to Semester 2/Programming 2/Project/Part 4 Complete/LibraryItem.ctxt index 9d064c0..dc2f6f9 100644 --- a/Semester 2/Programming 2/Project/Part 2/LibraryItem.ctxt +++ b/Semester 2/Programming 2/Project/Part 4 Complete/LibraryItem.ctxt @@ -6,10 +6,10 @@ comment1.params= comment1.target=java.lang.String\ getItemCode() comment10.params= comment10.target=void\ printDetails() -comment10.text=\n\ Print\ to\ terminal,\ relevant\ field\ variables\n +comment10.text=\n\ Forms\ field\ variables\ in\ a\ desired\ format,\ prints\n\ to\ the\ PrintWriter,\ and\ flush\ to\ the\ file.\n\ Takes\ Parameter\n\ \ PrintWriter\ @writer\n comment11.params=detailScanner comment11.target=void\ readItemData(java.util.Scanner) -comment11.text=\n\ Passed\ a\ scanner\ object,\ assign\ values\ to\ relevant\ field\ variables\n +comment11.text=\n\ Populate\ the\ fields\ with\ details\ from\ the\ scanner\n\ Takes\ Parameters\n\ \ Scanner\ @detailScanner\n comment2.params= comment2.target=int\ getCost() comment3.params= diff --git a/Semester 2/Programming 2/Project/Part 2/LibraryItem.java b/Semester 2/Programming 2/Project/Part 4 Complete/LibraryItem.java similarity index 87% rename from Semester 2/Programming 2/Project/Part 2/LibraryItem.java rename to Semester 2/Programming 2/Project/Part 4 Complete/LibraryItem.java index dbc3000..599c202 100644 --- a/Semester 2/Programming 2/Project/Part 2/LibraryItem.java +++ b/Semester 2/Programming 2/Project/Part 4 Complete/LibraryItem.java @@ -1,12 +1,11 @@ import java.util.Scanner; -import java.util.ArrayList; import java.util.NoSuchElementException; /** * Superclass of items / assets stored in a Library. * * @author George Wilkinson - * @version 3.1 + * @version 4.1 */ public abstract class LibraryItem { @@ -80,9 +79,12 @@ public abstract class LibraryItem * Field Mutator End */ - /* - * Print to terminal, relevant field variables - */ + /** + * Forms field variables in a desired format, prints + * to the PrintWriter, and flush to the file. + * Takes Parameter + * PrintWriter @writer + */ public void printDetails() { System.out.println("Item Code: " + itemCode + @@ -95,9 +97,11 @@ public abstract class LibraryItem System.out.println( "Available to Loan"); } - /* - * Passed a scanner object, assign values to relevant field variables - */ + /** + * Populate the fields with details from the scanner + * Takes Parameters + * Scanner @detailScanner + */ public void readItemData( Scanner detailScanner ) { if ( detailScanner != null ) { diff --git a/Semester 2/Programming 2/Project/Part 4 Complete/LibraryReservation.class b/Semester 2/Programming 2/Project/Part 4 Complete/LibraryReservation.class new file mode 100644 index 0000000000000000000000000000000000000000..623b67985cb63c3c3ed5f886083cd7377b97c29d GIT binary patch literal 3132 zcmbVOTXz#x6#gbja~TFGDdk!;a?z5~77?uiRwxk-rY(?`i;6l;hjt*Hl*yz}@vi7{ z`Qml4{0}~;%NCZd<)aV&CD(HK?K9KNkPa`toU_lFefjp@-#*FT|Nj0bfTOsp<1w7g zVGmxDr6S9?jtNYPbWWD@8C=kj#aUUZSxm`3ox??3%HnbsSF(6Li#NpR%`C3U*SE5G zTgN*vvzXCQ!>lZpj%%3HF%MhEb==6Hp232Kjjq+S+$Gbq8_q;SL%wp|Tr!92rZYEO z^<3MTJFX#Xd)C6~#;m0w-J*KAq#@VzOxG)!9xuCnqn2mahvi00oW|s}lDXW}pp|KM z!gg$LR70hIeSrUWQ$Bc6L&`_BxneukL~CKja;MChIw9pNjhb1%Xu7tXgUggRZxhhg zO2wXWO?UZ1m^&dS`^97ToaIICr6ybZ53Yx(VFNYG?ZOy5Rl}0x*KDFi5sQg-T^Ns* z>29uz*BetKfwqCFVZa#RramdggS zai)eHL2SD*d`^@u$tU-?gik9qS3|E~jSdy|+_lVE-_5qbjmo}SGaV;zvT;^L4X!lw z_`V*}BP*Fq?Z&vd7&K0=Hd=1YI%7*~x3BNskdW5EQy4PvI0^=ykYz6l88`+SSTwK? z`wbkxleF(-_*l!X&swg5n_zYtEnmdp44MW!wAlU#9ST0ljulu$U3yUv0?JX>r5S~C zNe+2k#(>`z7A&X6Av#8ZO*ercJJH;d>xI+r!c$8nd?@~V_yW!G>4Prt~Hz`%OzQ4w5J;K zMZ^9$!bKV*S{#tHxwvRKvl<2;tsi+fg0j*uf~mUPWYsuqjTVu0Fo~!vbAbjs0+k1<-|rFq~3C zNUnDBTd#5>H)e|kS_Le z&HSRA6uCZz4A)&qVK;K`swC+Ji-7M5)HLxbX%Y=+Qk5nt)HueAK~C}{j; z34BcvnvlKt2eMc0BUdDCSE1)OaG{)v$VtkpFgn@cs963)6x$OqinVe2iX$fxrhmo8 zAV_|b?_EXO?91Xk-|fpP>K0#4KR{kS_4vokDz@f(DHF*mwuObvt9f2x&6jbWzj9N! z69G2e2KEw82C08ZV8XodfsWj_`=Jz~KvswXc@0r;6hsQlj)7I|3;}IYPt9GtiqBEO z7m<#Pw>vV9Qy3#04X05GVEq`7Wo+OtoGjAku2rzliBL?2Vroqcp3Xr10r~=FB-Qid yKcQc39l7v5$NvW+xEH}T*2Xr5mvM%eUSWy&K>kBTjmgN1R{jsE`B>Kg literal 0 HcmV?d00001 diff --git a/Semester 2/Programming 2/Project/Part 4 Complete/LibraryReservation.ctxt b/Semester 2/Programming 2/Project/Part 4 Complete/LibraryReservation.ctxt new file mode 100644 index 0000000..cbabb7c --- /dev/null +++ b/Semester 2/Programming 2/Project/Part 4 Complete/LibraryReservation.ctxt @@ -0,0 +1,42 @@ +#BlueJ class context +comment0.params=reservationNo\ itemCode\ userID\ startDate\ noOfDays +comment0.target=LibraryReservation(java.lang.String,\ java.lang.String,\ java.lang.String,\ java.lang.String,\ int) +comment0.text=\n\ Constructor\ for\ objects\ of\ class\ LibraryReservation\n +comment1.params= +comment1.target=LibraryReservation() +comment1.text=\n\ Default\ Constructor\ for\ objects\ of\ class\ LibraryReservation\n +comment10.params=startDate +comment10.target=void\ setStartDate(java.lang.String) +comment11.params=noOfDays +comment11.target=void\ setNoOfDays(int) +comment12.params= +comment12.target=java.lang.String\ toString() +comment12.text=\n\ Concatenates\ values\ to\ output\ a\ formatted\ string.\n +comment13.params= +comment13.target=void\ printDetails() +comment13.text=\n\ Prints\ to\ terminal,\ the\ details\ of\ the\ reservation.\n +comment14.params=writer +comment14.target=void\ writeData(java.io.PrintWriter) +comment14.text=\n\ Forms\ field\ variables\ in\ a\ desired\ format,\ prints\n\ to\ the\ PrintWriter,\ and\ flush\ to\ the\ file.\n\ Takes\ Parameter\n\ \ PrintWriter\ @writer\n +comment15.params=detailScanner +comment15.target=void\ readData(java.util.Scanner) +comment15.text=\n\ Populate\ the\ fields\ with\ details\ from\ the\ scanner\n\ Takes\ Parameters\n\ \ Scanner\ @detailScanner\n +comment2.params= +comment2.target=java.lang.String\ getReservationNo() +comment2.text=\n\ Accessor\ Start\n +comment3.params= +comment3.target=java.lang.String\ getItemCode() +comment4.params= +comment4.target=java.lang.String\ userID() +comment5.params= +comment5.target=java.util.Date\ getStartDate() +comment6.params= +comment6.target=int\ getNoOfDays() +comment7.params=reservationNo +comment7.target=void\ setReservationNo(java.lang.String) +comment7.text=\n\ Mutator\ Start\n +comment8.params=itemCode +comment8.target=void\ setItemCode(java.lang.String) +comment9.params=userID +comment9.target=void\ setUserID(java.lang.String) +numComments=16 diff --git a/Semester 2/Programming 2/Project/Part 2/LibraryReservation.java b/Semester 2/Programming 2/Project/Part 4 Complete/LibraryReservation.java similarity index 83% rename from Semester 2/Programming 2/Project/Part 2/LibraryReservation.java rename to Semester 2/Programming 2/Project/Part 4 Complete/LibraryReservation.java index fbd4836..3cfcd62 100644 --- a/Semester 2/Programming 2/Project/Part 2/LibraryReservation.java +++ b/Semester 2/Programming 2/Project/Part 4 Complete/LibraryReservation.java @@ -31,14 +31,86 @@ public class LibraryReservation this.noOfDays = noOfDays; } + /** + * Default Constructor for objects of class LibraryReservation + */ public LibraryReservation(){} + /** + * Accessor Start + */ + + public String getReservationNo() + { + return reservationNo; + } + + public String getItemCode() + { + return itemCode; + } + + public String userID() + { + return userID; + } + + public Date getStartDate() + { + return startDate; + } + + public int getNoOfDays() + { + return noOfDays; + } + + /** + * Accessor End + */ + + /** + * Mutator Start + */ + + public void setReservationNo( String reservationNo ) + { + this.reservationNo = reservationNo; + } + + public void setItemCode( String itemCode ) + { + this.itemCode = itemCode; + } + + public void setUserID( String userID ) + { + this.userID = userID; + } + + public void setStartDate( String startDate ) + { + this.startDate = DateUtil.convertStringToDate( startDate ); + } + + public void setNoOfDays( int noOfDays ) + { + this.noOfDays = noOfDays; + } + + /** + * Mutator End + */ + + /** + * Concatenates values to output a formatted string. + */ public String toString() { return reservationNo + " " + userID + " " + itemCode; } - /* + /** * Prints to terminal, the details of the reservation. */ public void printDetails() @@ -50,12 +122,23 @@ public class LibraryReservation "\nDuration: " + noOfDays + " days" ); } + /** + * Forms field variables in a desired format, prints + * to the PrintWriter, and flush to the file. + * Takes Parameter + * PrintWriter @writer + */ public void writeData( PrintWriter writer ) { writer.print( reservationNo + "," + itemCode + "," + userID + "," + DateUtil.convertDateToShortString( startDate ) + "," + noOfDays ); writer.flush(); } + /** + * Populate the fields with details from the scanner + * Takes Parameters + * Scanner @detailScanner + */ public void readData( Scanner detailScanner ) { if ( detailScanner != null ) { @@ -66,98 +149,4 @@ public class LibraryReservation this.noOfDays = Integer.parseInt( detailScanner.next().trim() ); } } - - /* - * Start Accessor - */ - - /* - * Return value of @reservationNo - */ - public String getReservationNo() - { - return reservationNo; - } - - /* - * Return value of @itemCode - */ - public String getItemCode() - { - return itemCode; - } - - /* - * Return value of @userID - */ - public String getUserID() - { - return userID; - } - - /* - * Return value of @startDate - */ - public Date getStartDate() - { - return startDate; - } - - /* - * Return value of @noOfDays - */ - public int getNoOfDays() - { - return noOfDays; - } - - /* - * End Accessor - * - * Start Mutator - */ - - /* - * Set @reservationNo to a new value - */ - public void setReservationNo( String reservationNo ) - { - this.reservationNo = reservationNo; - } - - /* - * Set @itemCode to a new value - */ - public void setItemCode( String itemCode ) - { - this.itemCode = itemCode; - } - - /* - * Set @userID to a new value - */ - public void setUserID( String userID ) - { - this.userID = userID; - } - - /* - * Set @startDate to a new value - */ - public void setStartDate( String startDate ) - { - this.startDate = DateUtil.convertStringToDate( startDate ); - } - - /* - * Set @noOfDays to a new value - */ - public void setNoOfDays( int noOfDays ) - { - this.noOfDays = noOfDays; - } - - /* - * End Mutator - */ } diff --git a/Semester 2/Programming 2/Project/Part 2/LibraryUser.class b/Semester 2/Programming 2/Project/Part 4 Complete/LibraryUser.class similarity index 61% rename from Semester 2/Programming 2/Project/Part 2/LibraryUser.class rename to Semester 2/Programming 2/Project/Part 4 Complete/LibraryUser.class index 743acacaaf485a1c7f8871596a1637161b560d15..8e3ccd472f894fa0bb811c8a62a6180b3a71a2f1 100644 GIT binary patch delta 169 zcmZ1=v_NRXB^E~M$pWmRlV7l?Gb#XCHjJuZeiEztCYa@Y(eo3P7F-T@T#0E&8oMOoMlSbc#!KQJ$Vy^=GA!HXf5 z!H*$s@+I~@)>H-`hV;p)9L16a3@i+V4Ezj53{nim45|zz3>E+pQmQ~P}frY`2L5RVgL6*URL5aa>@;z340ANrB`~Uy| delta 29 kcmeC>>E+pQmQ~P#frY`6L5RVML6*UqL5ab3@;z340AC9Q;{X5v diff --git a/Semester 2/Programming 2/Project/Part 2/PrintedItem.ctxt b/Semester 2/Programming 2/Project/Part 4 Complete/PrintedItem.ctxt similarity index 82% rename from Semester 2/Programming 2/Project/Part 2/PrintedItem.ctxt rename to Semester 2/Programming 2/Project/Part 4 Complete/PrintedItem.ctxt index 7c972b9..a4f1f89 100644 --- a/Semester 2/Programming 2/Project/Part 2/PrintedItem.ctxt +++ b/Semester 2/Programming 2/Project/Part 4 Complete/PrintedItem.ctxt @@ -14,4 +14,5 @@ comment4.target=void\ printDetails() comment4.text=\n\ Field\ Mutator\ End\n comment5.params=detailScanner comment5.target=void\ readItemData(java.util.Scanner) +comment5.text=\n\ Populate\ the\ fields\ with\ details\ from\ the\ scanner\n\ Takes\ Parameters\n\ \ Scanner\ @detailScanner\n numComments=6 diff --git a/Semester 2/Programming 2/Project/Part 2/PrintedItem.java b/Semester 2/Programming 2/Project/Part 4 Complete/PrintedItem.java similarity index 90% rename from Semester 2/Programming 2/Project/Part 2/PrintedItem.java rename to Semester 2/Programming 2/Project/Part 4 Complete/PrintedItem.java index de8467e..b86ae86 100644 --- a/Semester 2/Programming 2/Project/Part 2/PrintedItem.java +++ b/Semester 2/Programming 2/Project/Part 4 Complete/PrintedItem.java @@ -3,7 +3,7 @@ * Subclass of LibraryItem to create objects of printed items in a library. * * @George Wilkinson - * @1.0 + * @1.1 */ import java.util.Scanner; @@ -52,6 +52,11 @@ public abstract class PrintedItem extends LibraryItem super.printDetails(); } + /** + * Populate the fields with details from the scanner + * Takes Parameters + * Scanner @detailScanner + */ public void readItemData( Scanner detailScanner ){ if ( detailScanner != null ) { this.noOfPages = Integer.parseInt( detailScanner.next().trim() ); diff --git a/Semester 2/Programming 2/Project/Part 2/README.TXT b/Semester 2/Programming 2/Project/Part 4 Complete/README.TXT similarity index 100% rename from Semester 2/Programming 2/Project/Part 2/README.TXT rename to Semester 2/Programming 2/Project/Part 4 Complete/README.TXT diff --git a/Semester 2/Programming 2/Project/Part 2/data/item_data_1.txt b/Semester 2/Programming 2/Project/Part 4 Complete/data/item_data_1.txt similarity index 100% rename from Semester 2/Programming 2/Project/Part 2/data/item_data_1.txt rename to Semester 2/Programming 2/Project/Part 4 Complete/data/item_data_1.txt diff --git a/Semester 2/Programming 2/Project/Part 2/data/item_data_1_v2.txt b/Semester 2/Programming 2/Project/Part 4 Complete/data/item_data_1_v2.txt similarity index 100% rename from Semester 2/Programming 2/Project/Part 2/data/item_data_1_v2.txt rename to Semester 2/Programming 2/Project/Part 4 Complete/data/item_data_1_v2.txt diff --git a/Semester 2/Programming 2/Project/Part 2/data/item_data_2.txt b/Semester 2/Programming 2/Project/Part 4 Complete/data/item_data_2.txt similarity index 100% rename from Semester 2/Programming 2/Project/Part 2/data/item_data_2.txt rename to Semester 2/Programming 2/Project/Part 4 Complete/data/item_data_2.txt diff --git a/Semester 2/Programming 2/Project/Part 2/data/item_data_2_generic_test.txt b/Semester 2/Programming 2/Project/Part 4 Complete/data/item_data_2_generic_test.txt similarity index 100% rename from Semester 2/Programming 2/Project/Part 2/data/item_data_2_generic_test.txt rename to Semester 2/Programming 2/Project/Part 4 Complete/data/item_data_2_generic_test.txt diff --git a/Semester 2/Programming 2/Project/Part 2/data/items_all.txt b/Semester 2/Programming 2/Project/Part 4 Complete/data/items_all.txt similarity index 100% rename from Semester 2/Programming 2/Project/Part 2/data/items_all.txt rename to Semester 2/Programming 2/Project/Part 4 Complete/data/items_all.txt diff --git a/Semester 2/Programming 2/Project/Part 2/data/items_and_user_data.txt b/Semester 2/Programming 2/Project/Part 4 Complete/data/items_and_user_data.txt similarity index 100% rename from Semester 2/Programming 2/Project/Part 2/data/items_and_user_data.txt rename to Semester 2/Programming 2/Project/Part 4 Complete/data/items_and_user_data.txt diff --git a/Semester 2/Programming 2/Project/Part 2/data/library_user_data.txt b/Semester 2/Programming 2/Project/Part 4 Complete/data/library_user_data.txt similarity index 100% rename from Semester 2/Programming 2/Project/Part 2/data/library_user_data.txt rename to Semester 2/Programming 2/Project/Part 4 Complete/data/library_user_data.txt diff --git a/Semester 2/Programming 2/Project/Part 2/data/testreservationwrite.txt b/Semester 2/Programming 2/Project/Part 4 Complete/data/testreservationwrite.txt similarity index 100% rename from Semester 2/Programming 2/Project/Part 2/data/testreservationwrite.txt rename to Semester 2/Programming 2/Project/Part 4 Complete/data/testreservationwrite.txt diff --git a/Semester 2/Programming 2/Project/Part 2/data/testuserwrite.txt b/Semester 2/Programming 2/Project/Part 4 Complete/data/testuserwrite.txt similarity index 100% rename from Semester 2/Programming 2/Project/Part 2/data/testuserwrite.txt rename to Semester 2/Programming 2/Project/Part 4 Complete/data/testuserwrite.txt diff --git a/Semester 2/Programming 2/Project/Part 2/doc/Book.html b/Semester 2/Programming 2/Project/Part 4 Complete/doc/Book.html similarity index 100% rename from Semester 2/Programming 2/Project/Part 2/doc/Book.html rename to Semester 2/Programming 2/Project/Part 4 Complete/doc/Book.html diff --git a/Semester 2/Programming 2/Project/Part 2/doc/DateUtil.html b/Semester 2/Programming 2/Project/Part 4 Complete/doc/DateUtil.html similarity index 100% rename from Semester 2/Programming 2/Project/Part 2/doc/DateUtil.html rename to Semester 2/Programming 2/Project/Part 4 Complete/doc/DateUtil.html diff --git a/Semester 2/Programming 2/Project/Part 2/doc/Diary.html b/Semester 2/Programming 2/Project/Part 4 Complete/doc/Diary.html similarity index 100% rename from Semester 2/Programming 2/Project/Part 2/doc/Diary.html rename to Semester 2/Programming 2/Project/Part 4 Complete/doc/Diary.html diff --git a/Semester 2/Programming 2/Project/Part 2/doc/Library.html b/Semester 2/Programming 2/Project/Part 4 Complete/doc/Library.html similarity index 100% rename from Semester 2/Programming 2/Project/Part 2/doc/Library.html rename to Semester 2/Programming 2/Project/Part 4 Complete/doc/Library.html diff --git a/Semester 2/Programming 2/Project/Part 2/doc/LibraryItem.html b/Semester 2/Programming 2/Project/Part 4 Complete/doc/LibraryItem.html similarity index 100% rename from Semester 2/Programming 2/Project/Part 2/doc/LibraryItem.html rename to Semester 2/Programming 2/Project/Part 4 Complete/doc/LibraryItem.html diff --git a/Semester 2/Programming 2/Project/Part 2/doc/allclasses-frame.html b/Semester 2/Programming 2/Project/Part 4 Complete/doc/allclasses-frame.html similarity index 100% rename from Semester 2/Programming 2/Project/Part 2/doc/allclasses-frame.html rename to Semester 2/Programming 2/Project/Part 4 Complete/doc/allclasses-frame.html diff --git a/Semester 2/Programming 2/Project/Part 2/doc/allclasses-noframe.html b/Semester 2/Programming 2/Project/Part 4 Complete/doc/allclasses-noframe.html similarity index 100% rename from Semester 2/Programming 2/Project/Part 2/doc/allclasses-noframe.html rename to Semester 2/Programming 2/Project/Part 4 Complete/doc/allclasses-noframe.html diff --git a/Semester 2/Programming 2/Project/Part 2/doc/constant-values.html b/Semester 2/Programming 2/Project/Part 4 Complete/doc/constant-values.html similarity index 100% rename from Semester 2/Programming 2/Project/Part 2/doc/constant-values.html rename to Semester 2/Programming 2/Project/Part 4 Complete/doc/constant-values.html diff --git a/Semester 2/Programming 2/Project/Part 2/doc/index.html b/Semester 2/Programming 2/Project/Part 4 Complete/doc/index.html similarity index 100% rename from Semester 2/Programming 2/Project/Part 2/doc/index.html rename to Semester 2/Programming 2/Project/Part 4 Complete/doc/index.html diff --git a/Semester 2/Programming 2/Project/Part 2/doc/logfile.txt b/Semester 2/Programming 2/Project/Part 4 Complete/doc/logfile.txt similarity index 100% rename from Semester 2/Programming 2/Project/Part 2/doc/logfile.txt rename to Semester 2/Programming 2/Project/Part 4 Complete/doc/logfile.txt diff --git a/Semester 2/Programming 2/Project/Part 2/doc/package-frame.html b/Semester 2/Programming 2/Project/Part 4 Complete/doc/package-frame.html similarity index 100% rename from Semester 2/Programming 2/Project/Part 2/doc/package-frame.html rename to Semester 2/Programming 2/Project/Part 4 Complete/doc/package-frame.html diff --git a/Semester 2/Programming 2/Project/Part 2/doc/package-list b/Semester 2/Programming 2/Project/Part 4 Complete/doc/package-list similarity index 100% rename from Semester 2/Programming 2/Project/Part 2/doc/package-list rename to Semester 2/Programming 2/Project/Part 4 Complete/doc/package-list diff --git a/Semester 2/Programming 2/Project/Part 2/doc/package-summary.html b/Semester 2/Programming 2/Project/Part 4 Complete/doc/package-summary.html similarity index 100% rename from Semester 2/Programming 2/Project/Part 2/doc/package-summary.html rename to Semester 2/Programming 2/Project/Part 4 Complete/doc/package-summary.html diff --git a/Semester 2/Programming 2/Project/Part 2/doc/resources/inherit.gif b/Semester 2/Programming 2/Project/Part 4 Complete/doc/resources/inherit.gif similarity index 100% rename from Semester 2/Programming 2/Project/Part 2/doc/resources/inherit.gif rename to Semester 2/Programming 2/Project/Part 4 Complete/doc/resources/inherit.gif diff --git a/Semester 2/Programming 2/Project/Part 2/doc/stylesheet.css b/Semester 2/Programming 2/Project/Part 4 Complete/doc/stylesheet.css similarity index 100% rename from Semester 2/Programming 2/Project/Part 2/doc/stylesheet.css rename to Semester 2/Programming 2/Project/Part 4 Complete/doc/stylesheet.css diff --git a/Semester 2/Programming 2/Project/Part 2/nullnull b/Semester 2/Programming 2/Project/Part 4 Complete/nullnull similarity index 100% rename from Semester 2/Programming 2/Project/Part 2/nullnull rename to Semester 2/Programming 2/Project/Part 4 Complete/nullnull diff --git a/Semester 2/Programming 2/Project/Part 4 Complete/package.bluej b/Semester 2/Programming 2/Project/Part 4 Complete/package.bluej new file mode 100644 index 0000000..30276f6 --- /dev/null +++ b/Semester 2/Programming 2/Project/Part 4 Complete/package.bluej @@ -0,0 +1,179 @@ +#BlueJ package file +dependency1.from=Library +dependency1.to=Book +dependency1.type=UsesDependency +dependency2.from=Library +dependency2.to=Periodical +dependency2.type=UsesDependency +dependency3.from=Library +dependency3.to=LibraryItem +dependency3.type=UsesDependency +dependency4.from=Library +dependency4.to=CD +dependency4.type=UsesDependency +dependency5.from=Library +dependency5.to=DVD +dependency5.type=UsesDependency +dependency6.from=Library +dependency6.to=LibraryUser +dependency6.type=UsesDependency +dependency7.from=LibraryReservation +dependency7.to=DateUtil +dependency7.type=UsesDependency +dependency8.from=Library +dependency8.to=LibraryReservation +dependency8.type=UsesDependency +objectbench.height=76 +objectbench.width=940 +package.editor.height=874 +package.editor.width=814 +package.editor.x=0 +package.editor.y=31 +package.numDependencies=8 +package.numTargets=11 +package.showExtends=true +package.showUses=true +project.charset=UTF-8 +target1.editor.height=700 +target1.editor.width=900 +target1.editor.x=1017 +target1.editor.y=76 +target1.height=50 +target1.name=PrintedItem +target1.naviview.expanded=true +target1.showInterface=false +target1.type=AbstractTarget +target1.typeParameters= +target1.width=110 +target1.x=130 +target1.y=240 +target10.editor.height=700 +target10.editor.width=900 +target10.editor.x=960 +target10.editor.y=146 +target10.height=50 +target10.name=AudioVisual +target10.naviview.expanded=true +target10.showInterface=false +target10.type=AbstractTarget +target10.typeParameters= +target10.width=110 +target10.x=380 +target10.y=240 +target11.editor.height=700 +target11.editor.width=900 +target11.editor.x=40 +target11.editor.y=51 +target11.height=50 +target11.name=LibraryReservation +target11.naviview.expanded=true +target11.showInterface=false +target11.type=ClassTarget +target11.typeParameters= +target11.width=160 +target11.x=230 +target11.y=440 +target2.editor.height=786 +target2.editor.width=960 +target2.editor.x=34 +target2.editor.y=174 +target2.height=50 +target2.name=CD +target2.naviview.expanded=true +target2.showInterface=false +target2.type=ClassTarget +target2.typeParameters= +target2.width=80 +target2.x=360 +target2.y=340 +target3.editor.height=700 +target3.editor.width=900 +target3.editor.x=557 +target3.editor.y=177 +target3.height=60 +target3.name=LibraryItem +target3.naviview.expanded=true +target3.showInterface=false +target3.type=AbstractTarget +target3.typeParameters= +target3.width=120 +target3.x=250 +target3.y=110 +target4.editor.height=1049 +target4.editor.width=1920 +target4.editor.x=0 +target4.editor.y=31 +target4.height=50 +target4.name=DVD +target4.naviview.expanded=true +target4.showInterface=false +target4.type=ClassTarget +target4.typeParameters= +target4.width=80 +target4.x=470 +target4.y=380 +target5.editor.height=700 +target5.editor.width=900 +target5.editor.x=55 +target5.editor.y=274 +target5.height=50 +target5.name=LibraryUser +target5.naviview.expanded=true +target5.showInterface=false +target5.type=ClassTarget +target5.typeParameters= +target5.width=110 +target5.x=100 +target5.y=170 +target6.editor.height=700 +target6.editor.width=1619 +target6.editor.x=192 +target6.editor.y=267 +target6.height=50 +target6.name=Periodical +target6.naviview.expanded=true +target6.showInterface=false +target6.type=ClassTarget +target6.typeParameters= +target6.width=90 +target6.x=60 +target6.y=380 +target7.editor.height=1049 +target7.editor.width=1920 +target7.editor.x=0 +target7.editor.y=31 +target7.height=50 +target7.name=Book +target7.naviview.expanded=true +target7.showInterface=false +target7.type=ClassTarget +target7.typeParameters= +target7.width=80 +target7.x=180 +target7.y=340 +target8.editor.height=700 +target8.editor.width=900 +target8.editor.x=40 +target8.editor.y=51 +target8.height=50 +target8.name=DateUtil +target8.naviview.expanded=true +target8.showInterface=false +target8.type=ClassTarget +target8.typeParameters= +target8.width=80 +target8.x=70 +target8.y=10 +target9.editor.height=1049 +target9.editor.width=1920 +target9.editor.x=0 +target9.editor.y=31 +target9.height=50 +target9.name=Library +target9.naviview.expanded=true +target9.showInterface=false +target9.type=ClassTarget +target9.typeParameters= +target9.width=100 +target9.x=260 +target9.y=240