Noutati despre interfete web si interfete evoluate

Se afișează postările cu eticheta JAVA. Afișați toate postările
Se afișează postările cu eticheta JAVA. Afișați toate postările

luni, 12 ianuarie 2009

Despre interfete

De curand a expirat termenul de predare al temei 4 la materia interfete evoluate. A fost o tema interesanta ce a avut ca scop realizarea unei interfete pentru un program de cautare in log-urile aplicatiilor de messenger instalate in sistem.

La prima vedere, tema parea a fi una deosebit de usoara, pana cand am inceput sa ma gandesc la acele amanunte care fac diferenta intre interfetele aplicatiilor. (Tema am realizat-o in Java, iar interfata grafica a utilizat Swing). De exemplu, am vrut sa afisez rezultatele cautarii intr-un arbore in care utilizatorii sa fie grupati dupa sistemul de messenger utilizat. Pare o sarcina simpla, insa am vrut sa afisez si un icon pentru fiecare sistem de messenger, asta inseamna ca este nevoie de un renderer customizat. Dupa o cautare am vrut ca primul utilizator sa defina vizibil si sa ii fie selectata prima conversatie, ceea ce a dus la necesitatea tinerii evidentei primului utilizator adaugat si apoi a fost necesar sa aplelez niste metode pentru a face vizibil nodul selectat.

Un alt amanunt a fost ca atunci cand selectez campul de introducere text (care este un combobox editabil) sa se selecteze automat textul existent. Aceasta sarcina nu este asa de usoara pe cat pare. In mod normal, se adauga un ascultator de tipul FocusListener capabil sa receptioneze evenimentele de tipul FocusGained / FocusLost si apoi la primirea focusului se apeleaza o metoda asupra modelului combobox-ului care va selecta textul; numai ca in cazul combobox-ului nu este deloc simplu, deoarece combobox-ul este o combonenta compusa din mai multe componente (editorul text, butonul si container-ul in sine). O solutie era adaugarea listener-ului tuturor obiectelor continute in combobox, insa aceasta solutie nu functioneaza pentru componentele care au setet lok and feel-ul de Windows deoarece se pare ca exista un bug in acest look and feel care nu permite procesarea evenimentelor de tipul focusGained / focusLost de catre unele componente. Si asa am pierdut aproximativ trei ore cautand o solutie. In final am creat o noua clasa editor pentru combox careia i-am adaugat un listener la editorul intern (care este un textField).

Un ultim amanunt pe care il mentionez este partea de afisare a conversatiei care am dorit sa fie placuta, in sensul ca am vrut sa afisez numele utilizatorilor in culori diferite, data mesajului intr-o culoare placuta, dar diferita de numele utilizatorilor, si in plus, textul cautat sa fie evidentiat prin scrierea lui cu culoarea rosu. Si asemanator cu tree-ul utilizat pentru afisarea utilizatorilor, am dorit ca atunci cand se vizualizeaza o conversatie sa fie afisata prima linie care contine textul cautat.

Toate aceste "amanunte" tin de utilizabilitate si sunt cele care fac diferenta intre o aplicatie pe care utilizatorul sa o foloseasca cu placere si una pe care nu o prea foloseasca.

Mai multe detalii puteti afla din sectiunea Produse a site-ului nostru.

Read more...

joi, 20 noiembrie 2008

Adunarea a doua siruri in Java

La cererea expresa a lui Florin si contrar vointei acestuia, subiectul primului meu post pentru proiectul de la cursul Interfete Evoluate va fi despre un lucru aparent banal: concatenarea a doua siruri in Java.

Operatia de adunare (concatenare) a doua siruri este una foarte raspandita in aplicatiile Java normale. Insa aceasta creaza probleme din cauza faptului ca obiectul String este imutabil. Practic, din adunarea a doua obiecte de tip String, va rezulta o noua instanta, complet diferita de primele doua. In codul compilat (adica in fisierul .class), acest lucru se face prin instantierea clasei StringBuilder si apelarea metodei append. Mai exact, daca vom scrie intr-o functie urmatoarea secventa de cod:


String s1 = "a";
String s2 = "b";
String s3 = s1 + s2;


Ea va fi compilata in:

String s1 = "a";
String s2 = "b";
String s3 = (new StringBuilder(String.valueOf(s1))).append(s2).toString();


Ca observatie, StringBuilder-ul este folosit doar de la Java 1.5. In versiunile mai vechi (care, din pacate inca se mai intalnesc...) se utilizeaza StringBuffer.

Este evident faptul ca apelul String.valueOf este inutil deoarece s1 este nenul (valueOf cu parametru de tip Object, intoarce sirul "null" daca parametrul este nul sau apeleaza functia toString() a obiectului daca acesta este nenul). De asemenea, in cazul in care o asemenea operatie se face des, cum ar fi intr-un ciclu, atunci este mai bine sa se reutilizeze instanta StringBuilder. Mai exact, daca avem urmatoarea secventa de cod:

