Pro vyřešení této úlohy je třeba
Rozumět principům objektového programování v jazyce Java.
Chápat způsob práce s výjimkami.
Systém simuluje doručování doporučených dopisů adresátům.
V této úloze bude Vaším úkolem vytvořit hierarchii výjimek MailException, RecipientFailureException, LetterRefusedException, RecipientMissedException a BadAddressException. Dále budete muset vytvořit jednoduchou třídu na posílání zpráv, která bude na různé chybové stavy reagovat právě těmito výjimkami.
Výjimka MailException bude potomkem třídy Exception, zatímco ostatní výjimky budou potomky třídy MailException. U každé výjimky nadefinujte přinejmenším konstruktor, který umožní nastavit řetězec s chybovou hláškou a konstruktor, který navíc nastaví i příčinu (cause) výjimky (tj. výjimku, která byla bezprostřední příčinou této výjimky). Význam výjimek viz dále.
Vytvořte třídu MyPostOffice, která bude implementovat rozhraní PostOffice a bude sloužit k doručení doporučených dopisů. Třída MyPostOffice bude mít jeden konstruktor, který bude mít dva parametry – addressBook typu AddressBook a maxSendAttemptCount typu int. Dopisy bude doručovat tak, že nejdříve pomocí instance třídy AddressBook zjistí, jestli adresa na dopise existuje. Pokud adresa neexistuje, vyhodí výjímku BadAddressException, Pokud existuje, získáme odkaz na pošťáka, pod jehož rajon adresa spadá. Pošťák se pak snaží dopis doručit. Pokus o doručení může skončit nezdarem, viz dokumentace rozhraní Mailman. Pokud se dopis nepodařilo doručit proto, že adresát nebyl zastižen, pokusí se třída MyPostOffice o doručení opakovaně. Počet pokusů je dán parametrem maxSendAttemptCount konstruktoru. Pokud se dopis nepodařilo doručit proto, že adresát odmítl dopis převzít, žádný další pokus o doručení se již neprovádí. V obou případech vyhodí třída MyPostOffice stejnou výjimku RecipientFailureException.
Vše si můžete vyzkoušet pomocí třídy Demo (chová se náhodně!) a k dispozici máte také testovací třídu MyPostOfficeTest.
V konstruktoru třídy MyPostOffice nezapomeňte zkontrolovat platnost parametrů, tj. nemá-li addressBook hodnotu null a není-li maxSendAttemptCount menší než jedna. V opačném případě vyhoďte výjimku NullPointerException, nebo IllegalArgumentException.
Každá výjimka musí mít nastavenou smysluplnou chybovou hlášku a pokud vznikla jako reakce na jinou výjimku tak musí mít nastavenou i svoji příčinu.
Další rady a návody jak řešit některé z potenciálních problémů Vám poskytnou cvičící v příslušném cvičení.
Před odevzdáním úlohy si zkontrolujte:
Zda jde úloha přeložit a zda jdou přeložit i všechny testy.
Zdali všechny testy projdou bez chyby.
Zda jste nezapomněli správně vyplnit hlavičky všech tříd ve formátu JavaDoc (popis třídy, autor, popis všech metod, apod.)