Licenta Alinvasile V6 [302442]

[anonimizat] A ACTIVITĂȚII (SIAMA)

Proiеct dе diplomă

prezentat ca cerință parțială pentru obținerea titlului de

Inginer în domeniul Calculatoare și Tehnologia Informației

programul de studii de licență Ingineria Informației

Conducător științific Absolvеnt

Ș.l. dr. ing. Vlad-[anonimizat]

2016

Cuprins

Cuprins 7

Lista figurilor 9

Listă acronime 11

Introducere 13

Capitolul 1. MySQL și XAMPP 15

1.1 Noțiuni generale 15

1.2 Baze de date și funcțiile unui sistem de gestiune a bazelor de date[3] 17

1.3 Funcțiile unui sistem de gestiune a bazelor de date 17

1.4 Caracteristici și limitări ale MySQL 18

1.5 XAMPP 19

Capitolul 2. Java 21

2.1 Istoric 21

2.2 Platformă 22

2.2.1 Implementare 22

2.2.2 Performanță 23

2.2.3 Sintaxă 23

2.3 Aplicații software speciale utilizate 24

2.3.1 Swing 24

2.4 Pachete de clase utilizate[12] 25

2.4.1 Socket 25

2.4.2 BufferedReader 26

2.4.3 BufferedWriter 26

2.4.4 JFreeChart 26

2.4.5 Apache POI 26

2.4.6 Java Database Connectivity (JDBC) 26

2.5 Medii de dezvoltare 27

2.5.1 NetBeans 27

Capitolul 3. Android Studio 29

3.1 Generalități 29

3.2 Structura 30

3.3 Dezvoltare 31

3.3.1 Instant Run 32

3.3.2 Android Emulator 32

3.3.3 Cloud Test Lab 33

3.3.4 App Indexing Code Generation & Test 34

3.3.5 GPU Debugger Preview 35

3.4 Mediu de programare 36

Capitolul 4 Realizarea practică 39

4.1 Baza de date 39

4.2 Aplicația Java 40

4.3 Aplicația Android 44

Concluzii și dezvoltări ulterioare 47

Dezvoltări ulterioare 47

Bibliografie 49

Anexa 1 51

Anexa 2 61

Anexa 3 66

Anexa 4 69

Lista figurilor

Fig.1.1 "MySQL" [1] ……………………………………………………………………………………………………..15

Fig. 1.2 "[anonimizat]"[4] ……………………………………………………….17

Fig.1.3 "Modelul ACID" [6] ……………………………………………………………………………………………18

Fig. 1.4 "XAMPP Control Panel" …………………………………………………………………………………….19

Fig. 2.1 “Java Sun Microsystems” [8] ……………………………………………………………………………..21

Fig. 2.2 “Structura implementării JAVA”[9] ……………………………………………………………………22

Fig. 2.3 “Tipuri de date primitive”[11] ……………………………………………………………………………24

Fig. 2.5 "Legătura aplicației Java cu baza de date"[14] ……………………………………………………..27

Fig. 2.6 "Interfața grafică a NetBeans" …………………………………………………………………………….28

Fig. 3.1 “Android Studio”[15] ………………………………………………………………………………………..29

Fig. 3.2 „Organizare proiect”[17] ……………………………………………………………………………………30

Fig. 3.3 „Afișarea fișierelor cu erori de codificare"[18] ……………………………………………………..31

Fig. 3.4 „Instant Run”[19] ………………………………………………………………………………………………32

Fig. 3.5 „Android Emulator”[20] …………………………………………………………………………………….33

Fig. 3.6 „Setări pentru Cloud Test Lab”[21] ……………………………………………………………………..34

Fig. 3.7 „Google App Indexing Testing”[22] ……………………………………………………………………35

Fig. 3.8 „Debug Preview”[23] ………………………………………………………………………………………..35

Fig. 3.9 „Fereastra principala Android Studio”[24] ………………………………………………………….36

Fig. 4.1 "Baza de date SIAMA" ……………………………………………………………………………………..39

Fig. 4.2 "Login" ……………………………………………………………………………………………………………40

Fig.4.3 "Fereastra administrator" …………………………………………………………………………………..40

Fig. 4.4 "Introducere parametrii în cereri" ………………………………………………………………………39

Fig. 4.5 ”Statistici individuale ale fiecărui angajat” …………………………………………………………..42

Fig. 4.6 "Fereastra angajat" ……………………………………………………………………………………………43

Fig.4.7 "Comunicare între mai mulți angajați în același timp"…………………………………………….41

Fig. 4.8 "Login Android" ………………………………………………………………………………………………44

Fig. 4.9 "Comunicare Android" ……………………………………………………………………………………..45

Listă acronime

Introducere

Această lucrare își propune să prezinte aspectele teoretice și practice, legate de o aplicație utilizată în cadrul unei companii, destinată comunicării mai ușoare între angajați și departamentele firmei.

Lucrarea descrie detaliat fiecare componentă folosită pentru alcătuirea acestei aplicații, oferă informațiile necesare în legătură cu desfășurarea activității, rolul aplicației în cadrul firmei în vederea obținerii unor performanțe mai bune ale angajaților.

Lucrarea este structurată în cinci capitole: primele trei capitole descriu detaliat toate tehnologiile utilizate în realizarea practică a aplicațiilor. Penultimul capitol descrie realizarea și utilizarea aplicației, detaliind etapa de proiectare precum și modalitățile de implementare asupra cărora m-am oprit, iar ultimul capitol conține concluziile și posibilele dezvoltări ulterioare ale aplicației.

Scopul acestui proiect este elaborarea unui sistem de comunicare eficient și realizarea unor statistici motivaționale pentru angajații unei compani.

În cadrul proiectului am simulat existența a 10 angajați în cadrul unei firme, aceștia urmând activitățile unei zile normale de muncă, posibilitatea obținerii rapide a unor cereri, trimiterea de mesaje și tichete către angajații sau departamentele din cadrul firmei pentru soluționarea anumitor probleme.

Capitolul 1. MySQL și XAMPP

1.1 Noțiuni generale

MySQL este un software de dezvoltare și administrare a bazelor de date. În iulie 2013 MySQL a fost declarat ca fiind al doilea cel mai folosit software în domeniul bazelor de date. Dezvoltarea proiectului MySQL s-a produs cu un cod sursă aflat sub licența GNU GPL. În prezent MySQL este deținut de ORACLE după ce a fost achiziționat de la compania suedeză MySQL AB.

Bazele de date generate de MySQL sunt folosite adesea în aplicații WEB dar și de companii importante precum Facebook, Twitter sau YouTube. Pentru o administrare mai elegantă a bazelor de date, MySQL a creat MySQL Workbench, aplicație cu interfață utilizator ce permite crearea și administrarea bazelor de date dintr-o interfață grafică, ușor de folosit, fără a necesita scrierea liniilor de comandă.

Fig.1.1 "MySQL" [1]

MySQL Workbench este mediul oficial de dezvoltare pentru baze de date MySQL. La rândul său acesta a fost proiectat inițial de aceeași companie suedeză MySQL AB și permite utilizatorilor să gestioneze, proiecteze și chiar să dezvolte din punct de vedere grafic bazele de date. MySQL Workbench a apărut ca o variantă îmbunătățită a vechiului produs software utilizat, MySQL GUI Tool. Pachetul MySQL Workbench este disponibil și el în două variante, una ce poate fi descărcată gratuit de pe site-ul producătorului și una cu plată care adaugă versiunii gratuite o serie de caracteristici avasate de dezvoltare.

Produsul software MySQL este scris și dezvoltat în limbajele de programare C și C++.

Principalele comenzi utilizate în MySQL pentru manipularea datelor în cadrul bazelor de date:[2]

SHOW DATABASES – comandă ce afișează o listă cu numele bazelor de date existente

USE baza_de_date – se alege baza de date în care se va lucra

CREATE DATABASE nume_baza – se creează o bază de date nouă

CREATE TABLE nume_tabel(nume_câmp TIP, nume_camp2 TIP) – creează un tabel cu câmpuri

DROP TABLE nume_tabel – șterge tabelul `nume_tabel`

DROP DATABASE nume_baza – șterge baza de date `nume_baza`

INSERT INTO nume_tabel (camp1,camp2) VALUES (valoare1,valoare2) – introduce în tabelul `nume_tabel` la nivelul câmpurilor `camp1` și `camp2`, valorile `valoare1` și `valoare2`

SELECT * FROM nume_tabel – afișează tot conținutul tabelului cerut

SELECT camp1 FROM nume_tabel – afișează doar conținutul din `camp1` din tabelul dorit

SELECT camp1,camp2 FROM nume_tabel – se poate cere afișarea a oricâte câmpuri din tabel

SELECT * FROM nume_tabel WHERE camp1='valoare1' – afișarea tuturor câmpurilor din tabel unde corespondentul din `camp1` este egal cu `valoare1`

SELECT * FROM nume_tabel WHERE camp1='valoare1' AND camp2 LIKE '%valoare2%' – afișează toate câmpurile care conțin `valoare1` ce se aseamănă cu `valoare2`

SELECT camp1 FROM nume_tabel ORDER BY camp1 ASC – afișarea valorilor din `camp1` în ordine crescătoare

SELECT camp1 FROM nume_tabel ORDER BY camp1 DESC – afișarea valorilor din `camp1` în ordine descrescătoare

SELECT count(*) FROM nume_tabel – afișarea numărului total de înregistrări din tabel

SELECT count(*) FROM nume_tabel WHERE camp1=valoare1 afișează câte înregistrări sunt în tabel al căror `camp1` este egal cu `valoare1`

SELECT * FROM nume_tabel LIMIT 0,3 afișează din tabel începând cu prima înregistrare, următoarele trei înregistrări existente în tabel

DELETE FROM nume_tabel WHERE camp1=valoare1 șterge înregistrările din tabel conform condiției din clauza WHERE

ALTER TABLE nume_tabel ADD nume_coloana TEXT – adaugă la tabel o coloană cu numele `nume_coloana` de tipul TEXT

ALTER TABEL nume_tabel CHANGE nume_coloana nume_coloane TEXT – modifică numele coloanei din tabel

Atunci când se creează un tabel în MySQL trebuie definit tipul de date pe care fiecare coloană îl va conține. Există trei tipuri principale de date care se ramifică: `Text`, `Numere`, `Dată și Ora`.

Stocarea de tip text se face în variabile de tipul:

CHAR – câmp cu lungime fixă de la 0 la 255 caractere;

VARCHAR(lungime) – câmp cu lungime variabilă de la 0 la 65,535 caractere;

TINYTEXT – câmp de lungime maximă de 255 caractere;

TEXT – câmp cu lungime maximă de 65,535 caractere;

MEDIUMTEXT – câmp cu lungime maximă de 16,777,215 caractere;

LONGTEXT – câmp cu lungime maximă de 4,294,967,295 caractere;

Stocarea numerelor se face în variabilele de tipul:

TINYINT – interval de la -128 la 127 sau de la 0 la 255 fără semn;

SMALLINT – interval de la -32,768 la 32,767 sau de la 0 la 65,535 fără semn;

MEDIUMINT – interval de la -8,388,608 la 8,388,607 sau de la 0 la 16,777,215 fără semn;

INT – interval de la -2,147,483,648 la 2,147,483,647 sau de la 0 la 4,294,967,295 fără semn;

BIGINT – interval de la –9,223,372,036,854,775,808 la 9,223,372,036,854,775,807 sau de la 0 la 18,446,744,073,709,551,615 fără semn

FLOAT (lungime, zecimale) număr foarte mare cu precizie de zecimale controlabilă

DOUBLE (lungime, zecimale) număr foarte mare cu precizie de zecimale controlabilă.

Stocarea datei și orei se face în variabile de tipul:

DATE – data stocată în format AAAA-LL-ZZ

DATETIME – data și ora stocate în format AAA-LL-ZZ OO: MM: SS

TIMESTAMP – conține date și ore preluate între ianuarie 1970 și ianuarie 2038

TIME – oră în format OO: MM: SS

1.2 Baze de date și funcțiile unui sistem de gestiune a bazelor de date[3]

O bază de date este o colecție organizată de date. Colecția cuprinde scheme, tabele, interogări, rapoarte dar și posibilitatea de vizualizare a altor obiecte. Datele sunt organizate într-un mod în care la orice cerere de informații cuprinse în tabele, baza de date să returneze componența acesteia. Formal, o bază de date se referă la un set corelat și organizat de date. Accesul la aceste date (v. și figura 1.2) se face de obicei cu ajutorul unor sisteme de gestiune a bazelor de date (SGBD) permițând utilizatorilor să interacționeze în mod direct cu baza de date prin diferite operații de manipulare a datelor. Bazele de date pot fi stocate și utilizate atât dintr-un sistem local cât și din online.

Calitatea unei baze de date este condiționată de patru caracteristici importante: volumul de informație, facilitățile de interogare, timpii de acces și grafica ecranului.

Din punct de vedere istoric bazele de date au existat întotdeauna, dar sub diverse forme. În ceea ce privește evoluția tehnologică modelul relațional al bazelor de date, model ce presupune o structură bine definită, integrarea datelor și prelucrarea acestora, a fost propus pentru prima dată în anul 1970 de către Edgar F. Codd.

Fig. 1.2 "Structura relației utilizator-bază de date"[4]

1.3 Funcțiile unui sistem de gestiune a bazelor de date

Descrierea datelor permite definirea și modificarea structurii bazelor de date de către utilizatori. În acest mod fiecare utilizator primește anumite drepturi de acces la obiectele existente în baza de date. Nu toți utilizatorii au nevoie de drepturi depline asupra bazelor de date, drepturile fiind limitate pentru a reduce riscul deteriorării accidentale a datelor efectuând operații necorespunzătoare.

Utilizarea datelor include operațiile pe care un utilizator le efectuează pentru prelucrarea înregistrărilor dintr-o bază de date. Un utilizator poate efectua anumite interogări precum: inserarea, ștergerea sau modificarea datelor în cadrul unei tabele dintr-o bază de date.

Integritatea datelor presupune definirea unor reguli numite „constrângeri de integritate”, după care datele sunt stocate în baza de date. În eventualitatea în care o operație nu respectă aceste reguli, automat cererea este respinsă și nu afectează cu nimic baza de date.

Confidențialitatea datelor este una dintre funcțiile de siguranță a sistemelor de gestiune a bazelor de date, funcția acordând accesul la date doar utilizatorilor înregistrați, verificând și drepturile de acces ale fiecărui utilizator.

1.4 Caracteristici și limitări ale MySQL

MySQL este oferit în două ediții diferite, MySQL Community Server și MySQL Enterprise Server. Versiunea Enterprise este diferită printr-o serie de extensii avansate ce se instalează pe server oferind mai multe facilități legate de sistemul de numerotare. Printre cele mai importante caracteristici ale ultimelor ediții MySQL se pot enumera implementarea posibilității de indexare și căutare a unui text, posibilitatea utilizării formatului de codificare și interpretare a datelor binare în format text – Unicode, motoare multiple de stocare, posibilitatea utilizării mecanismelor de declanșare și biblioteci de bază încorporate.