for (int i=0; i<100; i++) {
String s1 = "a";
String s2 = "b";
String s3 = s1 + s2;
}

ea va fi compilata in:

for (int i=0; i<100; i++) {
String s1 = "a";
String s2 = "b";
String s3 = new StringBuilder(String.valueOf(s1)).append(s2).toString();
}

Evident, acest cod poate fi optimizat in felul urmator (facem abstractie de modul in care functioneaza instantierea obiectelor in Java):

StringBuilder buffer = new StringBuilder();
for (int i=0; i<100; i++) {
String s1 = "a";
String s2 = "b";
buffer.setLength(0);
String s3 = buffer.append(s1).append(s2).toString();
}


Ca incheiere, vreau sa mai adaug doar ca incepand cu Java 1.5, StringBuilder si StringBuffer au un parinte comun, AbstractStringBuilder (aici ma refer la JDK-ul de la Sun). Practic, in clasa abstracta sunt implementate toate operatiile, iar StringBuilder si StringBuffer actioneaza doar ca niste wrapper-e. Diferenta dintre cele doua clase este data de faptul ca StringBuffer este thread-safe deoarece apelurile sale sunt marcate ca synchronized.

Ionut

Read more...

duminică, 9 noiembrie 2008

API pentru explorarea comunitatii HI5

A trecut si tema 1 la Interfete Evoluate. Titlul ei? Analiza unor comunitati web
.
Cum aveam un cont la HI5 m-am gandit ca e perfect daca as face o explorare pentru a vedea cu cati utilizatori este conectat profilul meu (mergand doua niveluri in jos am descoperit ca "am" aproximativ 6000 de prieteni distincti, destul de multi :) )

Dar pana sa ajung aici a fost destul de interesant.

Trebuie sa va spun ca mie imi place sa programez in JAVA, asa ca pentru tema aceasta m-am gandit ca ar fi excelent daca as utiliza cunostintele de parsere SAX pentru a rezolva tema.
Initial, am zis ca voi face o parsare a listei de prieteni Numai ca nu e chiar asa de simplu: in primul rand trebuie sa fii logat (se poate face din Java, de exemplu folosind clasa HttpClient insa nu e asa placut) apoi, pentru a folosi un parser XML cu o pagina HTML e riscant (paginile HTML nu au intotdeauna tag-urile inchise corect, nu folosesc intotdeauna ghilimele pentru valorile atributelor ...), apoi lista de prieteni este afisata pe mai multe pagini, deci trebuie mai multe parsari. In concluzie, prima solutie parea destul de complicata.

Dupa ce am cautat putin pe net am descoperit ca HI5 expune un api (aflat in stadiu beta!) de explorare a comunitatii. Exact ce aveam nevoie. API-ul era oferit sub forma de servcii web ce puteau fi accesate prin SOAP. Ca urmare am incercat sa ma conectez la serviciul de lookup pentru a afla ID-ul unui utilizator (eu) a carui adresa de email o cunosteam. Conectarea am incercat sa o realizez folosind un client SOAP si anume Axis. Desi pare foarte simplu: creezi un nou client SOAP, creezi un nou apel, setezi parametrii si tipul lor, tipul raspunsului, trimiti cererea si astepti raspunsul formatat XML, nu a fost simplu. Se pare ca nu degeaba e in stadiu beta API-ul. Aparent, WSDL-ul (Web Service Description Language) asociat nu era consistent (asa cum am aflat dupa ce am folosit un utilitar AXIS de generare a unui client folosind WSDL-ul).

A picat si SOAP-ul. Insa pe pagina API-ului HI5 mai era un API, si anume: REST (Representational state transfer). API-ul permite accesarea de resurse peste o retea folosind identificatori. In scurt timp am vazut cat de usor se puteau accesa informatiile care ma interesau (userID si lista de prieteni ai unui utilizator pentru care cunosc id-ul). Asa ca am folosit metoda /profile/lookup pentru a afla id-ul utilizatorului si /profile/foaf/ pentru a afla lista de utilizatori in format FOAF. Era exact ce imi trebuia; primesc raspunsul in XML, totul e foarte clar. Mai departe am inceput sa scriu programul care foloseste un XMLReader pentru a parsa documentele si cateva handlere (cate unul pentru fiecare tip de document). Este destul de usor sa creezi un handler SAX, este nevoie sa extinzi clasa org.xml.sx.helpers.DefaultHandler si sa redefinesti cateva metode: startDocument (apelata la inceputul documentului), startElement (apelata la dechiderea unui nou tag), endElement (apelata la inchiderea unui tag) si characters (apelata la intalnirea de caractere intre un tag de inceput si unul de sfarsit).

Si asa am utilizat SAX si REST scriind un program in JAVA pentru a descoperii ca am 6000 de prieteni indirecti pe HI5. Voi cati prieteni aveti?

Florin.

Read more...

Arhivă blog