<html>
        <head>
                <title>
                        Üzenőfal
                </title>
        </head>
        <body>
                <h1>
                        Üzenőfal
                </h1>
                <p>
                        Készíts üzenőfalt, melyen a különböző szálak üzenetet hagyhatnak egymásnak, elolvashatják bármelyik üzenetet, 
                        és akár törölhetik is azt. A megoldásod be kell mutatnod egy gyakorlatvezetőnek, aki majd leosztályozza. Az
                        osztályozás során az implementáció minőségét osztályozzák.
                </p>
                <p>
                        Az alap feladatot megoldhatod RMI-vel és Socket-ek segítségével egyaránt. A hármasért a feladat kötött, de a
                        négyesért már választhatsz, melyik részfeladatot oldod meg. Az ötösért elég 2 plusfeladat, nem kell mind a 3.
                </p>
                <hr />
                <h2>
                        Az alapfeladat:
                </h2>
                <p>
                        Készítsd el az Üzenőfalat (BlackBoard), és készíts hozzá random üzeneteket (Message) gyártó klienseket is. 
                        Minden üzenet egy <b>(int, String)</b> pár, amit az int az üzenőfalon egyértelműen meghatároz (ID). A BlackBoard műveletei:
                </p>
                        <h3>
                        RMI-vel:
                        </h3>
                        <ul>
                                <li> Message read(int)
                                        <ul>
                                                <li> a paraméterül kapott id-jú Message-et adja vissza
                                                <li> ha nincs ilyen Message, akkor null-t ad vissza
                                        </ul>
                                <li> Message take(int)
                                        <ul>
                                                <li> a paraméterül kapott id-jú Message-et adja vissza
                                                <li> a visszatérés előtt a Message-et eltávolítja az üzenőfalról
                                                <li> ha nincs ilyen Message, akkor null-t ad vissza
                                        </ul>
                                <li> boolean write(Message)
                                        <ul>
                                                <li> a paraméterül kapott Message-et a BlackBoard-ra írja
                                                <li> ha már létezik ilyen ID-jú Message, akkor a visszatérési értéke false
                                        </ul>
                        </ul>
                        <h3>
                                Sockettel:
                        </h3>
                        <ul>
                                <li>read <ID>
                                        <ul>
                                                <li> a read utáni id-jú Message szövegét kéri vissza
                                                <li> ha nincs ilyen Message, akkor üres sort kap vissza 
                                        </ul>
                                <li> take <ID>
                                        <ul>
                                                <li> a take id-jú Message szövegét kéri vissza
                                                <li> a visszatérés előtt a Message-et eltávolítja az üzenőfalról
                                                <li> ha nincs ilyen Message, akkor üres sort küld vissza
                                        </ul>
                                <li> write <ID> <String>
                                        <ul>
                                                <li> a write után kapott ID-val és Stringgel Message-et ír a BlackBoard-ra
                                                <li> ha már létezik ilyen ID-jú Message, akkor "fail" üzenetet küld vissza, amúgy "OK"-t.
                                        </ul>
                        </ul>
                <p>
                        <b>Minden esetben figyelj a párhuzamos problémák kiküszöbölésére!</b>
                </p>
                <hr />
                <h2>
                        A hármasért:
                </h2>
                <p>
                        Ha az előző feladatot RMI-vel oldottad meg, ezt Sockettel kell, és fordítva.
                </p>
                <p>
                        Készíts egy aktív logoló alkalmazást, mely csatlakozik a BlackBoard-hoz, és meghatározott időközönként lekéri
                        annak teljes tartalmát. A szükséges Socketes / RMI-s felülettel egészítsd ki a Black Board-ot. Egy BalckBoard-hoz
                        akárhány Logger csatlakozhat.
                </p>
                <p>
                        A Logger parancssori paraméterként várja, hogy hány másodpercenként kérjen le az összes üzenetet. Ha csak egy 
                        paramétert kap, akkor a standard outputra logol, ha kettőt, akkor a második paraméterül kapott file-ba.
                        A Logger folyamtosan várja a felhasználó parancsait, melyek a következők lehetnek.
                </p>
                        <ul>
                                <li> force -- hatására zonnal lekéri a üzeneteket
                                <li> exit -- hatására kilép
                        </ul>
                <hr />
                <h2>
                        +1
                </h2>
                        <p>
                                Oldd meg, hogy ha nem létezik a Message, amit a read vagy a take művelet igényelt, akkor a kliens várjon addig,
                                míg az üzenet fel nem kerül a BlackBoard-ra.
                        </p>
                <hr />
                <h2>
                        +1
                </h2>
                        <p>
                                Készíts Mirror-t a BlackBoard-hoz. A Mirror a következő kritériumoknak kell, hogy megfeleljen:
                        </p>
                        <ul>
                                <li> Egy BlackBoard-hoz akárhány Mirror csatlakozhat.
                                <li> A Mirror magától csatlakozik a BlackBoard-hoz.
                                <li> A Mirror kezdeti állapotát a BlackBoard állítja be
                                <li> A Mirror-t mindig a BlackBoard tartja karban.
                        </ul>
                <hr />
                <h2>
                        +1
                </h2>
                        <p>
                                A BlackBoard fogadja a felhasználó üzeneteit:
                        </p>
                        <ul>
                                <li> shutdown -- lezárja az összes kapcsoaltot, nem fogad el újat, az aktuális állapotott egy fájlba menti, ha
                                a file létezik indításkor, akkor onnan tölti be a kezdeti állapotot.
                                <li> reset -- minden kapcsolatot lezár, és az összes üzenetet eldobja
                        </ul>
        </body>
</html>