O caracteristică importantă o reprezintă posibilitatea implementării bazelor de date de tip ACID[5] cu ajutorul extensiei InnoDB. ACID reprezintă un acronim de la proprietățile pe baza cărora se realizează tranzacțiile în cadrul bazelor de date (v. figura 1.3).

Atomicitatea reprezintă proprietatea care garantează că mai multe operații sunt grupate împreună și sunt recunoscute ca fiind o singură unitate.

Consistența este cea care se asigură că în urma unei tranzacții terminate, starea sistemului rămâne consistentă, adică respectă în continuare regulile după care a fost creată.

Izolarea este acea componentă care se ocupă de administrarea fiecărui client astfel încât fiecare dintre aceștia să poată să utilizeze baza de date fără să știe unul de celălalt și fără ca una dintre utilizări să afecteze o alta.

Durabilitatea garantează că toate actualizările permanent salvate supraviețuiesc indiferent de erorile apărute pe parcurs.

Fig.1.3 "Modelul ACID" [6]

Din punct de vedere al limitărilor, până la versiunea MySQL 5.7 se putea utiliza un singur mecanism de declanșare la un anumit moment de timp iar numărul maxim de tabele care puteau fi introduse într-o bază de date fiind limitat la 61.

Una dintre principalele limitări ale MySQL o constituie faptul că nu utilizează funcții de tip OLAP. Aceste funcții sunt utilizate foarte mult în cadrul administrării și analizei datelor multidimensionale.

1.5 XAMPP

XAMPP[7] este un program software gratuit dezvoltat de către Apache Friends și furnizează servicii server HTTP Apache, baze de date MariaDB, interpretare PHP dar și suport pentru limbajul de programare Perl. Denumirea de XAMPP este un acronim de la X-Platforma încrucișată, A-Apache, M-MariaDB, P-PHP și P-Perl. A fost lansat la data de 22 mai 2002 pentru sistemele de operare Windows, Linux și OS X. Echipa de dezvoltatori care au implementat XAMPP au avut intenția de a lansa acest produs doar în scopul testării aplcațiilor create pe calculatoarele proprii.

Principalele caracteristici și avantaje ale XAMPP sunt date de interfața simplă și intuitivă, suportul oferit pentru instalare dar și instalarea Apache, MySQL, PHP, Perl, FileZilla și serverul web local pentru găzduirea site-urilor WEB. Aplicația software XAMPP pune la dispoziția utilizatorilor un panou de control principal din care se pot activa toate funcțiile pe care le deține aplicația dar și acces la fișierele de configurare ale XAMPP.

Fig. 1.4 "XAMPP Control Panel"

Capitolul 2. Java

2.1 Istoric

În iunie 1991 James Gosling, Mike Sheridan și Patrick Naughton au inițiat proiectul Java. Scopul inițial pentru care a fost creat Java a fost televiziunea interactivă, dar s-a dovedit a fi prea avansat pentru televiziunea digitală din acea perioadă. Limbajul Java a fost inițial denumit "Oak", denumirea în limba engleză pentru stejar datorită stejarului din curtea biroului lui Gosling. Ulterior proiectul a fost redenumit "Green" și într-un final s-a stabilit și păstrat denumirea de "Java" de la boabele de cafea provenite din insula indoneziană Java (de unde și logo-ul actual, prezentat în figura 2.1).

Compania Sun Microsystems a lansat pentru prima dată public implementarea Java 1.0 în anul 1995 unde s-a anunțat pentru prima dată apariția unui limbaj de programare ce permitea utilizatorului posibilitatea rulării codului pe orice mașină fără să mai includă alte costuri, precum erau celelalte platforme din perioada respectivă. Java a adus un plus de securitate în rândul comunicării pe rețea și astfel cele mai multe navigatoare WEB au implementat foarte rapid Java Applets. Astfel Java a devenit foarte popular într-un timp foarte scurt. Compilatorul Java, versiunea 1.0 a fost rescris în limbaj Java de către Arthur van Hoff pentru a compila strict limbajul specific Java 1.0.

Din anul 1997 Java a oferit toate implementările în mod gratuit, singura sursă de venit fiind vânzarea produselor avasate și specializate pentru sisteme de tip Enterprise. În dată de 13 noiembrie 1995, compania Sun Microsystems a lansat Java Virtual Machine ca un software open-source sub licența GNU GPL.

Fig. 2.1 “Java Sun Microsystems” [8]

2.2 Platformă

Unul dintre obiectivele pentru care a fost creat Java este portabilitatea, ceea ce reprezintă ideea că un program scris într-o platformă Java poate rula în același fel indiferent de sistemul hardware sau sistemul de operare utilizat. Acest obiectiv a fost atins prin compilarea codului scris în limbaj Java într-o reprezentare intermediară denumită "Java bytecode" în locul compilării direct în arhitectura specifică cod-mașină. Instrucțiunile Java bytecode sunt proiectate pentru a fi executate de o mașină virtuală specifică sistemului gazdă. Bibliotecile standard creează un mod de acces la caracteristicile echipamentului gazdă, precum elemente grafice, fire de execuție și rețea.

2.2.1 Implementare

Oracle Corporation este proprietarul actual al implementării oficiale a platformei JAVA SE ca urmare a achiziționării acesteia de la Sun Microsystems la data de 27 ianuarie 2010. Această dezvoltare este bazată pe implementarea originală Java de la Sun. Implementarea celor de la Oracle este disponibilă atât pentru sisteme de operare Windows cât și MAC, Linux sau Solaris. În prezent Java este o implementare bazată foarte mult pe Java Community Process, continuând să se dezvolte pe baza opiniilor utilizatorilor acesteia, cu alte cuvinte un standard ”de facto”, adică aplicat dar nu neapărat conform legilor, Java nefiind recunoscut de ECMA Internațional.

Oracle livrează pachetul Java sub forma a două distribuții diferite JRE și JDK.

Java Runtime Environment (JRE) conține acele pachete din JAVA SE care sunt necesare rulării unor programe Java pentru utilizatori. Java Developmnent Kit (JDK) este distribuția specifică dezvoltărilor software și include uneltele specifice dezvoltării, unelte precum compilatorul Java, documentația Javadoc și un depanator. Open JDK este o altă implementare notabilă din pachetul Java SE aflată sub licența GNU GPL.

Fig. 2.2 “Structura implementării JAVA”[9]

Scopul Java este acela de a face toate implementările software scrise în acest limbaj să fie compatibile. Independența platformei este intens utilizată în cadrul Java EE, extensie a Java SE, unde sunt furnizate aplicații distribuite și servicii WEB.

2.2.2 Performanță

Aplicațiile dezvoltate în limbajul de programare Java[10] sunt recunoscute ca fiind ceva mai lente și cu un consum de memorie mai mare decât aplicațiile dezvoltate în limbajul C++. Cu toate acestea, viteza de rulare a programelor este foarte mult îmbunătățită de compilator (Javac) și de către mașina virtuală (JVM) care execută codul. Anumite platforme oferă suport direct în ceea ce privește partea hardware atunci când se utilizează limbajul de programare Java. Unele companii ce creează microcontrolere au introdus în cadrul microprocesoarelor un înlocuitor al mașinii virtuale Java (JVM) pentru a se putea folosi limbajul Java și în programarea microcontrolerelor.

Platforma Java utilizează un sistem de administrare a memorie automat, denumit ”garbage collector” care administrează toate resursele de memorie pe toată durata de viață a unui obiect. Programatorul este cel care decide când un obiect este instanțiat dar Java Garbage Collector se ocupă de recuperarea memoriei imediat ce acel obiect nu mai este utilizat. În momentul în care nu mai există nicio referință către un obiect, acesta devine automat disponibil pentru eliberare. De cele mai multe ori apar probleme de memorie atunci când programatorul scrie un cod în care păstrează o referință către un obiect de care nu mai este nevoie. Pentru a evita blocarea memoriei, Java Garbage Collector trimite o excepție de tipul ”Null pointer exception”.

Activitatea utilitarului Garbage Collector poate avea loc în orice moment de timp, de preferat atunci când programul este în stare inactivă. Acesta rulează în mod garantat atunci când se constată insuficiența memoriei pentru alocarea unor noi obiecte în stiva de memorie. Administrarea memoriei în mod explicit nu se poate realiza în Java.

Spre deosebire de C++, Java nu acceptă aritmetica pointerilor unde adresele obiectelor și valorile fără semn pot fi interschimbate.

2.2.3 Sintaxă

Sintaxa în limbajul de programare este foarte mult influențată de C++. Spre deosebire de cel menționat care combină sintaxa generică – cea pentru structuri și cea obiect-orientată – Java rulează exclusiv ca un limbaj orientat pe obiect. Tot codul este scris în interiorul claselor și orice element este un obiect; excepție fac datele primitive. Un dezavantaj față de C++ îl reprezintă faptul că Java nu acceptă supraîncărcarea operatorilor și nici moștenirea multiplă a claselor.

În cadrul codului există asemănări în ceea ce privește C++ și Java și la capitolul comentarii adăugate în cod. În ambele limbaje se folosește grupul "//" pentru a comenta o sigură linie sau deschiderea unui comentariu pe mai multe linii "/*" și încheierea cu același grup de caractere scris în ordine inversă "*/".

În ceea ce privește declararea variabilelor, Java definește următoarele tipuri de date (v. și figura 2.3):

Variabile de instanță, care din punct de vedere tehnic păstrează în memorie stările câmpurilor non-statice care conform sintaxei sunt câmpuri declarate fără cuvântul cheie "static".

Variabile de clasă, variabile ce reprezintă orice când sunt declarate cu specificatorul "static"; astfel compilatorul va recunoaște existența unei singure copii a acelei variabile indiferent de câte ori a fost instanțiată clasa.

Variabile locale, sunt acele zone de memorie în care se salvează starea temporară a unei metode sau valori. Limbajul de programare Java presupune că toate variabilele dorite a fi utilizate sunt declarate înaintea folosirii.

Fig. 2.3 “Tipuri de date primitive”[11]

2.3 Aplicații software speciale utilizate

2.3.1 Swing

Swing este o platformă independentă, un MVC cu elemente grafice din Java SE lansat pentru prima dată în dată de 16 decembrie 1996. Această unealtă permite inserarea de elemente grafice pentru o interacțiune mai ușoară cu funcționalitățile aplicației. Aceasta poate fi utilizată în orice aplicație Java dacă se importă pachetul javax.Swing.

Utilitarul Swing a fost dezvoltat pentru a utiliza mai ușor componente grafice utilizând modele abstracte ce pot fi configurate de către utilizator.

Unele dintre cele mai folosite obiecte grafice din cadrul Swing sunt butoanele de tip JButton, panourile de tip JPanel, listele de tip JList sau mecanismul de căutare fișiere JFileChooser.

2.4 Pachete de clase utilizate[12]

În funcție de utilitatea unor clase predefinite, acestea sunt grupate în biblioteci. Un alt criteriu după care clasele sunt grupate în biblioteci este în funcție de aplicațiile pentru care sunt destinate.

2.4.1 Socket

Un socket este un punct final de comunicație, el fiind locul în care programul de aplicație începe să comunice cu furnizorul mediului de transport. Din punct de vedere al unui program tip aplicație, socket-ul este o resursă alocată de către sistemul de operare. Socket-urile furnizează mecanismul de comunicare între două calculatoare utilizând TCP. TCP este un protocol de comunicare bidirecțional astfel că se pot transmite date din ambele capete la același moment de timp.

Un program aplicație de tip client creează un socket ca punct final de comunicație și încearcă să se conecteze prin acel socket la server. În momentul în care s-a realizat conexiunea serverul creează și el un obiect socket specific clientului, astfel clientul și serverul putând să comunice scriind și citind date de la socket.

Clasa java.net.Socket reprezintă socket-ul în sine iar clasa java.net.ServerSocket furnizează un mecanism pentru programul de tip server care așteaptă ca un eventual client să stabilească o conexiune. Pașii parcurși pentru stabilirea unei comunicații sunt următorii:

Serverul creează un obiect de tip ServerSocket pe baza unui port stabilit

Acesta așteaptă până un client se conectează pe același port și cu ajutorul metodei accept() leagă clientul la server

Dacă s-a stabilit conexiunea între client și server aceștia pot interschimba mesaje.

Fig. 2.4 ”Funcționarea socket”[13]

2.4.2 BufferedReader

Clasa BufferedReader face parte din pachetul java.io și reprezintă clasa care citește un text de la un flux de caractere de intrare. Obiectele din clasa BufferedReader pot utiliza metode mai rapide de citire precum readLine(), metodă care citește o linie întreagă dintr-un flux. Finalul unei linii este marcat de caracterul "\r" (Carriage Return).

Clasa BufferedReader a fost utilizată în cadrul aplicației pentru realizarea comunicării între angjații firmei. Cu ajutorul acesteia se citesc mesajele atât în serverul de comunicare cât și în fiecare dintre aplicațiile client.(v. capitol 4.2)

2.4.3 BufferedWriter

Clasa BufferedWriter face parte din același pachet java.io și are ca funcționalitate principală scrierea unor caractere într-un flux de date. Principala metodă utilizată este write().

Clasa BufferedWriter, este de asemenea utilizată în cadrul modulului de comunicare, fiind necesară pentru scrierea unui mesaj de la client sau server în punctul de comunicare numit Socket. (v. secțiunea 4.2)

2.4.4 JFreeChart

JFreeChart este o bibliotecă gratuită ce pune la dispoziție o serie de grafice ce pot fi realizate pe baza unor parametri dați. Biblioteca menționată a ajutat la realizarea unei statistici în cadrul aplicației client și utilizarea unor date pentru trasarea unui grafic. (v. secțiunea 4.2)

2.4.5 Apache POI

Apache POI este biblioteca ce realizează documente în format Microsoft Word Document. De asemenea aceasta include o serie de metode prin care se pot realiza paragrafe, schimba font-uri, culori sau chiar atașa imagini. În aplicația destinată angajaților din cadrul proiectului, biblioteca a fost utilizată în modulul de date personale pentru obținerea unor documente specifice fiecărui angajat. (v. secțiunea 4.2)

2.4.6 Java Database Connectivity (JDBC)

JDBC este o interfață într-o aplicație Java care definește modul în care un client accesează o bază de date (v. figura 2.4). Această bibliotecă face parte din pachetul Java Standard Edition și furnizează metode prin care se pot crea interogări, actualizări și inserări. Biblioteca JDBC a fost lansată de către Sun Microsystems în pachetul JDK 1.1 în februarie 1997.

JDBC premite existența și utilizarea a mai multor implementări în aceeași aplicație. Toate sistemele din JDBC sunt administrate de către un obiect din clasa Driver Manager.

Fig. 2.5 "Legătura aplicației Java cu baza de date"[14]

2.5 Medii de dezvoltare

Un mediu de dezvoltare este o aplicație software care furnizează mai multe facilități unui programator în dezvoltarea unor programe. Un mediu de dezvoltare este alcătuit dintr-un editor de cod sursă, un utilitar care are rolul de compilator și un depanator. Cele mai multe dintre mediile de dezvoltare au integrată funcția de auto-completare inteligentă a codului scris.

