V této úloze si procvičíte práci se vstupem a výstupem. Vaším
úkolem je vytvořit třídu
cz.muni.fi.pb162.school.StudentImpl
, která bude
implementovat rozhraní cz.muni.fi.pb162.school.Student
, a třídu
cz.muni.fi.pb162.school.StudentCatalogImpl
, která bude
implementovat rozhraní cz.muni.fi.pb162.school.StudentCatalog
.
Jak se mají Vaše třídy chovat je popsáno v komentářích formátu JavaDoc.
Pro ověření správné funkčnosti Vaší implementace uvedených
rozhraní máte k dispozici testovací třídu StudentCatalogTest
pro
testovací framework JUnit. Silně
Vám doporučuji ji využít, neboť Vám pomůže odhalit některé zákeřné
chyby, které se mohou objevit.
Pozor, tato třída netestuje níže předepsanou metodu main!
Dále v třídě StudentCatalogImpl
implementujte
metodu main, která udělá tyto operace:
StudentCatalogImpl
,
test.data
(soubor bude v aktuálním adresáři),getStudents()
),save()
zapíše do
souboru test1.data
asave()
zapíše na
standardní výstup.
V posledním kroku se nepozastavujte nad případně poškozeným
kódováním diakritiky; předepsané kódování pro ukladání dat metodou
save()
je utf-8, zatímco Vy nejspíše pracujete ve
Windows s kódováním cp-1250 nebo na Linuxové stanici s kódováním
iso-8859-2 (pokud podobně jako já nemáte jako výchozí kódování
nastavené utf-8).
Veškerý Váš kód alespoň stručně okomentujte pomocí značek JavaDoc a vytvořte dávku compile.(bat|sh), která kód přeloží, vygeneruje dokumentaci ve formátu JavaDoc a zdrojové kódy, zkompilované třídy, vygenerovanou dokumentaci i sebe sama zabalí do archivu uloha8.jar, který potom odevzdáte. V archivu uloha8.jar budou zdrojové kódy v podadresáři src, zkompilované třídy v podadresáři build a vygenerovaná dokumentace v podadresáři doc (viz adresářová struktura zadání). Do archivu nezahrnujte soubor junit.jar!
Alternativně můžete místo této dávky vytvořit soubor build.xml pro nástroj Ant.
Nedejte se zmást tím, že metody rozhraní Student
a StudentCatalog
nejsou deklarovány
jako public. Narozdíl od tříd mají metody rozhraní implicitně
veřejný přístup (tj. jako by byly deklarovány public).
Pozor na zajištění unikátnosti přidělovaného id! Nestačí si pouze pamatovat počet studentů a při vytváření nového studenta mu přidělit id o jednu větší, neboť id studentů v souboru mohou obsahovat mezery. Proto bych doporučil si místo počtu studentů pamatovat maximální id studenta a při nahrávání studentů ze vstupního proudu toto číslo v případě potřeby aktualizovat.
Metody StudentCatalog.load(InputStream)
a
StudentCatalog.save(OutputStream)
mají při špatném formátu dat nebo
při chybě vstupu/výstupu vyvolat výjimku StudentCatalogException
.
Při chybě vstupu/výstupu ale vznikne výjimka typu IOException. Proto musíme
výjimku IOException zachytit a zareagovat tak, že vygenerujeme požadovanou
výjimku StudentCatalogException. Abychom neztratili informaci o původní
příčině problému, vyžijeme techniku, která se nazývá řetězení výjimek.
Tato technika spočívá v tom, že nově vytvořené výjimce předáme i odkaz na
výjimku původní:
public void load(InputStream is) throws StudentCatalogException() { try { // Nejaka operace, ktera muze vyvolat vyjimku IOException } catch(IOException ex) { throw new StudentCatalogException(ex); } }
Metody StudentCatalog.load() a StudentCatalog.save() mají pracovat s kódováním utf-8. Kódování se nastavuje jako druhý paramter konstruktoru InputStreamReader(InputStream in, String charsetName) a OutputStreamWriter(OutputStream in, String charsetName).
Třída PrintWriter negeneruje IOException! Když dojde k chybě, potichu si ji označí a pokračuje dál. Pokud chcete reagovat na případnou chybu (což se po vás v zadání chce), musíte buď testovat úspěšnost operace metodou checkError(), nebo raději použít pouze třídu Writer (která již IOException normálně generuje).
Metoda StudentCatalog má vracet kolekci, kterou není možné modifikovat. Takovou kolekci vytvoříte pomocí metody Collections.unmodifiableCollection().
Pokud v JavaDoc komentářích používáte diakritiku, spouštějte nástroj javadoc s parametrem
-charset <charset>
.
Obecně je samozřejmě lepší psát komentáře anglicky, aby jim rozumněli i zahraniční vývojáři,
ale v této úloze plně vyhovují komentáře v češtině.
Pro ověření funkčnosti použijte připravenou testovací třídu
StudentCatalogTest
.
Pro její použití si musíte stáhnout balíček
junit.jar, který si přidáte do CLASSPATH
.
Pak zkompilujte Váš kód i testovací třídu a testovací třídu spustíte.
Pokud se objeví nějaké chyby, snažte se je odstraňovat v tom pořadí, v jakém se objeví; pozdější chyby mohou být důsledkem některé z chyb dřívějších (např. pokud Vám nebude správně fungovat metoda equals, pravděpodobně selžou i všechny ostatní testy, které hodně spoléhají na její bezchybnou funkci).
Pokud se Vám nelíbí jednoduché textové rozhraní JUnit, můžete použít grafické. Toho dosáhnete např.
pomocí příkazu
java -cp junit.jar:. junit.swingui.TestRunner cz.muni.fi.pb162.school.StudentCatalogTest