Servletul implementeaza metoda de GET si este disponibil la /hello conform web.xml. Servletul proceseaza requesturi ce contin cei 4 parametrii: key, value, sync si mock. Daca datale nu sunt bine formatate, se raspunde prin SC_BAD_REQUEST.
Servletul contine un repository ce este responsabil pentru scrierea in fisier a cerintelor clientului. Accesul la acest repository este sincronizat sau nu (depinzand de parametrul sync). Ca raspuns la un request, se ofera lista de linii din fisierul repository-ului, sortate dupa cheie. In log se va afisa fiecare request cu datele aferente.
In afara de clientul web, a fost implementat si un client cu requesturi aleatorii in NodeJS. De asemenea, pentru performanta, un client full sync/full-async a fost testat. Rezultatele analizei sunt gasite in analiza.pdf.
Servletul Web controller implementeaza in spiritul MVC:
- metoda GET pentru a gestiona requesturi ce sunt trimise catre input page. Aceste requesturi au ca atribute categoria preselectata (daca utilizatorul are un cookie ce sa specifice acest lucru) si multimea categoriilor stocate in baza de date. Mai mult, la nivel de sesiune se adauga un atribut pentru generarea de captcha. In sfarsit, pagina este construita cu JSTL si incorporeaza Bootstrap.
- method POST pentru a gestiona requesturi ce sunt trimise catre result page. Un request ofera parametrii pentru category, key si value. Daca category nu exista, acesta este initializat cu ajutorul unui atribut la nivel de aplicatie "default-category". De asemnea, captcha-ul este verificat si un cookie, ce contine alegerea categoriei, este adaugat. In final, un record bean este creat si persistat in baza de date.
Servletul Captcha implementeaza metoda GET ce ofera o imagine captcha generata pe baza unui text stocat la nivel de sesiune.
Aplicatia contine de asemenea doua filtre web si un listener web:
- Decorator de request ce adauga in logging toate requesturile primite.
- Decorator de response ce ataseaza raspunsului dat de catre aplicatie, prin intermediul unui response, un header si un footer.
- Listenerul citeste un parametru de context si il adauga in scope-ul aplicatiei sub forma de atribut. Acest parametru de context este categoria default ce trebuie setata daca aceasta nu apare in requesturile POST.
In final, aplicatia fololseste o baza de date gestionata prin intermediul unui layer de persistenta ce foloseste Hibernate.
Proiectul foloseste JSF impreuna cu mai multe bean-uri:
- Language Bean este un bean la nivel de sesiune ce gestioneaza selectia limbii curente (locale). Proiectul suporta doua limbi: engleza si romana.
- Exam Bean este un bean la nivel de request ce gestioneaza work-flow-ul legat de examene. Acesta agrega un model low-level pentru examene ce este persistat in baza din date prin Hibernate folostind Exam.
- Student Bean este un bean la nivel de request ce gestioneaza work-flow-ul legat de studenti. Acesta agrega un model low-level pentru studenti ce este peristat in baza de date prin Hibvernate folosind Student. Relatia examene-studenti este many-to-many, motiv pentru care, fizic, baza de date contine si un tabel ce mapeaza id-uri de studenti la id-uri de examene.
- Schedule Bean este un bean la nivel de request ce gestioneaza componenta de grupare a examenelor pe zile. Acesta genereaza un model pentru componenta UI bazandu-se pe solutia problemei orarului rezolvata cu ajutorul SMT-solver-ului Z3. Z3 Schedule Resolver adauga in contextul Z3 constrangerile legate de examene sub forma de conditii logice. Pentru a optimiza numarul de zile, se aplica cautarea binara a numarul optim de zile folosind satisfiabilitatea formulei ca baza a functiei monotone suport. Modelul este extras doar dupa ce formula este satisfiabila cu numar minim de zile.
Pentru partea de UI, PrimeFaces a fost folosit: dataTable, datePicker, selectOneMenu, inputNumber etc. De asemenea, un converter a fost folosit pentru examene pentru a le gestiona intr-un selectManyCheckbox cu selectItems.
Proiectul este o continuare pentru Lab3:
- Paginile sunt construite folosind un template, unde este inclus header, menuBar si footer.
- Tabelele cu model preconfigurat pentru examene si studenti sunt composite-uri definite ca examgrid si studgrid. Acestea au un singur parametru, anume multimea de recorduri ce trebuie afisate in data-table.
- Footer-ul include un copyright, versiunea aplicatiei si numarul de sesiuni active prin intermediul Sess Bean. Numarul de sesiuni active se obtine live prin folosirea poll.
- Au fost facute mai multe experimente legate de connection pool in cadrul Hibernate, c3p0 si Tomcat. Performanta a fost analizata cu ajutorul unui script in NodeJs.
Proiectul este o continuare pentru Lab4:
- Layer-ul de persistenta a fost rescris pentru a folosi specificatiile JPA prin persistence.xml. Aici este configurat un unit ce foloseste conexiunea la nivel de server definita in Tomcat.
- Examenele au fost extinse incat acum putem lucra cu examene scrise sau examene sub forma de proiect. Acestea sunt definite in aceeasi tabela a bazei de date si extind modelul Exam. Se foloseste ca discriminator campul dtype.
- Query-urile si update-urile pentru baza de date sunt gestionate de persistence layer. Acesta foloseste Named Query scrise in JPQL la nivelul fiecarui model. EntityManager-ul folosit de acest layer este generat de un factory.
Proiectul este o continuare pentru Lab5:
- Layer-ul de persistenta este bazat acum pe repositories Exam, Resource si Student. Fiecare repository este un EJB ce foloseste un entity manager definit prin Injection. Persistence unitul este acum cu tranzactii de tip JTA.
- A fost adaugata o pagina pentru rezervarea de resurse, ce este construita folosind bean-ul de rezervari. In baza de date a fost adaugat modelul pentru resurse si mapat peste entitatea Resource.
- Bean-ul ReservationSingletonBean gestioneaza maparea resurselor la examene intr-un mod sincron, ReservationStatefulBean gestioneaza adaugarea unei noi mapari, iar ReservationStatelessBean verifica disponibilitatea unei resurse.
- Un interceptor pentru performanta contorizeaza apelurile pentru singleton.
- Un timer este scris ca demo.
Proiectul nou este implementat cu JSF si foloseste:
- Autentificare pentru a gestiona trei tipuri de useri: admini, revieweri si autori. Doar adminii pot adauga noi useri. User-ul curent este retinut de catre SessionBean.
- Papers pentru gestiunea de paper-uri. Autorii pot adauga paper-uri sub forma de pdf, ce vor fi uploadate in baza de date sub forma de byte array. Toate paper-urile pot fi vazute de catre admini si descarcate.