Korzystając z technologii RMI napisz system odzwierciedlający pracę bramek kontrolnych na stacjach metra. Założenia: Bramka to element systemu zarządzania metrem odpowiedzialny za wpuszczanie i wypuszczanie z niego pasażerów (jest dwukierunkowa). Jest samodzielną aplikacja z GUI, poprzez który można: 1. zarejestrować bramkę w i wyrejestrować z centrali – czyli powinna być parametryzowana danymi centrali, 2. zobaczyć statystykę dotyczącą ruchu odbywającego się przez bramkę. Aby uprościć implementację w systemie nie będzie biletów (obiektów przenoszących informację o czasie skasowana oraz numerze bramki). Zamiast tego na bramce będzie można będzie wygenerować zdarzenie wejścia lub wyjścia (np. klik na przycisku "wejście" lub przycisku "wyjście"). Każdą bramkę można 1. "lokalnie włączyć" - co wiąże się z koniecznością zdalnego zarejestrowania w centrali i udostępnieniem możliwości klikania na przyciskach "wejście" i "wyjście". 2. "lokalnie wyłączyć" - co wiąże się z koniecznością zdalnego wyrejestrowania z centrali i uniemożliwieniem klikania na przyciskach "wejście" i "wyjście". 3. "zdalnie wyłączyć" - co wiąże się z uniemożliwieniem klikania na przyciskach "wejście" i "wyjście". W tym przypadku bramkę wyłączy centrala, w związku bramka nie musi się wyrejestrowywać, bo centrala sama usunie bramkę z listy zarejestrowanych w niej bramek. Sposób implementacji Bramki jest dowolny. Obligatoryjny jest jednak interfejs zdalny, który bramka musi zaimplementować: public interface IBramka extends Remote { // do pobierania informacji o statystyce – do wykorzystania przez Monitor // statystyka to tablica z dwiema wartościami: liczba wejść, liczba wyjść public int[] getStatystyka(Date pocz, Date kon) throws RemoteException; // do zdalnego zatrzymywania bramek public boolean zamknijBramke() throws RemoteException; // do pobrania numeru bramki public int getNumer() throws RemoteException; } Centrala to osobna aplikacja, której zadaniem jest zarządzanie namiastkami bramek (przydzielanie im numerów, przetrzymywanie kolekcji bramek aktywnych), udostępnianie listy namiastek bramek oraz umożliwienie zarejestrowania/wyrejestrowania/pobrania namiastki monitora. Nie musi posiadać GUI, choć dobrze byłoby, aby wyświetlała numery zarejestrowanych bramek. Chodzi o to, by z centrali dało się zamknąć wskazaną bramkę. Centrala implementuje interfejs zdalny: public interface ICentrala extends Remote { // do rejestrowania bramki w systemie, wynik – numer przydzielony bramce // (bramka musi wpisać sobie ten numer po wywołaniu zdalnym) // lub wartość ujemna, gdy operacja nieudana. public int zarejestrujBramke(Object bramka) throws RemoteException; // do wyrejestrowywania bramek public boolean wyrejestrujBramke(int nrBramki) throws RemoteException; // do pobierania listy bramek aktywnych (w celu monitorowania ich "aktywności") public ArrayList getZarejestrowaneBramki() throws RemoteException; // do rejestracji w centrali namiastki monitora (w celu późniejszego // informowania o konieczności aktualizacji) public void zarejestrujMonitor(Object o) throws RemoteException; public void wyrejestrujMonitor() throws RemoteException; public Object getMonitor() throws RemoteException; } Monitor to aplikacja, która pokazuje działanie całego systemu. Korzysta z: interfejsu zdalnego udostępnionego przez Centralę (po to, aby otrzymać listę referencji do aktywnych bramek); interfejsu zdalnego bramki (do pobierania statystyki danej bramki). Odświeżanie widoku na Monitorze następuje w zadanych interwałach czasu (działa wątek). Monitor implementuje interfejs zdalny: public interface IMonitor extends Remote { public void koniecznaAktualizacja() throws RemoteException; } Metoda koniecznaAktualizacja odpalana jest przez Centralę (przy rejestracji/wyrejestrowywaniu zdalnym bramek). W rmiregistry rejestrowana jest tylko Centrala (czyli Bramka i Monitor muszą znać adres hosta z rejestrem RMI oraz nazwą, pod którą zarejestrowano Centralę by móc się w centrali zarejestrować/wyrejestrować). Pozostałe elementy systemu z metodami wywoływanymi zdalnie nie są rejestrowane w rmiregistry. Przekazują one swoje namiastki do Centrali poprzez wywołania odpowiednich metod.