Vytvořte třídu cz.muni.fi.pb162.textutils.Grep, která bude realizovat zjednodušenou verzi příkazu grep. Bude mít metodu public static void grep(String regexpr, Reader input, Writer output) throws PatternSyntaxException, IOException; Tato metoda bude z proudu input postupně načítat řádky a pokud budou odpovídat zadanému regulárnímu výrazu, vypíše je do proudu output. Třídu bude také možné spustit z příkazové řádky (tj. bude mít kromě výše zmíněné metody i metodu main); v tom případě bude první parametr příkazové řádky obsahovat regulární výraz a druhý parametr jméno vstupního souboru. Druhý parametr je nepovinný a pokud nebude zadán, bude se číst standardní vstup. Výstup bude zapisován na standardní výstup. Vytvořte třídu cz.muni.fi.pb162.textutils.Sort, která bude realizovat zjednodušenou verzi příkazu sort. Bude mít metodu public static void sort(Reader input, Writer output) throws IOException; Tato metoda načte z proudu input všechny řádky a pak je do proudu output zapíše seřazené podle abecedy. Třídu bude také možné spustit z příkazové řádky (tj. bude mít kromě výše zmíněné metody i metodu main); v tom případě bude první parametr příkazové řádky obsahovat jméno souboru. Parametr je nepovinný a pokud nebude zadán, bude se číst standardní vstup. Výstup bude zapisován na standardní výstup. Vytvořte třídu cz.muni.fi.pb162.textutils.Demo, která bude kombinovat příkazy grep a sort. Třída ze vstupního souboru vybere řádky odpovídající danému regulárnímu výrazu, seřadí je podle abecedy a vypíše je na standardní výstup. Prvním parametrem bude regulární výraz, druhým parametrem jméno vstupního souboru. Druhý parametr je nepovinný a pokud nebude zadán, bude se číst standardní vstup. Výstup bude zapisován na standardní výstup. Třída Demo musí k výběru řádků a jejich seřazení používat třídy Grep a Sort (tj. nesmí sama používat kolekce). Existují dvě možná řešení, která se budou hodnotit různým počtem bodů. a) Metody se spustí postupně za sebou a pro uložení mezivýsledku se použije dvojice tříd CharArrayWriter/CharArrayReader. Toto řešení je snadněji implementovatelné a bude hodnoceno maximálně osmi body. b) Metody se spustí paralelně, tj. každá ve vlastním vlákně a pro předávání dat z jednoho vlákna do druhého se použije dvojice tříd PipedWriter/PipeReader. Toto řešení je efektivnější a bude hodnoceno maximálně dvanácti body. Pokud dojde k jakékoliv chybě, třída vypíše srozumitelnou chybovou hlášku, z níž uživatel pochopí, co je špatně (tj. žádné výpisy stacktrace). Pokud bude problém v počtu nebo formátu parametrů, vypíše se srozumitelná nápověda. Při řešení důsledně dodržujte všechny zásady, o kterých jsme si v průběhu roku povídali, úloha bude hodnocena podstatně přísněji než ostatní úlohy. Před řešením si znovu pečlivě projděte diskusní fórum předmětu, zejména vlákno, v němž Martin Janík upozorňuje na časté chyby! Pro zisk bodového hodnocení je nutné implementovat všechny tři třídy (Grep, Sort, Demo), částečná řešení nebudou hodnocena. Termín je do 11. 2. 2007 23:59. Můžete svá řešení konzultovat, ale v žádném případě není přípustné sdílet kód nebo jeho frgamenty. Jakékoliv plagiáty budou bez výjimky řešeny formou disciplinárního řízení. Prémiovou úlohou je možné kompenzovat pouze ztrátu bodů z úloh, nikoliv z písemek. Taktéž není možné kompenzovat ztrátu bodů způsobenou plagiátorstvím.