Între cele mai cunoscute medii de dezvoltare pentru limbajul de programare Java amintesc NetBeans și Eclipse. Fiecare dintre acestea a încercat să ofere tot mai multe funcționalități, NetBeans integrând o interfață grafică pentru o realizare mai ușoară a unui model.

2.5.1 NetBeans

Platformă de dezvoltare software realizată cu ajutorul limbajului de programare Java. NetBeans[15] permite aplicațiilor să fie dezvoltate cu ajutorul unor componente software numite module. A apărut în anul 1996 ca un proiect al unor studenți de la Facultate de Matematică și Fizică din Praga.

Mediul de dezvoltare NetBeans face parte din suita de programe gratuite ce permite dezvoltarea tuturor tipurilor de aplicații Java, testarea și depanarea acestora. De asemenea poate fi adaptat și pentru alte limbaje precum PHP, C/C++ sau HTML5.

Module integrate în cadrul NetBeans IDE (interfața grafică este prezentată în figura 2.5):

NetBeans Profiler – unealtă ce se ocupă cu monitorizarea aplicațiilor Java, ajută la îmbunătățirea vitezei afișând zonele în care se realizează pierderi de memorie (memory leaks).

GUI tool – unealtă care a înglobat tot pachetul SWING din Java și a făcut amplasarea lor mai ușoară în aplicație fără a mai scrie codul specific fiecărei componente ci poziționarea directă a acestora dintr-un meniu în fereastra de lucru.

NetBeans JavaScript editor – extensie atașată la NetBeans pentru a facilita și a oferi suport în ceea ce privește JavaScript, Ajax sau CSS. Această extensie oferă posibilitatea unor redenumiri globale, auto-completări de cod și chiar evidențierea unor părți de sintaxă. În ceea ce privește editorul CSS acesta face auto-completări și poate să afișeze fiecare regulă de scriere a CSS.

Fig. 2.6 "Interfața grafică a NetBeans"

Capitolul 3. Android Studio

3.1 Generalități

Android Studio[16] este mediu integrat oficial de dezvoltare (IDE) pentru realizarea de aplicații Android, bazate pe IntelliJ IDEA. Comparativ cu editoarele de cod puternice și instrumentele de dezvoltare ale lui IntelliJ, Android Studio oferă chiar mai multe caracteristici care sporesc productivitatea atunci când se construiesc aplicații Android, cum ar fi:

Un sistem flexibil constructiv bazat pe Gradle.

Un emulator rapid și cu o multitudine de caracteristici.

Un mediu unificat unde se pot dezvolta aplicații pentru toate dispozitivele Android.

Executare instantanee, fără a construi un nou APK.

Template-uri de cod și integrarea GitHub pentru a ajuta la construirea caracteristicilor aplicațiilor și exemple de cod.

Instrumente extinse de testare.

Instrumente pentru a mării performanța, ușurința de utilizare, compatibilitatea

Suport C++ și NDK.

Suport încorporat pentru Google Cloud Platform, făcând mai ușoară integrarea Google Cloud Messaging și App Engine.

Fig. 3.1 “Android Studio”[17]

Android 2.0 Studio este modul cel mai rapid de a construi aplicații performante de înaltă calitate pentru platforma Android, inclusiv pentru telefoane și tablete, Android Auto, Android Wear și Android TV. Ca și IDE oficial din partea Google, Android Studio include tot ce este nevoie pentru a construi o aplicație, inclusiv un editor de cod, instrumente de analiză a codului, compilatoare și multe altele. Această versiune nouă și stabilă de Android Studio are viteze mari de a construi aplicația și un emulator rapid, cu suport pentru cea mai recentă versiune Android și serviciile Google Play.

Android Studio este construit în perfectă coordonare cu sistemul de operare Android și suportă toate tipurile de API. Android Studio este utilizat de cei mai mulți dezvoltatori pentru aplicații Android, iar trecerea la Android Studio 2.0 a crescut numărul acestora. Android Studio, poate fi descărcat sau actualizat foarte ușor de pe site-ul oficial.

3.2 Structura

Fiecare proiect[18] din Android Studio conține unul sau mai multe module cu fișiere de cod sursă și fișiere de resurse. Principalele module sunt:

Module de aplicații Android

Module de biblioteci

Module pentru Google App Engine

În mod implicit, Android Studio afișează fișierele de proiect în fereastra de vizualizare a proiectului Android, așa cum se arată în următoarea figură. Acest proiect este organizat pe module pentru a oferi acces rapid la fișierele sursă-cheie ale proiectului respectiv.

Fig. 3.2 „Organizare proiect”[19]

Toate fișierele sunt vizibile la nivelul superior în cadrul Script Gradle și fiecare modul al aplicației conține următoarele fișiere:

Manifests: Conține fișierul AndroidManifest.xml.

Java: Conține fișierele de cod sursă Java, inclusiv codul de test JUnit.

Res: Conține toate resursele de bază non-cod, cum ar fi machete XML, șiruri de caractere UI și imagini bitmap.

Structura proiectului Android pe disc diferă de această reprezentare. Pentru a vedea structura efectivă a fișierului în cadrul proiectului, se selectează "Project" din meniul derulant de proiect.

Puteți personaliza, de asemenea, vizualizarea fișierelor de proiect să se concentreze asupra aspectelor specifice dezvoltării aplicației. De exemplu, selectarea meniului "Problems" din proiect afișează referințe către fișierele sursă care conțin orice erori de codificare și de sintaxă recunoscute de către compilator, cum ar fi un element XML lipsă de închidere a tag-ului într-un fișier de aspect.

Fig. 3.3 „Afișarea fișierelor cu erori de codificare"[20]

3.3 Dezvoltare

Android Studio 2.0 include următoarele caracteristici noi pe care dezvoltatorii Android le pot utiliza în fluxul lor de lucru:

Instant run: Pentru fiecare dezvoltator care dorește ca aplicațiile să ruleze la viteze mai mari, funcția face modificări direct în aplicația care rulează.

Android Emulator: Noul emulator rulează de trei ori mai rapid decât emulatoarele anterioare Android, datorită îmbunătățirilor ADB, datele și aplicațiile se pot încărca de câteva ori mai rapid în emulator decât la un dispozitiv fizic. Asemenea unui dispozitiv fizic, emulatorul Android include Google Play Services încorporat, astfel încât să poată fi testate mai multe funcționalități API. În cele din urmă, noul emulator are caracteristici mult mai bine definite pentru a gestiona apeluri, baterie, rețea, GPS și multe altele.

Cloud Test Lab Integration: Oferă posibilitatea testării aplicației în cadrul departamentului testare Google. Îmbunătățirea calității aplicațiilor prin testarea rapidă pe o gamă largă de dispozitive fizice Android în Cloud Lab chiar din Android Studio.

App Indexing Code Generation & Test: Ajută la promovarea vizibilității aplicației în căutarea Google pentru utilizatori prin adăugarea automată de URLs cu caracteristica App Indexing în Android Studio. Cu câteva clicuri se pot adăuga link-uri URL indexabile care pot fi testate toate în IDE.

GPU Debugger Preview: Pentru dezvoltatorii de jocuri sau aplicații bazate pe OpenGL ES, se poate utiliza Debugger Preview astfel încât se segmentează fiecare cadru și starea GL. Se descoperă și se dă diagnosticul GL de randare prin captarea și analiza fluxului GPU de pe dispozitivul Android.

IntelliJ 15 Update: Android Studio este construit pe platforma de codificare Intellij.

3.3.1 Instant Run

Astăzi, platformele mobile sunt centrate în jurul valorii de viteză și agilitate. Și totuși, pentru construirea de aplicații mobile aceste platforme, uneori, se simt greoaie și lente. Instant Run în Android Studio este soluția optimă pentru a menține totul într-un flux de dezvoltare rapid și fluid. Calitatea crește productivitatea dezvoltatorilor, prin accelerarea procesului de editare, construcție, cicluri de execuție. La apăsarea pe butonul „Instant Run”, acesta va analiza modificările făcute și va determina modul în care se poate implementa noul cod în cel mai rapid mod.

Fig. 3.4 „Instant Run”[21]

Ori de câte ori este posibil, se vor introduce modificările codului în procesul de aplicație care rulează, evitând re-implementarea și re-instalarea fișierului APK. Pentru anumite tipuri de modificări, activitate sau o aplicație este necesară o repornire, dar editarea, construcția și ciclurile de execuție ar trebui să fie în continuare mult mai rapide decât înainte. „Instant Run” funcționează cu orice dispozitiv Android sau emulator care rulează API-14 (Ice Cream Sandwich) sau mai nou.

De la momentul de previzualizare a aplicației de la sfârșitul anului trecut, dezvoltatorii au petrecut nenumărate ore incorporând părerile utilizatorilor pentru versiunea stabilă. Pentru a afla cum se poate profita la maximum de Instant Run în dezvoltarea aplicației, poate fi consultată documentația oficială pentru Instant Run.

3.3.2 Android Emulator

Noul Android Emulator este de până la trei ori mai rapid în CPU, RAM & I/O în comparație cu emulatorul Android precedent. Atunci când se apasă butonul de „Build”, vitezele de încărcare ADB sunt de zece ori mai mari față de precedentul emulator. În cele mai multe situații, dezvoltarea pe Emulatorul Android oficial este mai rapidă decât pe un dispozitiv real iar caracteristicile precum Instant Run vor funcționa mai bine pe noul emulator Android.

În plus față de viteză și performanță, Android Emulator are o interfață utilizator pentru controlul senzorilor. Cu acest emulator există posibilitatea de „drag and drop” pentru instalare rapidă a fișierelor de tip APK, redimensionarea ferestrei, schimbarea rezoluției, utilizarea acțiunilor de tip multi-touch și multe alte facilități.

Fig. 3.5 „Android Emulator”[22]

Utilizarea noului emulator este la fel de ușoară ca și actualizarea instrumentelor SDK 25.1.1 sau variante mai noi, crearea unui nou dispozitiv virtual Android se face folosind una dintre imaginile din sistemul x86 recomandate de către Android Studio. Mai multe detalii despre Android Emulator pot fi aflate prin verificarea documentației.

3.3.3 Cloud Test Lab

Cloud Test Lab este un nou serviciu care permite testarea aplicației pe o gamă largă de dispozitive și configurații de dispozitive la scară de cloud. Odată cu terminarea testării inițiale cu Android Emulator sau dispozitivului Android, Cloud Test Lab, o extensie a procesului de testare și pornește rularea unei serii de teste pe dispozitive fizice găzduite în centrele de date Google. Dacă nu se specifică seria de teste, Cloud Test Lab poate efectua un set de teste de bază pentru a se asigura că aplicația nu se oprește accidental.

Fig.3.6 „Setări pentru Cloud Test Lab”[23]

Noua interfață în Android Studio permite utilizatorului să configureze portofoliul de teste pe care dorește să-l ruleze pe Cloud Test Lab și permite vizualizarea rezultatelor testelor acestuia.

3.3.4 App Indexing Code Generation & Test

Sistemul realizează o integrare mai eficientă în cadrul căutărilor Google cu ajutorul Indexing API App. Android 2.0 Studio ajută la crearea structurii URL corectă în codul aplicației și adaugă atribute în fișierul AndroidManifest.xml, pe care va funcționa serviciul de indexare Google App. După ce sunt adăugate adresele URL la aplicația respectivă, se poate testa și valida codul aplicației de indexare după cum este prezentat în figura 3.7.

Fig. 3.7 „Google App Indexing Testing”[24]

3.3.5 GPU Debugger Preview

Dezvoltatorii de jocuri OpenGL ES sau aplicații grafice intensive au la dispoziție un nou depanator GPU cu Android 2.0 Studio.

Fig. 3.8 „Debug Preview”[25]

3.4 Mediu de programare

Există posibilitatea de organizare a ferestrei principale pentru a oferi mai mult spațiu pe ecran prin ascunderea sau eliminarea barelor de instrumente și ferestre adiționale. Se pot utiliza, de asemenea, comenzi rapide de la tastatură pentru a avea acces la cele mai multe caracteristici IDE.

În orice moment, se poate căuta în codul sursă, baze de date, acțiuni, elemente ale interfeței cu utilizatorul, și așa mai departe, prin dubla apăsare pe tasta Shift, sau făcând clic pe lupă în colțul din dreapta sus al programului Android Studio. Acest lucru poate fi foarte util în cazul în care, de exemplu, se încearcă găsirea unei anumite acțiuni IDE.

Fereastra principală Android Studio este alcătuita din mai multe zone logice identificate în figura următoare.

Fig. 3.9 „Fereastra principala Android Studio”[26]

Bara de instrumente permite efectuarea unei game largi de acțiuni, inclusiv rularea aplicației și lansarea de instrumente Android.

Bara de navigare ajută la navigarea prin proiectul și fișierele deschise pentru editare. Acesta oferă o vizualizare mai compactă a structurii vizibile în fereastra de unelte.

Fereastra editorului este locul unde se poate scrie și modifica codul. În funcție de tipul de fișier curent, această fereastră se poate schimba. De exemplu, atunci când se vizualizează un fișier de aspect, fereastra editorului afișează editorul de aspect și oferă posibilitatea de a vizualiza fișierul XML corespunzător.

Ferestrele de instrumente oferă utilizatorului acces la sarcini specifice, cum ar fi managementul de proiect, de căutare, de control al versiunii, și multe altele. Acesta are posibilitatea de a le extinde și a le închide/șterge.

Bara de stare afișează starea proiectului și a mediului de dezvoltare în sine, precum și orice avertismente sau mesaje.

Capitolul 4 Realizarea practică

În acest capitol urmăresc prezentarea funcționării întregii aplicații, a utilitarelor utilizate pentru dezvoltare, precum și prezentarea conexiunilor realizate în cadrul aplicației.

Partea practică se axează pe rularea aplicației pe mai multe dispozitive pentru obținerea unor rezultate în ceea ce privește extragerea datelor din baza de date dar și pentru o bună comunicare între utilizatorii aplicației. Aplicația destinată unei firme sau unui departament din cadrul unei firme realizează extragerea datelor într-o formă optimă pentru o eficiență maximă dar realizează și o comunicare fluentă între angajați, astfel încât în momentul în care apar probleme de orice tip, se pot trimite tichete între departamente pentru soluționarea problemelor într-un mod cât mai ușor și eficient.

4.1 Baza de date

În dezvoltarea bazei de date s-a utilizat aplicația software MySQL Workbench cu ajutorul căreia am implementat toate tabelele și câmpurile din cadrul acestora, am realizat legăturile pentru configurarea cheilor străine dintre tabele. Cu ajutorul XAMPP am folosit pagina de administrator din cadrul MySQL "http://localhost/phpmyadmin/" unde am realizat introducerea datelor în baza de date. Fiecare dintre tabele are o denumire specifică pentru funcționalitatea pe care o are.

Fig. 4.1 "Baza de date SIAMA"

4.2 Aplicația Java

Pentru implementarea aplicației pentru sistemul de operare Windows s-a folosit aplicația software NetBeans cu ajutorul utilitarului de componente Swing, descrise în cadrul celui de-al doilea capitol.

Am realizat o interfață de conectare la baza de date prin intermediul aplicației, interfață ce preia datele din două câmpuri text și le verifică corectitudinea conform valorilor din baza de date. Dacă datele introduse nu corespund cu ceea ce există în baza de date, atunci aplicația generează un mesaj de eroare prin care anunță utilizatorul că datele introduse sunt greșite.

