Differences
This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
|
laboratoare:laborator10 [2016/01/08 02:13] Andrei Roșu-Cojocaru |
laboratoare:laborator10 [2016/01/08 16:18] (current) Andrei Roșu-Cojocaru [Soluții] |
||
|---|---|---|---|
| Line 881: | Line 881: | ||
| Un utilizator ce a primit un mesaj că un alt utilizator nu mai e disponibil îl va exclude din lista utilizatorilor activi. | Un utilizator ce a primit un mesaj că un alt utilizator nu mai e disponibil îl va exclude din lista utilizatorilor activi. | ||
| - | **a)** În clasa ''ContactsList'', în metoda ''start()'', să se transmită mesajul ''Constants.LOGIN_MESSAGE'' către toţi utilizatorii cu care s-a comunicat recent (din ''recentContactsListItem''). Se va apela metoda ''publish()'' a obiectului ''communicator'' având ca parametrii numele de utilizator al destinatarului şi mesajul propriu-zis. | + | <spoiler|Indicații de Rezolvare> |
| + | **a)** În clasa ''ContactsList'', în metoda ''start()'', să se transmită mesajul ''Constants.LOGIN_MESSAGE'' către toţi utilizatorii cu care s-a comunicat recent (din ''recentContactsListItem''). Se va apela metoda ''publish()'' a obiectului ''communicator'' având ca parametrii numele de utilizator al destinatarului şi mesajul propriu-zis. | ||
| - | **b)** În clasa ''ContactsList'', în metoda ''handleMessage()'', să se analizeze mesajul ''Constants.LOGIN_MESSAGE'', parcurgându-se lista ''connectedContactsListItem'' şi adăugându-se la aceasta numele de utilizator din mesajul primit, în cazul în care utilizatorul nu se regăseşte în aceasta. | + | Obiectul ''recentContactsListItem'' conține lista utilizatorilor recenți sub formă de ''ObservableList<TreeItem<String>>'', obținută ca rezultat al metodei ''getChildren()''. Valoarea conținută de un obiect de tip ''TreeItem'' se obține prin intermediul metodei ''getValue()''. |
| - | **c)** În clasa ''ContactsList'', în metoda ''close()'', să se transmită mesajul ''Constants.LOGOUT_MESSAGE'' către toţi utilizatorii cu care s-a comunicat recent (din ''recentContactsListItem''). Se va apela metoda ''publish()'' a obiectului ''communicator'' având ca parametrii numele de utilizator al destinatarului şi mesajul propriu-zis. | + | **b)** În clasa ''ContactsList'', în metoda ''handleMessage()'', să se analizeze mesajul ''Constants.LOGIN_MESSAGE'', parcurgându-se lista ''connectedContactsListItem'' şi adăugându-se la aceasta numele de utilizator din mesajul primit (''interlocutorUserName''), în cazul în care utilizatorul nu se regăseşte în aceasta. După această procesare, metoda se termină întrucât mesajul nu mai poate avea și alt tip. |
| - | **d)** În clasa ''ContactsList'', în metoda ''handleMessage()'', să se analizeze mesajul ''Constants.LOGOUT_MESSAGE'', parcurgându-se lista ''connectedContactsListItem'' şi eliminându-se din ea numele de utilizator din mesajul primit, în cazul în care utilizatorul face parte din aceasta. | + | **c)** În clasa ''ContactsList'', în metoda ''close()'', să se transmită mesajul ''Constants.LOGOUT_MESSAGE'' către toţi utilizatorii cu care s-a comunicat recent (din ''recentContactsListItem''). Se va apela metoda ''publish()'' a obiectului ''communicator'' având ca parametrii numele de utilizator al destinatarului şi mesajul propriu-zis. |
| + | |||
| + | Obiectul ''recentContactsListItem'' conține lista utilizatorilor recenți sub formă de ''ObservableList<TreeItem<String>>'', obținută ca rezultat al metodei ''getChildren()''. Valoarea conținută de un obiect de tip ''TreeItem'' se obține prin intermediul metodei ''getValue()''. | ||
| + | |||
| + | **d)** În clasa ''ContactsList'', în metoda ''handleMessage()'', să se analizeze mesajul ''Constants.LOGOUT_MESSAGE'', parcurgându-se lista ''connectedContactsListItem'' şi eliminându-se din ea numele de utilizator din mesajul primit, în cazul în care utilizatorul face parte din aceasta. Este important ca eliminarea să nu se realizeze concomitent cu parcurgerea tabloului. După această procesare, metoda se termină întrucât mesajul nu mai poate avea și alt tip. | ||
| + | </spoiler> | ||
| **8.** Să se modifice comportamentul aplicaţiei astfel încât utilizatorii să poată primi şi mesajele transmise în răstimpul în care nu au fost disponibili. | **8.** Să se modifice comportamentul aplicaţiei astfel încât utilizatorii să poată primi şi mesajele transmise în răstimpul în care nu au fost disponibili. | ||
| - | În clasa ''PublishSubscribe'', în metoda ''subscribe()'', se va modifica tipul obiectului consumator de mesaje astfel încât acesta să fie durabil (persistent şi atunci când este inactiv, adică nu are nici un abonat conectat la el). | + | <spoiler|Indicații de Rezolvare> |
| + | În clasa ''PublishSubscribe'', în metoda ''subscribe()'', se va modifica tipul obiectului consumator de mesaje astfel încât acesta să fie durabil (persistent şi atunci când este inactiv, adică nu are nici un abonat conectat la el). | ||
| + | |||
| + | Se va utiliza metoda [[https://docs.oracle.com/javaee/7/api/javax/jms/JMSContext.html#createSharedDurableConsumer-javax.jms.Topic-java.lang.String-java.lang.String-|createSharedDurableConsumer()]] care, pe lângă argumentele topicii și a selectorului de mesaje (pe care le primea și metoda ''createConsumer()'') primește ca argument și o denumire (unică) prin intermediul căreia este identificat. Se va folosi, în acest scop, denumirea utilizatorului care a lansat în execuție aplicația, dată fiind unicitatea sa (deși de poate recurge la orice convenție, în acest scop). | ||
| + | |||
| + | <code java> | ||
| + | MessageConsumer consumer = subscribeSession.createSharedDurableConsumer(topic, userName, Constants.CUSTOM_MESSAGE_PROPERTY + "= '" + userName + "'"); | ||
| + | </code> | ||
| + | </spoiler> | ||
| **9.** Să se modifice formatul mesajelor astfel încât acesta să includă şi ora la care mesajul a fost transmis: | **9.** Să se modifice formatul mesajelor astfel încât acesta să includă şi ora la care mesajul a fost transmis: | ||
| Line 900: | Line 914: | ||
| </code> | </code> | ||
| - | Se va modifica structura mesajului din clasa ''CustomMessage'', modificându-se definiţia metodei ''handleMessage()'' din clasa ''ContactsList'' astfel încât să conţină şi parametrul referitor la momentul de timp la care a fost transmis mesajul. | + | <spoiler|Indicații de Rezolvare> |
| + | Este necesar să se realizeze următoarele modificări în structura aplicației pentru a se obține funcționalitatea solicitată: | ||
| + | * în clasa ''CustomMessage'' se va include un câmp ''messageDateTime'' de tip [[https://docs.oracle.com/javase/8/docs/api/java/util/GregorianCalendar.html|GregorianCalendar]], care va fi instanțiat în cadrul constructorului de copiere și pentru care se vor implementa metode getter și setter; | ||
| + | * în clasa ''PublishSubscribe'' se vor modifica metodele: | ||
| + | * ''handleMessage()'' - se va transmite metodei ''handleMessage()'' (din clasa ''ContactsList'') argumentul care conține data și timpul la care mesajul a fost transmis; | ||
| + | * ''publish()'' - va crea un obiect de tip ''Message'' care conține și parametrul de tip dată și timp, instanțiat cu momentul curent (constructorul implicit al clasei ''GregorianCalendar''); | ||
| + | * în clasa ''ContactsList'', metoda ''handleMessage()'' va primi un argument de tip ''GregorianCalendar'' pe care îl va propaga, mai departe, către metoda ''handleConversationHistory()'' din clasa ''MessageExchange''; | ||
| + | * în clasa ''MessageExchange'', data și timpul la care a fost transmis mesajul este afișat în interfața grafică: | ||
| + | * în metoda de tratare a evenimentului de apăsare a butonului //SendMessage// (metoda ''handle()'' asociată ascultătorului obiectului ''sendMessageButton''); | ||
| + | * în metoda ''handleConversationHistory()'', a cărei semnătură trebuie schimbată corespunzător (pentru a include argumentul de tip dată și timp). | ||
| + | </spoiler> | ||
| ===== Resurse ====== | ===== Resurse ====== | ||
| Line 908: | Line 932: | ||
| ===== Soluții ===== | ===== Soluții ===== | ||
| - | TODO | + | [[https://github.com/aipi2015/Laborator10/tree/master/solutions/eclipse/10-Messaging-JMS|Proiect Eclipse]]\\ |
| + | [[https://github.com/aipi2015/Laborator10/tree/master/solutions/netbeans/10-Messaging-JMS|Proiect NetBeans]] | ||
