Professional Documents
Culture Documents
LUCRARE DE LICEN
Smart Presentation Feedback
Comunicaia client-server
Coordonatori tiinifici:
Absolvent:
George-Cristian
Cristian Stoica
BUCURETI
2012
Rezumat
O prezentare inut n faa unei audiene numeroase reprezint o activitate predominant
unilateral, n care cei prezeni n audien nu pot interveni n niciun fel pe parcursul prezentrii, astfel
nct strngerea unui feedback relevant din partea acestora este dificil. Acest lucru se ntmpl chiar i
n condiiile n care majoritatea persoanelor dein un dispozitiv smartphone sau chiar o tablet, deci un
suport electronic pe care ar putea urmri prezentarea i prin care s-ar putea devolta o interaciune ntre
acetia i speaker.
Aplicaia Smart Presentation ofer oportunitatea celor din audien s urmreasc prezentarea
fcut de speaker pe propriul dispozitiv Android, smartphone sau tableta, n mod sincronizat cu
prezentarea speakerului sau nu. n plus, aplicaia ofer posibilitatea acordrii de feedback direct pe
documentul prezentrii, n timp real, astfel nct speakerul s aduc lmuriri sau s rspund la ntrebri
chiar n timpul prezentrii, fr intervenia verbal a audientei. Speakerul are acces la forma agregat a
feedbackului, extrem de util n cazul unei audiente mari.
Pentru realizarea acestei aplicaii, am dezvoltat un sistem client-server, bazat pe cereri efectuate de
clieni, dispozitivele Android, ctre un server web, care pune la dispoziie resurse ce pot fi accesate prin
adresele lor URL. Resursele pot fi documentul prezentrii sau feedback agregat adresat de cei din
audien.
ii
CUPRINS
1. Introducere
1.1 Contextul proiectului
1.2 Ideea i Scopul proiectului
1.3 Structura proiectului
1.4 Structura lucrrii
2 Tehnologii folosite
2.1 Sistemul de operare Android
2.2 Tehnologiile specifice folosite la comunicarea client-server
2.3 Alte tehnologii folosite n cadrul proiectului
3 Arhitectura sistemului
3.1 Descrierea arhitecturii i modulele funcionale ale sistemului
3.2 Arhitectura clientului Android
3.3 Arhitectura serverului web
4 Detalii implementare
4.1 Accesarea resurselor pe baza URL i a protocolului HTTP
4.1.1 Structura URL
4.1.2 Tipurile mesajelor HTTP
4.2 Implementarea protocolului de comunicaie
4.2.1 Componenta mesajelor i logica acestora
4.2.2 Serializarea datelor folosind Google Protocol Buffers
4.3 Implementarea clientului Android
4.3.1 Implementarea design patternului MVC
4.3.2 Persistena datelor n Sqlite i accesarea resurselor interne prin ContentProvider
4.3.3 Accesarea resurselor de pe web server prin mesaje asincrone
4.4 Implementarea serverului web
4.4.1 Iniializarea serverului i a containerului Grizzly
4.4.2 Clasele resurs i metodele HTTP definite pe server
4.4.3 Serializarea i deserializarea datelor
4.4.4 Modulul de clusterizare a ntrebrilor i sincronizarea cu acesta
4.5 Interfaa de utilizare a clienilor Android
4.5.1 Interfaarea cu prezentarea, selecia elementelor
4.5.2 Metodele handler ale butoanelor
5 Utilizarea aplicaiei
5.1 Descrierea aplicaiei
5.2 Scenarii utilizare - screenshots
6 Concluzii
7 Bibliografie
iii
George-Cristian Stoica
1. Introducere
1.1 Contextul proiectului
Prezentrile realizate n faa unei audiente de mrime medie sau mare pot fi uneori greu de urmrit
din diferite motive, cum ar fi incapacitatea persoanelor din audien de a nelege anumite concepte din
materialele prezentate, care duc la pierderea ateniei, sau imposibilitatea acestora de a reveni asupra
unor slide-uri anterioare.
Aceste prezentri ar putea deveni mai interactive, prin implicarea asculttorilor nc din timpul
audienei n procesul de apreciere pozitiv sau negativ a elementelor prezentate, precum i prin
posibilitatea urmririi prezentrii att n timp real ct i a revenirii asupra unor slideuri anterioare sau a
avansrii ctre slideuri urmtoare.
George-Cristian Stoica
modulul de manipulare a prezentrii PDF. Acesta presupune folosirea unei biblioteci open
source de manipulare a formatului PDF, pentru a permite navigarea prin prezentare, selectarea
unor elemente ale prezentrii prin folosirea ecranului touchscreen al dispozitivului Android i
evidenierea seleciei fcute prin diverse culori de highlighting.
interfaa clientului pe Android, care include toate elementele vizuale prin care clientul
interacioneaz cu aplicaia (ferestre, butoane, liste).
modulul de comunicaie client-sever, care asigur transmisia resurselor ntre dispozitive i server
i sincronizarea acestora.
Partea mea de proiect a constat n implementarea modulului de comunicaie ntre clienii Android i
server. Acest modul include partea de stocare a datelor att pe Android, ct i pe server, dezvoltarea
serverului web i a protocolului de comunicaie bazat pe HTTP i Google Protocol Buffers, obinerea
resurselor prin URLuri, tipul mesajelor i modalitatea de serializare a acestora, precum i interfaarea pe
server cu modulul de clusterizare a ntrebrilor i interfaarea pe sistemul de operare Android cu
modulul de manipulare a PDFurilor i cu interfaa de utilizare.
George-Cristian Stoica
2. Tehnologii folosite
2.1 Sistemul de operare Android
Android este un sistem de operare pentru dispozitive mobile, telefoane sau tablete. Android a
devenit lider mondial n acest segment n 2010, n primul trimestru al anului 2012 raportnd o cot de
59% din piaa mondial a smartphoneurilor, cu un total aproximat la 331 milioane de dispozitive cu
acest sistem de operare instalat1.
Android a nceput de la o companie mic, achiziionat de Google n 2005. n prezent, dezvoltarea
sistemului de operare este supervizat de Open Handset Alliance, o comunitate condus de Google din
care mai fac parte companii c ARM Holdings, HTC, Inel, LG, Motorola, Samsung Electronics, Nvidia, TMobile sau Texas Instruments.
Kernelul sistemului de operare Android se bazeaz pe kernelul de Linux. Acest kernel a suferit
modificri de arhitectura realizate de inginerii Google n afara procesului tipic de devoltare a kernelului
Linux. Android nu are un sistem nativ X Window i nu suport ntregul set de biblioteci standard GNU,
ceea ce face destul de dificil portarea aplicaiilor i bibliotecilor existente de Linux pe Android.
Principalele modificri pe care Google le-a adus ntr-o prima faza kernelului au fost legate de
eficientizarea consumului bateriei. Aceste modificri au fost respinse n prima faza de dezvoltatorii
kernelului Linux de baz, motivnd lipsa de ncredere n intenia Google de a se ocupa n continuare de
acest cod. n 2010 s-a fcut un pas major pentru integrarea modificrilor din Android n Linux, prin
adugarea unui patch care mbuntea frameworkul de wakeup events existent i care permitea
driverelor Android s fie uor integrate n Linux de baz. n August 2011 Linus Torvalds spunea c n
patru sau cinci ani Linux i Android se vor ntoarce la un kernel comun [1].
Arhitectura Android presupune existena a patru layere, cel de la baza fiind kernelul de Linux. Al
doilea layer, cel de middleware, conine biblioteci de C. Acesta este cod nativ, rulnd direct peste cel de
Kernel. Urmtorul layer este cel de application framework, care cuprinde biblioteci compatibile Java,
bazate pe versiunea de Java Apache Harmony.
George-Cristian Stoica
Maina virtual care face translaia din codul Java n byte-code se numete Dalvik virtual machine, i
se deosebete de maina virtual clasic JVM prin faptul c nu este o main bazat pe stiv, ci una
bazat pe regitri. Un tool numit dx este folosit pentru a converti o parte a fiierelor .class Java ntr-un
format .dex. Mai multe clase sunt incluse ntr-un singur fiier .dex. Stringurile duplicate i alte constante
folosite n mai multe fiiere class sunt incluse doar o dat n outputul .dex, pentru conservarea spaiului.
Java bytecode-ul este de asemenea convertit ntr-un set de instruciuni definit de Dalvik Virtual
Machine. Un fiier necomprimat .dex este sensibil mai mic dect o arhiv .jar, derivat din aceleai
fiiere .class. O alt diferen major fa de clasicele JVM este introducerea compilatorului JUST-INTIME, care reprezint o metod hibrid fa de cele dou metode clasice de runtime (intrepretat sau
static cod compilat). Astfel, acest compilator translateaz codul din bytecode n machine code la
runtime, nainte de a-l rula nativ.
Fiecare aplicaie Android ruleaz n propriul proces cu propria instan a mainii virtuale. Dalvik a
fost dezvoltat n aa fel nct un dispozitiv poate rula mai multe maini virtuale eficient. Maina virtual
Dalvik se bazeaz pe kernel-ul Linux pentru funcionalitile de baz, cum ar fi gestionarea thread-urilor
i meninerea nivelului de memoriei sczut.
Layerul de application framework cuprinde acele servicii scrise n Java care fac legtura ntre aplicaii
i sistemul de operare, fiind separate pe diverse funcionaliti: Activity Manager, Content Providers,
Resource Manager, Notification Manager, View System, Telephony Manager, Location Manager i altele.
Layerul de top este cel al aplicaiilor, unde dezvoltatorii pot aduga noi aplicaii utiliznd API-ul existent
sau pot modifica aplicaiile deja existente.
n prezent, Android are o vast comunitate de dezvoltatori care scriu aplicaii (apps) care extind
funcionalitatea dispozitivelor. Dezvoltatorii folosesc n principal codul versiunii custom de Java.
Applicaiile pot fi descrcate de pe magazine online ca Google Play (fostul Android Market), magazinul
condus de Google. n octombrie 2011 erau mai mult de 500 000 aplicaii disponibile pentru Android.
n cadrul proiectului Smart Presentation, o mare parte din devoltare s-a fcut pe sistemul de operare
Android, folosind versiunea 2.3 a sdk-ului Android. Dezvoltarea s-a fcut n Eclipse, acesta fiind mediul
standard i global folosit pentru crearea aplicaiilor Android, datorit pluginului Android i a
emulatorului care poate fi lansat direct din interfaa IDEului.
n cadrul dezvoltrii, am folosit att cod nativ C, ct i cod standard Java. Codul nativ face parte din
biblioteca mupdf, pe care am folosit-o la manipularea prezentrii n format PDF, pentru partea de
selecie. Codul nativ a fost compilat folosind toolul ndk, biblioteca rezultat putnd fi ncrcat direct n
codul de Java.
Pentru modulul client-server, am folosit design patternul Model-View-Controller, detaliat la capitolul
Arhitectura sistemului. Pentru implementarea acestui pattern am folosit clasele existente n API-ul
Android, care ncurajeaz separarea ariei funcionale, comunicarea pe retea sau persistena datelor, de
interfaa grafic a aplicaiei, pentru a se asigura un flow continuu al interfeei, fr ntreruperi care ar
duna calitii utilizrii. Principalele mecanisme folosite sunt cel de ContentProvider, care returneaz
activitii de frontend coninut pe baza unor interogri (echivalent conceptului de Model). n cadrul
ContentProviderului, persistena datelor este asigurat printr-o baz de date SQLlite, iar comunicarea cu
serverul wireless se face asincron, n cadrul unor threaduri separate. Pentru rularea acestor taskuri, APIul Android pune la dispoziie numeroase soluii, cea mai popular fiind cea de a extinde clasa AsyncTask,
aceasta oferind metode handler pentru execuie i pentru returnarea rezultatelor.
George-Cristian Stoica
Protocolul HTTP
Hypertext Transfer Protocol, pe scurt HTTP, este un protocol la nivelul aplicaie care st la fundaia
comunicaiei n World Wide Web. Hypertext reprezint un set de obiecte care construiesc conexiuni
ntre noduri prin legturi logice, hyperlinks. HTTP este protocolul care permite transferul unor astfel de
obiecte1.
HTTP este un protocol de tip cerere-rspuns n modelul arhitectural client-server. Un client, cel mai
des un web browser, trimite o cerere HTTP ctre un server web, care ntoarce un rspuns. Acest rspuns
conine o stare al completrii cererii i, n caz de succes, informaia cerut.
Resursele HTTP sunt identificate i localizate pe reea prin Uniform Resource Locators (URLs)
folosind schema http URI definit n RFC 3986 astfel:
<nume_schema> : <poriunea_ierarhic> [ ? <query> ] [ # <fragment> ]
n cazul HTTP numele schemei este http. Partea ierarhic ncepe cu un dublu forward slash "//",
urmat de un nume al autoritii, care poate fi un nume de domeniu sau un ip, urmat apoi de un port
opional, precedat de ":". Dup autoritate urmeaz un path construit ca o succesiune de segmente,
asemntor unei structuri de directoare, caracterul separator fiind "/". Poriunea de query este
opional, ncepe cu "?" i conine informaie adiional care nu este ierarhic, ci organizat tipic prin
perechi de tip <cheie>=<valoare>, cu perechile separate prin ";" sau "&". Partea fragmentului este de
1
George-Cristian Stoica
asemenea opional, ncepe cu "#" i conine o directiv ctre o resurs secundar, cel mai des un
atribut id al resursei principale, aa cum se ntmpl n cazul documentelor HTML.
HTTP definete nou metode care indic aciunea dorit asupra resursei accesate. Aceste nou
metode sunt: HEAD, GET, POST, PU, DELETE, TRACE, OPTIONS, CONNECT i PATCH. Cele mai utilizate
sunt cele de GET, prin care se citete resursa, i cele de POST, PUT i DELETE, prin care se modific
resursa. Metodele safe (sigure) sunt considerate cele prin care se intenioneaz doar citirea informaiei,
fr modificarea strii serverului. Acestea sunt HEAD, GET, OPTIONS i TRACE. Metodele idempotente
sunt cele asupra crora mai multe cereri identice ar trebui s aib acelai efect. Acestea sunt POST i
DELETE.
o linie de request, spre exemplu GET /diverse/car.jpg HTTP/1.1 care formuleaz o cerere pentru
resursa /diverse/car.jpg de la server.
O linie goal
linie de Status (spre exemplu HTTP/1.1 200 OK, care indic finalizarea cu succes a cererii
clientului). Un status 3xx indic necesitatea unei redirectari, 4xx i 5xx sunt statusuri de eroare
(4xx eroare la client, 5xx- eroare la server).
O linie goal
Antetele HTTP sunt perechi "cheie: valoare", scrise n clear-text i separate prin succesiunea de
caractere carriage return (CR) i line feed (FD). Aceste headere definesc parametrii de operare a unei
tranzacii HTTP.
Datorit necesitii trasmiterii unor tipuri diferite de coninut prin mesajele HTTP, am folosit n
cadrul aplicaiei Smart Presentation setarea headerului Content-Type prin care se specific mime-typeul
coninutului. Un mime-type (Multipurpose Internet Mail Extension) este un standard Internet care a
pornit de la descrierea seturilor de caractere folosite la formatul email, ajungnd azi s fie utilizat ca
standard de descriere al coninutului unui mesaj web n general. Un astfel de antet descrie att
coninuturi de tip text, ct i coninut binar. n cazul clienilor i al serverului, interpretarea acestui cmp
este vital pentru alegerea modului n care resursa este citit, respectiv scris.
Pentru aplicaia Smart Presentation, am folosit urmtoarele tipuri mime:
application/pdf indic prezena unui fiier PDF n interiorul mesajului, n format binar
George-Cristian Stoica
George-Cristian Stoica
Stateless acest principiu asigur c niciun context al clientului nu este memorat pe server ntre
cereri. Fiecare cerere efectuat conine toate informaiile necesare, i orice informaie de stare
a sesiunii este stocat pe client. Aceasta este o caracteristic de rezisten la erori a serverelor.
Cacheable clienii pot reine n cache rspunsurile. O memorie cache bine ntreinut poate
mbunti scalabilitatea i performana sistemului, prin reducerea numrul de cereri de la
clieni la server.
Layered un client nu-i poate da seama prin interfata comun dac este conectat direct la
server sau la un proxy intermediar. Servere intermediare pot mbunti scalabilitatea
sistemului prin load-balancing sau prin partajarea unei memorii cache.
Code on demand (opional) serverele pot s extind temporar funcionalitatea clientului prin
transferul codului - exemple fiind Java applets sau limbajele client-side scripting ca JavaScript.
GET definete un acces la citirea unei resurse, fr efecte secundare. Resursa nu este niciodat
alterat n urma unei cereri GET.
DELETE terge o resurs; operaia trebuie s fie idempotent, o repetare a cererii nu trebuie s
produc efecte suplimentare primei cereri.
Descriere
@PATH(my_path)
seteaz patul la URL de baza + "/" + my_path. URL-ul de baza este cel definit ca
URL al containerului de baz, n web.xml sau n aplicaie, n cazul folosirii unui
container c Grizzly
@POST
@GET
@PUT
@DELETE
George-Cristian Stoica
@PathParam
@QueryParam
@HeaderParam
Google protocol-buffers
Protocolul HTTP este un protocol care permite definirea oricrui format de serializare a coninutului
propriu-zis al pachetului, att timp ct i emitorii i receptorii definesc programatic metode de citire i
scriere a acelor mesaje. Limbajul de facto folosit nc pentru schimbul de date este XML, datorit
simplitii sale i uurinei de citire. Totui, din dorina optimizrii utilizrii benzii de transfer , n dauna
lizibilitii, n cazul mesajelor mari sau a situailor n care exist necesitatea schimbului unui numr
foarte mare de mesaje, au ctigat teren i formatele de serializare binare [9].
Pentru serializarea mesajelor de mrime potenial mare, am folosit soluia Google Protocol Buffers,
un mecanism extensibil, neutru din punct de vedere al limbajului i al platformei pentru serializarea
binar a datelor, reprezentnd o variant mult mai eficient fa de XML i JSON. Acest mecanism a fost
dezvoltat de Google pentru uz intern, acetia crend compilatoare pentru C++, Java i Python disponibile
publicului larg printr-o licen open source.
Designul Protocol Buffers pune accentul pe simplitate i performan. A fost devoltat special pentru
a crea o alternativa mai compact i, deci, mai rapid dect XML. Metoda de creare a mesajelor Protocol
Buffers are la baz un limbaj de descriere a interfeei (IDL) care descrie structura datelor ntr-un format
foarte simplu. Aceste "mesaje" sunt definite ntr-un fiier de definire Proto (.proto) care este compilat cu
un executabil protoc. Compilarea genereaz cod care poate fi invocat de destinatarul sau receptorul
acestor structuri de date. Clasele generate pun la dispoziia programatorului metode Get i Set pentru
cmpurile mesajelor, asigurnd citirea i manipularea facil a acestora. De asemenea, se pot defini
mesaje ncapsulate n cadrul altor mesaje, care n mod programatic vor fi translatate n clase inner. O
alt facilitate a claselor generate dinamic este posibilitatea obinerii unei instane a mesajului direct din
streamul de octei.
n mod canonic, Protocol Buffers sunt serializate ntr-un format binar care este compact, forwardcompatible i backwards-compatible. Datorit simplitii i a vitezei sale, acest format i-a extins
popularitatea dincolo de comunicarea pe retea la cea ntre procese sau sisteme scrise n limbaje de
programare diferite, care suport serializare/deserializare Google Protocol Buffers.
message MessageExample
{
required int32 id = 1;
requird string messageName = 2;
enum Type
{
TYPE1 = 1;
TYPE2 = 2;
}
George-Cristian Stoica
Dup cum se poate observa, formatul .proto este foarte intuitiv, foarte facil de scris i permite o
mapare la tipuri de date i structuri de date de baz n toate limbajele de programare populare:
stringuri, tipuri numerice de date, liste, dar i concepte de programare orientat obiect, cum este
ncapsularea.
Astfel, eficiena acestui mecanism de serializare este dat att de dimensiunea extreme de redus a
pachetului care este transferat pe retea, ct i de de modul foarte succinct i compact de definire a
formatului mesajului. Aceste aspecte sunt net superioare limbajului XML, motiv pentru care foarte
multe aplicaii folosesc astzi acest mecanism de serializare. Dezavantajul Google Protocol Buffers fa
de XML este acela c nu e human-readable, fiind un limbaj binar prea puin important ns pentru
aplicaii care nu pun accentul pe urmrirea coninutului mesajului ntre procesele de serializare i
deserializare.
n cadrul proiectului Smart Presentation, am folosit Protocol Buffers la transmiterea ntre client i
server a feedbackului acordat de asculttori sub forma de ntrebri puse asupra unor elemente selectate
din prezentare. Serverul este cel responsabil de serializarea clusterului de ntrebri, mesajul proto fiind
prezentat n detaliu la capitolul detaliilor de implementare.
1
10
George-Cristian Stoica
Formatul PDF
Pentru reprezentarea documentelor am ales formatul PDF (Portable Document Format), motivul
principal fiind reprezentat de popularitatea acestui i de unele avantaje tehnologice clare.
PostScript care este limbajul de programare interpretat aflat la baza formatului. Scopul su principal
este de a descrie modul de randare a textului, formelor i imaginilor grafice. Acesta ofer, de asemenea,
un cadru pentru controlul dispozitivelor de imprimare. Dei PostScript i PDF sunt nrudite, sunt formate
diferite. PDF folosete capacitatea limbajului PostScript de randare de stiluri complexe de text i grafic
i aduce aceast caracteristic att pe ecran, ct i la imprimare. Pentru PDF s-a ales o flexibilitate
redus n favoarea unei eficiene i unei predictibiliti mai bune. Spre deosebire de PostScript, PDF
poate conine o mulime de structuri de document, link-uri, precum i alte informaii conexe, dar nu
poate schimba rezoluia, sau s foloseasc orice alte caracteristici specifice hardware.
Sintaxa PDF poate fi mprit n patru pri [4]:
Obiecte. Un document PDF este o structur de date compus dintr-un set redus de tipuri de obiecte.
PDF include opt tipuri de baza de obiecte: valori boolene, numere ntregi i reale, iruri de caractere,
nume, vectori, dicionare, fluxuri de date i obiectul null.
Structura fiierului. Structura fiierului PDF determin cum sunt stocate n fiier obiectele, cum sunt
accesate i cum sunt modificate. Aceast structur este independent de sintaxa obiectelor.
Structura fiierului PDF este format din urmtoarele patru elemente:
o
Structura iniaial poate fi modificat ulterior, ceea ce adug elemente adiionale la finalul
fiierului.
Structura documentului. Structura documentelor PDF specific modul cum obiectele de baz sunt
folosite pentru reprezentarea componentelor unui document: pagini, fonturi, adnotri etc.
Catalogul documentului este un dicionar care conine referine la alte obiecte care definesc
coninutul, cuprinsul, threaduri de articole, nume de destinaii i formulare interactive
Paginile documentului sunt acesate printr-o structur cunoscut ca arborele de pagini (eng.
page tree), care definete ordonarea de pagini n document. Folosind aceast structur
arborescent aplicaiile de citit PDFuri care folosesc o cantitate limitat de memorie, pot deschide
imediat un document coninnd sute de pagini. Arborele conine noduri de dou feluri: noduri
interne reprezentate de arborii de pagini i frunze reprezentate de obiectele pagin.
Fluxuri de date. Un flux de date PDF conine o secven de instruciuni care descriu modul de
apariie al paginii sau alte entiti grafice. Aceste instruciuni, dei sunt reprezentate c obiecte, sunt
diferite din punct de vedere conceptual de obiectele folosite n descrierea structurii documentului.
11
George-Cristian Stoica
Datele dintr-un flux de date de coninut sunt interpretate ca o secven de operatori i operanzii
acestora. Un flux de date de coninut poate descrie modul de prezentare a unei poze sau poate fi
tratat ca un element grafic n alte contexte.
Sistemul de coordonate definete spaiul n care randarea are loc. Determin poziia, orientarea i
dimensiunea textului, graficelor i imaginilor ce apar pe pagin (Figura 3).
Coninutul unei pagini apar n cele din urm pe un dispozitiv de ieire raster, cum ar fi un ecran sau o
imprimant. Asemenea dispozitve variaz n sistemul de coordinate folosit pentru a adresa pixeli.
Sistemul particular al unui dispozitiv se numete spaiul dispozitv (eng. device space). Originea sistemului
de coordinate al dispozitivelor poate fi n locuri diferite, de asemnea i axele pot avea orientri diferite.
Pentru a evita dependena de dispozitiv, PDF definete un sistem de coordonate independent de
dispozitiv. Acest sistem de coordonate se numete spaiul utilizator (eng. user space).
Fig. 3 Relaiile dintre sistemele de coordonate (imagine preluat din ISO 32000-1)
Pe lng aceste dou sisteme de coordonate PDF mai folosete i alte spaii de coordonate [4]:
Coordonatele pentru text va fi specificat n spaiul text. Transformarea din spaiu text n spaiu
utilizator va fi definit de o matrice n combiantie cu ali parametrii specifici textului respectiv.
Simbolul unui caracter dintr-un font este definit n spaiul simbol (eng. glyph space).
Transformarea din spaiul simbol n spaiul text va fi realizat de matricea de font.
Toate imaginile vor fi definite n spaiul imagine. Transformarea din spaiul imagine n spaiul
utilizator este predefinit i nu poate fi modificat.
Biblioteca MuPDF
MuPDF este o bibliotec software gratuit i open source dezvoltat n C care implementeaz un
motor de parsare i randare de PDF-uri i XPS-uri. Acesta este utilizat n principal pentru a face pagini n
bitmapuri, dar ofer de asemenea suport pentru alte operaiuni, cum ar fi cutarea, listarea cuprins i
hyperlinkuri. Motorul de randare n MuPDF este adaptat pentru grafic de nalt calitate. Aceasta
randeaz textul cu o precizie de fraciuni de pixel pentru o calitate ct mai bun n reproducerea
aspectului unei pagini imprimate pe ecran.
Motivul pentru care a fost ales pentru acest proiect muPDF l reprezint caracteristicele de baza ale
acestuia. MuPDF are o dimensiune redus de cod, este rapid i, cu toate acestea, complet. Aceasta
susine PDF 1.7, cu transparen, criptare, hyperlinkuri, adnotri, cutarea n text i mai multe. Suport,
de asemenea, i documente OpenXPS. Nu ofer suport pentru caracteristici interactive, cum ar fi
12
George-Cristian Stoica
completare de formulare sau JavaScript. Un alt avantaj pentru care am ales MuPDF este acela c este
foarte bine modularizat, astfel nct alte caracteristici pot fi adugate dac se dorete acest lucru.
Exist un numr de aplicaii software gratuite care folosesc MuPDF pentru a randa documente PDF,
cel mai important fiind Sumatra PDF. MuPDF este, de asemenea, disponibil ca pachet pentru Debian,
Fedora, FreeBSD Ports i OpenBSD Ports.
MuPDF folosete o structur de date complex pentru reprezentarea intern a documentului PDF,
de care se folosete pentru a manipula fiierul pentru diferite funcionaliti, precum randare a
paginilor, extragere de text, de imagini, cutare n text etc. Practic realizeaz o copie n memorie a
fiierului PDF aflat pe hard. Folosirea acestei structuri care e completat cu date efective din fiierul PDF
faciliteaz realizarea de noi funcionaliti, cum a fost i cazul acestui proiect.
13
George-Cristian Stoica
3. Arhitectura sistemului
3.1 Descrierea arhitecturii i modulele funcionale ale sistemului
Arhitectura sistemului aplicaiei Smart Presentation este de tip client-server, clienii fiind, din punct
de vedere logic, de dou tipuri: speakerul, cel care ine prezentarea i cei din audien. Clienii au n
general dou posibiliti: s trimit date ctre server, precum n cazul feedbackului, sau s interogheze
serverul pentru resurse, spre exemplu documentul PDF, slideul curent al prezentrii sau forma global,
agregat a feedbackului curent (Figura 4).
Serverul aplicaiei are rolul de a stoca resursele comune tuturor. Aceste resurse pot fi statice, cum
este cazul documentului PDF, sau pot fi dinamice, cum e cazul elementelor de feedback sau a slide-ului
curent al speakerului. n ambele cazuri, serverul are rolul de a centraliza datele i de a le pune la
dispoziia clienilor, prin adrese URL.
n cazul resurselor dinamince, serverul poate avea doar rolul de stocare, astfel nct orice client s
poat accesa resursa, sau poate avea i un rol de prelucrare, cum ar fi n cazul elementelor de feedback.
Aceste resurse sunt refcute la primirea oricrui feedback, astfel nct rspunsul la o cerere s conin o
form agregat a feedbackului.
14
George-Cristian Stoica
View interfaa grafic, alctuit din totalitatea butoanelor, ferestrelor i elementelor cu care
utilizatorul interacioneaz direct;
Controller totalitatea handlerelor care sunt declanate de utilizarea elementelor interfeei
grafice. n cadrul acestor handlere, sunt formulate interogri asincrone ctre model sau ctre
server pentru obinerea datelor.
Model modulul care are rolul de persistenta a datelor i care poate face cereri pe reea.
Interfaa este actualizat prin returnarea rspunsurilor de la server, asincron. Aceste rspunsuri pot
veni prin intermediul Modelului, dac cererea este fcut intermediar la Model, n cazul aplicaiei
Android acesta fiind implementat prin clasa ContentProvider. O alt variant a actualizrii vizuale este
prin ntoarcerea valorii direct prin execuia asincron a unei cereri ctre server, caz n care controllerul
este responsabil cu efectuarea cererilor ctre server.
O alt componenta de baz a modelului este baza de date, care este folosit pentru stocarea
informaiilor de feedback, sau a informaiilor proprii clientului, cum ar fi date legate de propriul
feedback. Aceste date se obin prin interogarea content providerului, care poate decide dac este
nevoie de o actualizare a datelor prin cereri ctre server.
Mai jos se afl o diagram UML care descrie principalele componente ale Modelului, clasa content
providerului i cele care deservesc bazei de date comunicrii cu serverul (Figura 5):
15
George-Cristian Stoica
n cazul serverului web, exist un thread principal cu un entry point din care se ruleaz serverul. n
acest thread se iniializeaz pachetele claselor resurs, care sunt ncrcate n background, comunicaia
facndu-se prin crearea de threaduri secundare. Responsabil cu crearea i managementul acestor
threaduri este containerul Grizzly.
Pentru stocarea datelor, am implementat o arhitectur de stocare ierarhic, format din containere
pentru diferitele tipuri de date (Figura 6).
16
George-Cristian Stoica
Resursele HTTP care sunt disponibile la interogarea serverului web sunt implementate n clase
specifice, care definesc metode programatice de interpretare a pachetelor HTTP i de alctuire a
rspunsurilor n cazul unor cereri (Figura 7).
n cazul resurselor dinamice, cum ar fi feedbackul de la utilizatori, serverul poate modifica resursa
prin executarea unor operaii interne, cum ar fi incrementarea numrului de feedbackuri pozitive asupra
unei selecii (mapate la un URL) sau reclusterizarea ntrebrilor pentru o selecie. n cazul al doilea,
serverul proceseaz clusterizarea semantic ntr-un thread separat. Sincronizarea cu acesta se face
printr-un lock i prin resurse de memorie comune, aflate n MemoryStore.
17
George-Cristian Stoica
4. Detalii de implementare
4.1 Accesarea resurselor pe baza URL i a protocolului HTTP
Aplicaia SmartPresentation se bazeaz pe o arhitectur client-server, avnd n centru un server cu
urmtoarele roluri:
menine evidena slideului curent al prezentrii la care se afl speakerul, oferind posibilitatea
clienilor de a-i sincroniza propria copie a prezentrii cu cea a speakerului, prin folosirea
modului "Go live!";
ruleaz modulul de grupare pe baza semantic a ntrebrilor puse de cei din audien i
serializeaz structurile de date procesate de acest modul.
Pentru implementarea serverului am ales o soluie de web service, datorit existenei unor
soluii multiple de frameworkuri astfel de servicii i datorit simplitii accesrii resurselor, prin Uniform
Resource Locator.
/presentation : aceast adresa este accesat la pornirea aplicaiei Smart Presentation pentru
prezentatorul. Prin accesul la aceast resurs, utilizatorii pot sincroniza prezentarea cu cea a
speakerului. Speakerul actualizeaz aceast resursa automat la schimbarea slideului;
/containers/positivefeedback/[selection_id] aceasta este resursa la care se reine
numrul de feedbackuri pozitive care au fost acordate pe o selecie din prezentare, reprezentat
de un id, numr ntreg, al seleciei;
18
George-Cristian Stoica
Pe lng cele de mai sus, am mai definit patru resurse care sunt create i actualizate de server, la
primirea oricrui tip de feedback. Acestea sunt cele de feedback agregat pentru toat prezentarea,
necesare speakerului la finalul prezentrii, i au urmtoarele adrese URL:
text/plain: prin aceast setare am definit coninutul de tip clear text, n cazul mesajelor scurte,
care nu necesitau serializare pentru o optimizare a comunicrii. Astfel de mesaje sunt:
o schimbarea slideului de ctre speaker respectiv accesarea slideului curent de ctre client, n
ambele cazuri se transmite doar un numr al slideului;
o transmiterea unui ir fix de dou caractere, "+1" sau "-1", cu semnificaia adugrii su retragerii
unui feedback te ip fix, adic unul din tipurile positive feedback, ambiguous sau proof needed n
cazul unei selecii. Selecia este reprezentat n URL prin id-ul ei, un numr ntreg de tip long
care se obine ca hashCode al unui ir de caractere reprezentativ pentru elementele selectate;
o transmiterea ca rspuns de la server ctre client a unui ir de caractere reprezentnd numrul
total de feedbackuri din fiecare tip din cele trei descrise mai sus, pentru o anumit selecie.
Acest numr este reprezentativ pentru agregarea tipurilor fixe de feedback, frecvena indicnd
relevana acelui feedback;
application/pdf: aceast setare e folosit pentru codificarea binar a prezentrii pdf stocate pe
server. Prin interpretarea corect acestui mesaj http, clientul preia coninutul binar i l scrie ntr-un
fiier de tip pdf, stocat local pe dispozitivul Android.
application/x-protobuf: acesta este un mime-type definit local corespunztor mesajelor http
codificate binar folosind Google Protocol Buffers. Setarea coninutului binar al fiierului se poate
face n mai multe moduri: n cazul clientului Android am folosit clasa ByteArrayEntity, care se
instantiaza cu un content-type dintr-un vector de octei, byte[]. n cazul serverului, sunt definite
clase care implementeaz interfeele MessageBodyWriter i MessageBodyReader din pachetul
19
George-Cristian Stoica
jersey javax.ws.rs.ext, necesare pentru construirea unei clase Response pentru un mime type definit
de utilizator. Pentru deserializare am folosit i metoda parseFrom() aplicat unui obiect Google
Protocol Buffer, prin care se construiete instana din vectorul de octei al coninutului binar.
Setarea cmpului content-type i citirea acesuia se poate face foarte uor programatic, n funcie de
pachetele i clasele Java folosite pentru formarea i interpretarea mesajelor http. Astfel, pentru citirea
cmpului, pe server se poate inspecta cmpul headers de tip HttpHeaders accesibil ntr-o metod de tip
Http a unei clase resurs, prin apelarea metodei header.getMediaType(). n cazul clientului, pentru
citirea antetului se apeleaz metoda getFirstHeader("Content-Type") pe o instan de tip HttpResponse.
Pentru setarea acestui cmp, se poate instania o entitate care implementeaz interfaa HttpEntity cu
tipul coninutului corect sau se poate seta acel cmp din antet, printr-o metod setter.
La iniializarea aplicaiei, fiecare client trimite o cerere http de tip GET la adresa
[adresa_server]/presentation, cu coninut gol. Serverul trimite ca rspuns un mesaj http cu
headerul Content-type setat "application/pdf" i coninutul binar, n format pdf, reprezentnd
aplicaia stocat pe server.
La schimbarea slide-ului de ctre speaker, se trimite un mesaj de tip PUT ctre server, la adresa
[adresa_server]/containers/slidecontainer/slide, avnd un coninut cu Content-type "text/plain"
care este format dintr-un numr cu slide-ul curent. Clientul trimite cereri de tip GET la aceeai
20
George-Cristian Stoica
adres, primind ca rspuns tot un mesaj http "text/plain" cu numrul slide-ului actual. Acest
mesaj este trimis la un interval mic de timp, ncontinuu, atunci cnd clientul se afl n modul "Go
live!".
Pentru trimiterea unui feedback de tip fix, positive feedback, ambiguous sau proof needed,
clientul trimite un mesaj HTTP PUT cu coninutul "text/plain" reprezentat dintr-un ir de
caractere cu forma "+1" sau "-1", cu semnificaia adugrii sau retragerii acelui tip de feedback.
Adresele de acces a acestor tipuri de feedback pentru o selecie sunt:
o
[adresa_server]/containers/positivefeedback/[id_selecie]
pentru
pentru
[adresa_server]/containers/ambiguousfeedback/[id_selecie]
accesarea feedbackului de tip ambiguu
Pentru mesajele ce conin feedback de tip ntrebri pentru o anumit selecie, am folosit
codificarea n formatul binar Google Protocol Buffers, datorit simplitii i versatilitii sale n
definirea mesajelor, dar i datorit unei eficientizri evidente a utilizrii benzii de transfer. Ca i
n cazul celorlalte tipuri de feedback, adresa la care este inut feedbackul agregat pe un id al
unei selecii este de forma [adresa_server]/containers/questions/[id_selecie]. Diferena apare
la tipul coninutului unui mesaj i la logica rspunsului de la server n cazul transmiterii unei
forme agregate a feedbackului stocat.
Astfel, un client trimite un feedback sub forma unui mesaj de tip HTTP PUT, cu cmpul contenttype setat pe "application/x-protobuf". Coninutul acestui mesaj este un mesaj de tip protocol
buffers, avnd la baza o ntrebare adresat pe o selecie. La recepia acestei cereri, serverul
reface resursa pe care o are reinut la acea adres, prin regrupare. Aceast resurs conine o
form agregat a feedbackului, reinut n format binar Google Protocol Buffers. Coninutul
acesui mesaj este format dintr-o list de clustere, un cluster fiind o list de ntrebri cu sens
asemntor din punct de vedere semantic. Acest mesaj este cel primit ca rspuns de un client
sau de ctre speaker la o cerere de tip GET pe adresa corespunztoare unei selecii.
De asemenea, am folosit Google Protocol Buffers pentru agregarea tuturor tipurilor de feedback
pentru ntregul document PDF, pentru ca acestea s poate fi accesate de speaker la final. Aceste
resurse sunt gsite la adresele detaliate la capitolul anterior, de tipul:
[adresa_server]/containers/[feedback_container]/aggregate
Coninutul unui mesaj de tip Google Protocol Buffers poate varia, n funcie de tipul mesajului.
Pentru a determina tipul mesajului nainte de deserializare, am folosit un mecanism de
ncapsulare care va fi descris n continuare.
21
George-Cristian Stoica
Pentru un cluster de ntrebri, reprezentat printr-o list de ntrebri apropiate semantic, din care se
poate alege oricare ca centroid (ntrebare reprezentativ), am definit urmtorul mesaj:
message QuestionCluster
{
required string selectionString = 1;
repeated FeedbackQuestion questions = 2;
}
Pentru reprezentarea agregat pentru o selecie a tuturor clusterelor obinute n urma aplicrii
algoritmului de grupare pentru toate ntrebrile adresate, am definit urmtorul mesaj:
message SelectionClusters
{
required int64 selectionId = 1;
required string selectionString = 2;
repeated QuestionCluster clusters = 3;
}
n plus fa de aceste mesaje, am implementat mesaje de ncapsulare pentru tipurile de feedback fix
sau ntrebri, pentru ncapsularea mesajelor de agregare transmise speakerului la finalizarea prezentrii.
message AggregateQuestionsFeedback
{
repeated SelectionClusters SelectionClusters = 1;
}
message FixedFeedback
{
required string selectionString = 1;
required string feedbackType = 2;
required int32 numberOf = 3;
}
message AggregateFixedFeedback
{
repeated FixedFeedback feedbacks = 1;
}
n cazul transmiterii unui mesaj Google Protocol Buffers, ar trebui cunoscut tipul mesajului nainte
de deserializare, pentru folosirea claselor corecte generate de executabilul protoc. O tehnic potrivit
22
George-Cristian Stoica
pentru acest scop este ncapsularea unui mesaj din cele trei tipuri de mai sus ntr-un mesaj container,
care s conin un cmp cu semnificaia unui flag care indic tipul mesajului ncapsulat, i un alt cmp cu
mesajul propriu-zis. Formatul mesajului container arta astfel:
message MessageContainer
{
enum Type
{
SINGLE = 1;
CLUSTER = 2;
SELECTION = 3;
AGGREGATE_QUESTIONS = 4;
AGGREGATE_FIXED = 5;
}
required Type type = 1;
optional
optional
optional
optional
optional
FeedbackQuestion feedbackQuestion = 2;
QuestionCluster questionCluster = 3;
SelectionClusters selectionClusters = 4;
AggregateQuestionsFeedback aggregateQuestions = 5;
AggregateFixedFeedback aggregateFixed = 6;
Astfel, cmpul type evideniaz care din cele trei mesaje opionale este cel coninut de mesajul
container, permind o deserializare corect.
Pentru definirea acestor mesaje, am folosit urmtoarele cuvinte cheie ale limbajului Google Protocol
Buffers, cu explicaiile:
De asemenea, se poate observa i un tag care este asociat fiecrui cmp. Acest tag este utilizat la
interpretarea mesajului la deserializare, indicnd ordinea n care se gsesc membrii mesajului n
formula binar a mesajului.
Generarea claselor, serializarea i deserializarea mesajelor
Google Protocol Buffers este un limbaj compatibil cu majoritatea limbajelor populare, oferind suport
inclusiv pentru Java. Pentru obinerea mesajelor binare, este necesar obinerea unor clase Java din
formatele definite n fiierele .proto. Generarea acestor clase face printr-un executabil protoc.exe. n
cazul utilizrii mediului de dezvoltare Eclipse, exist un plugin care determin generarea automat a
claselor la crearea unui mesaj .proto n folderul resources al unui proiect.
Clasele generate pun la dispoziie mai multe subclase i metode pentru serializare i deserializare.
Pentru deserializare, cea mai facil tehnic este apelarea metodei parseFrom() care primete c
parametru un array de octei (byte[]), spre exemplu coninutul unui mesaj HTTP. Pentru serializare,
fiecare clasa conine o subclasa builder, care se obine astfel, pentru un exemplu din mesajele de mai
sus:
SelectionClusters.Builder clusterBuilder = SelectionClusters.newBuilder()
Aceast instan este folosit apoi pentru adugarea celorlalte cmpuri, prin metode de tip setter;
23
George-Cristian Stoica
Exp: clusterBuilder.setSelectionId(id)
Pentru un cmp de tip repeated, se folosete metoda add().
Dup setarea tututor cmpurilor, mesajul se obine prin apelul metodei build asupra instanei builder.
Exp: SelectionClusters clusters = clusterBuilder.build()
SelectionClusters.Builder scBuilder = SelectionClusters.newBuilder();
scBuilder.setSelectionId(new Long(MemoryStore.currentItem));
for (Set<Question> cluster : clusterTree)
{
QuestionCluster.Builder qCluster = QuestionCluster.newBuilder();
for (Question q : cluster)
{
FeedbackQuestion.Builder fqBuilder =
FeedbackQuestion.newBuilder();
fqBuilder.setRetract(0);
fqBuilder.setQuestion(q.originalText);
FeedbackQuestion fq = fqBuilder.build();
qCluster.addQuestions(fq);
}
QuestionCluster qc = qCluster.build();
scBuilder.addClusters(qc);
}
SelectionClusters sc = scBuilder.build();
Exemplu de cod din serializarea feedbackului
24
George-Cristian Stoica
rularea paralel a mai multor taskuri, cu scopul de a nu ncrca suplimentar threadul GUI. Spre exemplu,
ultimele versiuni de Android sdk interzic rularea de operaii de networking, cum sunt i cele http.
ncercarea de rulare a unei astfel de cereri n threadul aplicaiei arunc o excepie [2].
Cea mai des utilizat tehnica n devoltarea unor taskuri care ruleaz paralel este comunicarea
asincron cu threadul respectiv, astfel nct elementele vizuale, de interfa din threadul principal s fie
ntiinate de finalizarea taskului paralel. Pentru implementarea acestei tehnici, am folosit dou metode.
Prima i cea mai simpl este de a implementa o clas care extinde clasa AsyncTask, aceasta oferind
metode pentru rularea n background i pentru finalizarea rulrii. Cealalt este cea de a realiza un
managedQuery() ctre ContentProviderul aplicaiei, un serviciu care are rolul Modelului din arhitectura
Model-View-Controller i care are acces direct la baz de date a aplicaiei. Ambele variante sunt
detaliate n continuare.
Utilizarea clasic a unui content provider se face prin stocarea datelor ntr-o baz de date
SqLiteDatabase, asupra crora acioneaz metodele implementate ale clasei abstracte ContentProvider:
Insert este analoag metodei POST a unui server web i are rolul de a stoca noi date n baz
de date
25
George-Cristian Stoica
Query analoag metodei GET, returneaz nregistrri din baz de date pe baza unor cereri
SQL, ntr-o colecie specializat numit Cursor
Update analoag metodei update. nlocuiete cererile din baz de date cu unele mai noi
Delete analoag cererii de tip DELETE
Ca i n cazul unui server web, un content provider mapeaz dinamic adrese URL la resursele aflate
n baza de date. Aceast mapare este responsabilitatea programatorului, care la apelul metodei Query a
content providerului face match pe URIul folosit n query pentru a ti ce interogare se realizeaz pe baza
de date. Interogarea ntoarce o instan a clasei Cursor, care ofer pe lng informaia propriu-zis
mecanisme de declanare a evenimentelor atunci cnd datele aflate la adresa respectiv sufer
modificri. Pentru a activa aceste mecanisme, se apeleaz metoda [2]:
queryCursor.setNotificationUri(getContext().getContentResolver(),uri);
la modificarea coninutului, adic n interiorul unei metode insert, delete sau update.
n cazul ambelor metode, se folosete metoda getContext().getContentResolver(), care
ntoarce instana unui ContentResolver, clasa care realizeaz interfaa dintre aplicaia care ruleaz i
content providerul nregistrat n fiierul de configurare. Att Context, ct i ContentResolver, sunt clase
singleton, ale cror instane sunt create la iniializarea aplicaiei Android.
Clasa Content Provider a aplicaiei Smart Presentation are scopul de stocare n baz de date a unor
date care sunt preluate de pe server. Cele mai importante astfel de date sunt documentul PDF, care este
preluat asincron la deschiderea aplicaiei, dup care aceasta este notificat pentru a-i reface interfaa,
i ntrebrile de feedback sub forma agregat, care sunt reinute asemntor unui mecanism de
cacheing n baz de date, pentru a rri cererile la server. n ambele cazuri, din clasa activitate se
folosete un query de tip managedQuery, care primete ca parametru adresa de interogare a content
providerului i returneaz un cursor cu datele din baz de date.
Clasa managedQuery are posibilitatea de mapare a unei instane a clasei ContentObserver, care
implementeaz metoda onChange(), aceasta fiind metoda handler apelat atunci cnd un notify este
executat pe URLul cursorului n cadul content providerului, cel mai uzual n cazul unui insert, delete sau
update (Figura 8).
nd
Zigurd Mednieks, Laird Dornin & G. Blake Mieke: Programming in Android 2 Edition (O'Reilly, 2012), 80
26
George-Cristian Stoica
Metoda query() a content providerului este responsabil cu returnarea rezultatelor din baz de
date. Acest matching se face folosind o clas ajuttoare UriMatcher.
n cazul ntrebrilor feedback reinute n baza de date, am decis s implementez o modalitate de
cacheing, astfel nct n urma unei extrageri a intrrii din baza de date corespunztoare feedbackului
unei selecii, s se verifice i timestampul ultimei actualizri, astfel nct o nou cerere ctre serverul
web s se fac doar atunci cnd resursele stocate sunt considerate prea vechi.
Extragerea cii de salvare a documentului PDF din baza de date se face doar o dat, la nceput, n
urma unei cereri efectuate la serverul web care declaneaz un notify la insertul n baza de date.
Aceste tipuri sunt setate atunci cnd se extinde clasa AsynTask, prin setarea celor trei parametri
generici ai clasei. n cazul n care unul din cele trei tipuri nu este folosit, acesta poate fi marcat cu void.
Un exemplu de declarare a unei clase copil ar fi:
private class MyTask extends AsyncTask<URL, Void, String)
care se traduce astfel: metoda de execuie primete ca parametri instante ale clasei URL, unitile de
progress nu sunt folosite, iar rezultatul este ntors sub forma unui String.
Cnd un task asincron este executat acesta trece prin patru pai1:
1.
onPreExecute(), invocat de threadul UI imediat dup ce taskul este executat. Acest pas este utilizat
n mod normal pentru setarea taskului, spre exemplu pentru afiarea unui progress bar n interfaa
utilizatorului.
2. doInBackground(Params ...) invocat de threadul de background imediat ce onPreExecute()
termin de executat. Acest pas este folosit pentru efectuarea unor aciuni computaionale de
background care pot dura un timp mai ndelungat. Rezultatul operaiilor efectuate aici trebuie s fie
ntors n aceast metod i va fi pasat urmtorului pas. Acest pas poate declana i metoda
publishProgress(Progress...) pentru a publica una sau mai multe uniti de progres. Aceste
valori sunt interpretate n UI thread, n pasul onProgressUpdate(Progres...)
3. onProgressUpdate(Progress...), invocat de UI thread dup un apel al metodei
publishProgress(Progress...). Momentul exact al executrii este nedefinit. Aceast metod
este folosit pentru afiarea oricrei forme de progres n interfaa utilizatorului n timp ce operaiile
1
27
George-Cristian Stoica
de background sunt n execuie. Spre exemplu, poate fi folosit pentru animarea unui progress bar
sau pentru a afia mesaje de log.
4. onPostExecute(Result), invocat de UI thread dup ce operaiile de background se termin.
Parametrul Result este cel preluat de metoda doInBackground().
O alt facilitate oferit de clasa AsynTask este posibilitatea opririi acesteia din threadul apelant, prin
apelul metodei cancel(boolean). Invocarea acestei metode activeaz returnarea valorii
onCancelled(Object) la terminarea metodei doInBackgroud(), n loc de onPostExecute. De
asemenea, n timpul executrii taskului se poate verifica periodic valoarea ntoars de onCancelled().
Din punct de vedere al concurenei threadurilor, AsyncTask asigur c toate apelurile callback sunt
sincronizate n aa fel nct urmtoarele operaii sunt sigure:
setarea
membrilor
constructor
sau
onPreExecute()
referirea
lor
referirea
lor
doInBackground(Params...)
setarea
cmpurilor
membri
n doInBackgroud(Params...)
onProgressUpdate(Progress...) i n onPostExecute(Result)
Aplicaia Smart Presentation folosete numeroase clase particulare care implementeaz aceast
clas abstract. n general, toate taskurile care presupun comunicare pe reea, n acest caz efectuarea
cererilor ctre serverul web i ntoarcerea asincron a rspunsurilor, sunt mapate la o astfel de clas.
Urmtoarele sunt principalele astfel de clase folosite n cadrul aplicaiei:
speakerului, a crei executare este lansat atunci cnd se intr n modul Go live!. Modul de
funcionare a acesteia este urmtorul: funcia doInBackgroud(String... params) intr ntrun ciclu n care, dac nu a s-a apelat nc metoda cancel n UI Thread, se verific ultima
actualizare a slideului. Dac timpul scurs de la ultima actualizare este mai mare de un anumit
threshold mic (2-3 secunde), se execut o cerere asincron ctre serverul web pentru
actualizarea numrului slideului.
Verificarea dac taskul continu s ruleze se face prin apelul metodei isCancelled, care ntoarce
true sau false. Dup fiecare cerere GET efectuat, rspunsul este folosit pentru actualizarea
1
nd
Zigurd Mednieks, Laird Dornin & G. Blake Mieke: Programming in Android 2 Edition (O'Reilly, 2012), 110
28
George-Cristian Stoica
interfeei grafice, n cazul nostru schimbarea slideului. Aceeai metod de actualizare a slideului
este apelat i n final n metoda onPostExecute(String result).
Metoda doInBackground(String... params) primete parametru de tip String, reprezentat
de URLul la care se face cererea i returneaz un rspuns de tip String, numrul slideului curent.
@Override
protected String doInBackground(String... params)
{
String response = "";
while (!isCancelled())
{
if (TimeUtils.getDiffTimeInSeconds(taskTimer) > 3)
{
taskTimer = TimeUtils.getCurrentTime();
HttpClient client = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(params[0]);
try
{
HttpResponse execute = client.execute(httpGet);
response = HttpUtils.getStringFromResponse(execute);
changeSlide(response);
} catch (Exception e)
{
e.printStackTrace();
}
}
}
return response;
}
Implementare a metodei doInBackground()
Clasa PutCurrentSlide este folosit n aplicaie doar de speaker, i este apelat atunci cnd
acesta schimb slide-ul. n cadrul metodei de background, se seteaz coninutul de tip
"text/plain" al unei entiti StringEntity, reprezentnd slideul curent, i se execut o metod de
tip HttpPut.
Clasa PutFixedFeedback este folosit pentru trimiterea unuia din cele trei tipuri de feedback
fix, positive feedback, ambiguous sau proof needed. Aceast clasa seteaz n constructor un
membru String al clasei, numit PutOrRetract, cu valoarea "-1" sau "+1", cu semnificaia
adugrii acelui feedback sau retragerea unui feedback fcut anterior. Acest ir de dou
caractere este ncapsulat n coninutul unei StringEntity i trimis printr-un http put ctre
server, care returneaz ca rspuns numrul agregat al acelui tip de feedback pus pe selecia
respectiv. Afiarea rspunsului n aplicaie se face la execuia onPostExecute()
29
George-Cristian Stoica
Clasa UriRequestTask
Comunicarea cu serverul web se face nu doar din Activity, ci i prin intermediul Content Provider. n
acest scop, am dezvoltat o clas care implementeaz interfaa Runnable, rulnd ntr-un thread separat.
La fel c n cazul AsyncTask, n cadrul metodei run() se execut operaiile de background. Pentru
interpretarea mesajului, am implementat o clas handler, MessageHandler, care parseaza mesajul http
pentru a decide urmtorul pas. n general, datele cuprinse n rspunsul de la server sunt introduse n
baza de date SQLite, astfel nct la o modificare a datelor, cursorul pe care s-a fcut o interogare pe baz
de date s notifice elementele apelante din Activity.
Prima situaie n care se ntmpl acest scenariu este la pornirea aplicaiei, cnd se execut un
managedQuery la contentprovider pentru descrcarea prezentrii PDF de la server.
public void query()
{
Uri queryUri = SmartPresentationMessage.Pdf.CONTENT_UR;
Cursor myCursor = managedQuery(queryUri, null, null, null, null);
myCursor.registerContentObserver(new ContentObserver(new Handler()) {
@Override
public void onChange(boolean selfChange)
{
Log.d(SmartpTAG.TAG, "On load finished");
super.onChange(selfChange);
onLoadPresentation();
initializeFrontend();
}
@Override
public boolean deliverSelfNotifications()
{
return true;
}
});
}
Metoda de interogare a content providerului
SmartPresentationMessage.Pdf.CONTENT_URI este adresa la care se face o interogare ctre
ContentProvider, i are forma content://" + AUTHORITY + "/" + Pdf.PATH, unde AUTHORITY este calea
complet a clasei Content Provider i Pdf.PATH este o constanta care definete numele resursei.
Aceast interogare declaneaz cererea ctre web server. La descrcarea prezentrii PDF, aceasta este
scris n memoria intern a dispozitivului i adresa intern, cea specific sistemul de fiiere Android este
salvat n baza de date. n funcia care realizeaz insert n baz de date, se apeleaz metoda de
notificare notifyChange pe URLul descris mai sus, astfel nct cursorul creat de metoda managedQuery
30
George-Cristian Stoica
s fie atenionat de terminarea cererii. n urma notificrii, se execut metoda onChange, n care se
ncarc prezentarea PDF n interfaa grafic.
Aceeai succesiune de aciuni ca i n cazul de mai sus se efectueaz n cazul interogrii
ContentProviderului pentru obinerea feedbackului agregat. Aceste date sunt cerute prin intermediul
instanei ContentProvider deoarece am dorit salvarea n baz de date a feedbackului, astfel nct s fie
implementat un mecansim de cacheing care s permit aplicaiei s obin feedbackul direct din baza de
date dac ultimul moment al actualizrii sale a fost foarte recent. Acest feedback agregat este reinut n
baz de date SqlLite n tabela QUESTIONS_TABLE, n cazul ntrebrilor, i n FIXED_FEEDBACK, pentru
celelalte tipuri de feedback. Interogarile pe tabele se fac dup ID reprezentnd selecia, i care conine
un blob cu binarul serializat Google Protocol Buffers i un timestamp al ultimei actualizri.
Setarea unei adrese de baz a serverului web, spre exemplu http://localhost:9988/. Orice
resursa stocat pe server are adresa format din concatenarea acestei adrese unei poriuni
specifice resursei;
nregistrarea pachetelor unde se afl clasele resursa;
Crearea propriu-zis a serverului web, prin apelul metodei:
GrizzlyWebContainerFactory.create(BASE_URI, initParams).
31
George-Cristian Stoica
Class PDFPresentation este clasa care pune la dispoziie prezentarea PDF stocat pe server.
Aceasta este adnotat cu @Path("presentation"), indicnd adresa la care poate fi accesat.
Clasa implementeaz doar o metod GET, adnotat cu @Produces("application/pdf"), indicnd
tipul coninutului pachetului http. n interiorul metodei, este citit ntr-un obiect File fiierul PDF
aflat n directorul rdcina al serverului . Acest obiect este ncapsulat n rspunsul http prin
metoda Response.ok((Object) file).
Clasa ContainersResource adonatat cu @Path("containers"), este clasa care ncapsuleaz
totalitatea containerelor, ntorcnd un xml cu containerele definite.
Clasa ContainerResource nu are adnotare de Path, irul de caractere de dup /containers/
fiind considerat un parametru care se parseaza la apelul metodei http. Metoda GET returneaz
rspuns doar dac exist acel container.
Clasa ItemResource - nu are adnotare de Path, numele su este irul de caractere de dup
/containers/[container_name] i este instaniat din metoda geItemResource a clasei
ContainerResource. Are definite metode GET i PUT, pentru extragerea resursei, respectiv
pentru crearea/actualizarea acesteia.
Ultimele trei clase descrise fac parte dintr-o arhitectur exemplificat n aplicaia Storage Server
definit ca exemplu al utilizrii Jersey1. Acest design reprezint o alternativ foarte generic de stocat
resurse, ntruct ierarhia adresei permite separarea logic a acestora. De asemenea, resursele sunt
reinute n format binar, din care se poate obine orice alt tip de date, n funcie de resursa stocat.
Din punct de vedere programatic, arhitectura Storage Server permite stocarea unor date care pot fi
accesate n comun de resurse. Clasa care asigur stocarea se numete MemoryStore, i membrii clasei
au atributul static, pentru ca acetia s fie instantiati la ncrcarea clasei i nu la o instantiere a sa.
Excepie fac structurile de date de tip HashMap care realizeaz maparile containerelor i a numelor
resurselor item la containere:
private Map<String, Container> containerMap = new HashMap<String, Container>();
private Map<String, Map<String, byte[]>> dataMap = new HashMap<String,
Map<String, byte[]>>();
Acestea sunt membri ale instanei singleton MemoryStore, care conine i metode accesor pentru
32
George-Cristian Stoica
[adresa_server/containers/[nume_container]/[nume_item]
Containerele sunt: slidecontainer, positivefeedback, ambiguousfeedback, prooffeedback i
questions, cu semnificaiile prezentate anterior. Dei pachetele http ntoarse ca rspuns pot avea
formate diferite (plain/text sau Google protocol buffers), toate resursele sunt reinute n forma byte[],
pentru a beneficia de genericitatea designului. Serializarea i deserializarea datelor din binar se face la
nivelul clasei ItemResource, n funcie de numele containerului.
33
George-Cristian Stoica
Problemele evidente apar la sincronizarea ntre threadurile create n background pentru cererile
web i threadul modulului de clustering. Pentru a rezolva aceast situaie, am folosit un obiect simplu ca
lock, acesta fiind vizibil tuturor claselor serverului ca membru al clasei MemoryStore. De asemenea,
toate datele modificate la execuia clusterizarii sunt membri ai clasei MemoryStore. Toate aceste resurse
accesate n comun sunt modificate ntr-o zon sincronizat dup MemoryStore.threadlLock [11].
Astfel,
threadul
de
clusterizare
se
blocheaz
ciclul
de
rulare
la
apelul
web atunci cnd o nou ntrebare este adresat. n threadul cererii http, atunci cnd sosete o nou
ntrebare, se intr ntr-o zon sincronizat n care nti se construiete ntreg setul de ntrebri,
deserializndu-se binarul deja reinut la care se adug noua ntrebare, apoi se apeleaz notify pentru
a reporni threadul clusterer. Acesta preia setul de ntrebri din MemoryStore i reface clusterizarea, apoi
serializeaz noile clustere ntr-un nou mesaj SelectionClusters, care este suprascris peste binarul
stocat la URL-ul seleciei. La sfrit, acest thread iese din synchronized i repet operaia, blocndu-se n
wait.
public void run()
{
QuestionHierClusterer clusterer = new QuestionHierClusterer();
clusterer.init();
while (true)
{
clusterQuestions(clusterer);
}
}
public void clusterQuestions(, QuestionHierClusterer clusterer)
{
synchronized (MemoryStore.threadLock)
{
try {
MemoryStore.threadLock.wait();
Set<InputQuestion> input =
clusterer.setInputQuestionsFromArray(MemoryStore.feedbackQuestions);
Set<Set<Question>> tree = clusterer.cluster(input);
storeClusters(clusterer, tree);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
34
George-Cristian Stoica
35
George-Cristian Stoica
5. Utilizarea aplicaiei
5.1 Descrierea aplicaiei
Aplicaia Smart Presentation permite utilizatorilor unor dispozitive Android care iau parte la o
prezentare s interacioneze n timp real cu aceasta, existnd dou moduri de utilizare: speaker i simplu
uer, persoana aflat n audien. Scopul principal al aplicaiei este s permit celor din audien s
poat selecta elemente din slide-ul curent pe care s acorde diverse tipuri de feedback, cum ar fi:
feedback pozitiv, n semn de apreciere, feedback de ambiguitate, care indic necesitatea unor clarificri
suplimentare sau feedback de proof sau citation needed, pentru exprimarea necesitii citrii sursei. n
plus, utilizatorii pot formula ntrebri legate de selecia fcut adresate speakerului, sau pot vedea
ntrebrile deja reinute de la ali asculttori pentru a-i exprima acordul cu una din ele. ntrebrile sunt
grupate semantic pe un server central, astfel nct toi userii s poate vedea doar o forma compact a
ntrebrilor, fiind selectate doar cele reprezentative din punct de vedere semantic.
O alt facilitate a aplicaiei este posibilitatea de navigare liber prin prezentarea descrcat pe
propriul dispozitiv, sau folosirea modului live, care sincronizeaz permanent prezentarea cu cea a slideului speakerului pn cnd modul este dezactivat.
La sfritul prezentrii, speakerul poate vedea pe documente diversele feedbackuri primite din
audien pe timpul prezentrii astfel nct s poat rspunde mai eficient la ntrebri i s i
mbunteasc prezentarea pentru viitor.
n urmtoarele situaii sunt descrise activitile userilor din audien, adic Alina, Andrei i Elena.
Dup alegerea numelui, este ncrcat prezentarea de la nceput i acetia pot vedea interfaa aplicaiei
(Figura 11).
36
George-Cristian Stoica
n continuare, Alina hotarete s parcurg aa cum dorete prezentarea, pentru ca este curioas de
coninutul acesteia. Andrei i Elena hotaresc s fie sincronizai cu prezentarea inut de Dan, pentru a fi
mai ateni la ceea ce spune acesta. Astfel, cei doi aps primul buton din stnga jos, cel de Go live!, care
le permite intrarea n modul sincronizat.
Pe parcursul prezentrii, Alina hotareste s fac o selecie pentru a trimite un feedback de
ambiguous. Pentru a face asta, ea apas pe al doilea buton, cel marcat cu T, i realizeaz selecia. Dac
nu este mulumit cu selecia fcut, ea poate reseta selecia prin apsarea aceluiai buton.
n acest timp, Andrei i Elena se afl la alt slide, cel la care se afl i Dan, acetia fiind n modul Live.
Andrei se hotareste s pun o ntrebare legat de titlul slideului. Pentru aceasta, el selecteaz nti titlul
(Figura 13).
37
George-Cristian Stoica
Apoi, acesta apsa pe al treilea buton de jos, care i arta ntrebrile semnificative deja
formulate pentru selecia fcut:
Andrei are posibilitatea de a alege o ntrebare cu care s-si exprime acordul, sau de a alege
elementul Add question din list, care-i permite scrierea unei ntrebri noi.
38
George-Cristian Stoica
Pe parcursul prezentrii, Elena a acordat mai multe feedbackuri de tip ambiguous (penultimul
buton) sau proof needed (ultimul buton), i a remarcat c, pentru unul din concepte, explicaia se afl
deja n prezentare, motiv pentru care se ntoarce la slide-ul respectiv i i retrage feedbackul pe aceeai
selecie.
n timpul prezentrii, Andrei, Elena i Alina acord mai multe feedbackuri de tip +1, pentru a-i
exprima o prere pozitiv legat de elementele selectate.
39
George-Cristian Stoica
La sfritul prezentrii, Dan poate utiliza interfaa proprie, care i arat pentru fiecare tip de
feedback seleciile fcute pe document, pentru a asocia corect feedbackul cu elementele asupra crora
acesta a fost acordat.
40
George-Cristian Stoica
6. Concluzii
Dezvoltarea aplicaiei Smart Presentation a necesitat utilizarea multor cunotine practice i
teoretice nvate n facultate, cum ar fi: protocoale de comunicaii, programare i design orientate
obiect, structuri de date, calcul paralel i sincronizare ntre threaduri, baze de date sau ingineria
programelor. n plus, au fost necesare acumularea unor cunotine teoretice noi, ct i nvarea
utilizrii unor tehnologii noi.
Dezvoltarea serverului mi-a permis s studiez arhitectura RESTful pentru servicii web i s nv s
implementez un astfel de serviciu folosind framework-ul Jersey i utilizarea containerului Grizzly. Prin
studierea diverselor exemple am ales s implementez un design ierarhic al claselor resursa http, i o
clas de stocare a datelor, accesibil din toate resursele serverului. De asemenea, am folosit elemente
de detaliu ale protocolului http, cum ar fi metodele specifice protocolului i headerul de content-type,
care mi-a permis s trimit diferite tipuri de date n pachetele http.
Implementarea modulului suplimentar de grupare a ridicat probleme de sincronizare, datorit
accesului comun la date din threaduri separate i a necesitii crerii unui mecanism de comunicare
ntre threaduri.
Din punct de vedere al clientului, am nvat concepte importante de programare pe sistemul de
operare Android. n primul rnd, ideea de entry point sau clasa main sunt inexistente pe Android, unde
serviciile i procesele lansate la execuia unei aplicaii sunt definite ntr-un fiier de configurare. n al
doilea rnd, din punct de vedere al gndirii arhitecturale, programarea pe Android foreaz utilizatorul
s separe funcionalitile aplicaiei dup modelul arhitectural Model-View-Controller. Pentru
respectarea acestui pattern, am folosit numeroasele clase oferite de sdk-ul Android care faciliteaz
rularea paralel a taskurilor i sincronizarea cu threadul principal. Stocarea datelor se face ntr-un mod
canonic ntr-o baz de date Sqlite care asigur persistena datelor. n cazul meu, am folosit o astfel de
baz de date pentru persistena unor informaii, similar cu pstrarea unor structuri de date, dar ntr-un
mod mai robust i care permite accesul simplu, prin adrese URI.
Pentru a realiza cererile HTTP de la client ctre server, am explorat versatilitatea clasei AsyncTask,
prin care dezvoltatorului i se ofer toate mecanismele necesare sincronizrii threadului apelant cu cel de
background i actualizarea datelor i a interfeei cu cele incluse n rspunsul primit de la server.
Comunicaia ntre client i server mi-a lsat la alegere conceperea diverselor tipuri de mesaje,
serializate n mod diferit i cu semnificaii diferite, care alctuiesc protocolul aplicaiei. Pentru mesajele
largi, de agregare a feedbackului de ntrebri, am ales s folosesc mecanismul de serializare binar
Google Protocol Buffers, o soluie optim i foarte uor de implementat, datorit generrii automate a
claselor Java dintr-un format de definire a mesajelor proprietar, user-friendly.
Rezultatul final al lucrrii s-a transpus ntr-o aplicaie care ndeplinete obiectivele formulate iniial:
posibilitatea sincronizrii prezentrii unui client Android din audien cu cea a speakerului;
acordarea de feedback de tip positive feedback, ambiguous, proof needed sau sub forma unei
ntrebri pe o selecie a unui slide sau pe ntregul slide curent al prezentrii;
vizualizarea feedbackului agregat n timp real i posibilitatea exprimrii acordului cu feedback
deja formulat de alte persoane;
retragerea feedbackului propriu efectuat;
interfee diferite de utilizare pentru speaker i audienta;
vizualizarea de ctre speaker a unei variante finale, agregate a tuturor tipurilor de feedback
acordate de audien.
41
George-Cristian Stoica
n viitor, aplicaia poate fi dezvoltat, pentru a permite diverse faciliti noi. n primul rnd, este
necesar gruparea mai eficient a ntrebrilor, bazat pe un algoritm care s grupeze mai inteligent
ntrebrile pe baza similaritii semantice i care s aleag un centroid al clusterelor reprezentativ
pentru ntrebrile grupate. n prezent, gruparea se bazeaz n special pe cuvinte de baz i nu pe cuvinte
cheie care pot schimba sensul unei ntrebri.
Alte mbuntiri care pot fi aduse aplicaiei sunt: o interfata mai interactiv i informativ a
aplicaiei, care s permit o vizualizare mai intuitiv i mai cuprinztoare a feedbackului, devoltarea unui
sistem de autentificare pentru a acorda privilegii diferite uerilor, posibilitatea ncrcrii n realtime a
unui document nou de prezentare sau dezvoltarea unei interfee grafice a serverului, care s permit o
configurare a acestuia.
De asemenea, ar fi interesant/util de implementat o clasificare a userilor, n funcie de o reputaie a
acestora, care s le acorde o pondere mai mare propriilor feedbackuri n faa unor utilizatori noi.
42
George-Cristian Stoica
7. Bibliografie
[1] Wikipedia, Android Operating systems, 20.06.2012,
<http://en.wikipedia.org/wiki/Android_%28operating_system%29>
[2] Zigurd Mednieks, Laird Dornin, G. Blake Meije, Programming Android, 2nd Edition, O'Reilly,
2011
[3] Documentaia oficial Android, 20.06.2012, <http://developer.android.com>
[4] International Organization for Standardization, ISO 32000-1:2008 Document management -Portable document format -- Part 1: PDF 1.7, 20.06.2012,
<http://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/PDF32000_2008.pdf>
[5] Website Grizzly, 20.06.2012, <http://grizzly.java.net>
[6] Sameer Tyagi, RESTful Web Services,
< http://www.oracle.com/technetwork/articles/javase/index-137171.html>
[7] Documentaia oficial Jersey, 20.06.2012, < http://jersey.java.net/nonav/documentation>
[8] RESTful Web Services Developer's Guide, 20.06.2012,
<http://docs.oracle.com/cd/E19776-01/820-4867/ggrby/index.html>
[9] Documentaia oficial Google Protocol Buffers, 20.06.2012,
<https://developers.google.com/protocol-buffers/>
[10] Vogella tutorials, 20.06.2012,
<http://www.vogella.com/articles/AndroidSQLite/article.html>
[11] Scott Oaks, Henry Wong, Java Threads, 3rd Edition, O'Reilly, 2004
[12] RESTful Web Services Developer's Guide, Chapter 5 - Jersey Sample Applications,
20.06.2012 <http://docs.oracle.com/cd/E19776-01/820-4867/ggrby/index.html>
[13] Marko Gargenta, Learning Android - Building Applications for the Android Market , O'Reilly,
2011
43