6. praktikum - kontrolltöö näidisülesanne
NB! Näidisülesande lahendamine on küllaltki töömahukas. Tegelikult tuleb kontrolltöös lühem ülesanne, milles kõiki näidisülesandes toodud asju ei nõuta.
Automaattestimise võimaldamiseks peavad kõik klassid asuma kindlas paketis ja kõik Java failid peavad olema kindla kodeeringuga. Antud juhul lepime kokku, et klassid asuvad vaikepaketis (st. failide alguses ei ole package direktiivi) ja failide kodeering on UTF-8. Kodeeringu määramise juhise leiate 4. praktikumi materjali algusest.
Raamatukogust saab laenutada erinevaid teoseid - raamatuid ja ajakirju. Teoseid laenutatakse erinevateks tähtaegadeks vastavalt tähisele: roheline tähis – 24 tunniks (ehk 1 päevaks), tähis puudub – 14 päevaks, kollane – 30 päevaks ja sinine – 60 päevaks. Kui teoseid tähtajaks tagasi ei vii, tuleb hakata maksma viivist vastavalt korraldusele: 30 ja 60 päeva laenutus – 0.05 eurot teose kohta iga ületatud päeva eest, 14 päeva laenutus – 0.15 eurot teose kohta iga ületatud päeva eest, 24 tunni laenutus – 2 eurot teose kohta iga ületatud päeva eest. Tavaliselt tuuakse kõik teosed tähtajaks tagasi, aga mõned tegelased kipuvad tähtaegu täielikult ignoreerima. Kirjutame programmi, mis otsib laenutuste nimekirjast väga suurte viivistega laenutusi ja kõige suurema viivisega laenutaja ja väljastab neile hoiatusi.
Laenutuste andmed on kirjas failis järgmises formaadis:
Aksel Telgmaa, Matemaatika VI klassile; kollane; Joosep Kask; 125 Kodu ja aed/2013,10; kollane; Teele Tamm; 59 Oskar Luts, Kevade; sinine; Teele Tamm; 39 Artur Jürisson, Eesti-inglise õigussõnaraamat; puudub; Jaan Aruhein; 224 Juhani Püttsepp, Peipsimaa kaart; roheline; Joosep Kask; 22 Kroonika/2010,15; puudub; Joosep Kask; 4
Failis on igal real teose kirjeldus, teose tähis, laenutaja nimi ja laenutatud päevade arv. Eraldajaks on semikoolon koos tühikuga. Raamatute puhul on kirjelduseks autori nimi, koma koos tühikuga ja raamatu pealkiri. Ajakirjade puhul on kirjelduseks pealkiri, kaldkriips, aasta number, koma ja ajakirja number. Võib eeldada, et kui kirjelduses kaldkriipsu pole, siis tegu on raamatuga.
Kontrolltöö seisneb teoste tagastamist arvestava programmi koostamises. Programm peab vastama alltoodud nõuetele (isegi kui need kummalised tunduvad). Programm peab sisaldama abstraktse klassi Teos, liidest Kontrollija, klasse Ajakiri, Raamat, ViiviseHoiataja, SuurimaViiviseLeidja ning peaklassi. Peaklassis loetakse sisse teoste nimekiri ja kasutatakse viivise kontrollijaid, et hilinejatele hoiatusi saata. Peaklassis testitakse ka erinevate isendimeetodite tööd. Kõikide klasside kõik isendiväljad peavad olema privaatsed.
1. Liides Kontrollija sisaldab void-tüüpi meetodit salvestaViivis, mis võtab parameetriteks laenutaja nime (String), teose kirjelduse (String) ja viivise suuruse (double).
2. Klass ViiviseHoiataja realiseerib liidest Kontrollija. 
- Klassis peab olema ühe doubleargumendiga konstruktor, mille abil saab määrata lubatud viivise.
- Meetod salvestaViivispeab argumendiks saadud laenutaja nime meelde jätma, kui viivis ületab lubatud viivise piiri ja kui seda nime pole veel salvestatud.
- Meetod getHoiatatavadLaenutajadpeab tagastama listi kõigi nende laenutajate nimedega, kelle viivise suurus ületab lubatud piiri.
3. Klass SuurimaViiviseLeidja realiseerib liidest Kontrollija. 
- Klassis peab olema void-tüüpi parameetriteta meetodsaadaHoiatus, mis prindib ekraanile kõige suurema viivisega laenutaja nime ja tema poolt laenutatud teose kirjelduse.
- Mälu kokkuhoiu mõttes ei tohiks SuurimaViiviseLeidjajätta meelde rohkem andmeid, kui on tarvis suurima viivisega inimesele hoiatuse saatmiseks (see tähendab, etViiviseHoiatajaningSuurimaViiviseLeidjapeaks meetodisalvestaViivisrealiseerima erinevalt.) (Vihje: jäta alati meelde vaid suurima viivise andmed.)
4. Abstraktsel klassil Teos peab olema konstruktor teose kirjelduse (String), teose tähise (String), laenutaja (String) ja päevade arvu (int) määramiseks.
- Klassis on abstraktne boolean-tüüpi meetodkasHoidlast, mis näitab, kas teost on vaja tellida hoidlast.
- Samuti on parameetriteta int-tüüpi isendimeetodlaenutusaeg, mis tagastab selle teose laenutusaja (ehk mitmeks päevaks teost tähise järgi on lubatud laenutada). Kui tähis on erinev kuiroheline,kollane,sinine,puudub, siis tagastatakse 0.
- Samuti on klassis double-tüüpi parameetriteta meetodpäevaneViivis, mis tagastab vastavalt tähisele sobiva viivise ühe tähtaega ületanud päeva kohta.
- Samuti on klassis void-tüüpi meetodarvutaViivis, mis võtab parameetriksKontrollijaisendi. Tähtaja ületanud laenutuse korral arvutab meetod viivise suuruse ja laseb kontrollijal selle salvestada (salvestaViivis).
- Samuti on klassis TeosmeetodtoString, mis aitab kogu teadaolevat infot teose ja selle laenutamise kohta sobivalt kujundada. Muuhulgas peab olema näidatud, kas teost on vaja tellida hoidlast.
- Klass Teosrealiseerib liidestComparable<Teos>, kusjuurescompareTomeetod realiseeritakse nii, et teoseid võrreldakse kirjelduse alusel.
5. Klass Raamat on klassi Teos alamklass. Klassis on konstruktor vajaliku info määramiseks ja vähemalt järgmised meetodid.
- Meetod kasHoidlast, mis tagastabtrue, kui raamatu tähis on kollane või sinine, vastasel juhul tagastataksefalse.
- Meetod toString, mis tagastab ülemklassitoStringtulemuse koos märkusega, et tegemist on raamatuga.
6. Klass Ajakiri on klassi Teos alamklass. Klassis on konstruktor vajaliku info määramiseks ja vähemalt järgmised meetodid.
- Meetod kasHoidlast, mis tagastabtrue, kui ajakiri ilmus aastal 2000 või varem, vastasel juhul tagastataksefalse.
- Meetod toString, mille ülekatmisel on rakendatud ülemklassi meetodittoStringlisades märkuse selle kohta, et tegemist on ajakirjaga.
7. Peaklass peab olema nimega Peaklass. Klassis peab olema staatiline avalik meetod loeTeosed tagastustüübiga List<Teos>, mis võtab argumendiks failinime ja tagastab selles failis olevad laenutuste andmed. Meetod võib visata erindi (st. meetodi signatuuris võib olla throws Exception). Teoste faili formaat on ülalpool toodud. Teoste arv failis ei ole teada (programm peaks töötama suvalise (ka tühja) failiga). Kui failist lugemist ei õnnestu programmeerida, siis kirjutatagu selles meetodis vastav list programmi sisse (vähendab tulemust 2 punkti võrra).
Peameetodis tehakse järgmised tegevused.
- Rakendatakse vastavat staatilist meetodit, et lugeda failist teoste andmed.
- Sorteeritakse teoseid vastavalt meetodis compareTokirjeldatud järjekorrale (listi sorteerida saab kasutades meetoditjava.util.Collections.sort(List<T> list)).
- Luuakse ViiviseHoiataja(lubatud viivis 0.2€) jaSuurimaViiviseLeidjaisendid.
- Kutsutakse iga teose peal arvutaViivis, andes parameetriksViiviseHoiatajaisendi. Pärast kõigi viiviste arvutamist prindi väljaViiviseHoiatajassekogunenud laenutajate nimed.
- Kutsutakse iga teose peal arvutaViivis, andes parameetriksSuurimaViiviseLeidjaisendi. Pärast kõigi viiviste arvutamist saada suurima viivise omanikule hoiatus (kasutades vastavatSuurimaViiviseLeidjameetodit).
- Sobivates kohtades näidata isendite infot ja meetodite töö tulemusi ekraanil.
Andmete fail on aadressil http://kodu.ut.ee/~marinai/laenutus.txt. Salvestage see oma arvutisse. Fail on kodeeringus UTF-8. Vajadusel tutvuge klassi Scanner konstruktoriga, mis võimaldab kodeeringut näidata.
Mittekompileeruva programmi eest punkte ei saa.