Fig. 4.2 "Login"

După introducerea corectă a datelor în cadrul ferestrei de conectare, se face o verificare asupra funcției angajatului în cadrul firmei, dacă este "Administrator", se deschide o fereastră prin care acesta poate face modificări în cadrul bazei de date sau să pornească și să oprească serverul de comunicare între angajați.

Fig.4.3 "Fereastra administrator"

Dacă funcția nu este cea de "Administrator" atunci se deschide o altă fereastră, la care are acces de asemenea și administratorul, în care sunt trei panouri cu diverse funcții.

Primul panou este cel despre informațiile personale ale angajatului. Acesta are acces la anumite cereri care se auto-completează cu date din baza de date, sau poate vizualiza o statistică a evoluției personale bazată pe numărul de ore lucrate și pe numărul de tichete rezolvate (v. figura. 4.4).

Pentru realizarea graficului am folosit biblioteca JFreeChart, descrisă în secțiunea 2.4.4. Am introdus ca parametri pe cele două axe de coordonate ale graficului ”numărul de ore lucrate” și ”numărul de tichete rezolvate”. În funcție de acestea două este trasat automat un grafic al evoluției angajatului.

În același panou cu cel de statistici există și posibilitatea extragerii automate a unor documente precum ”Cererea de concediu medical”, ”Concediu fără plată” ,”Zi liberă” sau ”Date personale” aflate în baza de date. Documentele sunt generate automat cu ajutorul bibliotecii descrise în secțiunea 2.4.5 Apache POI. Această bibliotecă conține funcții speciale pentru crearea unor documente în format Microsoft Word Document, formatate special. Am utilizat câteva paragrafe și în anumite zone din documente unde am inserat date extrase din baza de date, date precum numele și prenumele angajatului și funcția acestuia. La apăsarea oricăruia dintre aceste butoane se deschid una sau mai multe ferestre de interogare prin care i se permite angajatului să introducă numărul de zile de concediu sau perioada în care dorește concediu.

Fig. 4.4 "Introducere parametrii în cereri"

Fig. 4.5 – ”Statistici individuale ale fiecărui angajat”

Cel de-al doilea panou cuprinde o listă cu tichetele primite în cadrul departamentului de care aparține angajatul și posibilitatea de a vizualiza ce tichete au fost marcate ca fiind în curs de rezolvare sau rezolvate. Marcarea tichetelor ca fiind în curs de rezolvare sau rezolvate se face în baza de date de unde acestea sunt și extrase ulterior pentru vizualizare.

Marcarea unui tichet ca fiind rezolvat este contorizată și contribuie la statistica personală a fiecăruia dintre angajați.

Ultimul panou este cel dedicat dialogului cu alte departamente sau angajați. Acest dialog constă în trimiterea de tichete sau mesaje în cadrul firmei. Pentru trimiterea unui tichet către un departament se selectează din lista de departamente departamentul dorit și la apăsarea butonului ”Trimite tichet” se deschide o fereastră în care se introduce numele tichetului și mesajul aferent acestuia.

Dacă se dorește trimiterea unui mesaj este suficientă apăsarea pe butonul de "Trimitere mesaj" și se deschide o fereastră cu toți angajații conectați în momentul respectiv, pentru alegerea corectă a destinatarului.

Fig.4.6 "Fereastra angajat"

Comunicarea între angajați este realizată într-o singură fereastră unde se specifică pe baza unei liste, către cine se trimite următorul mesaj iar în fereastra principală de comunicare se afișează de la cine s-au primit mesaje. Pentru exemplificare am rulat aplicația pentru mai mulți angajați și am simulat o comunicare de la câte un angajat pentru a se observa cum se realizează trimiterea și primirea mesajelor (v. figura 4.7).

Fig. 4.7 ”Comunicarea între mai mulți angajați în același timp”

4.3 Aplicația Android

Aplicația a fost dezvoltată în mediul de dezvoltare Android Studio și cuprinde funcționalitatea de conectare la baza de date principală și panoul de comunicare între angajați.

Fereastra principală din cadrul aplicației conține trei câmpuri text pentru introducerea datelor de autentificare ale fiecărui angajat și adresa IP a rețelei.

Fig. 4.8 "Login Android"

După introducerea datelor, acestea sunt verificate de către server în baza de date și apoi se realizează procesul de conectare.

Fereastra de comunicare este alcătuită dintr-un câmp text care arată și starea în care se află aplicația. Valoarea din eticheta text se modifică astfel:

-Not Connected: atunci când nu s-a putut realiza conexiunea.

-Connected: în momentul în care s-a conectat dar există posibilitatea ca baza de date să răspundă într-un timp mai îndelungat

-„Numele Utilizatorului” : Dacă totul decurge normal atunci baza de date returnează numele angajatului și este conectat la serverul de comunicare

Butonul de ”Refresh List” are funcția de a trimite o cerere către server, acesta urmând să returneze fiecare client în parte pentru a fi adăugați în listă.

Butonul de „Send” preia mesajul scris în caseta text alăturată și îl trimite către server unde urmează să fie procesat și trimis către destinatarul corect.

Astfel se pot vizualiza mesaje și trimite mesaje către alți angajați selectând din lista angajatul către care să se trimită mesaj(v. Fig.4.8)

Pe durata dezvoltării aplicației Android am utilizat atât Androi Emulator cât și dispozitivul Android personal.

Fig. 4.9 "Comunicare Android"

Concluzii și dezvoltări ulterioare

În acestă lucrare am urmărit eficientizarea comunicării în cadrul unei firme, între anagajați și departamente, extragerea unor statistici pentru motivarea angajaților și în același timp obținerea unor documente specifice fiecărui angajat într-o manieră mai ușoară, fără a mai exista pierderea de timp aferentă completării manuale a acestora.

Au fost descrise în detaliu toate aplicațiile software și tehnologiile utilizate pentru dezvoltarea acestui proiect, și anume MySQL, MySQL Workbench, Java, NetBeans, Android Studio.

Pe parcursul dezvoltării proiectului am observat necesitatea ca angajatul cu funcție de administrator să poată să modifice inclusiv datele din baza de date. De asemenea, pe parcursul proiectului au apărut și alte idei precum posibilitatea implementării unui sistem de trimitere tichete mai avansat din punct de vedere al facilităților, adăugarea unor sunete specifice la primirea unor mesaje, dar nu s-au putut realiza din motive de timp.

Rezultatele obținute sunt în conformitate cu cerințele inițiale ale proiectului în sensul că tot ceea ce s-a dorit de la proiect în faza inițială, a fost implementat.

Dezvoltări ulterioare

În cadrul proiectului pot fi implementate o serie de statistici realizate și pe alte criterii, nu doar cele de timp și tichete rezolvate și posibilitatea de acordare a unor calificative celorlalți angajați cu care s-a interacționat.

O altă opțiune de dezvoltare ulterioară o poate constitui implementarea unui sistem de comunicare tip voce astfel încât să se reducă și mai mult timpul pierdut pentru scrierea mesajelor.

Criptarea parolelor la introducerea în baza de date reprezinta o dezvoltare ulterioară destul de importantă în evoluția proiectului.

Ideile menționate mai sus nu au fost realizate din motive de timp.

Bibliografie

[1] – "Mysql Logo" http://xploit.ro/wp-content/uploads/2015/04/mysql-logo-740×357.jpg (accesat mai 2016)

[2] – "SQL" http://dev.mysql.com/doc/refman/5.7/en/sql-syntax-data-definition.html (accesat iunie 2016)

[3] -"MySQL" https://en.wikipedia.org/wiki/MySQL (accesat mai 2016)

[4]- "SGBD" http://databasease.weebly.com/prezentare.html (accesat iunie 2016)

[5]- Felicia Ionescu, Valentin Pupezescu ”Tranzacții ACID – Curs Prelucrarea Bazelor de Date”,2015-2016

[6]-"ACID " http://java.uzmanprogramci.com/acid-transaction-and-deadlock-animated/ (accesat mai 2016)

[7]-"XAMPP" https://ro.wikipedia.org/wiki/XAMPP (accesat iunie 2016)

[8]-"Java Logo" http://www.thetechherald.com/media/images/200912/Java_logo_1.jpg (accesat iunie 2016)

[9]-"Structura implementarii Java" http://javabeat.net/what-is-the-difference-between-jrejvm-and-jdk/ (accesat mai 2016)

[10]-"Java" https://en.wikipedia.org/wiki/Java_(programming_language) (accesat mai 2016)

[11]"Tipuri de date primitive" http://www.write-technical.com/126581/session2/session2.htm (accesat iunie 2016)

[12]-"Pachete Java" https://docs.oracle.com/javase/7/docs/api/ (accesat aprilie 2016)

[13]"Functionare socket" http://chimera.labs.oreilly.com/books/1234000001805/ch13.html#learnjava3-CHP-13-SECT-1.1 (accesat mai 2016)

[14] "Legătura aplicației Java cu baza de date" http://tutorials.jenkov.com/jdbc/index.html (accesat iunie 2016)

[15] Heiko Boeck- "NetBeans Platform for Beginners" ,Martie 2014

[16] Eduard Popovici – "Android Studio" – "Curs Dezvoltarea aplicațiilor Android inovative",2014-2015

[17]"Android Studio" http://www.tutorialspoint.com/android/images/studio1.jpg (accesat mai 2016)

[18]"Structura proiect" https://developer.android.com/studio/intro/index.html (accesat iunie 2016)

[19]"Organizare proiect" https://developer.android.com/studio/images/intro/project-android-view_2-1_2x.png (accesat iunie 2016)

[20]"Afisare fisier cu erori de codare" https://developer.android.com/studio/images/intro/problems-view_2-1_2x.png (accesat iunie 2016)

[21]"Instant Run" http://sdtimes.com/android-studio-2-0-launched-with-faster-emulator-instant-runcommand/ (accesat aprilie 2016)

[22] "Android Emulator" http://tools.android.com/tech-docs/emulator (accesat iunie 2016)

[23]"Setari Cloud Test Lab" https://developers.google.com/cloud-test-lab/androidstudio#configure_a_test_matrix_and_run_a_test (accesat aprilie 2016)

[24]"Google App Indexing Testing" http://bestparttimejob.in/android-studio-adds-google-app-indexing-integration-testing/ (accesat aprilie 2016)

[25]"Debug Preview" https://medium.com/@elifbon/android-application-performance-step-1-rendering-ba820653ad3#.pf5lyf6w3 (accesat mai 2016)

[26]"Fereastra principala Android Studio" https://developer.android.com/studio/images/intro/main-window_2-1_2x.png (accesat mai 2016)

Anexa 1

Functionalitati angajat:

package frames;

import CommApp.ClientFrame;

import CommBase.Log;

import java.awt.BorderLayout;

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.DataInputStream;

import java.io.DataOutputStream;

import java.io.File;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.FileReader;

import java.io.FileWriter;

import java.io.IOException;

import java.io.OutputStreamWriter;

import java.net.Socket;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.ResultSetMetaData;

import java.sql.SQLException;

import java.text.DateFormat;

import java.text.SimpleDateFormat;

import java.util.Calendar;

import java.util.Date;

import java.util.Timer;

import java.util.logging.Level;

import java.util.logging.Logger;

import javax.swing.DefaultListModel;

import javax.swing.JLabel;

import javax.swing.JOptionPane;

import javax.swing.JPanel;

import javax.swing.JTextArea;

import javax.swing.JTextField;

import java.util.TimerTask;

import org.apache.poi.xwpf.usermodel.ParagraphAlignment;

import org.apache.poi.xwpf.usermodel.XWPFDocument;

import org.apache.poi.xwpf.usermodel.XWPFParagraph;

import org.apache.poi.xwpf.usermodel.XWPFRun;

import org.jfree.chart.ChartFactory;

import org.jfree.chart.ChartFrame;

import org.jfree.chart.JFreeChart;

import org.jfree.chart.plot.CategoryPlot;

import org.jfree.chart.plot.PlotOrientation;

import org.jfree.chart.renderer.category.BarRenderer;

import org.jfree.data.category.CategoryDataset;

import org.jfree.data.category.DefaultCategoryDataset;

/**

*

* @author Alin-Florentin

*/

public class AngajatFrame extends javax.swing.JFrame implements Runnable {

/**

* Creates new form AngajatFrame

*/

int IdAngajat;

String numeAngajat;

DataOutputStream dout;

DataInputStream din;

Socket soc;

Thread t = null;

String partener;

int i = 0;

int nrTicheteRezolvate = 0;

String LoginName;

Connection con;

PreparedStatement ps;

ResultSet rs;

ClientFrame cf;

public AngajatFrame(String nume, int id) throws SQLException, IOException {

super(nume);

initComponents();

setVisible(true);

setLocationRelativeTo(null);

setResizable(false);

setDefaultCloseOperation(EXIT_ON_CLOSE);

jLabel1.setText("Nume: " + nume);

IdAngajat = id;

numeAngajat = nume;

Date d = new Date();

DateFormat df = new SimpleDateFormat("dd-MM-yyyy HH-mm-ss");

jLabel2.setText("Ultima autentificare: " + d.toString());

departamentsListModel();

getTickets();

LoginName = numeAngajat.replace(" ", "_");

cf = new ClientFrame("127.0.0.1", 1234, LoginName);

hideFrame();

}

public void hideFrame() {

cf.setVisible(false);

}

public void showFrame() {

cf.setVisible(true);

}

@SuppressWarnings("unchecked")

// <editor-fold defaultstate="collapsed" desc="Generated Code">

private void initComponents() {

jLabel1 = new javax.swing.JLabel();

jLabel2 = new javax.swing.JLabel();

jPanel1 = new javax.swing.JPanel();

jLabel3 = new javax.swing.JLabel();

jButton5 = new javax.swing.JButton();

jPanel2 = new javax.swing.JPanel();

jLabel4 = new javax.swing.JLabel();

jButton1 = new javax.swing.JButton();

jButton2 = new javax.swing.JButton();

jButton3 = new javax.swing.JButton();

jButton7 = new javax.swing.JButton();

jPanel3 = new javax.swing.JPanel();

jLabel6 = new javax.swing.JLabel();

jScrollPane4 = new javax.swing.JScrollPane();

jList4 = new javax.swing.JList<>();

jButton13 = new javax.swing.JButton();

jButton14 = new javax.swing.JButton();

jLabel5 = new javax.swing.JLabel();

jButton6 = new javax.swing.JButton();

jPanel4 = new javax.swing.JPanel();

jButton12 = new javax.swing.JButton();

jLabel9 = new javax.swing.JLabel();

jButton8 = new javax.swing.JButton();

jScrollPane3 = new javax.swing.JScrollPane();

jList3 = new javax.swing.JList<>();

jLabel8 = new javax.swing.JLabel();

jButton10 = new javax.swing.JButton();

jButton11 = new javax.swing.JButton();

jScrollPane2 = new javax.swing.JScrollPane();

jList2 = new javax.swing.JList<>();

setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

jLabel1.setText("Nume:");

jLabel2.setText("Ultima autentificare:");

jPanel1.setBackground(new java.awt.Color(200, 200, 200));

jLabel3.setText("Personal Info:");

jButton5.setText("Statistici");

jButton5.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {

jButton5ActionPerformed(evt);

}

});

javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);

jPanel1.setLayout(jPanel1Layout);

jPanel1Layout.setHorizontalGroup(

jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(jPanel1Layout.createSequentialGroup()

.addContainerGap()

.addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addComponent(jButton5, javax.swing.GroupLayout.DEFAULT_SIZE, 276, Short.MAX_VALUE)

.addGroup(jPanel1Layout.createSequentialGroup()

.addComponent(jLabel3)

.addGap(0, 0, Short.MAX_VALUE)))

.addContainerGap())

);

jPanel1Layout.setVerticalGroup(

jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(jPanel1Layout.createSequentialGroup()

.addContainerGap()

.addComponent(jLabel3)

.addGap(18, 18, 18)

.addComponent(jButton5)

.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))

);

jPanel2.setBackground(new java.awt.Color(200, 200, 200));

jLabel4.setText("Documents:");

jButton1.setText("Concediu medical");

jButton1.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {

jButton1ActionPerformed(evt);

}

});

jButton2.setText("Concediu");

jButton2.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {

jButton2ActionPerformed(evt);

}

});

jButton3.setText("Zi libera");

jButton3.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {

jButton3ActionPerformed(evt);

}

});

jButton7.setText("Date personale");

jButton7.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {

jButton7ActionPerformed(evt);

}

});

javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);

jPanel2.setLayout(jPanel2Layout);

jPanel2Layout.setHorizontalGroup(

jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(jPanel2Layout.createSequentialGroup()

.addContainerGap()

.addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addComponent(jButton1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)

.addComponent(jButton2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)

.addComponent(jButton3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)

.addGroup(jPanel2Layout.createSequentialGroup()

.addComponent(jLabel4)

.addGap(0, 0, Short.MAX_VALUE))

.addComponent(jButton7, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))

.addContainerGap())

);

jPanel2Layout.setVerticalGroup(

jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(jPanel2Layout.createSequentialGroup()

.addContainerGap()

.addComponent(jLabel4)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)

.addComponent(jButton1)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)

.addComponent(jButton2)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)

.addComponent(jButton3)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)

.addComponent(jButton7)

.addContainerGap())

);

jPanel3.setBackground(new java.awt.Color(200, 200, 200));

jLabel6.setText("Departamente:");

jList4.setModel(new javax.swing.AbstractListModel<String>() {

String[] strings = { "Item 1", "Item 2", "Item 3", "Item 4", "Item 5" };

public int getSize() { return strings.length; }

public String getElementAt(int i) { return strings[i]; }

});

jList4.addMouseListener(new java.awt.event.MouseAdapter() {

public void mouseClicked(java.awt.event.MouseEvent evt) {

jList4MouseClicked(evt);

}

});

jScrollPane4.setViewportView(jList4);

jButton13.setText("Trimite ticket");

jButton13.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {

jButton13ActionPerformed(evt);

}

});

jButton14.setText("Trimite mesaj");

jButton14.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {

jButton14ActionPerformed(evt);

}

});

jLabel5.setText("Communication");

javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(jPanel3);

jPanel3.setLayout(jPanel3Layout);

jPanel3Layout.setHorizontalGroup(

jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel3Layout.createSequentialGroup()

.addContainerGap()

.addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)

.addComponent(jButton13, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)

.addComponent(jButton14, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)

.addGroup(javax.swing.GroupLayout.Alignment.LEADING, jPanel3Layout.createSequentialGroup()

.addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)

.addComponent(jScrollPane4, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.PREFERRED_SIZE, 300, javax.swing.GroupLayout.PREFERRED_SIZE)

.addComponent(jLabel5, javax.swing.GroupLayout.Alignment.LEADING)

.addComponent(jLabel6, javax.swing.GroupLayout.Alignment.LEADING))

.addGap(0, 0, Short.MAX_VALUE)))

.addContainerGap())

);

jPanel3Layout.setVerticalGroup(

jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(jPanel3Layout.createSequentialGroup()

.addContainerGap()

.addComponent(jLabel5)

.addGap(18, 18, 18)

.addComponent(jLabel6)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)

.addComponent(jScrollPane4, javax.swing.GroupLayout.PREFERRED_SIZE, 121, javax.swing.GroupLayout.PREFERRED_SIZE)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 22, Short.MAX_VALUE)

.addComponent(jButton13)

.addGap(166, 166, 166)

.addComponent(jButton14)

.addContainerGap())

);

jButton6.setText("Log off");

jButton6.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {

jButton6ActionPerformed(evt);

}

});

jPanel4.setBackground(new java.awt.Color(200, 200, 200));

jButton12.setText("Vizualizare tickete rezolvate");

jButton12.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {

jButton12ActionPerformed(evt);

}

});

jLabel9.setText("Tickete:");

jButton8.setText("Vizualizare tickete in curs de rezolvare");

jButton8.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {

jButton8ActionPerformed(evt);

}

});

jList3.setModel(new javax.swing.AbstractListModel<String>() {

String[] strings = { "Item 1", "Item 2", "Item 3", "Item 4", "Item 5" };

public int getSize() { return strings.length; }

public String getElementAt(int i) { return strings[i]; }

});

jScrollPane3.setViewportView(jList3);

jLabel8.setText("Tickete primite:");

jButton10.setText("In curs de rezolvare");

jButton10.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {

jButton10ActionPerformed(evt);

}

});

jButton11.setText("Rezolvat");

jButton11.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {

jButton11ActionPerformed(evt);

}

});

jList2.setModel(new javax.swing.AbstractListModel<String>() {

String[] strings = { "Item 1", "Item 2", "Item 3", "Item 4", "Item 5" };

public int getSize() { return strings.length; }

public String getElementAt(int i) { return strings[i]; }

});

jScrollPane2.setViewportView(jList2);

javax.swing.GroupLayout jPanel4Layout = new javax.swing.GroupLayout(jPanel4);

jPanel4.setLayout(jPanel4Layout);

jPanel4Layout.setHorizontalGroup(

jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(jPanel4Layout.createSequentialGroup()

.addContainerGap()

.addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addComponent(jButton12, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)

.addComponent(jButton8, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)

.addComponent(jButton10, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)

.addComponent(jButton11, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)

.addGroup(jPanel4Layout.createSequentialGroup()

.addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 266, javax.swing.GroupLayout.PREFERRED_SIZE)

.addComponent(jScrollPane3, javax.swing.GroupLayout.PREFERRED_SIZE, 266, javax.swing.GroupLayout.PREFERRED_SIZE)

.addComponent(jLabel8)

.addComponent(jLabel9))

.addGap(0, 0, Short.MAX_VALUE)))

.addContainerGap())

);

jPanel4Layout.setVerticalGroup(

jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel4Layout.createSequentialGroup()

.addContainerGap()

.addComponent(jLabel8)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)

.addComponent(jScrollPane3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)

.addGap(13, 13, 13)

.addComponent(jButton10)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)

.addComponent(jButton11)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)

.addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 98, javax.swing.GroupLayout.PREFERRED_SIZE)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 11, Short.MAX_VALUE)

.addComponent(jLabel9)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)

.addComponent(jButton12)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)

.addComponent(jButton8)

.addContainerGap())

);

javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());

getContentPane().setLayout(layout);

layout.setHorizontalGroup(

layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(layout.createSequentialGroup()

.addContainerGap()

.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(layout.createSequentialGroup()

.addComponent(jLabel2)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)

.addComponent(jButton6))

.addGroup(layout.createSequentialGroup()

.addComponent(jLabel1)

.addGap(0, 0, Short.MAX_VALUE))

.addGroup(layout.createSequentialGroup()

.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)

.addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)

.addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))

.addGap(18, 18, 18)

.addComponent(jPanel4, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)

.addGap(18, 18, 18)

.addComponent(jPanel3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))

.addContainerGap())

);

layout.setVerticalGroup(

layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(layout.createSequentialGroup()

.addContainerGap()

.addComponent(jLabel1)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)

.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addComponent(jPanel3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)

.addGroup(layout.createSequentialGroup()

.addComponent(jPanel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)

.addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))

.addComponent(jPanel4, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)

.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)

.addComponent(jLabel2)

.addComponent(jButton6))

.addContainerGap())

);

pack();

}// </editor-fold>

public void departamentsListModel() {

DefaultListModel listModel = new DefaultListModel();

String numeDepartament = "";

try {

con = DriverManager.getConnection("jdbc:mysql://localhost:3306/company", "root", "");

ps = con.prepareStatement("SELECT `Nume` FROM `departamente` ");

rs = ps.executeQuery();

while (rs.next()) {

numeDepartament = rs.getString(1);

listModel.addElement(numeDepartament);

}

jList4.setModel(listModel);

} catch (SQLException ex) {

Logger.getLogger(AngajatFrame.class.getName()).log(Level.SEVERE, null, ex);

}

}

public void getTickets() throws SQLException {

DefaultListModel ticketList = new DefaultListModel();

Timer timer = new Timer();

TimerTask minuteTask = new TimerTask() {

@Override

public void run() {

try {

String title = "";

con = DriverManager.getConnection("jdbc:mysql://localhost:3306/company", "root", "");

String query = "Select `Mesaj` from `operatiuni` WHERE `operatiuni`.`departamentulDestinatie`=(SELECT `angajati`.`Departamente_IdDepartament` from `angajati` where `angajati`.`Users_IdAngajat`=" + IdAngajat + ")";

// and starti.Terminat!=0;

ps = con.prepareStatement(query);

rs = ps.executeQuery();

ticketList.removeAllElements();

while (rs.next()) {

title = rs.getString(1);

ticketList.addElement(title);

}

jList3.setModel(ticketList);

} catch (SQLException ex) {

//Log.i("Eroare refresh");

}

}

};

timer.schedule(minuteTask, 0, 5000);

}

private void jButton7ActionPerformed(java.awt.event.ActionEvent evt) {

FileWriter file;

BufferedWriter bw = null;

String personalInfo = "";

try {

con = DriverManager.getConnection("jdbc:mysql://localhost:3306/company", "root", "");

ps = con.prepareStatement("SELECT * FROM `angajati` WHERE `Users_IdAngajat`=?");

ps.setInt(1, IdAngajat);

rs = ps.executeQuery();

ResultSetMetaData rsmd = rs.getMetaData();

while (rs.next()) {

file = new FileWriter("PersonalInfo\\datePersonale" + rs.getInt("Users_IdAngajat") + ".txt");

bw = new BufferedWriter(file);

personalInfo = rsmd.getColumnName(1) + " " + rs.getString(1) + " \r\n" + rsmd.getColumnName(2) + " " + rs.getString(2) + " \r\n" + rsmd.getColumnName(3) + " " + rs.getString(3) + " \r\n" + rsmd.getColumnName(4) + " " + rs.getString(4) + " \r\n" + rsmd.getColumnName(5) + " " + rs.getString(5) + " \r\n" + rsmd.getColumnName(6) + " " + rs.getString(6) + " \r\n" + rsmd.getColumnName(7) + " " + rs.getString(7) + " \r\n" + rsmd.getColumnName(8) + " " + rs.getString(8) + " \r\n" + rsmd.getColumnName(9) + " " + rs.getString(9) + " \r\n" + rsmd.getColumnName(10) + " " + rs.getString(10);

}

bw.write(personalInfo);

bw.close();

} catch (IOException e) {

e.printStackTrace();

} catch (SQLException ex) {

Logger.getLogger(AngajatFrame.class.getName()).log(Level.SEVERE, null, ex);

}

}

private void jButton6ActionPerformed(java.awt.event.ActionEvent evt) { try {

try {

String sender = numeAngajat.replace(" ", "_");

dout.writeUTF(sender + " LOGOUT");

System.exit(1);

} catch (Exception ex) {

}

Date d = new Date();

String logout = d.toString();

DateFormat df = new SimpleDateFormat("dd-MM-yyyy HH-mm-ss");

Date today = Calendar.getInstance().getTime();

String reportDate = df.format(today);

String loginTime = jLabel2.getText();

numeAngajat = numeAngajat.replace(" ", "");

File workTime = new File("WorkingInfo\\WorkTime");

if (!workTime.exists()) {

workTime.mkdir();

}

System.out.println(workTime.getCanonicalPath());

String fileName = reportDate.substring(0, 10);

File file = new File("WorkingInfo\\WorkTime\\" + numeAngajat + ".txt");

FileOutputStream fos = new FileOutputStream(file, true);

BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fos));

int hours = Integer.parseInt(logout.substring(11, 13)) – Integer.parseInt(loginTime.substring(33, 35));

bw.append(String.valueOf(hours) + "#" + String.valueOf(nrTicheteRezolvate) + "\r\n");

bw.close();

System.exit(0);

} catch (FileNotFoundException ex) {

Logger.getLogger(AngajatFrame.class.getName()).log(Level.SEVERE, null, ex);

} catch (IOException ex) {

Logger.getLogger(AngajatFrame.class.getName()).log(Level.SEVERE, null, ex);

}

}

private void jButton14ActionPerformed(java.awt.event.ActionEvent evt) {

cf.setVisible(true);

}

private void jButton13ActionPerformed(java.awt.event.ActionEvent evt) {

String ticket = "";

if (jList4.getSelectedIndex() != -1) {

JPanel panel = new JPanel();

JTextField field = new JTextField(10);

JLabel label1 = new JLabel();

label1.setText("Nume ticket:");

panel.add(label1, BorderLayout.NORTH);

panel.add(field, BorderLayout.NORTH);

JTextArea area = new JTextArea(10, 30);

panel.add(area, BorderLayout.SOUTH);

int value = JOptionPane.showConfirmDialog(rootPane, panel, "Ticket", JOptionPane.OK_CANCEL_OPTION);

if (value == JOptionPane.OK_OPTION) {

// OK was pressed

String message = area.getText();

String title = field.getText();

ticket = title + "_-_" + message;

// handle them

}

try {

con = DriverManager.getConnection("jdbc:mysql://localhost:3306/company", "root", "");

String query = "INSERT INTO `operatiuni`( `Mesaj`, `DepartamentulDestinatie`) VALUES ('" + ticket + "'," + (jList4.getSelectedIndex() + 1) + ")";

ps = con.prepareStatement(query);

ps.executeUpdate();

} catch (SQLException ex) {

Logger.getLogger(AngajatFrame.class.getName()).log(Level.SEVERE, null, ex);

}

} else {

JOptionPane.showMessageDialog(rootPane, "Select department");

}

}

private void jList4MouseClicked(java.awt.event.MouseEvent evt) {

// angajatiListModel();

}

