Documente Academic
Documente Profesional
Documente Cultură
LUCRARE DE LICENŢĂ
Coordonator Absolvent
Grad didactic, prenume şi nume Prenume şi nume
Anul absolvirii 2017
Cuprins (orientativ)
1. Introducere (de ex.: justificarea alegerii temei, descrierea succintă a conţinutului
fiecărui capitol)................................................................................................................ 3
1.1. Scurtă prezentare a aplicaţiilor web..........................................................................3
1.2. Scopul lucrării...........................................................................................................4
1.3. Motivaţie...................................................................................................................4
1.4. Descrierea capitolelor...............................................................................................5
2. Descrierea conceptelor teoretice pe care se bazează aplicaţia.......................................... 6
2.1. Concepte ce ţin de dezvoltarea aplicaţiilor web.........................................................6
2.1.1. Descrierea modelului client-server
2.1.2. Modelul TCP-IP
2.1.3. Protocolul HTTP
2.1.4. Principiile REST
2.1.5. Modul de funcţionare a unui server Java
2.2. Descrierea conceptului de text mining
2.2.1. Concepte generale
2.2.2. Evaluarea similarităţii dintre două documente
3. Descierea tehnologiilor folosite
2
1. Introducere
1.1 Scurtă prezentare a aplicaţiilor web
În ultimul deceniu, numeroase ramuri din domeniul tehnologiei s-au dezvoltat într-
un ritm alert, având un efect simţitor în îmbunătaţirea calităţii vieţii oamenilor.
Dacă acum ceva timp o simplă conexiune la Internet era un lux pe care nu oricine
şi-l putea permite, s-ar putea spune că în ziua de azi Internetul a devenit un element
indispensabil al vieţii de zi cu zi.
Ca un scurt istoric, anul 1990 a fost cel în care doi ingineri de la CERN au pus
temeliile serviciului World Wide Web(WWW). Acesta fusese creat cu scopul de a fi folosit
într-un mediu academic, pentru a uşura transferul de informaţii între oamenii de ştiinţa din
diverse instituţii şi universităţi.
Serviciul WWW(World Wide Web) s-a dezvoltat de-a lungul timpului în aşa
măsură încât de la simplele pagini web statice care aveau ca scop doar furnizarea de
informaţie s-a realizat o tranziţie la pagini web dinamice orientate pe interacţiunea cu
utilizatorul .
3
activităţii ştiinţifice
Obiectivul principal al acestei lucrări constă în realizarea unei aplicaţii web ce are
ca scop managementul activităţii ştiinţifice a membrilor din departamentul unei
universităţi.
1.3 Motivaţie
4
Multe din functionaliţăţile lucrării ce urmează a fi dezvoltate au fost inspirate de
platforma Research Gate, diferenţa majoră fiind că aplicaţia curentă va fi restricţionată la a
fi folosită doar de membrii departamentului unei singure facultăţi, pe când Research Gate
permite înregistrarea membrilor oricărei facultaţi, indiferent de specializare, oraş, ţară.
5
2.Descrierea conceptelor teoretice pe care se bazează
aplicaţia
Privind scenariul de funcţionare a unei aplicaţii web sau chiar şi al unui website
static se pot identifica două entităţi esenţiale. O primă entitate ar fi cea care solicită
anumite servicii specifice ca de exemplu o cerere de vizualizare a unui anumit fişier sau a
unei imagini şi este denumită client. Cea de a doua entitate este cea care asigură deservirea
unui răspuns către orice solictare făcută şi poartă denumirea de server. Urmând aceste
specificaţii, a fost conceput modelul arhitectural client-server, care în prezent stă la baza
implementării aplicaţiilor WWW.
6
Pot exista mai multe tipuri de servere în funcţie de funcţionalitatea pe care acestea
o îndeplinesc. Câteva exemple ar fi: server web(Apache, Microsoft Internet Information
Services), server de baze de date(MySql, Oracle, SQL Server), server pentru servicii de
mail ce foloseşte protocolul SMTP(Simple Mail Transfer Protocol).
Pentru a fi posibilă dezvoltarea unei aplicaţii web este necesară existenţa unui
standard prin care să se asigure transmisia datelor pe Internet. În această privinţă este
utilizat modelul TCP-IP(Transmission Control Protocol- Internet Protocol), o variantă
simplificată a stivei OSI(Open Systems Interconnection), în care se regăsesc doar patru
niveluri, ci anume:
1.Accesul la mediu
2.Reţea(Internet)
3.Transport
4.Aplicaţie
De menţionat este faptul că stiva OSI reprezintă un model pur teoretic, ce nu a fost
niciodată implementat în mod concret, în timp ce TCP-IP este modelul real pe baza căruia
se realizează transmisia datelor în cadrul Internetului.
Pentru dezvoltatorii de aplicaţii web, nivelul de interes este cel de aplicaţie. Acesta
înglobează funcţionalităţile aduse de nivelurile sesiune, prezentare şi aplicaţie propuse la
stiva OSI. De asemenea, la acest nivel sunt folosite protocoale de nivel înalt precum:
HTTP(Hypertext Transfer Protocol), DNS(Domain Name Service), SMTP(Simple Mail
Transfer Protocol), FTP(File Transfer Protocol).
7
2.1.3. Protocolul HTTP
Pentru a se realiza comunicarea între client şi server este necesară utilizarea unui
protocol de nivel înalt, ci anume HTTP(Hypert Text Transfer Protocol), care acţionează la
nivelul aplicaţie al stivei TCP-IP.
Acţiunile menţionate mai sus trebuie totuşi să se integreze într-un anumit standard,
de aceea protocolul HTTP aduce o serie de metode specifice prin intermediul cărora
clientul poate interacţiona cu o resursă. Cele mai utilizate metode HTTP sunt:
Protocolul HTTP specifică faptul că orice metodă HTTP trebuie să aibă un anumit
format. Astfel, în cadrul unei cereri de orice tip va exista un header în care vor fi specificaţi
anumiţi parametri. Conform standardelor, headerul trebuie să conţină întotdeauna pe prima
linie metoda HTTP folosită, URI-ul şi versiunea HTTP. În prezent este folosită versiunea
1.1 care diferă de versiunea 1.0 prin faptul că este posibilă emiterea mai multor cereri şi
răspunsuri pe aceeaşi conexiune TCP, ceea ce nu era posibil la versiunea anterioară. Un
exemplu de header HTTP este redat în figura următoare:
8
Figura x.x Exemplu de header HTTP
9
O resursă este o entitate care are o anumită însemnătate în aplicaţie. Potrivit
principiilor REST fiecare resursă trebuie să aibă un URL(Uniform Resource Locator) care
este unic.
O resursă poate avea mai multe stări, iar starea într-un anumit moment este
cunoscută doar de server. Clientul poate totuşi să ceară schimbarea stării resursei prin
intermediul unei cereri HTTP. De asemenea o resursă poate avea mai multe
reprezentări(cazul documentelor ce sunt disponibile în mai multe limbi).
Aşa cum a fost prezentat până acum, o aplicaţie web este construită pe modelul
client-server. La prima vedere, principiul este unul simplu de înteles, funcţia principală a
serverului fiind aceea de a trata cererile venite de la clienţi, însă mecanismul din spatele
acestui proces este unul mai complex.
10
departe cererea. Unul dintre principalele avantaje ale folosirii Servlet-ului este că acesta
poate fi accesat simultan de mai multe thread-uri.
Unul dintre cele mai cunoste servere web ce oferă o implementare pentru Servlet
Container este Tomcat, un server open-source licenţiat de cei de la Apache. Alte exemple
de servere ce rulează pe un mediu Java: Glassfish, Jetty, Wildfly.
Text-miningul s-a născut din necesitatea procesării unor volume mari de date ce nu
sunt reprezentate într-o formă standard de tip tabel în care informaţia este structurată pe
rânduri şi coloane. În această categorie se încadrează documentele Word, documentele
PowerPoint, documentele în format PDF, în care textul nu este organizat într-o manieră
uniformă.
11
Pentru a realiza text-mining, în primul rând este necesară colectarea documentelor
text ce urmează a fi procesate şi analizate.
Această matrice este esenţială în căutarea după termeni cheie, deoarece astfel se pot
determina foarte uşor documentele în care se găseşte un anumit cuvânt. În cazul în care
această matrice nu ar fi creată şi s-ar face o căutare cuvânt cu cuvânt în toate documentele
existente, procesul ar fi foarte consumator de timp şi ar putea dura ore întregi în funcţie
dimensiunea documentelor sau numărul lor. Această metodă ne asigură însă un timp de
răspuns foarte rapid, fiind tehnica de bază utilizată la motoarele de căutare.
Cum unul dintre obiectivele principale ale acestei lucrări este evitarea stocării de
documente duplicate, în acest capitol se va prezenta teoria din spatele tehnicii de evaluare a
similarităţii dintre doua documente.
12
Pentru a se putea calcula gradul de similaritate între documente este necesară
organizarea datelor folosind modelul vectorial. Utilizarea modelului vectorial presupune că
toate entităţile cu care se operează vor fi reprezentate sub forma de vector, într-un spaţiu
vectorial n-dimensional. Entităţile pot fi documente text sau interogări.
Dacă avem mai multe documente pentru care s-a calculat matricea de frecvenţă a
apariţiei termenilor, atunci dimensiunea spaţiului vectorial va fi dată de numărul de linii ale
matricii, adică de numarul de cuvinte cheie selectate.
Pentru a transpune cele 3 documente în spaţiul vectorial obţinut din cei trei termeni
va trebui să construim, pentru fiecare document, un vector format din 3 elemente, astfel: pe
prima poziţie vom avea numărul de apariţii al lui T1, pe a doua poziţie numărul de apariţii
al lui T2, analog pentru T3 . Cei 3 vectori obţinuţi(E1, E2, E3) vor fi apoi reprezentaţi în
spaţiul vectorial determinat de T1, T2, T3.
13
În cazul procesării clasice de text este utilizată cea de a doua variantă.
Cosinusul dintre cei doi vectori sau similaritatea se calculează după următoarea
formulă:
Termenul de open-source provine din limba engleză şi se referă la faptul că, pentru
un anumit proiect, codul sursă este disponibil integral în mediul online. Mai mult, la
proiectele open-source poate contribui oricine atâta timp cât reuşeşte să aducă o
îmbunătăţire sau să rezolve o problemă anterioară.
În ultimii ani, în sfera tehnologiilor web s-au dezvoltat o mulţime de proiecte open-
source care au căpătat amploare şi acum sunt folosite ca şi tehnologii de bază în
companiile software.
14
Mai jos este prezentată o schemă cu principalele tehnologii utilizate, ce urmează a
fi detaliate în capitolele următoare.
Pe langă tehnologiile principale prezentate mai sus s-au mai folosit biblioteci open-
source de Java(PDFBox şi Apache Lucene), un tool care se ocupă cu managementul
dependenţelor proiectului(Apache Maven) şi un framework de testare unitară(JUnit).
15
Prin definiţie, POJOs sunt nişte obiecte Java construite în aşa fel încât să nu
depindă de clase sau interfeţe definite în cadrul frameworkului.
Într-o aplicaţie Spring sunt utilizate cu precădere POJO-urile, iar pentru a semnala
faptul că unele clase definite de programator depind de alte clase sau interfeţe interne
frameworkului se folosesc adnotări specifice.
Orice aplicaţie este construită din mai multe clase ce pot interacţiona între ele prin
relaţii de moştenire sau agregare.
16
● simplificarea procesului de testare
● codul devine mai uşor de reutilizat
● obiectele injectate vor avea propriul lor ciclu de viaţă
● în cadrul Spring, la crearea unui obiect, dependinţele sunt gestionate de către
framework
Spring Core
Spring Boot
Spring MVC(Model-View-Controller)
Spring Data JPA
Spring Security
17
View-ul –are ca rol funcţia de afişare a datelor preluate de la controller
Astfel, în imaginea de mai jos se observă cum o cerere este mai întâi tratată de un
Front Controller care o redirecţionează către controllerul ce trebuie să servească răspunsul.
Răspunsul este trimis înapoi către Front controller, ce îl va trimite ulterior către
view pentru a fi randat corespunzător.
Spring Data JPA este un modul prin care se realizează interacţiunea aplicaţiei cu
baza de date. Oferă suport atât pentru baze de date relaţionale, cât şi pentru cele
nerelaţionale.
Lucrul cu baza de date se face acum la un nivel abstractizat. În Spring Data JPA
fiecărui tabel din baza de date îi corespunde acum un repository, ce este implementat prin
intermediul unei interfeţe care va extinde o interfaţă pusă la dispoziţie de Spring. Există
două interfeţe de bază ce pot fi utilizate: CrudRepository şi JpaRepository, ce trebuie să fie
parametrizate corespunzător.
18
2. findOne –returnează o entitate în funcţie de id
3. findAll – returnează toate înregistrările dintr-un tabel
4. count – returnează numărul total al înregistrărilor dintr-un tabel
5. delete –şterge o înregistrare din baza de date
6. exists – verifică existenţa unei entităţi în baza de date
n
Fig x.x Codul sursă pentru interfaţa CrudRepository
Autentificarea este procesul prin care se stabileşte dacă un utilizator este cine
pretinde. În general, autentificarea se face prin intermediul unui formular de login, în care
utilizatorul îşi introduce username-ul şi parola, iar sistemul de securitate stabileşte
validitatea lor.
Autorizarea sau controlul accesului constă în procesul prin care se stabileşte dacă,
odată autentificat, un utilizator are sau nu permisiunea de a efectua o anumită acţiune
asupra aplicaţiei. Aşa cum este binecunoscut, o aplicaţie poate avea mai multe tipuri de
utilizatori, dintre care cele mai cunoscute roluri sunt cele de ADMIN şi USER. Autorizarea
este necesară pentru a se determina ce permisiuni îi sunt atribuite fiecărui rol.
19
Spring Security este construit pe baza unui mecanism ce foloseşte un lanţ de
filtre.Astfel, dacă un utilizator face o cerere pentru a accesa o resursă protejată, până ca
cererea lui să ajungă la Servlet, acesta va trece printr-o serie de filtre ce pot fi responsabile
cu: redirecţionarea către un formular de login, verificarea usernameului şi a parolei,
generarea de mesaje de eroare.
Apache Lucene este o bibliotecă Java a cărei principală funcţionalitate este aceea
de a indexa documente ce conţin text şi de a facilita procesul de regăsire a informaţiilor.
Scopul unui index este de a optimiza viteza de răspuns atunci când se fac căutari
asupra unei colecţii foarte mari de documente.
20
Cu o instanţă a acestei clase se poate crea sau modifica un index deja existent. Fişierele
index vor fi apoi stocate într-un anumit director specificat de programator.
Odată indexate, operaţia de bază ce se poate realiza asupra documentelor este cea
de căutare. Pentru acest lucru avem disponibile clasele IndexSearcher şi IndexReader.
Pentru a deschide directorul în care este stocat indexul este necesară o instanţă a clasei
IndexReader, iar pentru a face interogări asupra indexului se foloseşte clasa IndexSearcher.
Deoarece interfaţa unei aplicaţii web este afişată într-un browser, este necesară
utilizarea unor tehnologii care să poată fi interpretate de browser. Principala tehnologie de
acest tip este cea HTML(HyperText Markpup Language) care pentru expunerea
conţinutului în pagină utilizează taguri ce au caracter de metadate.
O pagină descrisă doar prin intermediul limbajului HTML este implicit statică, nu
permite nicio interacţiune cu utilizatorul, nu face posibilă generarea de conţinut dinamic şi
nu poate implementa niciun fel de logică de control în ceea ce priveşte afişarea datelor.
Această limitare a tehnologiei HTML a fost rezolvată prin introducerea unui limbaj de
programare care să poată fi interpretat de browser şi să asigure servirea de conţinut
dinamic la interacţiunea cu utilizatorul. Acest limbaj poartă denumirea de Javascript şi a
apărut în anul 1995, având ca şi principale caracteristici faptul că este independent de
platformă şi orientat obiect.
Dacă utilizarea limbajului HTML permite doar afişarea de conţinut static (text sau
fotografii), prin JavaScript este posibilă modificarea DOM-ului la interacţiunea cu
utilizatorul.
21
Javascript a fost iniţial utilizat doar la dezvoltarea aplicaţiilor pe partea de client,
însă ulterior a început să fie folosit şi ca limbaj de programare pe server, odată cu apariţia
frameworkului Node.js.
3.4.2. Angular JS
Pentru a utiliza Angular JS, framework-ul trebuie importat în fişierul HTML aferent
paginii principale a aplicaţiei, care prin convenţie poartă denumirea de index.html .
Principala noutate adusă de Angular este extinderea sintaxei limbaului HTML prin
utilizarea unor atribute specifice în cadrul tag-urilor clasice. Aceste atribute poartă
denumirea de directive. Angular vine cu propriile sale directive, dar dacă este necesar,
programatorul îsi poate defini la rândul său altele. Un exemplu de astfel de directivă este
ng-app care iniţializează o aplicaţie de tip Angular.
Unul din principalele avantaje aduse de Angular JS este acela că oferă sincronizare
automată între datele din model şi cele din view, concept cunoscut sub numele de data-
binding. Astfel, fiecare modificare adusa modelului va fi imediat înregistrată în view şi
viceversa prin intermediul unor watchere care vor monitoriza starea variabilelor.
22
controller.Angular are la bază un mecanism de injectare a dependinţelor prin care sunt
gestionate legăturile dintre componente.
Ideea de bază la aplicaţiile de tip SPA este că întreg conţinutul este integrat într-o
singură pagină. Toate fişierele auxiliare necesare, cum ar fi scripturile Javascript sau
fişierele CSS sunt acum încărcate o singuă data. La o aplicaţie clasică, organizată în mai
multe pagini, fiecare accesare de pagină presupunea încărcarea fişierelor JavaScript şi CSS
aferente, acest proces determinând creşterea timpului de răspuns. Aplicaţiile SPA
reprezintă o soluţie prentru rezolvarea acestei probleme.
O aplicaţie de tip SPA va avea un singur URL, iar stările vor fi marcate prin
caracterul special #.
3.4.3 Bootstrap
În perioada incipientă a aplicaţiilor web se utilizau doar fişiere CSS externe pentru
realizarea designului unei pagini, însă pe parcurs au apărut diverse frameworkuri care îşi
propun să uşureze munca programatorului în acest sens, cele mai cunoscute fiind Bootstrap
şi Foundation.
23
Bootstrap vine cu o serie de clase CSS predefinite astfel încât aplicaţiile să aibă un
design uniform şi plăcut. Aceste clase se pot aplica pe elemente HTML precum formulare,
tabele, meniuri de navigare, butoane, div-uri.
24
Fig x.x Exemplu de declarare a unei dependinţe Maven
În cadrul acestui proiect s-a utilizat Maven pentru adăugarea modulelor necesare
frameworkului Spring(Spring Boot, Spring Data Jpa, Spring Security) şi a altor biblioteci
externe precum PDFBox şi Apache Lucene. Referitor la modulele Spring, odată declarată
versiunea de framework folosită în fişierul de configurare, Maven se va asigura ca şi restul
modulelor vor fi compatibile, eliminând riscul anumitor incompatibilităţi.
3.6.Hibernate
Deoarece mediul de dezvoltare folosit în cadrul aplicaţiei este Java, adică un limbaj
de programare strict orientat pe obiect, iar baza de date folosită este una relaţională este
necesară utilizarea unei tehnologii care să realizeze maparea entităţilor reprezentate sub
formă de obiect şi a celor sub formă de tabelă. Tehnologia prin intermediul căreia se
realizează acest lucru poartă denumirea de Hibernate.
25
Necesitatea utilizării unui ORM provine din faptul că între datele reprezentate sub
formă de clase Java şi cele dintr-o bază de date relaţională apar incompatibilităţi în ceea ce
priveşte tipurile de date şi mai ales relaţiile între entităţi. În cadrul programării orientate pe
obiecte, o relaţie între entităţi poate fi bidirecţională, în timp ce la bazele de date, relaţiile
între tabele sunt definite prin intermediul cheilor străine. Un tabel copil va păstra o coloană
de tip cheie străină în care va face referinţă la cheia primară a tabelului părinte, dar în
tabelul părinte nu se regăseşte nicio referinţă la tabelul copil, deci din acest punct de vedere
relaţia este unidirecţională.
Pentru a putea realiza o legătură între cele două modalităţi de reprezentare a datelor,
Java a introdus un standard care poartă numele de JPA, iar Hibernate este un framework ce
implementează acest standard.
3.7. MySQL
Pentru a putea stoca informaţia într-o bază de date şi a putea interacţiona cu aceasta
este necesară utilizarea unui sistem de gestiune a bazelor de date.
MySQL este unul dintre cele mai populare SGBD-uri deoarece este open-source,
oferă API-uri pentru o varietate mare de limbaje de programare(PHP, Java, C#, C++, C,
Ruby, Python) , funcţionează pe o multitudine de platforme.
3.8. JUnit
În dezvoltarea oricărui proiect, etapa de testare este cea prin care se asigură
calitatea produsului livrat, de aceea aceasta nu trebuie neglijată. Metodele de testare
manuală permit într-adevăr detecţia erorilor de funcţionare într-un procent destul de mare,
însă întotdeauna este recomandat să se realizeze şi o testare automată.
JUnit este un framework de testare folosit pentru limbajul Java. Este utilizat la
scrierea testelor unitare, adică teste ce verifică funcţionalitatea corectă a unei componente
de sine stătătoare(clasă sau metodă).
26
Se bazează pe folosirea de adnotări printre care cea de bază este @Test care se trece
înaintea semnăturii unei metode pentru a semnaliza că acea metodă va fi rulată ca şi test.
Procedeul este unul simplu, pentru a testa o anumită metodă se vor defini nişte date de
intrare şi outputul care este aşteptat în urma introducerii acelor date. Dacă outputul metodei
coincide cu cel aşteptat, atunci testul a rulat cu success, altfel este semnalată o eroare în
logica metodei.
Pentru alegerea tehnologiilor s-au avut în vedere mai multe aspecte. S-a urmărit în
primul rând să se folosească tehnologii de actualitate, cât mai utilizate în companiile ce
dezvoltă produse software. În al doilea rând, au fost alese tehnologii open-source ce au o
comunitate largă de programatori.
S-a ales Java ca limbajul principal utilizat pentru partea de server din următoarele
considerente:
Ca şi framework pentru partea de server s-a ales Spring deoarece este cel mai
cunoscut framework Java folosit la dezvoltarea aplicaţiilor web, este open-source, are o
documentaţie foarte bună şi complexă ce cuprinde explicaţii însoţite de exemple de cod,
fiind împărţit în aproximativ 20 de module, fiecare modul adresându-se unei funcţionalităţi
distincte. De asemenea, în cadrul Spring este folosit un mecanism de management al
dependenţelor între obiecte care conduce la un cod mai uşor de reutilizat şi de testat.
Frameworkul ales pentru partea de client este Angular JS, deoarece este open-
source, oferă sincronizare automată între datele din model şi cele din view(data-binding) şi
dispune de un mecanism de management asemanător Spring ce gestionează ciclul de viaţă
27
al obiectelor.De asemenea, aplicaţiile Angular fiind de tip SPA asigură un timp de răspuns
mai rapid pentru cererile HTTP.
Ca şi framework folosit pentru stilizarea aplicaţiei s-a ales Bootstrap din principalul
motiv că prin utilizarea claselor de CSS predefinite în cadrul acestui framework se
micşorează timpul necesar realizării unei interfeţe grafice care să aibă design responsive.
De asemenea, frameworkul este open-source, uşor de integrat în proiect şi are o
documentaţie foarte bună.
În cazul aplicaţiilor web este întotdeauna necesară existenţa a cel puţin două
niveluri.Cel mai cunoscut exemplu este reprezentat chiar de modelul client-server, în care
28
pe partea de client avem interfaţa cu utilizatorul şi pe partea de server logica aplicaţiei şi
procesarea datelor. Este important de notat faptul că în terminologia din limba engleză
atunci când se face referire la arhitecturi multi-nivel se face adesea confuzia între termenii
layer şi tier. O arhitectură multi tier implică faptul că nivelurile rulează pe maşini diferite,
dar în cazul multi layer nivelurile se pot afla şi pe aceeaşi maşină.
Nivelul client sau prezentare este cel cu care utilizatorul poate interacţiona în mod
direct prin intermediul interfeţei grafice afişate în browser. Este responsabil cu afişarea
datelor, monitorizarea acţiunilor utilizatorului, trimiterea de cereri HTTP către server şi
afişarea de răspunsuri. După cum se poate observa şi în schema de mai sus, nivelul client
comunică în mod direct cu nivelul server printr-un API, însă nu are acces la nivelul de date.
La nivelul server rezidă logica aplicaţiei. Principalele operaţii care au loc aici sunt:
procesarea cererilor HTTP venite de la client, realizarea conexiunii cu baza de date şi
efectuări de operaţii de tip CRUD(creare, citire, modificare şi stergere) asupra
înregistrărilor din tabele. Acest nivel joacă rol de intermediar între client şi date şi este
implementat folosind tehnologia Spring.
29
La nivelul de date se află o bază de date relaţională implementată folosind sistemul
de gestiune a bazelor de date MySQL. Acest nivel nu este în niciun fel conştient de
existenţa nivelurilor superioare şi poate exista independent.
În cazul aplicaţiei dezvoltate, cele trei niveluri rulează pe aceeaşi maşină, însă
acestea pot funcţiona la fel şi în cazul mutării lor pe maşini diferite.
Atunci când un proiect necesită stocarea şi apoi regăsirea informaţiei, cea mai
indicată metodă de a realiza acest lucru este prin utilizarea unei baze de date. Astfel, există
două mari tipuri de baze de date şi fiecare este folosit în funcţie de cerinţele aplicaţiei:
30
Fig x.x Tabelul în care sunt stocaţi utilizatorii
Diferenţa dintre contul de tip USER şi cel ADMIN este că ADMIN-ul are
permisiuni extinse faţă de USER, fiind cel care se ocupă cu gestiunea conturilor de USER,
mai exact poate vizualiza informaţii despre toţi utilizatorii înregistraţi şi poate genera o
serie de rapoarte privind activitatea lor. Ca şi o alternativă a proiectării acestei constrângeri
s-ar fi putut opta pentru crearea unui tabel separat TIP_CONT în care să fie stocate toate
tipurile de cont disponibile cu un id asociat, iar în tabelul utilizatorilor să existe o cheie
străină care face referire, prin id, la tipul de cont din tabelul TIP_CONT. Această variantă
ar fi necesitat o operaţie de join între cele două tabele care ar fi crescut costul unei
interogări şi nu ar fi fost justificată de faptul că un utilizator poate avea doar un tip de cont.
Aplicaţia permite încărcarea a patru tipuri de articole, despre care trebuie să fie
stocate informaţii specifice:
articolul este o carte scrisă în totalitate de un autor sau un grup de autori: editura,
ISBN, ISSN, ediţia, anul publicării
articolul este un capitol dintr-o carte ce aparţine mai multor autori: titlul cărţii,
numele tuturor autorilor, numele editorilor, numele capitolului, paginile la care
poate fi găsit articolul, ISBN, ISSN, editura, anul publicării
31
articolul a fost prezentat în cadrul unei conferinţe: numele, locaţia şi data
conferinţei
articolul a fost publicat într-un jurnal ştiinţific sau o revistă: nume jurnal/revistă,
număr jurnal/revistă, volum jurnal /revistă, paginile la care poate fi găsit articolul,
data apariţie jurnal/revistă
Fig x.x
Se observă cum tabelul Articol are un câmp id_tip_articol, ce este o cheie străină ce
face legătura cu tabelul Tip_Articol. Tabelele Detalii_Carte_Capitol,
Detalii_Jurnal_Revistă, Detalii_Carte_Completă şi Detalii_Conferintă împart aceeaşi cheie
primară cu cea a tabelului Articol, marcând o relaţie de tipul one-to-one.
Pentru cuvintele cheie ataşate fiecărui articol a fost necesară crearea unui tabel Tag
cu câmpurile id şi denumire. Astfel, un articol poate avea mai multe tag-uri şi un tag se
poate regăsi la mai multe articole. Acest tip de relaţie se numeşte many-to-many şi se
rezolvă prin crearea unui tabel intermediar, articol_tag, ce va conţine o cheie primară
compusă din cheile primare ale tabelelor Articol şi Tag.
32
De asemenea, este necesar ca pentru fiecare articol să se ştie ce utilizator l-a
încărcat. Acest lucru este rezolvat prin crearea unei relaţii de tipul one-to-many între
tabelele Articol şi User, astfel pentru fiecare articol există o constrângere de tipul cheie
străină prin care se face referire la id-ul utilizatorului ce a încărcat articolul.
Pentru coautorii unui articol vor exista două situaţii, dacă un coautor este sau nu
înregistrat pe platformă. Dacă are deja cont, relaţia de tipul many-to-many leagă tabelele
User şi Articol prin tabelul coautorUser_articol. Cea de a doua situaţie, în care un coautor
nu are cont este rezolvată prin crearea unui nou tabel Autor_fara_cont, iar între acest tabel
şi Articol se face legătura de tip many-to-many prin tabelul Articol_coautorFaraCont.
Fig x.x
Primul pas constă în scrierea claselor Java şi determinarea relaţiilor dintre acestea.
Hibernate funcţionează pe baza unor adnotări specifice, un fel de metadate, care se
33
ataşează unei clase, unui atribut sau unei metode. După ce au fost scrise clasele cu
adnotări, la rularea programului codul va genera tabelele respective, inclusiv relaţiile dintre
acestea în baza de date relaţională, ce a fost definită în fişierul de configurare. Singura
condiţie de funcţionare este ca baza de date să existe, dar ea nu va conţine niciun tabel,
acestea vor fi generate prin intermediul codului Java.
În figura de mai jos se află o reprezentare UML a claselor prin intermediul cărora s-
au generat tabelele. Pentru simplificarea schemei s-au omis unele atribute, care se regăsesc
însă în formă completă în reprezentările schematice ale bazei de date(fig x.x , fig x.x, fig
x.x). Prin linie dreaptă sunt marcate relaţiile de asociere între clase.
Adnotările folosite
Hibernate pune la dispoziţie o gamă largă de adnotări, însă cele care au fost folosite
în acest proiect sunt următoarele:
@Entity – marchează faptul că o clasă va reprezenta o tabelă de sine stătătoare în
baza de date şi se va pune întodeauna înainte de declarea unei clase
@Column – marchează faptul că un atribut va reprezenta o coloană într-o tabelă şi
se poate parametriza în funcţie de necesităţi(se poate specifica dacă valorile din
acea coloană pot fi sau nu nule, dacă trebuie să fie unice)
@Id –este o adnotare ce marchează faptul că unul din atributele clasei va avea rol
de cheie primară
@OneToOne – este folosită pentru a marca o relaţie de tipul one-to-one
@OneToMany – este folosită pentru a marca o relaţie de tipul one-to-many
@ManyToMany –este folosită pentru a marca o relaţie de tipul many-to-many
34
Pentru rezolvarea relaţiilor one-to-one, one-to-many, many-to-many Hibernate va
interpreta adnotările corespunzătoare care sunt ataşate unor atribute din clasele Java şi va
crea constrângeri de tip cheie străină sau va genera tabele de legătură. Pentru a înţelege mai
bine cum funcţionează aceste adnotări, în continuare se vor oferi nişte exemple pentru
fiecare tip de relaţie în parte.
În clasa Articol:
Clasa User joacă aici rolul de părinte al relaţiei. Prin intermediul atributului fetch
setat cu valoarea FetchType.EAGER , atunci când datele despre un User vor fi solicitate se
vor primi şi datele despre toate articolele încărcate de acel utilizator. Prin mappedBy se
specifică numele atributului din clasa care completează relaţia. Atributul orphanRemoval
setat cu valoarea true specifică faptul că atunci când un utilizator va fi şters vor fi şterse şi
toate înregistrările din tabelul Articol care au ca şi cheie străină id-ul utilizatorului.
35
Bucata de cod de mai sus se regăseşte în clasa User. Se observă ca relaţia many-to-
many este cea mai complicată de până acum, deoarece necesită foarte multe adnotări. Prin
intermediul adnotării @JoinTable se specifică numele tabelului de legătura, iar prin
adnotarea @JoinColumn se vor menţiona coloanele corespunzătoare celor două tabele care
vor forma cheia primară compusă a tabelului de legătura. În acest caz, cheia primară este
compusă din id-ul utilizatorului şi id-ul articolului.
Modulul prin care se face legătura între partea de server şi baza de date este Spring
Data JPA. Acesta asigură posibilitatea de introducere a noi înregistrări în tabele şi de
definire a unor interogări. Modalitatea prin care se realizează acest lucru este prin definirea
unor interfeţe Java aferente fiecărei clase ce a fost adnotată cu @Entity.
În exemplul de mai sus este definită o interogare prin care se obţine id-ul maxim
din tabelul Tag.
36
În exemplul de mai sus este accesată metoda care returnează un obiect de tipul
CarteCapitol, făcând căutare dupa id.
La crearea unui nou cont de utilizator se vor preciza şi permisiunile acestuia. Pentru
menţinerea confidenţialităţii şi integrităţii datelor este recomandat ca utilizatorilor să le fie
restricţionat accesul şi să li se ofere permisiuni doar pentru citire. De asemenea, un alt
lucru ce trebuie luat în considerare este faptul că parola unui utilizator trebuie să fie dificil
de spart, deoarece o parolă slabă poate reprezenta o vulnerabilitate considerabilă.
La nivel intern, mai pot apărea vulnerabilităţi din cauza utilizării unor setări
implicite ale sistemului de gestiune a bazei de date. În acest caz, se recomandă consultarea
documentaţiei, deoarece aceste setări pot să difere în funcţie de versiunea de MySql
utilizată. De asemenea, portul implicit pe care rulează MySql, adică 3306, ar trebui să fie
modificat pentru a putea preveni o potenţială încercare de conexiune la acest port din afară.
37
La nivel de aplicaţie web, unul dintre cele mai frecvente atacuri asupra unei baze de
date poartă denumirea de SQL Injection. Indiferent de mediul de baze de date folosit,
există riscul ca un cod nu foarte bine scris să îi ofere unui atacator posibilitatea de a
executa un astfel de atac.
Ca şi modalităţi de prevenire ale acestui atac se poate opta pentru validarea textului
introdus de utilizator pentru a verifica dacă acesta conţine sau nu ghilimele şi utilizarea de
cereri parametrizate.
O tabelă va fi în general ordonată după câmpul cheie primară. Acest lucru nu este
eficient în cazul în care se fac multe interogări după alte câmpuri, deoarece datele nefiind
38
într-o ordine logică, căutarea se va face liniar, înregistrare cu înregistrare, timpul de acces
devenind astfel foarte mare.
În funcţie de căutările care se vor face, în cazul acestei aplicaţii se pot defini indecşi
pentru diverse câmpuri cum ar fi titlul unui articol, numele autorilor. Cu toate acestea,
definirea indecşilor va fi necesară doar în cazul în care baza de date a atins un număr foarte
mare de înregistrări, altfel ar ocupa spaţiul pe disc într-un mod ineficient.
Pentru alegerea tehnologiilor s-au avut în vedere mai multe aspecte. S-a urmărit în
primul rând să se folosească tehnologii de actualitate, cât mai utilizate în companiile ce
dezvoltă produse software. În al doilea rând, au fost alese tehnologii open-source ce au o
comunitate largă de programatori.
S-a ales Java ca limbajul principal utilizat pentru partea de server din următoarele
considerente:
Ca şi framework pentru partea de server s-a ales Spring deoarece este cel mai
cunoscut framework Java folosit la dezvoltarea aplicaţiilor web, este open-source, are o
documentaţie foarte bună şi complexă ce cuprinde explicaţii însoţite de exemple de cod,
fiind împărţit în aproximativ 20 de module, fiecare modul adresându-se unei funcţionalităţi
39
distincte. De asemenea, în cadrul Spring este folosit un mecanism de management al
dependenţelor între obiecte care conduce la un cod mai uşor de reutilizat şi de testat.
Frameworkul ales pentru partea de client este Angular JS, deoarece este open-
source, oferă sincronizare automată între datele din model şi cele din view(data-binding) şi
dispune de un mecanism de management asemanător Spring ce gestionează ciclul de viaţă
al obiectelor.De asemenea, aplicaţiile Angular fiind de tip SPA asigură un timp de răspuns
mai rapid pentru cererile HTTP.
Ca şi framework folosit pentru stilizarea aplicaţiei s-a ales Bootstrap din principalul
motiv că prin utilizarea claselor de CSS predefinite în cadrul acestui framework se
micşorează timpul necesar realizării unei interfeţe grafice care să aibă design responsive.
De asemenea, frameworkul este open-source, uşor de integrat în proiect şi are o
documentaţie foarte bună.
40
dovedeşte întotdeauna cea mai buna soluţie, iar în situaţiile în care avem prea multe
niveluri complexitatea aplicaţiei va creşte şi pot apărea de asemenea probleme de
performanţă.
În cazul aplicaţiilor web este întotdeauna necesară existenţa a cel puţin două
niveluri.Cel mai cunoscut exemplu este reprezentat chiar de modelul client-server, în care
pe partea de client avem interfaţa cu utilizatorul şi pe partea de server logica aplicaţiei şi
procesarea datelor. Este important de notat faptul că în terminologia din limba engleză
atunci când se face referire la arhitecturi multi-nivel se face adesea confuzia între termenii
layer şi tier. O arhitectură multi tier implică faptul că nivelurile rulează pe maşini diferite,
dar în cazul multi layer nivelurile se pot afla şi pe aceeaşi maşină.
Nivelul client sau prezentare este cel cu care utilizatorul poate interacţiona în mod
direct prin intermediul interfeţei grafice afişate în browser. Este responsabil cu afişarea
datelor, monitorizarea acţiunilor utilizatorului, trimiterea de cereri HTTP către server şi
afişarea de răspunsuri. După cum se poate observa şi în schema de mai sus, nivelul client
comunică în mod direct cu nivelul server printr-un API, însă nu are acces la nivelul de date.
41
La nivelul server rezidă logica aplicaţiei. Principalele operaţii care au loc aici sunt:
procesarea cererilor HTTP venite de la client, realizarea conexiunii cu baza de date şi
efectuări de operaţii de tip CRUD(creare, citire, modificare şi stergere) asupra
înregistrărilor din tabele. Acest nivel joacă rol de intermediar între client şi date şi este
implementat folosind tehnologia Spring.
În cazul aplicaţiei dezvoltate, cele trei niveluri rulează pe aceeaşi maşină, însă
acestea pot funcţiona la fel şi în cazul mutării lor pe maşini diferite.
Nivelul server
Nivelul server este nivelul de mijloc al aplicației, care realizează legătura între baza
de date și interfața cu utilizatorul. Tot aici este implementată logica de control care stă la
baza tuturor funcționalităților aplicației iar principalul său rol este de a intercepta toate
cererile venite din partea clientului şi de a genera un răspuns corespunzator.
42
Avantajele utilizării acestui şablon de implementare constau în faptul că aplicaţiei i
se oferă scalabilitate, funcţionalităţile vor fi mult mai bine delimitate şi de asemenea codul
va fi mult mai uşor de modificat şi reutilizat.
Pe lângă cele trei niveluri principale ce comunică între ele, ar mai trebui menționat
și nivelul cel mai de jos, al claselor prin care sunt modelate entitățile principale ale
aplicației, marcate cu adnotarea @Entity. Acestea au fost prezentate în capitolul anterior în
care s-a discutat despre baza de date.
Nivelul inferior este cel care asigură legătura cu baza de date și este alcătuit din
interfețe ce extind interfața JpaRepository, parametrizate cu numele clasei, ce este mapată
cu un tabel în baza de date și tipul de date al cheii primare. Fiecărei clase îi va corespunde
o interfață marcată cu adnotarea @Repository.
Fiecare interfaţă de tip @Repository va avea asociată o clasă al cărui rol este de a
oferi o implementare pentru metodele interfeţei şi de a verifica validitatea datelor primite
pentru a le trimite mai departe către ultimul nivel. Clasele de acest tip sunt marcate prin
adnotarea @Service.
Ultimul nivel este cel care interceptează cererile HTTP venite de la client și
generează un răspuns corespunzator, folosind instanțe ale claselor de tip @Service. Aceste
clase sunt marcate cu adnotarea @Controller.
Întrucât clasele de tip @Controller sunt cele care asigură comunicarea cu clientul,
urmând principiile REST, acestea trebuie să fie identificate în mod unic prin intermediul
unui URL. Fiecare resursă, adică tabelă din baza de date va avea asociată câte o clasă
@Controller şi prin convenţie URL-ul prin care este identificată această clasă va purta
denumirea resursei. Există două modalităţi de definire a acestui URL:
la nivel de clasă
la nivel de metodă
43
Astfel, pentru clasa UserController s-a definit calea rădăcină “ /user”.
44
Metoda getAllUsers() returnează o listă cu toţi utilizatorii, făcând apel la o metodă
pusă la dispoziţie de interfeţele Spring de tip JpaRepository, metoda findAll().
În acest punct, poate apărea o întrebare legată de utilitatea claselor de tip @Service,
întrucât metodele din interfeţele @Repository pot fi accesate şi de la nivelul claselor
@Controller.
Cea mai complexă metodă şi cea pe care se bazează întreaga aplicaţie este metoda
pentru încarcarea unui articol, care este reprezentat sub formă de fişier PDF. Această
metodă are rolul de a valida fişierul, verificând întâi dacă acesta a mai fost încărcat ulterior
şi în caz contrar de a îl salva în baza de date, împreună cu toate informaţiile
corespunzatoare introduse de utilizator.
Pentru determinarea similarităţii dintre două documente s-a folosit biblioteca open-
source Apache Lucene şi pentru extragerea conţinutului text din fişierele PDF s-a folosit o
altă bibliotecă open-source, PDFBox.
45
Antetul metodei:
Metoda primeşte ca parametri titlul articolului, care este de tipul String, adică un şir
de caractere, fişierul încărcat, ce este reprezentat sub forma unui obiect de tipul
MultipartFile şi un parametru de tipul HttpServletRequest în care sunt încapsulate restul
informaţiilor despre articol ce sunt trimise în cererea de tip POST.
Mai departe, din fişierul PDF se va extrage conţinutul text utilizandu-se biblioteca
PDFBox. Pentru acest lucru s-a creat o clasă denumită PDFBoxUtils ce va conţine o
metodă de extragere a textului. Salvarea în prealabil a fişierului PDF, înainte de verificarea
pentru duplicate a fost necesară deoarece metoda PDFBox prin care se încarcă un fişier
cere ca parametru o cale, deci fişierul nu ar fi putut fi procesat dacă nu era salvat pe server.
După ce s-a obţinut conţinutul text al unui fişier PDF acesta se va indexa folosind
Apache Lucene. Atunci când un document este indexat cu Lucene i se atribuie un ID
intern, problema majoră cu acest ID fiind că se generează în mod aleator şi nu este
persistent, se poate modifica după fiecare adăugare a unui nou document la index. Acest
lucru poate însă fi rezolvat, deoarece la indexarea unui document de tip text, programatorul
mai poate adăuga şi alte informaţii suplimentare pentru identificare, deci se poate adăuga
un alt ID care să fie persistent şi care să poată fi generat după o anumită regula(de exemplu
auto-incrementare). S-a ales ca acest ID să corespundă cu ID-ul din baza de date.
46
Pentru calcularea similarităţii cosinus a fost implementată clasa CosineSimilarity.
Apache Lucene are implementată o metodă care primeşte ca parametru ID-ul intern al unui
document indexat şi returnează vectorul de frecvenţă a apariţiei termenilor. Având în
vedere faptul că ID-ul intern nu este mereu acelaşi a fost necesar ca înainte de fiecare
indexare să se determine corespondenţa dintre ID-ul dat de programator(care coincide cu
cel din baza de date) şi cel dat aleator de Lucene. Acest lucru s-a realizat prin calcului unei
structuri de date de tip HashMap ce conţine perechi de tipul cheie-valoare unde cheia este
ID-ul extern şi valoarea este ID-ul intern. Acest HashMap se va calcula înainte de fiecare
indexare.
Din punct de vedere teoretic, dacă două documente sunt identice atunci
similaritatea cosinus trebuie să ia valoarea 1. Pentru comparare s-a ales însă pragul de 0.97
pentru că în urma rulării câtorva teste pe documente identice rezultatul nu a fost întodeauna
1 şi a atins şi valori de 0.98 sau 0.99.
Dacă în urma comparării s-a gasit un document identic, atunci fişierul ce urma să
fie încărcat va fi şters din folderul în care a fost salvat şi din index, iar metoda îi va returna
un răspuns clientului cu mesajul că documentul ce se vrea a fi încărcat deja există.
Dacă nu se găseşte niciun document similar atunci metoda merge mai departe
pentru determinarea restului informaţiilor necesare pentru ca articolul să fie salvat în baza
de date. Astfel, în continuare, utilizând parametrul de tip HttpServletRequest se vor
determina: care sunt coautorii articolului, care sunt tagurile introduse de utilizator, ce tip de
articol a fost încărcat, informaţiile specifice pentru fiecare tip de articol. La final, după ce
au fost stabilite toate relaţiile se va efectua operaţia de scriere în baza de date, iar către
client va fi trimis un mesaj prin care se specifică dacă articolul a fost încărcat cu succes sau
nu.
47
Mai jos este ilustrată o diagrama de activităţi care prezintă principalii paşi pentru
metoda de încărcare de fişier:
3.Autentificarea
Un JSON Web Token este un şir de caractere ce a fost obţinut prin criptare cu o
cheie secretă, folosindu-se un algoritm specific. Este alcătuit din trei părti:
48
● header
● payload (parte ce conţine informaţie utilă)
● semnătură
Iniţial, headerul este reprezentat sub formă de fişier JSON şi poate conţine
informaţii despre algoritmul de criptare folosit (HMAC, SHA256, RSA) sau tipul
tokenului(în cazul de faţa JWT). Apoi, pentru a obţine prima parte a tokenului, headerul
este encodat în forma Base64 pentru a transforma toate datele in simboluri ASCII.
Pentru semnătură se vor lua headerul encodat, payloadul encodat şi asupra lor se va
face o criptare folosindu-se o cheie secretă şi un algoritm de criptare specific. Se va obţine
astfel a treia parte a tokenului.
Avantajul adus de această metodă este că prin folosirea tokenului nu se va mai crea
un tabel în baza de date pentru a salva starea utilizatorului, ceea ce implică mai puţine
interogări la fiecare cerere, deci un timp de răspuns mai rapid.
49
Astfel, toate cererile ce vor începe cu calea /auth şi vor avea ca scop logarea sau
crearea de cont le vor fi permise tuturor utilizatorilor. Pentru URL-ul /user/all ce apelează
metoda GET din controller-ul dedicate resursei utilizator s-a restricţionat accesul, doar
utilizatorii cu rolul de ADMIN vor avea permisiune. În acest fel se asigură securizarea
resurselor aplicaţiei, iar în cazul în care un client va face o cerere pentru care nu este
autoritzat serverul va genera un răspuns cu codul 401 UNAUTHORIZED.
Nivelul client
Nivelul client este cel care permite realizarea interfeţei grafice ce poate fi
vizualizată din browser. Pentru implementare s-au folosit următoarele tehnologii:
50
utilizatorului să trimită către server cereri de tip HTTP(în principal GET, POST, PUT) şi de
asemenea să asigure afişarea răspunsului primit. Angujar JS conlucrează foarte bine cu
limbajul HTML întrucât conţine nişte componente specifice numite directive, ce pot fi
integrate în sintaxa HTML în scopul îndeplinirii anumitor funcţionalităţi.
Mai departe, tot în acest fişier sunt declarate stările aplicaţiei, întrucât o aplicaţie
Angular nu va conţine pagini propriu-zise. Declararea stărilor se face cu ajutorul modului
ui.router.
Mai sus este reprezentat un exemplu de declarare a stării default a aplicaţiei. Pentru
declararea unei stări trebuie precizate numele, url-ul şi fişierul HTML aferent.
51
$scope – este o variabilă prin intermediul căreia datele din controller pot fi vizibile
în cadrul fişierului HTML
$http – este un serviciu oferit de Angular prin intermediul căruia se realizează
cererile HTTP
$state – este o variabilă ce permite accesarea stării curente(a fost utilizată pentru a
realiza o operaţie de refresh asupra unei stări)
O altă directivă Angular foarte des folosită este ng-repeat. Aceasta are rolul unui
for, parcurgând toate elementele dintr-o variabilă de tip vector. În exemplul de mai jos
variabila users este un vector ce conţine informaţii despre toţi utilizatorii ce şi-au creat cont
pe aplicaţie şi a fost obţinută în urma unei cereri HTTP la adresa “user/all” ce apelează
metoda existentă pe server. În controller aceasta are denumirea de $scope.users în timp ce
în fişierul HTML poate fi accesată doar cu denumirea users.
52
având rolul de a preciza ce se va întâmpla când utilizatorul dă click cu mouseul pe
compnenta respectivă. În general este parametrizată cu o funcţie ce se va regăsi în cadrul
controllerului.
5. Descrierea aplicaţiei realizate
53
2.Secţiunea dedicată încărcării unui articol
pentru articolele de tip carte completă: editură, ediţie, an apariţie, ISSN, ISBN
pentru articolele de tip capitol: titlu cărţii din care face parte capitolul, numele
capitolului, lista completă de autori ai cărţii, lista editorilor cărţii, editura, ediţia,
anul apariţiei cărţii, ISSN, ISBN, paginile la care se găseşte capitolul
pentr articolele de tip conferinţă: numele conferinţei, locaţia, data
pentru articolele de tipul jurnal/revistă: numele publicaţiei, numărul, volumul, data
apariţie, ISSN, ISBN, paginile la care se regăseşte articolu
Pentru a adăuga un coautor există două posibilităţi: adăugarea unui coautor ce are deja
creat un cont sau adăugarea unui coautor ce nu are cont.
54
Fig x.x Formularul pentru adăugare coautori
În cazul adăugării unui coautor ce are deja cont, utilizatorul îi va putea selecta
numele dintr-o listă derulantă şi pentru a salva alegerea făcută va apăsa pe butonul Adauga
coautor. Pentru a finaliza cu adăugarea coautorilor se va apăsa butonul Finalizare.
Pentru adăugarea unui coautor ce nu are cont, utilizatorul are la dispoziţie o casetă
de text în care va introduce numele integral al coautorului.
55
Fig x.x Formularul de căutare articol
56
Fig x.x Fereastra de statistici pentru un utilizator
Pentru a vizualiza utilizatorul cu cele mai multe articole de un anumit tip, există o
casetă derulantă din care se poate selecta tipul articolului.
57
Secţiunea pentru rapoarte per grup de utilizatori permite sortarea utilizatorilor în
funcţie de articolele încărcate şi descărcate. Este pusă la dispoziţie o listă derulantă din
care se poate selecta criteriul de sortare dorit. Rezultatele vor fi afişate apoi într-o formă
tabelară, în ordine descrescătoare.
Cel de-al doilea raport constă în afişarea tuturor utilizatorilor care au încărcat un
articol de un anumit tip. Pentru acest lucru se va selecta din lista derulantă tipul articolului
şi rezultatele vor fi afişate tot într-o formă tabelară.
58
7.Bibliografie
Sun GlassFish Message Queue 4.4 Technical Overview. Documentaţie Oracle (2010).
http://docs.oracle.com/cd/E19587-01/821-0028/6nl41ccpg/index.html Accesat: 2015.
7. Verhenneman, G. (2009). Cameras in your living room, the next step in e-homecare?
European Journal of ePractice, No.8, Decembrie 2009, pag. 68-76, ISSN: 1988-625X
59