Inginerie Software


1. Sequence Diagram

2. Communication Diagram

3. Singleton, object pool, adapter, iterator, bridge, façade


Laborator 4

Sunteti dezvoltatorii unui server pentru gestiunea conexiunilor la mai multe baze de date. Serverul vostru trebuie sa gestioneze, pentru fiecare baza de date, toate conexiunile existente la ea, folosind un object pool. Clasa cu care comunica orice obiect care trebuie sa trimita un query catre baza de date se va numi RemoteConnection. Ea va avea ca atribut instanta clasei ConnectionPool care gestioneaza toate conexiunile.

Clasa RemoteConnection pune la dispozitie metoda String sendQuery(Query query) care va trebui sa returneze rezultatul executiei query-ului. Metoda functioneaza astfel:

  • Se obtine o instanta a DataConnection pentru conexiunea necesara folosind metoda DataConnection acquireConnection(String databaseName) din ConnectionPool, metoda care va elimina conexiunea din lista de conexiuni a unei baze de date, pentru a fi folosita de catre program.
  • Se trimite query-ul folosind metoda String sendQuery(Query query) din instanta DataConnection obtinuta anterior.
  • Se apeleaza metoda void releaseConnection(DataConnection dc) care adauga conexiunea in pool-ul apropiat.

Interfata Query contine metodele void setDatabaseName(String databaseName) si String getQuery(), iar aceste metode sunt implementate in clasele SQLQuery si ConnectionQuery (folositi bridge pattern). Un query SQL este un String de forma "select * from TableName;" iar un query de tipul conexiune este de forma "connect to database=DatabaseName with username=User and password=Password; ". Elementele subliniate trebuie sa poata fi setate/citite in clasele SQLQuery, respectiv ConnectionQuery prin metode aditionale definite de voi.

Clasa DataConnection va retine numele bazei de date spre care se doreste legatura. Metoda sendQuery() mentionata mai sus returneaza (pentru simplitate) query-ul sub forma de String conform modelului prezentat.

Clasa ConnectionPool este un singleton si ea trebuie sa gestioneze lista de obiecte conectate la fiecare baza de date. Folositi un HashTable pentru a retine pentru fiecare baza de date lista de conexiuni la ea (o conexiune este reprezentata de o instanta a DataConnection). Clasa pune la dispozitie metodele acquireConnection() si releaseConnection() mentionate anterior.

FUNCTIONARE

1. Programul vostru va trebui sa ceara (intr-un ciclu repetitiv) utilizatorului daca doreste sa trimita un query catre o baza de date. Daca raspunsul este afirmativ, se cere numele bazei de date, tipul query-ului (SQL sau connection) si parametrii acestuia (vezi clasele derivate din Query). Se vor afisa toate conexiunile disponibile pentru baza de date al carei nume a fost introdus, si in final, se va apela sendQuery() din RemoteConnection.

2. Pentru a parcurge lista de conexiuni existente la un moment dat (pentru afisare, de exemplu) folositi iterator pattern (vezi Enumeration sau Iterator).

NOTA: Puteti folosi orice alte elemente auxiliare in programul vostru. Puteti de asemenea adauga parametrii metodelor dupa cum considerati. Puteti adauga metode si atribute suplimentare claselor voastre, fara a modifica insa interfetele si metodele abstracte.

IMPORTANT: Orice atribut al unei clase trebuie sa fie private sau protected , accesul la el se face prin intermediul unor metode public pe care le veti defini. Mentineti obligatoriu conventia de notare a limbajului Java in programele voastre.

+ extra 1p: Incercati sa identificati cat mai multe design pattern-uri (dintre cele studiate pana acum) in codul vostru sursa. Explicati in comentarii unde apar aceste pattern-uri.

+ extra 2p: Incercati sa realizati o sincronizare intre acquireConnection() si releaseConnection() (fara a folosi metode synchronized) pentru a asigura o functionare thread-safe a celor doua metode. Explicati de ce este necesara aceasta sincronizare si alegerea facuta de voi in codul sursa, prin cateva comentarii.