private void jButton11ActionPerformed(java.awt.event.ActionEvent evt) {

if (jList3.getSelectedIndex() != -1) {

int nrTicket = 0;

try {

JOptionPane.showConfirmDialog(rootPane, "Sunteti sigur?", "Confirmare", JOptionPane.YES_NO_OPTION);

con = DriverManager.getConnection("jdbc:mysql://localhost:3306/company", "root", "");

String query1 = "Select `NrTichet` FROM `Operatiuni` WHERE `Mesaj`='" + jList3.getSelectedValue() + "'";

ps = con.prepareStatement(query1);

ResultSet rset = ps.executeQuery();

if (rset.next()) {

nrTicket = rset.getInt(1);

}

String query = "INSERT INTO `stari`( `Operatiuni_NrTIchet`, `InCurs`,`Terminat`) VALUES ('" + nrTicket + "','0','1')";

ps = con.prepareStatement(query);

ps.executeUpdate();

nrTicheteRezolvate++;

} catch (SQLException ex) {

Logger.getLogger(AngajatFrame.class.getName()).log(Level.SEVERE, null, ex);

}

}

}

private void jButton10ActionPerformed(java.awt.event.ActionEvent evt) {

if (jList3.getSelectedIndex() != -1) {

int nrTicket = 0;

try {

con = DriverManager.getConnection("jdbc:mysql://localhost:3306/company", "root", "");

String query1 = "Select `NrTichet` FROM `Operatiuni` WHERE `Mesaj`='" + jList3.getSelectedValue() + "'";

ps = con.prepareStatement(query1);

ResultSet rset = ps.executeQuery();

if (rset.next()) {

nrTicket = rset.getInt(1);

}

String query = "INSERT INTO `stari`( `Operatiuni_NrTIchet`, `InCurs`,`Terminat`) VALUES ('" + nrTicket + "','1','0')";

ps = con.prepareStatement(query);

ps.executeUpdate();

} catch (SQLException ex) {

Logger.getLogger(AngajatFrame.class.getName()).log(Level.SEVERE, null, ex);

}

}

}

private void jButton12ActionPerformed(java.awt.event.ActionEvent evt) {

try {

DefaultListModel ticketModel = new DefaultListModel();

con = DriverManager.getConnection("jdbc:mysql://localhost:3306/company", "root", "");

String query = "SELECT `NrTichet`,`Mesaj` from `operatiuni`,`stari` where `operatiuni_nrtichet`=`nrtichet` and `terminat`=1";

ps = con.prepareStatement(query);

rs = ps.executeQuery();

while (rs.next()) {

String ticket = rs.getString(1) + " " + rs.getString(2);

ticketModel.addElement(ticket);

}

jList2.setModel(ticketModel);

} catch (SQLException ex) {

Logger.getLogger(AngajatFrame.class.getName()).log(Level.SEVERE, null, ex);

}

}

private void jButton5ActionPerformed(java.awt.event.ActionEvent evt) {

try {

final CategoryDataset dataset = createDataset();

JFreeChart chart = ChartFactory.createLineChart("Statistici", "Nr ore lucrate", "Nr tichete rezolvate", (CategoryDataset) dataset, PlotOrientation.VERTICAL, false, true, true);

BarRenderer renderer = null;

CategoryPlot plot = null;

renderer = new BarRenderer();

ChartFrame frame = new ChartFrame("Statistici", chart);

frame.setVisible(true);

frame.setSize(800, 800);

} catch (IOException ex) {

Logger.getLogger(AngajatFrame.class.getName()).log(Level.SEVERE, null, ex);

}

}

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {

String zile = JOptionPane.showInputDialog("Numar zile concediu:");

String perioada = JOptionPane.showInputDialog("Perioada:");

try {

FileOutputStream fos = new FileOutputStream("PersonalInfo\\CerereConcediuMedical_" + numeAngajat + ".docx");

XWPFDocument doc = new XWPFDocument();

XWPFParagraph paragraphTitle = doc.createParagraph();

paragraphTitle.setAlignment(ParagraphAlignment.CENTER);

XWPFRun para_TitleRun = paragraphTitle.createRun();

para_TitleRun.setBold(true);

para_TitleRun.setFontSize(11);

para_TitleRun.setFontFamily("Arial");

para_TitleRun.addBreak();

para_TitleRun.addBreak();

para_TitleRun.addBreak();

para_TitleRun.setText("CERERE CONCEDIU MEDICAL");

//************

String nume = "";

String functie = "";

try {

con = DriverManager.getConnection("jdbc:mysql://localhost:3306/company", "root", "");

ps = con.prepareStatement("SELECT * FROM `angajati` WHERE `Users_IdAngajat`=?");

ps.setInt(1, IdAngajat);

rs = ps.executeQuery();

ResultSetMetaData rsmd = rs.getMetaData();

while (rs.next()) {

nume = rs.getString(4) + " " + rs.getString(5);

functie = rs.getString(9);

}

} catch (SQLException ex) {

Logger.getLogger(AngajatFrame.class.getName()).log(Level.SEVERE, null, ex);

}

//***********

XWPFParagraph paragraphMain = doc.createParagraph();

paragraphMain.setAlignment(ParagraphAlignment.LEFT);

XWPFRun para_MainRun = paragraphMain.createRun();

para_MainRun.setBold(false);

para_MainRun.setFontSize(11);

para_MainRun.setFontFamily("Arial");

para_MainRun.addBreak();

para_MainRun.addBreak();

para_MainRun.setText("Subsemnatul/a, " + nume + ",angajat/a in functia de " + functie + ", va rog sa-mi aprobati efectuarea unui numar de " + zile + " zile de concediu medical in perioada " + perioada + ". ");

Calendar calendar = Calendar.getInstance();

Date d = calendar.getTime();

SimpleDateFormat format1 = new SimpleDateFormat("dd-MM-yyyy");

String date = format1.format(d);

XWPFParagraph paragraphClose = doc.createParagraph();

paragraphClose.setAlignment(ParagraphAlignment.LEFT);

XWPFRun para_CloseRun = paragraphClose.createRun();

para_CloseRun.setBold(false);

para_CloseRun.setFontSize(11);

para_CloseRun.setFontFamily("Arial");

para_CloseRun.addBreak();

para_CloseRun.addBreak();

para_CloseRun.addBreak();

para_CloseRun.addBreak();

para_CloseRun.setText("Data: ");

para_CloseRun.addBreak();

para_CloseRun.setText(date);

XWPFParagraph paragraphSignature = doc.createParagraph();

paragraphSignature.setAlignment(ParagraphAlignment.RIGHT);

XWPFRun para_SignatureRun = paragraphSignature.createRun();

para_SignatureRun.setBold(false);

para_SignatureRun.setFontSize(11);

para_SignatureRun.setFontFamily("Arial");

para_SignatureRun.setText("Semnatura angajat: ");

para_SignatureRun.addBreak();

para_SignatureRun.addBreak();

para_SignatureRun.setText("………… ");

para_SignatureRun.addBreak();

para_SignatureRun.addBreak();

para_SignatureRun.setText("Director: ");

para_SignatureRun.addBreak();

para_SignatureRun.addBreak();

para_SignatureRun.setText("………… ");

doc.write(fos);

fos.close();

JOptionPane.showMessageDialog(rootPane, "Documentul a fost creat cu succes!");

} catch (FileNotFoundException ex) {

JOptionPane.showMessageDialog(rootPane, "Document in uz");

} catch (IOException ex) {

Logger.getLogger(AngajatFrame.class.getName()).log(Level.SEVERE, null, ex);

}

}

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {

String zile = JOptionPane.showInputDialog("Numar zile concediu:");

String perioada = JOptionPane.showInputDialog("Perioada:");

try {

FileOutputStream fos = new FileOutputStream("PersonalInfo\\CerereConcediuFaraPlata_" + numeAngajat + ".docx");

XWPFDocument doc = new XWPFDocument();

XWPFParagraph paragraphTitle = doc.createParagraph();

paragraphTitle.setAlignment(ParagraphAlignment.CENTER);

XWPFRun para_TitleRun = paragraphTitle.createRun();

para_TitleRun.setBold(true);

para_TitleRun.setFontSize(11);

para_TitleRun.setFontFamily("Arial");

para_TitleRun.addBreak();

para_TitleRun.addBreak();

para_TitleRun.addBreak();

para_TitleRun.setText("CERERE CONCEDIU FARA PLATA");

//************

String nume = "";

String functie = "";

try {

con = DriverManager.getConnection("jdbc:mysql://localhost:3306/company", "root", "");

ps = con.prepareStatement("SELECT * FROM `angajati` WHERE `Users_IdAngajat`=?");

ps.setInt(1, IdAngajat);

rs = ps.executeQuery();

ResultSetMetaData rsmd = rs.getMetaData();

while (rs.next()) {

nume = rs.getString(4) + " " + rs.getString(5);

functie = rs.getString(9);

}

} catch (SQLException ex) {

Logger.getLogger(AngajatFrame.class.getName()).log(Level.SEVERE, null, ex);

}

//***********

XWPFParagraph paragraphMain = doc.createParagraph();

paragraphMain.setAlignment(ParagraphAlignment.LEFT);

XWPFRun para_MainRun = paragraphMain.createRun();

para_MainRun.setBold(false);

para_MainRun.setFontSize(11);

para_MainRun.setFontFamily("Arial");

para_MainRun.addBreak();

para_MainRun.addBreak();

para_MainRun.setText("Subsemnatul/a, " + nume + ",angajat/a in functia de " + functie + ", va rog sa-mi aprobati efectuarea unui numar de " + zile + " zile de concediu fara plata in perioada " + perioada + ". ");

Calendar calendar = Calendar.getInstance();

Date d = calendar.getTime();

SimpleDateFormat format1 = new SimpleDateFormat("dd-MM-yyyy");

String date = format1.format(d);

XWPFParagraph paragraphClose = doc.createParagraph();

paragraphClose.setAlignment(ParagraphAlignment.LEFT);

XWPFRun para_CloseRun = paragraphClose.createRun();

para_CloseRun.setBold(false);

para_CloseRun.setFontSize(11);

para_CloseRun.setFontFamily("Arial");

para_CloseRun.addBreak();

para_CloseRun.addBreak();

para_CloseRun.addBreak();

para_CloseRun.addBreak();

para_CloseRun.setText("Data: ");

para_CloseRun.addBreak();

para_CloseRun.setText(date);

XWPFParagraph paragraphSignature = doc.createParagraph();

paragraphSignature.setAlignment(ParagraphAlignment.RIGHT);

XWPFRun para_SignatureRun = paragraphSignature.createRun();

para_SignatureRun.setBold(false);

para_SignatureRun.setFontSize(11);

para_SignatureRun.setFontFamily("Arial");

para_SignatureRun.setText("Semnatura angajat: ");

para_SignatureRun.addBreak();

para_SignatureRun.addBreak();

para_SignatureRun.setText("………… ");

para_SignatureRun.addBreak();

para_SignatureRun.addBreak();

para_SignatureRun.setText("Director: ");

para_SignatureRun.addBreak();

para_SignatureRun.addBreak();

para_SignatureRun.setText("………… ");

doc.write(fos);

fos.close();

JOptionPane.showMessageDialog(rootPane, "Documentul a fost creat cu succes!");

} catch (FileNotFoundException ex) {

JOptionPane.showMessageDialog(rootPane, "Document in uz");

} catch (IOException ex) {

Logger.getLogger(AngajatFrame.class.getName()).log(Level.SEVERE, null, ex);

}

}

private void jButton8ActionPerformed(java.awt.event.ActionEvent evt) {

try {

DefaultListModel ticketModel = new DefaultListModel();

con = DriverManager.getConnection("jdbc:mysql://localhost:3306/company", "root", "");

String query = "SELECT `NrTichet`,`Mesaj` from `operatiuni`,`stari` where `operatiuni_nrtichet`=`nrtichet` and `incurs`=1";

ps = con.prepareStatement(query);

rs = ps.executeQuery();

while (rs.next()) {

String ticket = rs.getString(1) + " " + rs.getString(2);

ticketModel.addElement(ticket);

}

jList2.setModel(ticketModel);

} catch (SQLException ex) {

Logger.getLogger(AngajatFrame.class.getName()).log(Level.SEVERE, null, ex);

}

}

private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {

String data = JOptionPane.showInputDialog("Data:");

try {

FileOutputStream fos = new FileOutputStream("PersonalInfo\\CerereConcediuFaraPlata_" + numeAngajat + ".docx");

XWPFDocument doc = new XWPFDocument();

XWPFParagraph paragraphTitle = doc.createParagraph();

paragraphTitle.setAlignment(ParagraphAlignment.CENTER);

XWPFRun para_TitleRun = paragraphTitle.createRun();

para_TitleRun.setBold(true);

para_TitleRun.setFontSize(11);

para_TitleRun.setFontFamily("Arial");

para_TitleRun.addBreak();

para_TitleRun.addBreak();

para_TitleRun.addBreak();

para_TitleRun.setText("CERERE CONCEDIU FARA PLATA");

//************

String nume = "";

String functie = "";

try {

con = DriverManager.getConnection("jdbc:mysql://localhost:3306/company", "root", "");

ps = con.prepareStatement("SELECT * FROM `angajati` WHERE `Users_IdAngajat`=?");

ps.setInt(1, IdAngajat);

rs = ps.executeQuery();

ResultSetMetaData rsmd = rs.getMetaData();

while (rs.next()) {

nume = rs.getString(4) + " " + rs.getString(5);

functie = rs.getString(9);

}

} catch (SQLException ex) {

Logger.getLogger(AngajatFrame.class.getName()).log(Level.SEVERE, null, ex);

}

//***********

XWPFParagraph paragraphMain = doc.createParagraph();

paragraphMain.setAlignment(ParagraphAlignment.LEFT);

XWPFRun para_MainRun = paragraphMain.createRun();

para_MainRun.setBold(false);

para_MainRun.setFontSize(11);

para_MainRun.setFontFamily("Arial");

para_MainRun.addBreak();

para_MainRun.addBreak();

para_MainRun.setText("Subsemnatul/a, " + nume + ",angajat/a in functia de " + functie + ", va rog sa-mi aprobati efectuarea unei zile de concediu fara plata in data de " + data + ". ");

Calendar calendar = Calendar.getInstance();

Date d = calendar.getTime();

SimpleDateFormat format1 = new SimpleDateFormat("dd-MM-yyyy");

String date = format1.format(d);

XWPFParagraph paragraphClose = doc.createParagraph();

paragraphClose.setAlignment(ParagraphAlignment.LEFT);

XWPFRun para_CloseRun = paragraphClose.createRun();

para_CloseRun.setBold(false);

para_CloseRun.setFontSize(11);

para_CloseRun.setFontFamily("Arial");

para_CloseRun.addBreak();

para_CloseRun.addBreak();

para_CloseRun.addBreak();

para_CloseRun.addBreak();

para_CloseRun.setText("Data: ");

para_CloseRun.addBreak();

para_CloseRun.setText(date);

XWPFParagraph paragraphSignature = doc.createParagraph();

paragraphSignature.setAlignment(ParagraphAlignment.RIGHT);

XWPFRun para_SignatureRun = paragraphSignature.createRun();

para_SignatureRun.setBold(false);

para_SignatureRun.setFontSize(11);

para_SignatureRun.setFontFamily("Arial");

para_SignatureRun.setText("Semnatura angajat: ");

para_SignatureRun.addBreak();

para_SignatureRun.addBreak();

para_SignatureRun.setText("………… ");

para_SignatureRun.addBreak();

para_SignatureRun.addBreak();

para_SignatureRun.setText("Director: ");

para_SignatureRun.addBreak();

para_SignatureRun.addBreak();

para_SignatureRun.setText("………… ");

doc.write(fos);

fos.close();

JOptionPane.showMessageDialog(rootPane, "Documentul a fost creat cu succes!");

} catch (FileNotFoundException ex) {

JOptionPane.showMessageDialog(rootPane, "Document in uz");

} catch (IOException ex) {

Logger.getLogger(AngajatFrame.class.getName()).log(Level.SEVERE, null, ex);

}

}

