<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>