Post on 27-Oct-2019
Univerzitet u Novom Sadu
Tehnički fakultet »Mihajlo Pupin«
Zrenjanin
Tehnologije distribucije podataka mobilnih aplikacija
Mobile application data distribution technologies
- Master rad -
Mentor:
Prof. dr Biljana Radulović
Student:
Nemanja Tešić MBI 1/15
Informacione tehnologije u
e-upravi i poslovnim sistemima
Zrenjanin, 2017
Tehnologije distribucije podataka mobilnih aplikacija
_____________________________________________________
_____________________________________________________
[1]
Sadržaj:
1. Opis Problema .......................................................................................................... 2
2. Specifikacija zahteva ............................................................................................... 3
3. Teorijski uvod .......................................................................................................... 4
3.1. Tehnologije distribucije podataka .................................................................. 4
3.1.1. Android Mobile Middleware Objects - AMMO .................................................... 4
3.1.2. Data Distribution Service - DDS ........................................................................... 6
3.2. Model servisa za distribuciju podataka .......................................................... 8
4. Tehnološke osnove .................................................................................................. 9
4.1. Android platforma (Android Studio) ............................................................. 9
4.1.1. Izvorne programske biblioteke ............................................................................ 11
4.1.2. Radno okruženje – Android Runtime .................................................................. 11
4.1.3. Application framework ........................................................................................ 12
4.1.4. Fajl AndroidManifest.xml ................................................................................... 13
4.1.5. Životni ciklus aktivnosti ...................................................................................... 13
4.1.6. Resursi u android aplikacijama ............................................................................ 17
4.2. Python (PyCharm) ........................................................................................ 18
4.3. SQL (Microsoft SQL server) ....................................................................... 19
5. Postojeća rešenja .................................................................................................... 24
6. Model softverskih funkcija .................................................................................... 27
7. Modeli podataka .................................................................................................... 28
8. Opis realizovanog rešenja ...................................................................................... 30
9. Korisničko uputstvo ............................................................................................... 31
10. Opis implementacije .............................................................................................. 38
11. Zaključak ............................................................................................................... 48
11.1. Mogućnosti korišćenja rešenja ..................................................................... 48
11.2. Dalji plan razvoja ......................................................................................... 48
12. Literatura ................................................................................................................ 49
Tehnologije distribucije podataka mobilnih aplikacija
_____________________________________________________
_____________________________________________________
[2]
1. Opis Problema
Potrebno je kreirati Android aplikaciju koja će služiti za evidenciju odsustava
zaposlenih i imenik zaposlenih.
Poslovni problem se sastoji u potrebi da se dokumentuju sva odsustva
zaposlenih, kao i to da zaposleni apliciraju za nova odsustva. Na osnovu tih podataka se
vidi koliko često zaposleni odsustvuje sa posla, koji su razlozi odsustava, kao i ko se od
zaposlenih nalazi na random mestu u određenom trenutnu, a ko je odsutan. Takođe
potrebna je mogućnost uvida u aplicirane godišnje odmore i organizacija godišnjih
odmora.
Druga potreba poslovnog problema jeste imenik u aplikaciji koji sadrži sve
zaposlene sa određenim detaljima kontakta, što bi omogućilo lakše i brže uspostavljanje
komunikacije između zaposlenih, kao i lakše pronalaženje zaposlenog na određenoj
poziciji.
Tehnologije distribucije podataka mobilnih aplikacija
_____________________________________________________
_____________________________________________________
[3]
2. Specifikacija zahteva
Potrebno je kreirati Android aplikaciju koja će služiti kao imenik, sa osnovnim
podacima, kao i dodatnim informacijama o zaposlenima, kako bi bila olakšana
komunikacija i saradnja među zaposlenima. Potrebno je omogućiti direktno pozivanje iz
aplikacije, slanje poruka i mejlova. Takođe, aplikacija treba da pruži zaposlenima
mogućnost da putem android uređaja lako mogu da zatraže odsustva sa posla (godisnji
odmori, bolovanja, slobodni dani...). Direktni nadređeni treba da imaju mogućnost da
odobre/odbiju zatraženo odsustvo, i da se taj odgovor nadređenog notifikuje kod
zaposlenog koji je zatražio odsustvo. Aplikaciju odlikuje tri profila korisnika:
administrator, team lead i zaposleni.
Potrebno je kreirati servis u Python programskom jeziku, koji će vršiti
komunikaciju sa bazom podataka. Prilikom svakog upita servisa ka bazi potrebno je da
se uradi verifikacija sa autentifikacijom na drugoj bazi podataka koja sadrži samo
username i password zaposlenih. Njoj je jedino moguće pristupiti ukoliko kredencijali
postoje u bazi, tacnije ukoliko se kredencijali prilikom autentifikacije poklapaju sa
kredencijalima nekog od zaposlenog u bazi. Aplikacija je moguće da se koristi samo u
online režimu.
Profil zaposleni treba da ima mogucnost uvida u imenik, sa funkcionalnostima
pretrage, pozivanja drugih zaposlenih, slanja poruka i mailova. Takodje, zaposleni
imaju mogućnost da zatraže odsustva sa posla, kao i uvid u svoja do sadašnja odsustva.
Profil team lead treba da ima sve mogućnosti kao i obican zaposleni, sa
proširenom funkcionalnošću za odobravanje/odbijanje zahteva za odsustva. Takođe, ima
mogućnost za pretragom i filtriranjem odsustava zaposlenih koji se nalaze u njegovom
timu, sa prikazanom statistikom o odsustvima za svakog zaposlenog posebno. Filtriranje
je moguće raditi po zaposlenom, datumu ili tipu odsustva, ili kombinacija prethodno
navedenog.
Profil administrator treba da ima mogućnosti kao i team lead, bez mogućnosti da
zatraži nova odsustva, ali ima mogućnost da zatražena odsustva od strane team lead-era
odobri ili odbije. Administrator ima mogućnost filtriranja i pretrage za sve zaposlene u
firmi. Ovaj profil je prvenstveno namenjej direktorima firme, ili pak vlasnicima firmi,
ukoliko žele da imaju uvid u odsustva svojih zaposlenih.
Tehnologije distribucije podataka mobilnih aplikacija
_____________________________________________________
_____________________________________________________
[4]
3. Teorijski uvod
3.1. Tehnologije distribucije podataka
Sa novim naglaskom na dinamičke mobilne aplikacije potreban je efikasan način
distribucije podataka između uređaja i usluga koje im pružaju informacije. Budući da
pametni telefoni imaju ograničen kapacitet baterije i obično rade na mrežama s relativno
niskim propusnim opsegom, takav sistem distribucije podataka bi trebalo fokusirati na
smanjenje potrošnje energije i propusnog opsega. Takođe, korisnici pametnih telefona
očekuju da će im odmah biti dostupne najnovije informacije kada otvaraju aplikaciju,
tako da takav okvir treba omogućiti aplikacijama da primaju potrebne podatke u bilo
koje vrijeme, čak i kada korisnik ne aktivno koristi aplikaciju. Ovaj rad opisuje takav
sistem distribucije podataka, koji se zove AMMO (Android Mobile Middleware
Objects), fokusirajući se specifično na njegovu stranu na strani servera, AMMO
Gateway.
3.1.1. Android Mobile Middleware Objects - AMMO
AMMO u suštini sakriva kompleksnost rada u mobilnim okruženjima,
omogućavajući lakšu interakciju između uređaja i uređaja, integraciju mobilnih računara
i razvoj mobilnih aplikacija. Kao i druge vrste middlevare, mobilni middlevare obično
pruža usluge razmene poruka kako bi omogućila komunikaciju između različitih
aplikacija. AMMO gateway trenutno podržava dva različita tipa komunikacije između
uređaja i gateway-a: komunikacija za objavljivanje-pretplatu i komunikaciju sa
povlačenjem.
Objava i prijava komunikacija primenjuje isti tip modela za objavljivanje /
pretplatu koji se primenjuje u sistemima kao što je DDS (Data Distribution Service). U
ovom modelu, broj klijenata "pretplaćuje se" da primi određenu vrstu podataka za koje
su zainteresovani, na koje se odnosi MIME1 tip. Zatim, kada drugi klijent "objavljuje"
podatke tog MIME tipa, gateway će ga automatski poslati svim klijentima koji su se
pretplatili na taj tip. Ovo je korisno za svaku situaciju u kojoj bi neki uređaji mogli biti
zainteresovani da prima sve podatke određene vrste ili na određenu temu, kao što se
može naći u aplikaciji kao što je chat u realnom vremenu.
U porukama za povlačenje / odazivanje, klijent pravi upit (ili "zahtev za
povlačenje") za određenu vrstu podataka koji odgovara parametrima koje je odredio
klijent. Usluge mogu da se registruju da bi se pokrilo zahtevima pojedinih tipova, a
kada se primi zahtev za povlačenje, zahtev se prosleđuje svim uslugama koje su
registrovane da bi se pokrile sa zahtevima tog tipa. Službe zatim pošalju odgovarajuće
podatke natrag na gateway, što prenosi rezultate natrag klijentu. Poruke za povlačenje /
1 MIME tip je “etiketa” koja se koristi za identifikaciju vrste podataka. Koristi se tako da softver
može znati kako da upravlja sa podacima. Ona služi istoj svrsi na Internetu da ekstenzije datoteka rade na
Microsoft Windows-u.
Tehnologije distribucije podataka mobilnih aplikacija
_____________________________________________________
_____________________________________________________
[5]
odazivanje su korisne kada uređaj treba da prima podatke na zahtev, ali ne zahteva
neprekidna ažuriranja poput objavljivanja / pretplaćivanja poruka.
Oba tipa poruka su dizajnirana da rade asinhrono. Na primer, klijent može
nastaviti da radi druge stvari, kao što je interakcija sa korisnikom ili objavljivanje više
podataka, dok čeka na objavljivanje podataka ili čekanje da se podaci vrate sa zahteva
za povlačenjem. Ovo je važno jer uređaj može imati prolaznu povezanost ili može biti u
ograničenom propusnom opsegu ili okruženju sa visokim latencijama. U ovim
okruženjima, operacije mogu potrajati puno vremena, pa je ključno da uređaji ostaju
upotrebljivi dok AMMO završava operaciju.
AMMO koristi TCP/IP za povezivanje Android uređaja sa gateway-om, kao i za
povezivanje mrežnih priključaka sa jezgrom gateway-a. U gateway -u, ovaj mrežni sloj
se implementira pomoću ACE2 (Adaptive Communication Environment) prihvatača /
konektora i reaktorskog okvira, koji apstrahuje većinu složenosti upravljanja više
klijenata i veza, i obezbeđuje jednostavan interfejs za upravljanje događajima za slanje i
primanje podatke od klijenata. Podaci koji su zapravo transmisani preko mreže su
enkapsulirani unutar Google’s Protocol Buffers3, lagan, višestruki format serijalizacije
podataka.
Google protocol Buffer je izabran za format serijalizacije podataka za AMMO,
jer omogućava jednostavnu i efikasnu serijalizaciju podataka koji ne zavise od
određenog programskog jezika, operativnog sistema ili arhitekture procesora. Ovo je
važno jer AMMO treba da komunicira između servera za gateway koji su kodirani u
C++ i pokreću Linux, kao i klijente koji pokreću Android operativni sistem. Kao i
gateway sistemi, Android je zasnovan na Linux-u, ali je programiran u Java-u i obično
koristi ARM procesore umesto x86 procesore koji se koriste u gateway-u). Buffers
protocol obezbeđuje generator koda i jezičke veze za C++ i Java. To omogućava
protokolu da se navede u jednostavnom tekstualnom formatu koji ne zavisi od jezika;
Protokol Buffers sam vodi računa o serijalizaciji i dezerijalizaciji podataka na osnovu
protokola definisanog od strane programera.
Protokol Buffers takođe čini jednostavniji proces razvoja Gateway-a i Android
usluga. Generator koda protokola preuzima specifikaciju protokola koji ne zavisi od
jezika i generiše biblioteku za konstrukciju poruka i serijalizaciju koja je izvorna prema
ciljnom jeziku (bilo C++ ili Java). Ovaj generator koda takođe omogućava protokole da
se lako prošire: dodavanje novih poruka ili elemenata podataka u protokol je
2 ACE (adaptivno komunikaciono okruženje) je okvir open source koda koji se koristi za mrežno
programiranje. Omogućuje skup objekata C++ klasa dizajniranih da pomognu u rešavanju inherentnih
složenosti i izazova u mrežnom programiranju sprečavajući uobičajene greške
3 Protokolni baferi su Google-ovi jezički neutralni, platformski neutralni, proširivi mehanizmi za
serijalizaciju strukturnih podataka, brži i jednostavniji. Definiše se kako se podaci žele strukturirati, tada
se može koristiti specijalno generisan izvorni kod za jednostavno pisanje i čitanje strukturiranih podataka
u različitim tokovima podataka i koristeći različite jezike
Tehnologije distribucije podataka mobilnih aplikacija
_____________________________________________________
_____________________________________________________
[6]
jednostavno kao dodavanje nekoliko redova specifikaciji protokola. Takođe, Buffers
protokoli su dizajnirani tako da omogućavaju kompatibilnost između starijih verzija
protokola i novijih verzija: obezbeđuje mehanizam pomoću kojeg stariji elementi
protokola mogu biti stabilni, dok se dodani elementi u skorije vreme mogu ignorisati
ako ih nema.
3.1.2. Data Distribution Service - DDS
Primer komunikacionog modela objavljivanja / pretplaćivanja je Grupa za
upravljanje objektima (OMG - Object Management Group), Služba za distribuciju
podataka (DDS - Data Distribution Service). DDS je specifikacija za sisteme
distribucije podataka za objavljivanje / pretplatu i pruža zajednički, nezavisni interfejs
od platforme koji definiše uslugu distribucije podataka. Sama DDS specifikacija pruža
UML model koji specificira interfejs za uslugu distribucije podataka, koja se zatim
može mapirati na više platformi i programskih jezika. Postoji niz implementacija ovog
standarda, uključujući OpenSplice DDS, OpenDDS i RTI DDS.
DDS definiše ono što nazivaju interfejs "Data-Centric Publish-Subscribe", koji
učesnicima u sistemu (izdavačima ili pretplatnicima) obezbeđuje efikasan, otključan
interfejs za čitanje i pisanje podataka. DDS middleware zatim distribuira podatke tako
da svaki pretplatnik može pristupiti trenutnim vrednostima za bilo koji deo podataka.
Da bi programeru dala kontrolu nad ovim procesom distribucije, specifikacija DDS
definiše i set politika kvaliteta usluga servisa. Ove politike mogu biti povezane sa bilo
kojim izdavačem ili pretplatnikom i postaviti ograničenja u procesu distribucije
podataka, kao što je dozvoljena latencija distribucije podataka ili stopa po kojoj se
podaci moraju ažurirati.
Kao DDS, AMMO gateway pruža paradigmu za objavljivanje-pretplatu za
distribuciju podataka. AMMO, međutim, nije implementacija DDS specifikacije.
AMMO koristi mnogo jednostavniji API4 za objavljivanje podataka i pretplatu, kako na
gateway-u tako i na Android uređajima: to omogućava AMMO-u da radi u mobilnim
okruženjima gde je mrežni propusni opseg ograničen i mala potrošnja energije
neophodna. AMMO takođe trenutno ne nudi ekvivalent kvalitetu DDS-ovih uslužnih
politika, iako se planira podrška do krajnjih garancija za usluge u budućem radu.
Mnogi drugi pokušaji su napravljeni da ovu paradigmu objavljivanja
pretplatnika dovedu do mobilnih uređaja. Vredi pomenuti nekoliko od njih da obezbede
kontekst i upoređivanje sa AMMO:
STEAM je sistem za objavljivanje i pretplatu dizajniran specijalno za rad preko
802.11 WIFI ad hoc mreža. Zbog toga, za razliku od AMMO-a, STEAM je
4 Interfejs za programiranje aplikacija (API - application programming interface) je skup
definicija potprograma, protokola i alata za izgradnju aplikativnog softvera. Generalno gledano, to je skup
jasno definisanih metoda komunikacije između različitih softverskih komponenti.
Tehnologije distribucije podataka mobilnih aplikacija
_____________________________________________________
_____________________________________________________
[7]
dizajniran da radi bez gateway-a; Radi kao potpuno distribuirani sistem.
STEAM takođe nudi bogatiji ali komplikovaniji metod filtriranja i distribucije
podataka: umesto filtriranja po temama samim putem AMMO gateway-a,
STEAM filtrira objekte zasnovane na temi, blizini i sadržaju.
Pronto je sistem koji pruža komunikaciju za objavljivanje-pretplatu i
komunikaciju od tačke ka tački, na osnovu standarda Java Messaging Service.
Pronto može da radi u dva načina: centralizovan način gde gateway, poput
AMMO gateway-a, distribuira podatke i decentralizovan mod kada uređaji dele
podatke među sobom. Takođe, pored gateway-a koji se nalaze na udaljenim
serverima, klijenti iz Pronto-a mogu komunicirati sa gateway-ima koji se nalaze
na samim uređajima, pored klijenata. Ovo se razlikuje od trenutne iteracije
AMMO-a, gde se gateway ne može zadržati na uređajima. Pronto takođe daje
veliki naglasak na ono što nazivaju "SmartCaching" u gateway-u. Ovo je
direktno analogno onome što gateway pruža svojim pluginom za skladištenje
podataka, što osigurava da se podaci isporučuju čak i pod intermitentnom
povezivanjem.
Pervaho je takođe sistem za objavljivanje i pretplatu, ali se razlikuje od AMMO-
a i drugih sistema pomenutih fokusiranjem specifično na objavljivanje-subscribe
na osnovu lokacije, gde uređaji primaju podatke vezane za lokacije u kojima su
u fizičkoj blizini. Kao i AMMO, trenutna implementacija Pervaho koristi
centralizovanu mrežu za primanje ažuriranja lokacija i distribuciju podataka,
iako autori navode da su zainteresovani za modifikaciju Pervaho-a za korištenje
decentralizovanog modela.
Ovo su različiti pristupi za objavljivanje-pretplaćivanje komunikacije u
mobilnom okruženju, kao i nekoliko drugih koji se koriste u nekim sistemima, su:
Centralizovan: Centralni broker čuva sve pretplate u sistemu. Ovo je pristup koji
implementira AMMO gateway.
Centralizovan sa funkcijom gašenja: Centralni broker daje svakom izvoru
događaja filter baziran na sindikatu svih aktivnih pretplata, tako da ne šalju
predmete koji se ne podudaraju sa aktivnim pretplatama u centralnom brokeru.
Distribuirano emitovanje: koristi brojne brokere za događaje (umesto
pojedinačne centralizovane), pri čemu svaki broker odgovara za deo svih
pretplata. Izvor događaja se povezuje sa jednim od ovih brokera, koji zatim
emituje događaj svim ostalim brokersima u sistemu.
Distribuirani multicast: Događaji se selektivno prosleđuju između brokera u
zavisnosti od aktivnih pretplata u sistemu.
Replikacija: Pretplata svakog korisnika nadgleda više brokera istovremeno, zbog
čega je manje verovatno da će korisnik propustiti događaje. Ovo otežava
obezbeđivanje da se duplikati ne isporučuju, da događaji stignu u redu i da svi
događaji zapravo primaju svi pretplatnici.
AMMO gateway trenutno implementira centralizovani model: AMMO gateway
je centralizovana tačka u kojoj se moraju poslati sve pretplate i poruke. Međutim,
AMMO proširuje pristup čistog objavljivanja-pretplatu i pruža sredstva pomoću kojih
uređaji mogu eksplicitno tražiti (ili "povući") podatke iz izvora podataka. Takođe, ne
Tehnologije distribucije podataka mobilnih aplikacija
_____________________________________________________
_____________________________________________________
[8]
razmatra pitanje integracije postojećih servisa i izvora podataka: AMMO pruža
framewor za ovo.
3.2. Model servisa za distribuciju podataka
DDS je mrežni interfejs koji pojednostavljuje složeno mrežno programiranje.
Ona implementira obrazac za objavljivanje-pretplatu za slanje i prijem podataka,
događaja i komandi među čvorovima. Čvorovi koji proizvode informacije (publishers)
stvaraju "argumente" (npr. temperatura, lokacija, pritisak) i objavljuju "uzorke". DDS
isporučuje uzorke pretplatnicima koji izjavljuju interesovanje za tu temu.
DDS obrađuje uloge prenosa: adresiranje poruka, marshalling podataka i
demarširanje (tako da pretplatnici mogu biti na različitim platformama od izdavača),
isporuka, kontrola protoka, pokušaji ponavljanja itd. Svaki čvor može biti izdavač,
pretplatnik ili oboje istovremeno.
Model DDS publish-subscribe virtuelno eliminiše složeno mrežno programiranje
za distribuirane aplikacije.
DDS podržava mehanizme koji prevazilaze osnovni model objavljivanja-
pretplate. Ključna prednost je što aplikacije koje koriste DDS za svoje komunikacije su
razdvojene. Potrebno je malo vremena za dizajn da rukuju njihovim međusobnim
interakcijama. Naročito, aplikacijama nikada nisu potrebne informacije o drugim
aplikacijama koje učestvuju, uključujući njihovo postojanje ili lokacije. DDS
transparentno upravlja isporukom poruka bez potrebe za intervencijom od korisničkih
aplikacija, uključujući:
Određivanje ko treba da primi poruke;
Gde se nalaze korisnici;
Šta se dešava ako se poruke ne mogu dostaviti.
DDS omogućava korisniku da specifikuje parametre kvaliteta usluge da unapred
konfiguriše mehanizme otkrivanja i ponašanja. Razmenjivanjem poruka anonimno,
DDS pojednostavljuje distribuirane aplikacije i podstiče modularne, dobro strukturirane
programe. DDS takođe automatski rukuje redovnim izdavačima za hot-swapping5 ako
primarni ne uspe. Pretplatnici uvek dobijaju uzorak sa najvećim prioritetom čiji su
podaci i dalje važeći (tj. čiji period važenja izdavaoca nije istekao). On se automatski
vraća na primarnu kada se oporavi.
5 Hot swapping zamenjuje komponente bez zaustavljanja ili isključivanja sistema. Preciznije, hot
swapping opisuje zamenu komponenti bez prekida u sistemu
Tehnologije distribucije podataka mobilnih aplikacija
_____________________________________________________
_____________________________________________________
[9]
4. Tehnološke osnove
4.1. Android platforma (Android Studio)
Android je mobilni operativni sistem prvobitno razvijen od strane Android
kompanije, koju je kupio Gugl 2005. godine. Nakon kupovine, Gugl je zatražio
stvaranje Open Handset Alliance (OHA) udruženja, koja je sada angažovano u pružanju
podrške i daljem razvoju sistema. Android je zasnovan na izmenjenoj verziji Linux
jezgra. Po broju prodatih pametnih telefona, zasnovanih na Android OS u SAD, u
drugom kvartalu 2010. godine, Android se nalazi na prvom mestu sa udelom od 33
procenata.
Android ima veliku zajednicu programera za pisanje aplikativnih programa koji
proširuju funkcionalnost uređaja. Trenutno postoji preko 450.000 aplikacija dostupnih
za Android, a po nekim procenama i više, što ga čini drugim najpopularnijim mobilnim
razvojnim okruženjem. Programeri pišu kontrolisani kod u Java jeziku, kontrolišući
uređaj preko Gugl razvojne Java biblioteke. Početak Android distribucije najavnjen je 5.
novembra 2007. godine zajedno sa osnivanjem Open Handset Alliance, udruženja 78
kompanija posvećene unapređenju otvorenih standard za mobilne uređaje. Gugl je veći
deo Android koda objavio pod Apache licencom, licencom slobodnog softvera i
licencom otvorenog koda.
Android OS se sastoji od 12 miliona linija koda, uključujući 3 miliona linija
XML koda, 2,8 miliona linija C koda, 2,1 miliona linija Java koda i 1,75 miliona linija
C++ koda. Android predstavlja softverski stek namenjen mobilnim telefonima koji u
sebi uključuje operativni sistem, posrednički softver kao i ključne aplikacije za
normalno funkcionisanje.
Android SDK obezbeđuje alatke i API koji su neophodni za dalji razvoj
aplikacija na Android platformi koristeći JAVA programski jezik. Shodno svojoj
politici OHA ističe sledeće karakteristike Android programskog okruženja:
otvorenost - programeru omogućava potpunu slobodu u razvoju novih i već
postojećih aplikacija, a proizvođaču uređaja slobodno korišćenje i
prilagođavanje platforme bez plaćanja autorskih prava;
sve aplikacije su ravnopravne - što znači da ne postoji razlika između osnovnih
jezgarnih aplikacija uređaja i dodatnih aplikacija. Svim aplikacijama omogućen
je ravnopravni pristup resursima pokretnog uređaja što daje mogućnost
prilagođavanja uređaja specifičnim potrebama individualnog korisnika;
automatsko upravljanje životnim ciklusom aplikacije - omogućava nadzor
pokretanja i izvršavanja aplikacija na sistemskom nivou optimizovanim
korišćenjem memorije i snage uređaja. Krajnji korisnik više ne brine o gašenju
određenih aplikacija pre pokretanja drugih;
uklanjanje granica "klasičnih" aplikacija - mogućnost razvoja novih i
inovativnih aplikacija zasnovanih na međusobnoj kolaboraciji tehnologija;
brz i jednostavan razvoj aplikacija - omogućen je bogatom bazom korisnih
programskih biblioteka (eng. libraries) i alata za izradu aplikacija;
Tehnologije distribucije podataka mobilnih aplikacija
_____________________________________________________
_____________________________________________________
[10]
visokokvalitetni grafički prikaz i zvuk - podržana 2D vektorska i 3D OpenGL
(engl. Open Graphics Librari) grafika, te ugrađeni kodeci svih često korišćenih
audio i video formata;
kompati ilnost sa većinom sadašnjeg i udućeg hardvera - uključuje prenosivost
Androidovih aplikacija na ARM, k86 i ostale arhitekture, te prilagodljivost
sistema ulaznim i izlaznim komponentama.
Arhitektura Android sistema bazira se na Linux-u 2,6 jezgru (eng. kernel) koja
se koristi kao sloj apstrakcije hardvera (HAL, eng. Hardvare Abstraction Laier). Razlog
za korišćenje jezgra operativnog sistema Linux je dokazana pogonska podrška (eng.
driver model), mogućnost upravljanja memorijom i procesima, sigurnosni model,
mrežni sistem, te dokazana robusnost, konstantni razvoj i unapređivanje sistema. Slika
1.1 prikazuje arhitekturu Android sistema.
Slika 1. Arhitektura Android platform
Tehnologije distribucije podataka mobilnih aplikacija
_____________________________________________________
_____________________________________________________
[11]
4.1.1. Izvorne programske biblioteke
Izvorne programske biblioteke (eng. native libraries) pisane su u programskim
jezicima C i C++ i čine sledeći sloj u arhitekturi sistema. Neke od značajnijih su:
UI - program za upravljanje grafičkim interfejsom (eng. Surface Manager) -
biblioteka odgovorna za pravilno iscrtavanje različitih aplikacionih komponenti
u vremenu i prostoru;
OpenGL ES (eng. OpenGL for Embedded Sistems) - biblioteke koje se koriste
za hardversku 3D akceleraciju (ukoliko je podržana) ili za 3D rasterizaciju;
SGL (eng. Scalable Graphics Librari) - predstavlja 2D biblioteke na kojima je
zasnovana većina aplikacija. Spomenimo još da se 2D i 3D elementi mogu
kombinovano prikazivati u jednom korisničkom interfejsu;
Media Framevork - grupa kodeka za snimanje i reprodukciju audio formata,
video formata i nepomičnih slika. Omogućena je od strane PacketVidea;
FreeType - biblioteka koja služi za vektorsku rasterizaciju oblika pisma (eng.
font);
SSL (eng. Secure Socket Laier) - omogućava rezervnu komunikaciju preko
Interneta;
SQLite - programska biblioteka koja implementira bazu podataka (eng. database
engine);
WebKit - Jezgro pretraživača koji podržava JavaScript i ostale standarde na
malom uređaju;
System C library - implementacija standardne C-ove sistemske biblioteke (libc)
izvedene iz operativnog sistema BSD.
4.1.2. Radno okruženje – Android Runtime
Idući sloj u arhitekturi Androida je radno okruženje (eng. Android runtime)
kojeg čine virtuelni mašina Dalvik (DVM, eng. Dalvik Virtual Machine) i jezgrene
biblioteke (eng. core librari).
DVM je registarski bazirana virtuelna mašina, dok je klasična Javina virtuelna
mašina (JVM, eng. Java Virtual Machine) baziran na steku. Bazne biblioteke pisane su
u programskom Jeziku Java i predstavljaju sve esencijalne klase kao što su klase za
manipulaciju kolekcijama, klase za komunikaciju sa okolinom i slično. Bitna novost je i
to što se Androidom jezgrene biblioteke razlikuju od biblioteka u Java Standard Edition
(J2SE) i Java 2 Micro Edition (J2ME).
Umesto upotrebe standardnog Java 2 Micro Edition (J2ME) kao mehanizma za
pokretanjejavinih aplikacija na mobilnim uređajima, Google je razvio sopstvenu
virtuelnu mašinu za Android. DVM je najverovatnije razvijen kako bi se zaobišla
problematika s dozvolama oko korišćenja Sunovog J2ME. Svaki mobilni uređaj koji u
sebi sadrži J2ME mora kod Suna licencirati bilo kakvu promenu izvornog koda J2ME-a.
Virtuelna mašina Dalvik dobila je ime po istoimenom Islandskom gradu u kojem
su živeli preci glavnog developera DVM-a Dan Bornstein. Osnovna razlika između Sun
Tehnologije distribucije podataka mobilnih aplikacija
_____________________________________________________
_____________________________________________________
[12]
Java virtuelnih mašina i DVM-a je u tome što su prvo spomenuti virtualni uredjaju
bazirani na steku, dok je DVM registarski baziran virtuelni mašina.
Međukod (eng. bytecode) Dalvik virtuelne mašine transformiše se pomoću alata
dk (koji je sastavni deo Android SDK-a) iz Javinih klasnih datoteka (eng. Java class
file) prevedenih Javinim revodiocem u novu klasu *.dex (eng. Dalvik Ekecutable)
formata. Međukod koji izvršava DVM nije Javin međukod, nego upravo spomenuti .dex
oblik. Transformacija formata omogućava bolju prilagođenost za rad na manjim
procesorima boljim iskorišćavanjem raspoložive memorije i procesorske snage. Rezultat
svega je mogućnost višestrukog instanciranja same virtuelne mašine što znači da se
svaka Android aplikacija pokreće kao zasebni proces, s vlastitom instancom virtuelne
mašine Dalvik
4.1.3. Application framework
Sloj aplikativnih okvira (eng. Application Framevork) napisan je u
programskom jeziku Java i sadrži proširiv skup programskih komponenti kojeg koriste
sve aplikacije uređaja. Framework podržava mnogobrojne open source jezike kao što su
openssl, sqlite i libc. Takođe podržava i jezik Android jezgra. Sa gledišta sigurnosti,
framework se bazira na UNIX file system ovlašćenjima koja osiguravaju da aplikacije
poseduju samo one mogućnosti koje im je vlasnik telefona dao pri instalaciji aplikacije.
Neki od važnijih elemenata su:
upravljanje aktivnostima (eng. Activiti Manager) - upravljanje životnim
ciklusom aplikacije,
upravljanje programskim paketima (eng. Package Manager) - sadrži informaciju
o aplikacijama instaliranim na sistemu
upravljanje prozorima (eng. Window Manager) - upravljanje aplikacionim
prozorima,
upravljanje pozivima (eng. Telephone Manager) - sadrži API-je koji se koriste
pri izradi aplikacija za upravljanje pozivima,
pružaoci sadržaja (eng. Content Providers) - omogućavaju zajedničko korišćenje
podataka od strane više aplikacija,
upravljanje resursima (eng. Resource Manager) - služi za skladištenje delova
aplikacije koji nisu kod (npr. slike),
sistem grafičkog prikaza (eng. Viev Sistem) - sadrži bazu gotovih grafičkih
prikaza i alata (eng. vidget),
upravljanje lokacijski zasnovanim uslugama (eng. Location Manager) i
upravljanje notifikacijama (eng. Notification Manager) - upravljanje
notifikacijama i događajima (npr. dospeće poruke, nadolazeći sastanak).
Aplikativni sloj je poslednji sloj u arhitekturi sistema Android i čine ga
korisničke aplikacije uređaja. Predstavlja sloj vidljiv krajnjem korisniku. UključuJe
neke od standardnih sistemskih aplikaciJa kao što su Veb pretraživač, lista kontakata,
telefon, itd.
Tehnologije distribucije podataka mobilnih aplikacija
_____________________________________________________
_____________________________________________________
[13]
4.1.4. Fajl AndroidManifest.xml
Svaka aplikacija mora da poseduje svoj AndroidManifest.xml fajl u korenom
folderu projekta. Naziv manifest fajla mora da bude AndroidManifest.xml. Manifest
sadrži neophodne informacije o aplikaciji i o Android sistemu. Ove informacije sistem
mora da poseduje pre početka izvršavanja aplikacije.
Neke od funkcija manifest fajla su:
Sadrži naziv Java paketa u okviru kojeg je napisan izvorni kod aplikacije. Naziv
paketa predstavlja jedinstveni identifikator aplikacije.
Opisuje komponente aplikacije – aktivnosti, servise, primaoce poruka i
provajdere sadržaja. Dakle, manifest fajl sadrži nazive klasa u kojima su opisane
komponente aplikacije. Na primer, aplikacija se neće startovati ukoliko u
manifest fajlu nije navedena njena početna aktivnost, čak ni u slučaju da fajl sa
Java izvornim kodom te aktivnosti postoji.
Određuje koji procesi će biti domaćini komponentama aplikacije.
Definiše koje privilegije (permissions) aplikacija mora da poseduje da bi mogla
nesmetano da funkcioniše.
Takođe definiše koje privilegije moraju druge aplikacije da poseduju da bi
mogle da koriste komponente aplikacije.
Definiše minimalnu verziju Android API-a koji zahteva aplikacija.
Definiše listu biblioteka koje aplikacija koristi
4.1.5. Životni ciklus aktivnosti
Aktivnost (Activity)predstavlja komponentu aplikacije koja se uglavnom može
poistovetiti s jednim konkretnim prozorom aplikacije u kojem je korisnik u mogućnosti
da izvrši određenu radnju. Na primer, aktivnost služi da bi korisniku mobilnog telefona
omogućila pozivanje određenog broja, slikanje fotografije korišćenjem ugrađene
kamere, slanje e-mail poruke, pregled mape i dr. Aplikacija može da sadrži jednu ili
više definisanih aktivnosti, pri čemu je jedna od aktivnosti uvek definisana kao
primarna aktivnost. Prelaz između aktivnosti odvija se tako što aktuelna aktivnost
poziva novu. Iako više aktivnosti čini jedan kompaktan korisnički interfejs, treba imati
na umu da su one međusobno nezavisne. Svaka aktivnost implementira se kao zasebna
klasa koja nasleđuje klasu Activity, pa je sama odgovorna za čuvanje svog stanja u
životnom ciklusu aplikacije.
Klasa aktivnosti je glavni deo svake Android aplikacije. Programer veći deo
vremena provodi na definisanju i implementaciji aktivnosti za svaki ekran u aplikaciji.
Svakoj Android aplikaciji mora biti dodeljena aktivnost unutar Android manifest
fajla. Druge klase aktivnosti mogu biti označene u manifest fajlu da se pokrenu pri
određenim okolnostima. Ovim sekundarnim ulaznim tačkama se upravlja pomoću
Android manifest fajla sa određenim filterima.
Tehnologije distribucije podataka mobilnih aplikacija
_____________________________________________________
_____________________________________________________
[14]
Aplikacije mogu biti prekinute zbog raznih događaja višeg prioriteta, kao što je
telefonski poziv. U jednom trenutku može postojati samo jedna aktivna aplikacija.
Android aplikacije su odgovorne za upravljanje njihovim stanjem, kao i njihovom
memorijom, resursima i podacima. Android operativni sistem može isključiti aktivnost
koja je na pauzi, stopirana ili uništena kada je memorija slaba. Ovo znači da svaka
aktivnost koja nije u prvom planu mora biti isključena. Drugim rečima, Android
aplikacija mora održavati stanje i biti spremna da bude prekinuta ili čak isključena u
svakom trenutku.
Životnim ciklusom aktivnosti jedne Android aplikacije upravlja se
implementacijom odgovarajućih metoda. Svaka aktivnost ima tri osnovna stanja:
Resumed (Running) - Aktivnost je pokrenuta i fokusirana.
Paused - Druga aktivnost je pokrenuta i fokusirana (u prvom planu), ali je tekuća
aktivnost i dalje pokrenuta i vidljiva. Na primer, druga aktivnost je u prvom
planu, dok je tekuća aktivnost vidljiva, ali ne zauzima ceo ekran. Aktivnost čije
je stanje paused je potpuno aktivna (objekat klase Activity se nalazi u memoriji,
zadržava sva stanja i ostaje u window manager-u), međutim ova aktivnost može
da bude dispozovana u slučaju niske slobodne memorije.
Stopped - Aktivnost čije je stanje stopped je i dalje aktivna, radi u pozadini.
Objekat klase Activity i dalje se nalazi u memoriji, čuva sva stanja, ali se više ne
nalazi u okviru window manager-a. Ovu aktivnost više ne vidi korisnik i u
slučaju potrebe za memorijom sistem može da je zaustavi.
Životni ciklus aktivnosti započinje metodom onCreate(), a završava se zajedno
sa metodom onDestroy(). U okviru metode onCreate(), programer bi trebalo da definiše
izgled i globalno stanje aktivnosti, kao što je raspored elemenata korisničkog interfejsa.
Implementacijom metode onDestroy() trebalo bi osloboditi korišćene resurse. Na
primer, ukoliko vaša aktivnost koristi pozadinsku nit koja preuzima podatke sa
Interneta, nit bi trebalo kreirati u okviru metode onCreate(), a zaustaviti je u okviru
metode onDestroy().
Aktivnost je vidljiva (visible) između poziva metoda onStart() i onStop(). Dok je
aktivnost vidljiva, korisnik je vidi na ekranu i može da vrši interakciju sa njom (npr. da
unosi podatke). Metoda onStop() se poziva kada se startuje nova aktivnost, a tekuća
aktivnost više nije vidljiva.
Aktivnost je fokusirana (u prvom planu) između poziva metoda onResume() i
onPause(). Tada se ta aktivnost nalazi ispred svih ostalih aktivnosti. Aktivnost može
često da prelazi iz prvog plana u pozadinu i obrnuto. Na primer, metoda onPause() se
poziva kada uređaj pređe u stanje mirovanja (sleep).
Tehnologije distribucije podataka mobilnih aplikacija
_____________________________________________________
_____________________________________________________
[15]
Slika 2. Životni ciklus aktivnosti
U sledećoj tabeli su prikazane fundamentalne metode za upravljanje životnim
ciklusom i njihov opis.
Tehnologije distribucije podataka mobilnih aplikacija
_____________________________________________________
_____________________________________________________
[16]
Tabela 1. Metoda za upravljanje životnim ciklusom aktivnosti
Kolona „Može da se stopira posle?“ označava da li sistem sme da zaustavi
proces koji omogućava pokretanje aktivnosti bilo kada nakon završetka izvršavanja date
metode.
Tehnologije distribucije podataka mobilnih aplikacija
_____________________________________________________
_____________________________________________________
[17]
4.1.6. Resursi u android aplikacijama
Sve android aplikacije sastoje se od dve stvari:
funkcionalnost – predstavlja kod kako se aplikacija ponaša na neki zahtev. Ovde
spadaju svi algoritmi koji pokreću aplikaciju
resursi ili podaci – obuhvataju tekstove, slike, audio i video fajlove, datoteke,
ikone i druge podatke koje koristi aplikacija.
Resursi obuhvataju tekst u obliku stringa, slike i ikone, audio datoteke, video
zapise i drugepodatke koje koristi aplikacija. Resursi se dele na dva tipa: resurse
aplikacije i resurse sistema. Resurse aplikacije definiše developer unutar fajlova
Android projekta i tačno su određeni za neku aplikaciju. Resursi sistema su standardni
resursi koje definiše Android platforma i dostupni su svim aplikacijama kroz Android
SDK.
Resursi aplikacije se prave i čuvaju unutar Android projekta u /res
direktorijumu. Koristeći već definisanu ali fleksibilnu strukturu direktorijuma, resursi su
organizovani, definisani i upakovani sa paketom aplikacije. Resursi aplikacije se ne dele
sa ostatkom Anroid sistema. Svi resursi aplikacije se čuvaju u strukturi direktorijuma
/res i sastavljeni su u projekat u trenutku pravljenja aplikacije. Resursi aplikacije se
mogu koristiti programerski. Takođe na njih se mogu odnositi resursi drugih resursa
aplikacija.
Svaki put kad se sačuva fajl sa resursima u Eclipsu, R.java klasa fajl se ponovo
sastavlja kako bi se ubacile nove izmene. Ako nije korišćen pravi direktorijum ili
pravila o nazivu fajla, pojaviće se greška u kompajleru u prozoru Eclipse Problems.
Resursima aplikacije se može pristupiti programerski koristeći generisu klasu koja se
zove R.java. Kako bi se dodala referenca na resurs, mora se doći do objekta resursa
aplikacije koristeći klasu getResources() i tako napraviti odgovarajući poziv na
komandu, koji je zasnovan na tipu resursa koji želi da se doda.
Developeri mogu da pristupe resursima Android sistema (kao dodatak resursima
aplikacije). Mogu se deliti mnogi resursi sistema kroz više aplikacija zbog običnog
izgleda i osećaja.Na primer, klasa resursa Android sistema (android.R.string) sadrži
stringove za reči kao što su OK, Cancel, Yes, No, Cut, Copy i Paste.
Sistemski resursi se čuvaju u android paketu. Postoje klase za svaki od većih
tipova resursa. Na primer, klasa android.R.string sadrži string sistemskog resursa. Kako
bi se dobio string sistemskog resursa za OK prvo se mora koristiti statičkia komanda
klase Resursa getSystem() kako bi se doveo globalni sistemski objekat Resource. Onda
se poziva komanda getString() sa odgovarajućim string imenom resursa.
Tehnologije distribucije podataka mobilnih aplikacija
_____________________________________________________
_____________________________________________________
[18]
4.2. Python (PyCharm)
Python je platformski nezavisan objektno orijentisan, interpreterski i interaktivni
programski jezik. Nastao je 1990. a njegov razvoj je započeo Guido van Rossum.
Spada u grupu softvera otvorenog koda, sa dobrom podrškom, dokumentacijom i
pratećim bibliotekama.
Python je jedan od retkih jezika koji su nastali u akademskim uslovima, a
postigli su komercijalni uspeh. Dugo je važlo da akademske ustanove prave čiste jezike,
sa novinama i jakom filozofskom pozadinom, ali da takve jezike retko ko koristi van
samih univerziteta. Primer za to su: Pascal, Simula, Algol, Haskell, Modula itd. S druge
strane, prljavi, brzi, sa gledišta nauke slabi jezici za koje je zajedničko da imaju
pragmatičan pristup, jezici pravljeni od hakera za hakere, su bivali prihvaćenii među
profesionalcima. Tako je bilo jezicima: C, C++, Perl, PHP, Java itd. Python je
jedinstven spoj čistog jezika, jasno zamišjenog, dobro projektovanog i
implemenitranog, lakog za upotrebu, a opet dovoljno moćnog i brzog da bi bio
prihvaćen među programerima. Python nalazi primenu u biološkim naukama, npr. za
analizu gena, u matematičkim naukama za simulacije, za optimizaciju, kao
kompjuterski algebarski sistem, alat za numeričku analizu, veštačku inteligenciju, itd.
Python je odličan "lepak jezik", jezik kojim se povezuju postojeći programi, pa
im se preko Python-a daje zajednički interfejs. Često koristi kao script mašina u raznim
programima: Maya i Blender za 3D animacije, Gimp, Inkscape za grafiku, Civilization
IV za kontrolu igre itd.
Ipak Python pokazuje pravu snagu u projektima koji su u potpunosti zasnovani
na njemu. BitTorrent klijent je izvorno napisan u njemu. Prvi web robot za Google je
pisan u Pythonu, a ta kompanija i dalje koristi mnogo njegovog koda. Tako je i Guido
van Rossum već nekoliko godina zaposlen u toj kompaniji. Youtube je zasnovan na
Pythonu, a koristi ga i NASA. Installer za Red Hat Linux je napisan u Pythonu .
Trenutno aktuelna verzija je 3.0, ali je u velikoj primeni i prethodna verzija 2.6.
Ime jezika potiče od britanske televizijske komedije Monty Python's Flying Circus,
čime je van Rossum želeo da naglasi svoj osnovni cilj pri pravljenju novog jezika, da
programiranje postane zabavno kao i pomenuta serija.
Poput Jave i Ruby-ja, ukoliko se ne koriste neke platformske specifičnosti, isti
programski kod može se interpretirati jednako pod Linuxom, Windowsom, ili MACom.
Python ima bogate biblioteke:
matematički proračuni
crtanje graka funkcija
obrada Telekomunikacionih signala
simulacija
upravljanje laboratorijskim instrumentima
Tehnologije distribucije podataka mobilnih aplikacija
_____________________________________________________
_____________________________________________________
[19]
programiranje mrežnih aplikacija (Google, Youtube)
Glavna implementacija Python-a napisana je u jeziku C i zove se CPython.
Pored ove, postoji implemetacija i u Javi Jython. Ona omogućava kompilaciju koda u
Java bajtkod i upotrebu Java klasa unutar Python modula (fajlova koji sadrži Python
programski kod). Implementacija Python web framework-a pod imenom Pylons
omogućava visoku funkcionalnost Python-a do nivoa Jave.
Implementacija pod imenom IronPython projekat je Microsoft-a za .NET
okruženje. Možda najinteresantnija implementacija Python-a je u samom Python-u, tzv.
Py Py gde je interpreter pisan u Python-u. Ova implementacija je znatno sporija od
CPython -a, a prednost joj je u mogućnosti izmene ponašanja interpretera u toku
izvršenja programa.
Za programski jezik Pajton razvijen je veliki broj standardnih modula koji
omogućavaju efikasan rad u mnogim oblastima. Većina ovih modula prenosiva je na
različite platforme što omogućava da često kompletni programi bez prilagođavanja rade
na različitim mašinama i pod različitim operativnim sistemima.
Standardna biblioteka modula omogućava pisanje programa vezanih za Internet
podržavajući veliki broj standardnih formata i protokola. Postoje moduli za kreiranje
grafičkog korisničkog interfejsa, vezu ka relacionim bazama podataka, za aritmetiku sa
proizvoljnim željenim brojem decimala, za rad na leksičkoj analizi primenom regularnih
izraza, kao i standardni moduli za mnoge druge poslove.
Ukoliko je potrebno razviti novi modul, to je moguće izvesti u Pajtonu ili u
nekom drugom podržanom jeziku. Obično je to C jezik, kada je potrebno sistemsko
programiranje ili kada je brzina izvršavanja kritična. Primeri drugih programskih jezika,
koji se koriste u ove svrhe, su Java ili Pyrex jezik koji predstavlja mešavinu
programskog jezika Pajton i C jezika.
Pajton je dizajniran da bude veoma čitljiv jezik. Ima relativno neopterećen
vizuelni dezen i često koristi engleske reči tamo gde drugi jezici koriste znakove
interpunkcije. Pajton cilja ka jednostavnosti i opštost u dezenu njegovih sintaksi,
osvrćujući se na "Treba biti jedan - i samo jedan - očigledan način da se to uradi", iz
"Zen Pajtona".
4.3. SQL (Microsoft SQL server)
SQL (Structured Query Language) je standardni relacioni upitni jezik (ANSI i
ISO standard). Njegov tvorac je Čemberlin (Chamberlin), a nastao je u IBM-ovoj
istraživačkoj Iaboratoriji (IBM Research Laboratory) u San Hoseu, Kalifornija 1974.
godine, dakle na istom mestu gde je Kod 1970. definisao osnovne koncepte relacionog
modela podataka.
Tehnologije distribucije podataka mobilnih aplikacija
_____________________________________________________
_____________________________________________________
[20]
Jezik se u početku zvao SEQUEL (Structured English Query Language) i
predstavljao je programski interfejs (API) za System R, prototipski sistem za
upravljanje bazom podataka (SU8P) koji se razvijao kao deo istraživačkog projekta pod
istim nazivom. Krajem sedamdesetih i početkom osamdesetih godina prošlog veka
javljaju se i prve komercijalne verzije relacionih sistema, sa SQL-om kao upitnim
jezikom. Među njima su najznačajniji Oracle i dva IBM-ova proizvoda: SQL/DS i DB2.
Pojava komercijalnih relacionih sistema uvećala je značaj i ubrzala proces
standardizacije relacionog upitnog jezika. Prva etapa tog procesa završila se 1986.
godine usvajanjem SQL-a kao standardnog relacionog upitnog jezika. Ta prva verzija
SQL standarda poznata je pod nazivom SQL-86. Njom su standardizovane osnovne
karakteristike SQL-a kao deklarativnog relacionog upitnog jezika.
Međutim, mnoge bitne karakteristike jezika ostale su nestandardizovane. To je
dovelo do revizije standarda koja je usvojena 1989. godine i kojom su standardizovane
karakteristike koje se odnose na očuvanje integriteta baze podataka i povezivanje sa
klasičnim programskim jezicima. Ta verzija SQL standarda poznata je pod nazivom
SQL-89. 1992. godine usvojena je sledeća bitna revizija standarda, poznata pod
nazivom SQL-92 ili SQL2, kojom je SQL zaokružen kao programski jezik, a obim
standarda uvećan šest puta u odnosu na polaznu verziju.
Poslednja revizija SQL standarda usvojena je 1999. godine. Ta verzija SQL
standarda poznata je pod nazivom SQL: 1999. U nju su uključeni koncepti objektne
tehnologije, mehanizam trigera, rekurzija i proceduralna proširenja.
SQL je u stalnom razvoju. Na početku je bio prilično jednostavan, blizak
korisniku i u velikoj meri deklarativan (neproceduralan). Danas se za SQL može reći da
je kompleksan, proceduralno/deklarativan jezik. SQL radi sa tabelama. Tabela se kreira
jednom izvršnom naredbom. Odmah po kreiranju tabela je raspoloživa za korišćenje.
Svi podaci memorisani su u tabelama i rezultat bilo koje operacije se Iogički prikazuje u
obliku tabele.
Neproceduralnost SQL-a se ogledala u činjenici da se njime definisalo ŠTA se
želi, a ne KAKO se dobija: koji podaci se žele, koje tabele se referenciraju i koji uslovi
treba da budu ispunjeni, bez specifikacije procedure za dobijanje željenih podataka. Da
bi se povećala funkcionalnost jezika, u SQL: 1999 standardu, uvedena je proceduralna
nadgradnja SQL-a, koju uglavnom čine upravljačke strukture slične upavljačkim
strukturama klasičnih programskih jezika.
Zaključno sa SQL-92 standardom SQL naredbe svrstavane su u tri kategorije:
naredbe za definisanje podataka (Data Definition Statements)
naredbe za manipulisanje (rukovanje) podacima (Data Manipulation Statements)
naredbe kontrolne (upravljačke) funkcije (Data Control Statements)
Zaključno sa SQL-92 standardom SQL naredbe su svrstavane u jednu od sledeće
tri kategorije: naredbe za definisanje podataka (Data Definition Statements), naredbe za
Tehnologije distribucije podataka mobilnih aplikacija
_____________________________________________________
_____________________________________________________
[21]
manipulisanje (rukovanje) podacima (Data Manipulation Statements) i naredbe za
kontrolne (upravljačke) funkcije (Data Control Statements).
Naredbe za definisanje podataka omogućuju definisanje objekata baze. Primeri
naredbi ove kategorije su:
CREATE TABLE (kreiranje tabele baze podataka)
CREATE VIEW (kreiranje virtuelne tabele – “pogleda”)
CREATE INDEX (kreiranje indeksa nad kombinacijom kolona tabele)
ALTER TABLE (izmena definicije tabele)
DROP TABLE (izbacivanje tabele iz baze podataka)
Naredbe za manipulisanje (rukovanje) podacima omogućuju ažuriranje i prikaz
podataka baze:
SELECT (prikaz sadržaja relacione baze podataka)
UPDATE (izmena vrednosti kolona tabele)
DELETE (izbacivanje redova tabele)
INSERT (dodavanje redova postojecoj tabeli)
Naredbe za kontrolne (upravljačke) funkcije omogućuju oporavak,
konkurentnost, sigurnost i integritet relacione baze podataka:
GRANT (dodela prava korišcenja sopstvene tabele drugim korisnicima)
REVOKE (oduzimanje prava korišćenja sopstvene tabele od drugih korisnika)
COMMIT (prenos dejstava transakcije na bazu podataka)
ROLLBACK (poništavanje dejstava transakcije)
SQL:1999 standard razvrstava SQL naredbe u 7 kategorija. Osnovni razlog za
drugačije razvrstavanje naredbi je uvođenje novih koncepata u SQL u skladu sa
razvojem informatičke tehnologije i potreba da se postojeće naredbe preciznije grupišu.
Definisane su sledeće kategorije SQL naredbi:
naredbe za šemu baze podataka (SQL-Schema Statements), koje se koriste za
kreiranje, izmenu i izbacivanje šema i objekata šema (CREATE, ALTER,
DROP),
naredbe za podatke (SQL-Data Statements) koje se koriste za prikaz i ažuriranje
podataka baze (SELECT, INSERT, UPDATE, DELETE),
naredbe za transakcije (SQL-Transaction Statements) koje se koriste za
startovanje, završavanje i postavljanje parametara za transakcije (COMMIT,
ROLLBACK),
naredbe za kontrolu (SQL-Control Statements) koje se koriste za kontrolu
izvršavanja sekvence SQL naredbi (CALL, RETURN),
naredbe za konekcije (SQL-Connection Statements) koje se koriste za
uspostavljanje i prekidanje SQL konekcije (CONNECT, DISCONNECT),
Tehnologije distribucije podataka mobilnih aplikacija
_____________________________________________________
_____________________________________________________
[22]
naredbe za sesije (SQL-Session Statements) koje se koriste za postavljanje
Default vrednosti i drugih parametara SQL sesije (SET),
naredbe za dijagnostiku (SQL-Diagnostic Statements) koje koriste dijagnostičke
podatke i signaliziraju izuzetke u SQL rutinama (GET DIAGNOSTICS).
SQL:1999 standard definiše više načina korišćenja SQL-a. Dva osnovna načina
su direktno (interaktivno) korišćenje SQL-a i povezivanje SQL-a sa klasičnim
programskim jezicima („ugrađeni” SQL).Bazna tabela, koja je objekat šeme baze
podataka, naziva se kreirana bazna tabela i može biti perzistentna ili privremena. Bazna
tabela, koja je objekat modula, može biti samo privremena i naziva se deklarisana
privremena tabela.
Perzistentna bazna tabela je imenovana tabela definisana CREATE TABLE
naredbom bez ključne reči TEMPORARY.Globalna privremena tabela je imenovana
tabela definisana CREATE TABLE naredbom koja uključuje odrednicu GLOBAL
TEMPORARY. Kreirana lokalna privremena tabela je imenovana tabela definisana
CREATE TABLE naredbom koja uključuje odrednicu LOCAL TEMPORARY.
Deklarisana lokalna privremena tabela je imenovana tabela koja se deklariše kao
komponenta modula.
Globalne privremene tabele i kreirane lokalne privremene tabele su slične
perzistentnim baznim tabelama u smislu da su njihove definicije u šemi i ostaju u njoj
dok se eksplicitno ne uklone. Međutim, za razliku od perzistentnih baznih tabela,
njihova fizička egzistencija se efektivno materijalizuje samo kada se referenciraju u
SQL sesiji.
SQL sesija je kontekst u kome jedan korisnik (osoba ili aplikacija) izvršava
sekvencu SQL naredbi u toku jedne SQL konekcije. SQL konekcija je asocijacija (veza)
izmedu SQL klijenta i SQL servera.
SQL klijent je procesor koji uspostavlja vezu sa SQL serverom i koji je
prvenstveno okrenut korisniku, odnosno aplikaciji. On predstavlja interfejs preko koga
se prosleđuju zahtevi SQL serveru i prihvataju rezultati obrade zahteva. SQL server je
procesor koji upravlja SQL sesijom. On prihvata zahteve od SQL klijenta. izvršava ih i
rezultate prosleđuje klijentu.
Svaki modul ili „ugrađeni” SQL program, koji referencira kreiranu lokalnu
privremenu tabelu, prouzrokuje materijalizaciju različitog pojavljivanja (instance) te
tabele u svakoj SQL sesiji. To znači da se sadržaj kreirane lokalne privremene tabele,
kao ni globalne privremene tabele, za razliku od perzistentnih baznih tabela, ne može
deliti izmedu SQL sesija. Prema tome, privremena tabela je prazna na početku SQL
sesije i prazni sa na njenom kraju ili na kraju SQL transakcije. Sadržaj kreirane lokalne
privremene tabele ne može se deliti ni izmedu modula ili „ugrađenih” SQL programa
jedne SQL sesije.
Tehnologije distribucije podataka mobilnih aplikacija
_____________________________________________________
_____________________________________________________
[23]
Da zaključimo, sadržaj globalne privremene tabele jedinstven je u SQL sesiji,
sadržaj kreirane lokalne privremene tabele jedinstven je unutar modula ili „ugrađenog”
SQL programa jedne SQL sesije, a sadržaj deklarisane lokalne privremene tabele
jedinstven je unutar procedure jednog modula ili „ugradenog” SQL programa jedne
SQL sesije.
Tehnologije distribucije podataka mobilnih aplikacija
_____________________________________________________
_____________________________________________________
[24]
5. Postojeća rešenja
Android aplikacija Human Resources6
, ima mogućnost prikaza i pretrage
zaposlenih, kao i vođenje evidencije o odsustvima. Takođe, ova aplikacija ima
mogućnost prikupljanja podataka, računanje i alate za intervjue. Ova aplikacija pruža
mogućnosti stvaranja nedeljnih planera, izveštaje o nezgodama koje su se desile u
prostorijama korporacije ili na terenu, izračunavanje plata, slanje i primanje
obaveštenja, rad u ofline i online režimu, eleminisanje papirologije, ima pristup svim
izveštajima u svakom trenutku i na svakom mestu. Aplikacija omogućava olakšani rad
službama za upravljanje ljudskim resursima. Svi prikupljeni podaci se čuvaju na
android uređajima, ali se mogu eksportovati u pdf ili xlsx ukoliko je to potrebno.
Aplikacija omogućava održavanje intervjua, organizaciju i lako zakazivanje intervjua.
Intervju se drži na uređaju, ali se može i proslediti putem mail-a. Takođe, postoji
mogućnost upload-a pdf fajlova sa lokalnog diska ili cloud-a. Postoji mogućnost
popunjavanja pdf obrazaca, stavljanja potpisa, podela formi putem sms poruka ili mejla.
Izgled ove aplikacije prikazan je na slici 3.
Slika 3. Android aplikaciju Human Resources
Jedna od aplikacija koje imaju sličnu primenu jeste Zoho People7
. Ova
aplikacija ima mogućnost pregleda i pretrage zaposlenih, ali i dodavanja novih
6 Izvor https://www.bamboohr.com/mobile.php
7 Izvor https://www.zoho.com/people/
Tehnologije distribucije podataka mobilnih aplikacija
_____________________________________________________
_____________________________________________________
[25]
zaposlenih. Takođe postoji organizacija godišnjih odmora, ali i mogućnosti zakazivanja
i pohađanja seminara, obuka... Ima mogućnost vođenja beležaka, tj sadrži planere za
poslovnu primenu, sa mogućnošću podsetnika. Osim android aplikacije, Zoho People je
razvijen i za desktop uređaje. Izgled aplikacije Zoho People prikazan je na sledećoj
slici.
Slika 4. Android aplikaciju Zoho People
Easy HR 8je jednostavna aplikacija koja pruža mogućnost vođenja evidencije o
odsustvima, odobravanje i odbijanje odsustava zaposlenima. Takođe ima mogućnost
organizacije putovanja i obuka, i lako upravljanje troškovima. Easy HR je prikazana na
slici 5.
8 https://play.google.com/store/apps/details?id=com.streetlightsoftware.easyhr
Tehnologije distribucije podataka mobilnih aplikacija
_____________________________________________________
_____________________________________________________
[26]
Slika 5. Android aplikaciju Easy HR
Tehnologije distribucije podataka mobilnih aplikacija
_____________________________________________________
_____________________________________________________
[27]
6. Model softverskih funkcija
Na slici 6. Prikazan je use case dijagram. Na njemu su detaljnije prikazani
procesi koji treba da se izvrše. Npr. zaposleni šalje zahtev za novo odsustvo, njegov
TeamLeader dobija notifikaciju da je zatraženo novo odsustvo, koje odobrava ili odbija,
zaposleni dobija notifikaciju, odgovor na zatraženo odsustvo.
Modeli podataka su rađeni pomoću alata Power Designer 15.
Slika 6. Use case dijagram HRA android aplikacije
Tehnologije distribucije podataka mobilnih aplikacija
_____________________________________________________
_____________________________________________________
[28]
7. Modeli podataka
Slika 7. Conceptual data model HRA android aplikacije
Iz konceptualnog modela izveden je PDM – Physical Data Model, na kojem su
prikazani i strani ključevi. PDM je prikazan na slici 8.
Tehnologije distribucije podataka mobilnih aplikacija
_____________________________________________________
_____________________________________________________
[29]
Slika 8. Physical Data Model HRA android aplikacije
Tehnologije distribucije podataka mobilnih aplikacija
_____________________________________________________
_____________________________________________________
[30]
8. Opis realizovanog rešenja
Servis za potrebe HRA (Human Resouces Android) aplikacije pisan je u Python
programskom jeziku, u ravojnom okruženju PyCharm. Za testiranje funkcionalnosti
servisa korišćen je Postman. Svi get endpointi kao povratnu vrednost imaju JSON type.
Servis ima endpointe za autentifikaciju, login, dobijanje spiska zaposlenih, detalji za
svakog zaposlenog, slike zaposlenih u Base64 formatu (koje se u aplikaciji keširaju, da
bi se smanjio protok internet saobraćaja i ubrzala aplikacija), dobijanje spiska
odsustava, kreiranje notifikacije, slanje mail-a, dobijanje tipova odsustava, kreiranje
novog odsustva, dobijanje notifikacija, pregledane notifikacije, odobravanje odsustva,
kao i nekoliko endpointa vezane za validacije, validnost podataka.
Aplikacija je napisana u Java programskom jeziku, koristeći Android studio kao
razvojno okruženje. Zasniva se na listingu i pretrazi zaposlenih u korporaciji, dobijanje
detalja o zaposlenima, pozivanje i slanje poruka zaposlenima direktno iz aplikacije, kao
i mogućnost da se pošalje e-mail zaposlenima. Takođe, prikaz fotografije zaposlenog
preko celog ekrana mobilnog uređaja, u cilju lakšeg prepoznavanja i međusobnog
upoznavanja zaposlenih u velikim korporacijama.
Druga ključna funkcionalnost ove aplikacije jeste olakšavanje zaposlenima
apliciranje za odsustva. Naime, kada je zaposlenom potrebno odsustvo, pomoću
aplikacije ga jednostavno može zatražiti. Na nadređenom zaposlenog koji je zatražio
odsustvo je da li će to odsustvo odobriti ili odbiti. U aplikaciji postoje tri profila
korisnika: administrator, team leader i employee.
Administrator, kao profil korisnika sa najvišim ovlašćenima, ima mogućnost da
team leader-u odobrava ili odbija aplicirana odsustva. Administrator ima uvid u
odsustva svih zaposlenih u korporaciji, da pretražuje odsustva po datumima, kao i po
svim zaposlenima. Team leader ima ovlašćenje da odobrava odsustva zaposlenih u
svom sektoru, i ima uvid u odsustva zaposlenim samo u njegovom sektoru, timu.
Zaposleni ima pravo da zatraži odsustvo, i ima uvid u svoja odsustva.
Tehnologije distribucije podataka mobilnih aplikacija
_____________________________________________________
_____________________________________________________
[31]
9. Korisničko uputstvo
Prilikom pokretanja HRA aplikacije prikazuje se logo firme, dok pozadinski
process (Async task) proverava da li je prilikom prethodkog korišćenja aplikacije
korisnik čekirao polje remember me. Ukoliko polje nije bilo čekirano, ili je ovo prvo
pokretanje aplikacije, prikazaće se fragment za logovanje koji izgleda kao na sledećoj
slici.
Slika 9. Stranica za logovanje korisnika
Ukoliko je polje remember me bilo čekirano prilikom prethodne upotrebe
aplikacije, pokreće se aplikacija sa početnim izgledom kao na slici 10.
Slika 10. Početna stranica aplikacije
Tehnologije distribucije podataka mobilnih aplikacija
_____________________________________________________
_____________________________________________________
[32]
Na početnom ekranu nalazi se kratki pregled statistike za ulogovanog user-a,
koliko mu je dana preostalo za odsustvovanje sa posla, koliko je odsustava zatražio do
sada, koliko je odobreno, odbijeno, i na koliko još uvek čeka odobrenje.
Sledeća stavka jeste drawer ili bočni menu. U njemu se nalaze sve putanje kroz
aplikaciju. Izgled aplikacije (tema aplikacije) se može podesiti da bude svetao ili taman,
u zavisnosti koji izgled korisnik odabere. Izgledi tema se vide na sledećoj slici.
Slika 11. Glavni meni sa prikazom obe teme aplikacije
Jedna od funkcionalnosti jeste lista zaposlenih, kao i pretraga po imenu ili
prezimenu. Pretraga je urađena po principu auto complete search, što označava da će se
lista automatski menjati, i izlistavati samo one rezultate koji odgovaraju unetim
karakterima iz search box-a. Izgled ekrana za pretragu liste zaposlenih prikazan je na
slici 12.
Tehnologije distribucije podataka mobilnih aplikacija
_____________________________________________________
_____________________________________________________
[33]
Slika 12. Prikaz stranice za pretragu zaposlenih
Takođe jedna od funkcionalnosti jeste i dobijanja detalja o zaposlenima,
mogućnost pozivanja zaposlenog direktno iz aplikacije, kao i slanje poruka i mogućnost
da se pošalje e-mail zaposlenom, jednostavnim klikom na email zaposlenog. Jedna od
funkcionalnosti jeste i prikaz fotografije zaposlenog preko celog ekrana mobilnog
uređaja, u cilju lakšeg prepoznavanja i međusobnog upoznavanja zaposlenih u velikim
korporacijama.
Tehnologije distribucije podataka mobilnih aplikacija
_____________________________________________________
_____________________________________________________
[34]
Slika 13. Prikaz detalja o zaposlenom
Druga ključna funkcionalnost ove aplikacije jeste olakšavanje zaposlenima
apliciranje za odsustvima. Naime, kada je zaposlenom potrebno odsustvo, pomoću
aplikacije ga jednostavno može zatražiti, i to kao na slici 14 i 15.
Tehnologije distribucije podataka mobilnih aplikacija
_____________________________________________________
_____________________________________________________
[35]
Slika 14. Stranica za apliciranje odsustva
Tehnologije distribucije podataka mobilnih aplikacija
_____________________________________________________
_____________________________________________________
[36]
Slika 15. Stranica za apliciranje odsustva
Team leader dobija notifikaciju da je jedan od njegovih zaposlenih (zaposleni u
istom sektoru, timu) zatražio odsustvo i team leader kroz aplikaciju ima mogućnost da
aplicirano odsustvo dozvoli, ili odbije. Zaposleni dobija notifikaciju nakon što je njegov
team leader odgovorio na aplicirano odsustvo.
Slika 16. Stranica notifikacija zatraženih odsustava
Tehnologije distribucije podataka mobilnih aplikacija
_____________________________________________________
_____________________________________________________
[37]
Ove notifikacije nisu push notifikacije koje se plaćaju, već je to servis koji se
“vrti” na svakom mobilnom uređaju posebno, i koji proverava da li se status odsustva
promenio. Frekvenciju ažuriranja zaposleni sami mogu odrediti.
Slika 17. Podešavanje tajmera za notifikacije
Tehnologije distribucije podataka mobilnih aplikacija
_____________________________________________________
_____________________________________________________
[38]
10. Opis implementacije
U daljem tekstu nalazi se SQL script baze podataka. Baza je rađena u MSSQL
programu za upravljanje bazama podataka. Napraviljena je baza gde imamo 5 tabela.
Script baze izgleda ovako:
CREATE DATABASE NewHRA CREATE TABLE [dbo].[tblSectors]( [SectorID] [int] IDENTITY(1,1) NOT NULL, [Name] [nvarchar](50) NOT NULL, [Description] [nvarchar](50) NULL, CONSTRAINT [PK_tblSectors] PRIMARY KEY CLUSTERED ( [SectorID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] CREATE TABLE [dbo].[tblOccupations]( [OccupationID] [int] IDENTITY(1,1) NOT NULL, [Name] [nvarchar](50) NOT NULL, [Descriptions] [nvarchar](100) NULL, CONSTRAINT [PK_tblAvocations] PRIMARY KEY CLUSTERED ( [OccupationID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] CREATE TABLE [dbo].[tblEmployees]( [EmployeeID] [int] IDENTITY(1,1) NOT NULL, [Name] [nvarchar](50) NOT NULL, [SectorID] [int] NOT NULL, [OccupationID] [int] NOT NULL, [Role] [int] NOT NULL, [CardNo] [int] NOT NULL, [IDNumber] [nvarchar](50) NOT NULL, [JMBG] [nvarchar](50) NOT NULL, [PlaceOfIDIssue] [nvarchar](50) NOT NULL, [AddressFromID] [nvarchar](50) NOT NULL, [LivingAddress] [nvarchar](50) NULL, [Username] [nvarchar](50) NOT NULL, [Password] [nvarchar](50) NULL, [Email] [nvarchar](50) NOT NULL, [Skype] [nvarchar](50) NULL, [Mobile] [nvarchar](50) NOT NULL, [WorkPhone] [nvarchar](50) NULL, [ExtensionNum] [nvarchar](50) NULL, [WorkStart] [smalldatetime] NOT NULL, [OfficialWorkStart] [smalldatetime] NULL, [OfficeNumber] [nvarchar](50) NULL, [SecondarySchool] [nvarchar](50) NULL, [HighSchools] [nvarchar](50) NULL, [IsActive] [bit] NOT NULL CONSTRAINT [DF_tblEmployees_IsActive] DEFAULT ((1)), [CV] [varbinary](max) NULL,
Tehnologije distribucije podataka mobilnih aplikacija
_____________________________________________________
_____________________________________________________
[39]
CONSTRAINT [PK_tblEmployees] PRIMARY KEY CLUSTERED ( [EmployeeID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] SET ANSI_PADDING ON ALTER TABLE [dbo].[tblEmployees] WITH CHECK ADD CONSTRAINT [FK_tblEmployees_tblEmployees] FOREIGN KEY([EmployeeID]) REFERENCES [dbo].[tblEmployees] ([EmployeeID]) ALTER TABLE [dbo].[tblEmployees] CHECK CONSTRAINT [FK_tblEmployees_tblEmployees] ALTER TABLE [dbo].[tblEmployees] WITH CHECK ADD CONSTRAINT [FK_tblEmployees_tblOccupations] FOREIGN KEY([OccupationID]) REFERENCES [dbo].[tblOccupations] ([OccupationID]) ALTER TABLE [dbo].[tblEmployees] CHECK CONSTRAINT [FK_tblEmployees_tblOccupations] ALTER TABLE [dbo].[tblEmployees] WITH CHECK ADD CONSTRAINT [FK_tblEmployees_tblSectors] FOREIGN KEY([SectorID]) REFERENCES [dbo].[tblSectors] ([SectorID]) ALTER TABLE [dbo].[tblEmployees] CHECK CONSTRAINT [FK_tblEmployees_tblSectors] CREATE TABLE [dbo].[tblAbsenceTypes]( [AbsenceTypeID] [int] IDENTITY(1,1) NOT NULL, [Name] [nvarchar](100) NOT NULL, [AbsenceCode] [nvarchar](10) NOT NULL, [IncludeHours] [decimal](18, 2) NOT NULL, CONSTRAINT [PK_tblAbsenceTypes] PRIMARY KEY CLUSTERED ( [AbsenceTypeID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] CREATE TABLE [dbo].[tblAbsences]( [AbsenceID] [int] IDENTITY(1,1) NOT NULL, [EmployeeID] [int] NOT NULL, [AbsenceTypeID] [int] NOT NULL, [Status] [int] NOT NULL, [DayFrom] [smalldatetime] NOT NULL, [DayTo] [smalldatetime] NOT NULL, [AbsenceYear] [int] NULL, [Description] [nvarchar](50) NOT NULL, [Response] [nvarchar](150) NULL, CONSTRAINT [PK_tblAbsences] PRIMARY KEY CLUSTERED ( [AbsenceID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY]
Tehnologije distribucije podataka mobilnih aplikacija
_____________________________________________________
_____________________________________________________
[40]
ALTER TABLE [dbo].[tblAbsences] WITH NOCHECK ADD CONSTRAINT [FK_tblAbsences_tblAbsenceTypes] FOREIGN KEY([AbsenceTypeID]) REFERENCES [dbo].[tblAbsenceTypes] ([AbsenceTypeID]) ALTER TABLE [dbo].[tblAbsences] CHECK CONSTRAINT [FK_tblAbsences_tblAbsenceTypes] ALTER TABLE [dbo].[tblAbsences] WITH NOCHECK ADD CONSTRAINT [FK_tblAbsences_tblEmployees] FOREIGN KEY([EmployeeID]) REFERENCES [dbo].[tblEmployees] ([EmployeeID]) ALTER TABLE [dbo].[tblAbsences] CHECK CONSTRAINT [FK_tblAbsences_tblEmployees]
Implementacija Python servisa za komunikaciju android aplikacije sa bazom
biće prikazana u delovima koda, konekcija ka bazi, provera autorizacije, koja se
izvršava prilikom svakog poziva endpointa, kao i login endpoint i endpoint za novo
odsustvo.
Konekcija ka bazi / DB connection:
MSSQL_serverName = 'DESKTOP-8974R6J\SQLEXPRESS' #server name
connectionString = 'DRIVER={SQL Server};SERVER=' + MSSQL_serverName +
';DATABASE=NewHRA;Trusted_Connection=yes;'
if __name__ == '__main__':
app.run(host='xxx.xxx.x.xxx', port=xxxx) # server configuration
Provera autorizacije / Check authorisation:
def check_auth(username, password):
global LDAPtarget #Another database for authorization(IP address)
if not '.' in username:
return False
ldapUsername = username.replace('.', ' ').title()
l=ldap.initialize(LDAPtarget)
l.protocol_version = ldap.VERSION3
l.set_option(ldap.OPT_REFERRALS, 0)
user_dn = "CN="+ldapUsername+",CN=Users,DC=panonit,DC=lan"
try:
# verification = l.simple_bind_s(user_dn, password)
# if verification is None:
# return False
connection = pyodbc.connect(connectionString)
cursor = connection.cursor()
sql = "select e.username from tblEmployees e where e.username = '" +
username + "'"
cursor.execute(sql)
results = cursor.fetchall()
if not results or not username in results[0]:
return False
return True
except Exception, error:
print error
return False
finally:
Tehnologije distribucije podataka mobilnih aplikacija
_____________________________________________________
_____________________________________________________
[41]
cursor.close()
connection.close()
Metoda za logovanje / Login endpoint:
@app.route('/api/login')
@requires_auth
def login():
try:
connection = pyodbc.connect(connectionString)
cursor = connection.cursor()
sql = "select e.EmployeeID, e.Name, e.SectorID, e.Email, e.Mobile,
e.WorkPhone, e.OfficeNumber, e.Role, " \
"i.Image, e.OccupationID, e.CardNo, e.IDNumber, e.JMBG,
e.PlaceOfIDIssue, e.AddressFromID, " \
"e.LivingAddress, e.Skype, e.ExtensionNum, e.WorkStart,
e.OfficialWorkStart, e.SecondarySchool, " \
"e.HighSchools, e.IsActive, e.Username, e.Password " \
"from tblEmployees e left join tblImages i on i.EmployeeID =
e.EmployeeID and i.ImageSize = 'm' " \
"where e.Username = '" + str(request.authorization.username)+"'"
cursor.execute(sql)
data = cursor.fetchall()[0]
if data[8] is not None:
image = base64.standard_b64encode(data[8])
else:
image = None
user = ({'EmployeeID': data[0], 'Name': data[1], 'SectorID': data[2],
'Email': data[3], 'Mobile': data[4],
'WorkPhone': data[5], 'OfficeNumber': data[6], 'Role':
data[7], 'Image': image, 'OccupationID': data[9],
'CardNo': data[10], 'IDNumber': data[11], 'JMBG': data[12],
'PlaceOfIDIssue': data[13],
'AddressFromID': data[14], 'LivingAddress': data[15],
'Skype': data[16], 'ExtensionNum': data[17],
'WorkStart': str(data[18]), 'OfficialWorkStart':
str(data[19]), 'SecondarySchool': data[20],
'HighSchools': data[21], 'IsActive': data[22], 'Username':
data[23], 'Password': data[24]})
response = json.dumps(user)
return response
except Exception, error:
print error
return internal_server_error()
finally:
cursor.close()
connection.close()
Zahtev za odsustvo / New absece endpoint:
@app.route('/api/absences/create', methods=['POST'])
@requires_auth
def create_new_absence():
try:
connection = pyodbc.connect(connectionString)
cursor = connection.cursor()
if not request.data:
return bad_request()
if not validate_new_absence_json(request.data):
Tehnologije distribucije podataka mobilnih aplikacija
_____________________________________________________
_____________________________________________________
[42]
return bad_request()
sql = "Select at.Name from tblAbsenceTypes at where at.AbsenceTypeID =
'" + \
str(json.loads(request.data)['AbsenceTypeID']) + "'"
cursor.execute(sql)
data = cursor.fetchall()
if not data:
return bad_request()
absenceData = json.loads(request.data)
absenceData['AbsenceType'] = data[0][0]
employeeDetails =
get_employee_details_by_username(str(request.authorization.username))
sql = "INSERT INTO tblAbsences (Status, AbsenceTypeID, DayFrom, DayTo,
AbsenceYear, Description, EmployeeID) " \
"OUTPUT INSERTED.AbsenceID, INSERTED.DayFrom, INSERTED.DayTo " \
"VALUES (0, {0}, '{1}', '{2}', {3}, '{4}', {5});"\
.format(absenceData['AbsenceTypeID'], absenceData['DayFrom'],
absenceData['DayTo'],
absenceData['AbsenceYear'],
absenceData['Description'], employeeDetails['EmployeeID'])
cursor.execute(sql)
try:
data = cursor.fetchall()[0]
except Exception, error:
print error
return bad_request()
absenceData['AbsenceID'] = data[0]
absenceData['DayFrom'] = str(data[1])
absenceData['DayTo'] = str(data[2])
absenceData['EmployeeID'] = employeeDetails['EmployeeID']
absenceData['Status'] = 0
absenceData['Response'] = None
sql = "select e.EmployeeID, e.Email from tblEmployees e where e.Role =
0"
cursor.execute(sql)
data = cursor.fetchall()
for admin in data:
message = 'Employee ' + employeeDetails['Name'] + ' has requested
an absence from ' + \
str(adjust_date_for_notification(absenceData['DayFrom'])) + \
' to ' +
str(adjust_date_for_notification(absenceData['DayTo']))
create_notification(employeeDetails['EmployeeID'], admin[0],
"Absences", message)
send_email(admin[1], 'Absence request', message)
response = json.dumps(absenceData)
connection.commit()
return response
except Exception, error:
print error
return internal_server_error()
finally:
Tehnologije distribucije podataka mobilnih aplikacija
_____________________________________________________
_____________________________________________________
[43]
cursor.close()
connection.close()
Implementacija Android aplikacije biće prikazana u delovima koda koji
obuhvataju neke od ključnih delove aplikacije.
AndroidManifest.xml
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.CALL_PHONE" />
LoginActivity.java
Metoda za proveru SharedPreferences:
private void CheckSharedPreferences() {
try {
loggedUserSharedPreferences = getSharedPreferences("USER DETAILS",
MODE_PRIVATE);
if (!(loggedUserSharedPreferences.getString("username", "").equals("")
&& loggedUserSharedPreferences.getString("password", "").equals(""))) {
loggedUser = new User();
loggedUser.setUsername(loggedUserSharedPreferences.getString("username", ""));
loggedUser.setPassword(loggedUserSharedPreferences.getString("password", ""));
username = loggedUser.getUsername();
password = loggedUser.getPassword();
login();
} else {
SharedPreferences.Editor editor =
loggedUserSharedPreferences.edit();
editor.putString("username", "");
editor.putString("password", "");
editor.apply();
Const.isRequiredLogin = true;
if(!isRequiredLogin) {
Intent intent = getIntent();
finish();
startActivity(intent);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
Metoda za logovanje:
Tehnologije distribucije podataka mobilnih aplikacija
_____________________________________________________
_____________________________________________________
[44]
public void login() {
if (loggedUserSharedPreferences.getString("username", "").equals("") &&
loggedUserSharedPreferences.getString("password", "").equals("")) {
if (!validate()) {
onLoginFailed();
return;
}
}
if(isRequiredLogin) {
btnLogin.setEnabled(false);
progressDialog = new ProgressDialog(LoginActivity.this,
R.style.AppTheme_Login_Dialog);
progressDialog.setIndeterminate(true);
progressDialog.setMessage(getString(R.string.message_authenticating));
progressDialog.show();
}
if (username.equals("") && password.equals("")) {
username = txtUsername.getText().toString();
password = txtPassword.getText().toString();
}
new loginRequest().execute(username, password);
new android.os.Handler().postDelayed(
new Runnable() {
public void run() {
if (isLoggedFailed) {
onLoginFailed();
if (isRequiredLogin) progressDialog.dismiss();
}
}
}, 7000);
}
loginRequest je AsyncTask koji, kao pozadinski proces, gađa metodu za
logovanje na servisu. Njegova implementacija je sledeća:
private class loginRequest extends AsyncTask<String, Void, String> {
@Override
protected void onPreExecute() {
...
}
@Override
protected String doInBackground(String... params) {
String returner;
try {
URL service = new URL(Const.SERVICE_URL_LOGIN);
HttpURLConnection connection = (HttpURLConnection)
service.openConnection();
String authentication = params[0] + ":" + params[1];
String encodedAuth =
Base64.encodeToString(authentication.getBytes(), Base64.NO_WRAP);
connection.setRequestProperty("Authorization", "basic " +
encodedAuth);
int responseCode = connection.getResponseCode();
BufferedReader bufferedReader = new BufferedReader(new
InputStreamReader(connection.getInputStream()));
StringBuilder total = new StringBuilder();
String line;
while ((line = bufferedReader.readLine()) != null) {
Tehnologije distribucije podataka mobilnih aplikacija
_____________________________________________________
_____________________________________________________
[45]
total.append(line);
}
JSONObject temp = new JSONObject(total.toString());
if (responseCode == HttpURLConnection.HTTP_OK) {
returner = temp.toString();
} else {
returner = ("" + responseCode);
}
return returner;
} catch (Exception e) {
returner = ("Exception: " + e.getMessage());
return returner;
}
}
@Override
protected void onPostExecute(String result) {
...
}
Nakon uspešnog logovanja, kreira se MainActivity.java, koji se provlači kroz
celu aplikaciju. MainActivity predstavlja kontejner za sve fragmente koji se smenjuju u
toku izvršavanja aplikacije. Jedan od tih fragmenata jeste NewAbsenceFragment.
Fragment_new_absence.xml
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="hra.panonit.com.hra.fragment.NewAbsenceFragment">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:weightSum="1"
android:baselineAligned="false">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:orientation="horizontal"
>
<TextView
android:text="@string/type"
android:layout_width="match_parent"
android:layout_weight="0.7"
android:layout_height="wrap_content"
/>
<Spinner
android:id="@+id/absenceType"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="0.3">
</Spinner>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
Tehnologije distribucije podataka mobilnih aplikacija
_____________________________________________________
_____________________________________________________
[46]
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:orientation="horizontal">
<TextView
android:text="@string/date_from"
android:layout_width="match_parent"
android:layout_weight="0.6"
android:layout_height="wrap_content"
/>
<TextView
android:clickable="true"
android:id="@+id/pickedDateFromID"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="0.315"/>
<ImageView
android:clickable="true"
android:id="@+id/dateFromImageID"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="?attr/imgBtnCalendar"
/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:orientation="horizontal">
<TextView
android:text="@string/date_to"
android:layout_width="match_parent"
android:layout_weight="0.6"
android:layout_height="wrap_content"
/>
<TextView
android:clickable="true"
android:id="@+id/pickedDateToID"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="0.315"/>
<ImageView
android:clickable="true"
android:id="@+id/dateToImageID"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="?attr/imgBtnCalendar"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:orientation="horizontal"
>
<TextView
android:text="@string/description"
android:layout_marginTop="5dp"
android:layout_width="match_parent"
android:layout_weight="0.7"
Tehnologije distribucije podataka mobilnih aplikacija
_____________________________________________________
_____________________________________________________
[47]
android:layout_height="wrap_content"
/>
<EditText
android:gravity="start"
android:id="@+id/descriptionID"
android:text=""
android:layout_margin="5dp"
android:layout_width="match_parent"
android:layout_weight="0.3"
android:layout_height="wrap_content"
android:maxLength="50"
/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:gravity="bottom|center"
android:layout_gravity="bottom"
>
<Button
android:text="@string/reset"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/resetID"
android:layout_marginBottom="20dp"/>
<Button
android:id="@+id/submitID"
android:text="@string/submit"
android:layout_width="wrap_content"
android:layout_marginLeft="50dp"
android:layout_height="wrap_content"
android:layout_marginBottom="20dp"/>
</LinearLayout>
</LinearLayout>
</FrameLayout>
Tehnologije distribucije podataka mobilnih aplikacija
_____________________________________________________
_____________________________________________________
[48]
11. Zaključak
11.1. Mogućnosti korišćenja rešenja
Rešenje je u potpunosti ispravno, i spremno, i može se koristiti kao rezultat
problema opisanog u prvom poglavlju. Ovu aplikaciju mogu koristiti sve organizacije,
preduzeća i ustanove koje imaju veći broj zaposlenih, kako bi se, pre svega, olakšala
komunikacija između zaposlenih.
Takođe, ključna uloga aplikacije je mogućnost lake komunikacije između
zaposlenih i njihovih nadređenih, za potrebe odsustva, vođenje evidencije o
iskorišćenim slobodnim danima, bolovanjima, organizacija godišnjih odmora…
11.2. Dalji plan razvoja
U narednom periodu planirano je da se aplikacija proširi mogućnošću
eksportovanja izveštaja o odsustvima zaposlenih pojedinačno, eksportovanju izveštaja
odsustva po godinama, datumima, sektorima.
Dodavanje mogućnosti pretrage po fotografijama, što bi rezultiralo lakšem i
bržem upoznavanju zaposlenih u velikim korporacijama.
Implementiranje push notifikacija, što bi zamenilo servis koji se “vrti” na
svakom mobilnom uređaju. To bi rezultiralo smanjenju potrošnje internet saobraćaja, i
oslobodilo deo resursa uredjaja, pre svega RAM memorije mobilnog uređaja.
Mogućnost za dodavanjem novih zaposlenih, i brisanje zaposlenih koji se više
ne nalaze u korporaciji. Tu mogućnost bi imao administrator. Zatim, mogućnost da
ulogovani korisnik može izmeniti svoje lične podatke, podesiti novu lozinku.
Proširiti upotrebu (implementirati rešenje) na platformu Windows Mobile kao i
IOS platform.
Tehnologije distribucije podataka mobilnih aplikacija
_____________________________________________________
_____________________________________________________
[49]
12. Literatura
[1] Zapata B., Android Studio Application Development, 2013
[2] Neil S., Android Studio 2 Development Essentials, 2016
[3] Yener M., Dundar O., Expert Android Studio, 2016
[4] Reto M., Professional Android 4 Application Development, Wiley Publishing,
2012
[5] Schwarz R., Dutson P., Steele J., To N., The Android Developer's Cookbook:
Building Applications with the Android SDK, Addison-Wesley, 2013
[6] Felker D., Android Application Development for Dummies, 2011
[7] Burnette E., Hello, Android - Introducing Google’s Mobile Development
Platform, 2010
[8] DiMarzio J., Android - A Programmer’s Guide, 2008
[9] Lee J., Mills J., Exploring Tourist Satisfaction with Mobile Experience
Technology, 2010
[10] Darcey L., Shane Conder, Sams Teach Yourself Android Application
Development in 24 Hours, 2010
[11] Corigliano M., Baggio R., Mobile Technologies Diffusion in Tourism: Modelling
a Critical Mass of Adopters in Italy, 2004
[12] Zechner M., Beginning Android Games, 2011
[13] Murphy M., Beginning Android 2, 2010
[14] Smyth N., Android 4 App Development Essentials ,Payload media, 2014
[15] Murphy M., Busy Coders Guide To Android Development, CommonsWare, 2015
[16] Nayak R., Wireless Technologies to Enable Electronic Business, Brisbane, 2010
[17] Detmold H., Scalable Surveillance Software Architecture, Proceedings of the
IEEE International Conference on Advanced Video and Signal-based
Surveillance, 2006
[18] Douglish F., As i Emerge from the Mobile Phone Dark Ages, i Look Around in
Fear and Wonder, IEEE Internet Computing, 2010
[19] Frickengel L., Wireless Networking in the Developing World, 2nd ed., 2007
[20] Hengel E., Dick A., Hill R., Activity topology estimation for large networks of
cameras. Proceedings of the IEEE International Conference on Advanced Video
and Signal-based Surveillance, 2006
[21] Miner R., Android - Building a Mobile Platform to Change the Industry, Stanford
EE Computer Systems Colloquium, 2007
[22] D. Pavlešić, Razvoj mobilnih aplikacija, Mreža, 2010
[23] Rossum G., Drake F., The Python Library Reference Release 2.6.4 Python
Software Fondation, 2010
[24] Miller B., Ranum D., The Python Programming Language, 2007
[25] Joyner J., Python Programming For Beginners: Python Programming Language
Tutorial, 2014
[26] Beazley D, Python Essential Reference, 2009
[27] Lester A., The Python (Programming Language) Handbook - Everything You
Need to Know about Python (Programming Language), 2016