private CategoryDataset createDataset() throws FileNotFoundException, IOException {

final DefaultCategoryDataset dataset = new DefaultCategoryDataset();

int ore = 0;

int tickete = 0;

String fileName = numeAngajat.replace(" ", "");

BufferedReader br = new BufferedReader(new FileReader("WorkingInfo\\WorkTime\\" + fileName + ".txt"));

StringBuilder sb = new StringBuilder();

String line;

while ((line = br.readLine()) != null) {

int index = line.indexOf("#");

ore = ore + Integer.parseInt(line.substring(0, index));

tickete = tickete + Integer.parseInt(line.substring(index + 1));

dataset.addValue((int) tickete, "", new Integer(ore));

}

br.close();

String everything = sb.toString();

return dataset;

}

// Variables declaration – do not modify

private javax.swing.JButton jButton1;

private javax.swing.JButton jButton10;

private javax.swing.JButton jButton11;

private javax.swing.JButton jButton12;

private javax.swing.JButton jButton13;

private javax.swing.JButton jButton14;

private javax.swing.JButton jButton2;

private javax.swing.JButton jButton3;

private javax.swing.JButton jButton5;

private javax.swing.JButton jButton6;

private javax.swing.JButton jButton7;

private javax.swing.JButton jButton8;

private javax.swing.JLabel jLabel1;

private javax.swing.JLabel jLabel2;

private javax.swing.JLabel jLabel3;

private javax.swing.JLabel jLabel4;

private javax.swing.JLabel jLabel5;

private javax.swing.JLabel jLabel6;

private javax.swing.JLabel jLabel8;

private javax.swing.JLabel jLabel9;

private javax.swing.JList<String> jList2;

private javax.swing.JList<String> jList3;

private javax.swing.JList<String> jList4;

private javax.swing.JPanel jPanel1;

private javax.swing.JPanel jPanel2;

private javax.swing.JPanel jPanel3;

private javax.swing.JPanel jPanel4;

private javax.swing.JScrollPane jScrollPane2;

private javax.swing.JScrollPane jScrollPane3;

private javax.swing.JScrollPane jScrollPane4;

// End of variables declaration

}

Anexa 2

Functionalitati server:

/*

* To change this license header, choose License Headers in Project Properties.

* To change this template file, choose Tools | Templates

* and open the template in the editor.

*/

package frames;

import CommApp.ServerFrame;

import java.io.IOException;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.ResultSetMetaData;

import java.sql.SQLException;

import java.util.logging.Level;

import java.util.logging.Logger;

import javax.swing.DefaultListModel;

import javax.swing.JOptionPane;

import main.Login;

/**

*

* @author Alin-Florentin

*/

public class MainServer extends javax.swing.JFrame {

/**

* Creates new form MainServer

*/

String user;

ServerFrame sf;

public MainServer(String nume, String user) {

super("Server");

this.user = user;

initComponents();

setVisible(true);

setLocationRelativeTo(null);

setResizable(false);

setDefaultCloseOperation(EXIT_ON_CLOSE);

jLabel3.setText(nume);

jTextArea1.setEditable(false);

departamentsListModel();

}

Connection con;

PreparedStatement ps;

/**

* This method is called from within the constructor to initialize the form.

* WARNING: Do NOT modify this code. The content of this method is always

* regenerated by the Form Editor.

*/

@SuppressWarnings("unchecked")

// <editor-fold defaultstate="collapsed" desc="Generated Code">

private void initComponents() {

panel1 = new java.awt.Panel();

jButton5 = new javax.swing.JButton();

jButton6 = new javax.swing.JButton();

jScrollPane1 = new javax.swing.JScrollPane();

jTextArea1 = new javax.swing.JTextArea();

jButton7 = new javax.swing.JButton();

panel2 = new java.awt.Panel();

jButton3 = new javax.swing.JButton();

jButton4 = new javax.swing.JButton();

jLabel1 = new javax.swing.JLabel();

jButton1 = new javax.swing.JButton();

jButton2 = new javax.swing.JButton();

jLabel3 = new javax.swing.JLabel();

jScrollPane2 = new javax.swing.JScrollPane();

jList1 = new javax.swing.JList<>();

jScrollPane3 = new javax.swing.JScrollPane();

jList2 = new javax.swing.JList<>();

jLabel2 = new javax.swing.JLabel();

jLabel4 = new javax.swing.JLabel();

jMenuBar1 = new javax.swing.JMenuBar();

jMenu1 = new javax.swing.JMenu();

jMenuItem1 = new javax.swing.JMenuItem();

setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

jButton5.setText("Start Server");

jButton5.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {

jButton5ActionPerformed(evt);

}

});

jButton6.setText("Stop Server");

jButton6.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {

jButton6ActionPerformed(evt);

}

});

jTextArea1.setColumns(20);

jTextArea1.setRows(5);

jScrollPane1.setViewportView(jTextArea1);

jButton7.setText("Afisare Clienti");

jButton7.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {

jButton7ActionPerformed(evt);

}

});

javax.swing.GroupLayout panel1Layout = new javax.swing.GroupLayout(panel1);

panel1.setLayout(panel1Layout);

panel1Layout.setHorizontalGroup(

panel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(panel1Layout.createSequentialGroup()

.addGap(19, 19, 19)

.addGroup(panel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)

.addComponent(jButton5, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)

.addComponent(jButton6, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)

.addComponent(jButton7, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)

.addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 810, javax.swing.GroupLayout.PREFERRED_SIZE)

.addContainerGap())

);

panel1Layout.setVerticalGroup(

panel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(panel1Layout.createSequentialGroup()

.addContainerGap()

.addGroup(panel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)

.addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 196, javax.swing.GroupLayout.PREFERRED_SIZE)

.addGroup(panel1Layout.createSequentialGroup()

.addComponent(jButton5)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)

.addComponent(jButton7)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)

.addComponent(jButton6)))

.addContainerGap(23, Short.MAX_VALUE))

);

jButton3.setText("Adauga angajat in departament");

jButton3.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {

jButton3ActionPerformed(evt);

}

});

jButton4.setText("Actualizeaza detalii");

jButton4.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {

jButton4ActionPerformed(evt);

}

});

jLabel1.setText("Database");

jButton1.setText("Sterge din baza de date");

jButton2.setText("Adauga user");

jButton2.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {

jButton2ActionPerformed(evt);

}

});

javax.swing.GroupLayout panel2Layout = new javax.swing.GroupLayout(panel2);

panel2.setLayout(panel2Layout);

panel2Layout.setHorizontalGroup(

panel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(panel2Layout.createSequentialGroup()

.addContainerGap()

.addGroup(panel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addComponent(jButton4, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)

.addComponent(jButton3, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)

.addComponent(jButton1, javax.swing.GroupLayout.DEFAULT_SIZE, 465, Short.MAX_VALUE)

.addGroup(panel2Layout.createSequentialGroup()

.addComponent(jLabel1)

.addGap(0, 0, Short.MAX_VALUE))

.addComponent(jButton2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))

.addContainerGap())

);

panel2Layout.setVerticalGroup(

panel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(panel2Layout.createSequentialGroup()

.addComponent(jLabel1)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)

.addComponent(jButton2)

.addGap(9, 9, 9)

.addComponent(jButton3)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)

.addComponent(jButton4)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)

.addComponent(jButton1)

.addContainerGap(59, Short.MAX_VALUE))

);

jLabel3.setText("jLabel3");

jList1.setModel(new javax.swing.AbstractListModel<String>() {

String[] strings = { "Item 1", "Item 2", "Item 3", "Item 4", "Item 5" };

public int getSize() { return strings.length; }

public String getElementAt(int i) { return strings[i]; }

});

jList1.addMouseListener(new java.awt.event.MouseAdapter() {

public void mouseClicked(java.awt.event.MouseEvent evt) {

jList1MouseClicked(evt);

}

});

jScrollPane2.setViewportView(jList1);

jScrollPane3.setViewportView(jList2);

jLabel2.setText("Departament:");

jLabel4.setText("Angajati:");

jMenu1.setText("Options");

jMenuItem1.setText("Open Personal Frame");

jMenuItem1.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {

jMenuItem1ActionPerformed(evt);

}

});

jMenu1.add(jMenuItem1);

jMenuBar1.add(jMenu1);

setJMenuBar(jMenuBar1);

javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());

getContentPane().setLayout(layout);

layout.setHorizontalGroup(

layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(layout.createSequentialGroup()

.addContainerGap()

.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(layout.createSequentialGroup()

.addComponent(panel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)

.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 207, javax.swing.GroupLayout.PREFERRED_SIZE)

.addComponent(jLabel2))

.addGap(18, 18, 18)

.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addComponent(jLabel4)

.addComponent(jScrollPane3, javax.swing.GroupLayout.PREFERRED_SIZE, 209, javax.swing.GroupLayout.PREFERRED_SIZE)))

.addGroup(layout.createSequentialGroup()

.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addComponent(panel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)

.addComponent(jLabel3))

.addGap(0, 0, Short.MAX_VALUE)))

.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))

);

layout.setVerticalGroup(

layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(layout.createSequentialGroup()

.addContainerGap()

.addComponent(jLabel3)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)

.addComponent(panel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)

.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(layout.createSequentialGroup()

.addComponent(panel2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)

.addGap(0, 0, Short.MAX_VALUE))

.addGroup(layout.createSequentialGroup()

.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)

.addComponent(jLabel2)

.addComponent(jLabel4))

.addGap(4, 4, 4)

.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addComponent(jScrollPane3)

.addComponent(jScrollPane2))))

.addContainerGap())

);

pack();

}// </editor-fold>

public void departamentsListModel() {

DefaultListModel listModel = new DefaultListModel();

String numeDepartament = "";

try {

Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/company", "root", "");

PreparedStatement ps = con.prepareStatement("SELECT `Nume` FROM `departamente` ");

ResultSet rs = ps.executeQuery();

while (rs.next()) {

numeDepartament = rs.getString(1);

listModel.addElement(numeDepartament);

}

jList1.setModel(listModel);

} catch (SQLException ex) {

Logger.getLogger(AngajatFrame.class.getName()).log(Level.SEVERE, null, ex);

}

}

public void angajatiListModel() {

DefaultListModel listModel = new DefaultListModel();

String numeAngajat = "";

try {

Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/company", "root", "");

PreparedStatement ps = con.prepareStatement("SELECT `angajati`.`nume`,`angajati`.`prenume` FROM `angajati`,`departamente` WHERE `departamente`.`IdDepartament` =`angajati`.`Departamente_IdDepartament` AND `angajati`.`Departamente_IdDepartament`=?;");

PreparedStatement ps2 = con.prepareStatement("SELECT `angajati`.`Departamente_IdDepartament` from `angajati`");

ResultSet rs;

rs = ps2.executeQuery();

while (rs.next()) {

ps.setInt(1, jList1.getSelectedIndex() + 1);

//ps.setInt(2, rs.getInt(1));

}

ResultSet rs2 = ps.executeQuery();

while (rs2.next()) {

numeAngajat = rs2.getString(1) + " " + rs2.getString(2);

listModel.addElement(numeAngajat);

}

jList2.setModel(listModel);

} catch (SQLException ex) {

Logger.getLogger(AngajatFrame.class.getName()).log(Level.SEVERE, null, ex);

}

}

public int getIdAngajat(String user) {

int idAngajat = 0;

try {

con = DriverManager.getConnection("jdbc:mysql://localhost:3306/company", "root", "");

ps = con.prepareStatement("Select * from Users where `User`=?");

ps.setString(1, user);

ResultSet rs = ps.executeQuery();

if (rs.next()) {

idAngajat = rs.getInt("IdAngajat");

}

} catch (SQLException ex) {

Logger.getLogger(Login.class.getName()).log(Level.SEVERE, null, ex);

}

return idAngajat;

}

public String getNume(String user) {

String numeAngajat = "";

try {

con = DriverManager.getConnection("jdbc:mysql://localhost:3306/company", "root", "");

ps = con.prepareStatement("Select * from Angajati where `Users_User`=?");

ps.setString(1, user);

ResultSet rs = ps.executeQuery();

if (rs.next()) {

numeAngajat = rs.getString("Nume");

numeAngajat = numeAngajat + " " + rs.getString("Prenume");

}

} catch (SQLException ex) {

Logger.getLogger(Login.class.getName()).log(Level.SEVERE, null, ex);

}

return numeAngajat;

}

private void jButton5ActionPerformed(java.awt.event.ActionEvent evt) {

sf = new ServerFrame(1234, 100);

sf.setVisible(false);

jTextArea1.append("Server started");

}

private void jButton6ActionPerformed(java.awt.event.ActionEvent evt) {

jTextArea1.append("Server closed!");

}

private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) {

if (jList2.getSelectedIndex() != -1) {

try {

ResultSet rs;

con = DriverManager.getConnection("jdbc:mysql://localhost:3306/company", "root", "");

String numeA = jList2.getSelectedValue().substring(0, jList2.getSelectedValue().indexOf(" "));

String prenumeA = jList2.getSelectedValue().substring(jList2.getSelectedValue().indexOf(" ") + 1);

String query = "SELECT * FROM `Angajati` WHERE `Departamente_IdDepartament`=" + (jList1.getSelectedIndex() + 1) + " AND `Angajati`.`Nume`='" + numeA + "' AND `Angajati`.`Prenume`='" + prenumeA+"'";

ps = con.prepareStatement(query);

rs = ps.executeQuery();

ResultSetMetaData rsmd = rs.getMetaData();

String[] changes = new String[rsmd.getColumnCount()+1];

if (rs.next()) {

for (int i = 3; i <= rsmd.getColumnCount(); i++) {

changes[i]=JOptionPane.showInputDialog(rsmd.getColumnName(i),rs.getString(i));

}

}

String query2="UPDATE `Angajati` SET `Departamente_IdDepartament`='"+changes[3]+"', `Nume`='"+changes[4]+"', `Prenume`='"+changes[5]+"', `Adresa`='"+changes[6]+"', `DataNasterii`='"+changes[7]+"', `DataAngajarii`='"+changes[8]+"', `Functie`='"+changes[9]+"', `Salariu`='"+changes[10]+"', `Demisionat`='"+changes[11]+"' WHERE `Angajati`.`Nume`='" + numeA + "' AND `Angajati`.`Prenume`='" + prenumeA+"'";

ps = con.prepareStatement(query2);

ps.executeUpdate();

} catch (SQLException ex) {

Logger.getLogger(Login.class.getName()).log(Level.SEVERE, null, ex);

}

} else {

JOptionPane.showMessageDialog(rootPane, "Selecteza angajat!");

}

}

private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {

try {

AngajatFrame af = new AngajatFrame(getNume(user), getIdAngajat(user));

} catch (SQLException ex) {

Logger.getLogger(MainServer.class.getName()).log(Level.SEVERE, null, ex);

} catch (IOException ex) {

Logger.getLogger(MainServer.class.getName()).log(Level.SEVERE, null, ex);

}

}

private void jList1MouseClicked(java.awt.event.MouseEvent evt) {

angajatiListModel();

}

private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {

if (jList1.getSelectedIndex() != -1) {

try {

con = DriverManager.getConnection("jdbc:mysql://localhost:3306/company", "root", "");

String[] values;

String valori = "";

ResultSet rs;

ps = con.prepareStatement("Select * from `Angajati`");

rs = ps.executeQuery();

ResultSetMetaData rsmd = rs.getMetaData();

int tableLen = rsmd.getColumnCount();

values = new String[tableLen];

for (int i = 4; i <= tableLen; i++) {

valori = valori + JOptionPane.showInputDialog(rsmd.getColumnName(i)) + "','";

}

String idFromDatabase = "";

String userFromDatabase = "";

ps = con.prepareStatement("Select `IdAngajat`,`User` from `USERS` ORDER BY `IdAngajat` DESC LIMIT 1 ");

rs = ps.executeQuery();

if (rs.next()) {

idFromDatabase = rs.getString(1);

userFromDatabase = rs.getString(2);

}

String query2 = "INSERT INTO `Angajati` VALUES('" + idFromDatabase + "','" + userFromDatabase + "','" + (jList1.getSelectedIndex() + 1) + "','" + valori.substring(0, valori.length() – 2) + ")";

ps = con.prepareStatement(query2);

ps.executeUpdate();

} catch (SQLException ex) {

Logger.getLogger(Login.class.getName()).log(Level.SEVERE, null, ex);

}

} else {

JOptionPane.showMessageDialog(rootPane, "Selectati departamentul");

}

}

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {

try {

con = DriverManager.getConnection("jdbc:mysql://localhost:3306/company", "root", "");

String user = JOptionPane.showInputDialog("User:");

String pass = JOptionPane.showInputDialog("Pass:");

String query = "INSERT INTO `users`(`User`, `Password`) VALUES ('" + user + "','" + pass + "')";

ps = con.prepareStatement(query);

ps.executeUpdate();

JOptionPane.showMessageDialog(rootPane, "User adaugat!");

} catch (SQLException ex) {

Logger.getLogger(Login.class.getName()).log(Level.SEVERE, null, ex);

}

}

private void jButton7ActionPerformed(java.awt.event.ActionEvent evt) {

sf.setVisible(true);

}

// Variables declaration – do not modify

private javax.swing.JButton jButton1;

private javax.swing.JButton jButton2;

private javax.swing.JButton jButton3;

private javax.swing.JButton jButton4;

private javax.swing.JButton jButton5;

private javax.swing.JButton jButton6;

private javax.swing.JButton jButton7;

private javax.swing.JLabel jLabel1;

private javax.swing.JLabel jLabel2;

private javax.swing.JLabel jLabel3;

private javax.swing.JLabel jLabel4;

private javax.swing.JList<String> jList1;

private javax.swing.JList<String> jList2;

private javax.swing.JMenu jMenu1;

private javax.swing.JMenuBar jMenuBar1;

private javax.swing.JMenuItem jMenuItem1;

private javax.swing.JScrollPane jScrollPane1;

private javax.swing.JScrollPane jScrollPane2;

private javax.swing.JScrollPane jScrollPane3;

private javax.swing.JTextArea jTextArea1;

private java.awt.Panel panel1;

private java.awt.Panel panel2;

// End of variables declaration

}

Anexa 3

Fereastra client comunicare

/*

* To change this license header, choose License Headers in Project Properties.

* To change this template file, choose Tools | Templates

* and open the template in the editor.

*/

package CommApp;

import CommBase.Client;

import CommBase.Log;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import javax.swing.DefaultListModel;

/**

*

* @author Alin-Florentin

*/

public class ClientFrame extends javax.swing.JFrame {

Client client;

Map<Integer, String> clients;

String nume;

DefaultListModel model = new DefaultListModel();

int index = 0;

/**

* Creates new form ClientFrame

*/

public ClientFrame(String server, int port, String name) {

initComponents();

setLocationRelativeTo(null);

clients = new HashMap<Integer, String>();

//updateList();

jLabel1.setText("Nume: " + name);

this.nume = name;

setDefaultCloseOperation(DISPOSE_ON_CLOSE);

client = new Client(server, port) {

@Override

public void onReceived(String message) {

if (isVisible() == false) {

setVisible(true);

}

int pos1 = message.indexOf(":");

int pos2 = message.indexOf(":", pos1 + 1);

int pos3 = message.indexOf(":", pos2 + 1);

int x = 0;

int op = Integer.parseInt(message.substring(0, pos1));

int src = Integer.parseInt(message.substring(pos1 + 1, pos2));

int dst = Integer.parseInt(message.substring(pos2 + 1, pos3));

String msg = message.substring(pos3 + 1);

String clientName = "";

switch (op) {

case 2:

if (!model.contains(msg)) {

//clientName = index + "#" + msg;

model.add(x, msg);

index++;

x++;

}

//clients.put(client.getID(), msg);

Log.i(String.valueOf(clients.size()));

//updateList();

break;

}

if (src == client.getID()) {

jTextAreaCommunication.append("\n");

jTextAreaCommunication.append(">>> " + "*");

} else if (src == 1) {

jTextAreaCommunication.append("\n");

jTextAreaCommunication.append(">>> " + model.getElementAt(0) + ":" + msg);

} else if (src > 1) {

jTextAreaCommunication.append("\n");

jTextAreaCommunication.append(">>> " + model.getElementAt(model.getSize() – src + 1) + ":" + msg);

}

}

};

client.start();

String msg = "0:" + client.getID() + ":0:" + nume;

client.send(msg);

}

private void updateList() {

jList1.setModel(model);

}

/**

* This method is called from within the constructor to initialize the form.

* WARNING: Do NOT modify this code. The content of this method is always

* regenerated by the Form Editor.

*/

@SuppressWarnings("unchecked")

// <editor-fold defaultstate="collapsed" desc="Generated Code">

private void initComponents() {

jScrollPane1 = new javax.swing.JScrollPane();

jTextAreaMessage = new javax.swing.JTextArea();

jButton1 = new javax.swing.JButton();

jLabel1 = new javax.swing.JLabel();

jScrollPane3 = new javax.swing.JScrollPane();

jList1 = new javax.swing.JList<>();

jScrollPane2 = new javax.swing.JScrollPane();

jTextAreaCommunication = new javax.swing.JTextArea();

jButton2 = new javax.swing.JButton();

setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

jTextAreaMessage.setColumns(20);

jTextAreaMessage.setRows(5);

jScrollPane1.setViewportView(jTextAreaMessage);

jButton1.setText("Send");

jButton1.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {

OnSendClick(evt);

}

});

jLabel1.setText("Nume:");

jScrollPane3.setViewportView(jList1);

jTextAreaCommunication.setColumns(20);

jTextAreaCommunication.setRows(5);

jScrollPane2.setViewportView(jTextAreaCommunication);

jButton2.setText("Refresh");

jButton2.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {

jButton2ActionPerformed(evt);

}

});

javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());

getContentPane().setLayout(layout);

layout.setHorizontalGroup(

layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(layout.createSequentialGroup()

.addContainerGap()

.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(layout.createSequentialGroup()

.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addComponent(jScrollPane3, javax.swing.GroupLayout.PREFERRED_SIZE, 121, javax.swing.GroupLayout.PREFERRED_SIZE)

.addComponent(jButton2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)

.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(layout.createSequentialGroup()

.addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 382, javax.swing.GroupLayout.PREFERRED_SIZE)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)

.addComponent(jButton1))

.addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 445, javax.swing.GroupLayout.PREFERRED_SIZE)))

.addGroup(layout.createSequentialGroup()

.addComponent(jLabel1)

.addGap(0, 0, Short.MAX_VALUE)))

.addContainerGap())

);

layout.setVerticalGroup(

layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(layout.createSequentialGroup()

.addContainerGap(21, Short.MAX_VALUE)

.addComponent(jLabel1)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)

.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(layout.createSequentialGroup()

.addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 277, javax.swing.GroupLayout.PREFERRED_SIZE)

.addGap(18, 18, 18)

.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)

.addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 63, javax.swing.GroupLayout.PREFERRED_SIZE)

.addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 63, javax.swing.GroupLayout.PREFERRED_SIZE)))

.addGroup(layout.createSequentialGroup()

.addComponent(jScrollPane3, javax.swing.GroupLayout.PREFERRED_SIZE, 318, javax.swing.GroupLayout.PREFERRED_SIZE)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)

.addComponent(jButton2)))

.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))

);

jButton1.getAccessibleContext().setAccessibleName("jButtonSend");

pack();

}// </editor-fold>

private void OnSendClick(java.awt.event.ActionEvent evt) {

// TODO add your handling code here:

String message = jTextAreaMessage.getText();

jTextAreaMessage.setText("");

if (jList1.getSelectedIndex() == 0) {

message = "1:" + client.getID() + ":" + "1:" + message;

} else {

message = "1:" + client.getID() + ":" + (model.size() – jList1.getSelectedIndex() + 1) + ":" + message;

}

//message = "1:" + client.getID() + ":" + (model.getSize() – (jList1.getSelectedIndex() + 1)) + ":" + message;

client.send(message);

jTextAreaCommunication.append("\n");

jTextAreaCommunication.append(jList1.getSelectedValue()+"<<< "+ message);

}

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {

String message = "2:" + client.getID() + ":0:" + "REQUEST";

client.send(message);

model.clear();

index = 0;

updateList();

}

// Variables declaration – do not modify

private javax.swing.JButton jButton1;

private javax.swing.JButton jButton2;

private javax.swing.JLabel jLabel1;

private javax.swing.JList<String> jList1;

private javax.swing.JScrollPane jScrollPane1;

private javax.swing.JScrollPane jScrollPane2;

private javax.swing.JScrollPane jScrollPane3;

private javax.swing.JTextArea jTextAreaCommunication;

private javax.swing.JTextArea jTextAreaMessage;

// End of variables declaration

}

Anexa 4

Aplicatie android :

package com.example.alin_florentin.siama;

import android.app.Dialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TextView;

import com.example.alin_florentin.siama.comm.Client;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

String user;
String pass;
String serv;
String name;
Client client;

TextView tvStatus;
Button sendButton;
Button refreshButton;
EditText writeMessageBox;
TextView chat;
Spinner spinner;

/**
* Items entered by the user is stored in this ArrayList variable
*/
ArrayList<String> list = new ArrayList<String>();

/**
* Declaring an ArrayAdapter to set items to ListView
*/
ArrayAdapter<String> adapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvStatus = (TextView) findViewById(R.id.main_status);
sendButton = (Button) findViewById(R.id.buttonSend);
writeMessageBox = (EditText) findViewById(R.id.write_message);
chat = (TextView) findViewById(R.id.chat);
spinner = (Spinner) findViewById(R.id.spinner);
adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, list);
}

@Override
protected void onResume() {
super.onResume();
if (client == null) {
do_login();
}
}

void do_login() {
if (user != null) {
new ConnectToServer().execute(serv, "1234", user, pass);
return;
}
// Create Object of Dialog class
final Dialog login = new Dialog(this);
// Set GUI of login screen
login.setContentView(R.layout.control_login);
login.setTitle("Login to SIAMA");

// Init button of login GUI
Button btnLogin = (Button) login.findViewById(R.id.login_ok);
Button btnCancel = (Button) login.findViewById(R.id.login_cancel);
final EditText txtUsername = (EditText) login.findViewById(R.id.login_user);
final EditText txtPassword = (EditText) login.findViewById(R.id.login_pass);
final EditText txtServer = (EditText) login.findViewById(R.id.login_server);

// Attached listener for login GUI button
btnLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String usr = txtUsername.getText().toString().trim();
String psw = txtPassword.getText().toString().trim();
String srv = txtServer.getText().toString().trim();
if (usr.length() > 0
&& psw.length() > 0
&& srv.length() > 0) {

// Validate Your login credential here than display message
//Toast.makeText(MainActivity.this, "Login Sucessfull", Toast.LENGTH_LONG).show();

// Redirect to dashboard / home screen.
new ConnectToServer().execute(srv, "1234", usr, psw);
login.dismiss();
} else {
//Toast.makeText(MainActivity.this, "Please enter Username and Password", Toast.LENGTH_LONG).show();

}
}
});
btnCancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
login.dismiss();
}
});

// Make dialog box visible.
login.show();
}

public void buttonOnClick(View v) {
String msg = String.valueOf(writeMessageBox.getText());
client.send("1:" + client.getID() + ":" + (spinner.getSelectedItemPosition() + 1) + ":" + msg);
writeMessageBox.setText("");
chat.append("\n" +spinner.getSelectedItem()+"<< "+ msg);

}

public void onRefershButtonClick(View v) {
list.clear();
String message = "2:" + client.getID() + ":0:" + "REQUEST";
client.send(message);

}

@Override
protected void finalize() throws Throwable {
super.finalize();
if (client != null) {
client.stop();
}
}

private class ConnectToServer extends AsyncTask<String, Integer, Boolean> {
protected Boolean doInBackground(String… parms) {
runOnUiThread(new Runnable() {
@Override
public void run() {
tvStatus.setText("Connecting …");
}
});

long totalSize = 0;
serv = parms[0];
int port = Integer.parseInt(parms[1]);
user = parms[2];
pass = parms[3];

client = new Client(serv, port) {
@Override
public void onClose() {
client = null;
user = null;
pass = null;
serv = null;
}

@Override
public void onReceived(final String message) {
runOnUiThread(new Runnable() {
@Override
public void run() {
int pos1 = message.indexOf(":");
int pos2 = message.indexOf(":", pos1 + 1);
int pos3 = message.indexOf(":", pos2 + 1);
int x=0;
int op = Integer.parseInt(message.substring(0, pos1));
int src = Integer.parseInt(message.substring(pos1 + 1, pos2));
int dst = Integer.parseInt(message.substring(pos2 + 1, pos3));
String msg = message.substring(pos3 + 1);

switch (op) {
case 0:
tvStatus.setText(msg);
break;
case 1:
chat.append("\n" + ">>"+ spinner.getItemAtPosition(src-1)+":" + msg);
break;
case 2:
if (src == client.getID()) {
msg = "*" + msg;
} else {
if (!list.contains(msg)) {
list.add(x, msg);
x++;
}
spinner.setAdapter(adapter);
}
}

}
});
}

};
if (client.isConnected()) {
client.start();
return true;
}
return false;
}
protected void onProgressUpdate(Integer… progress) {
//nu avem
}
protected void onPostExecute(Boolean connected) {
if (connected) {
runOnUiThread(new Runnable() {
@Override
public void run() {
tvStatus.setText("Connected");
client.send("101:" + client.getID() + ":0:" + user + "#" + pass);
//client.send("102:"+client.getID()+":0:"+pass);
}
});
} else {
runOnUiThread(new Runnable() {
@Override
public void run() {
tvStatus.setText("Not Connected");
}
});
client = null;
}

}

}
}

Similar Posts