Mi smo kreirali vlastiti razvojni sistem za razvoj aplikacija orijentisanih pristupu i manipulaciji bazama podataka.
Razvojni sistem je sada kompatibilan sa eclipse rcp.
Pogledajte DbTable razvojni sistem demo (potreban flash, 20 mb)
ili manji demo koji demonstrira startanje aplikacije sa splash screen
DbTable - startanje (flash, 600k)
i jos jedan koji prikazuje neke trikove sa JXTable klasom
iz swingx paketa JXTable i DbTable (flash, 2 mb)
Zadnji razvoj jos nije lokalizovan na nas jezik.
Demonstracije su uradjene na Ubuntu linuxu koristenjem Wink-a.
Osnovne karakteristike sistema su :
Koristi aplikacije otvorenog koda.Sistem koristi dodatne alate, ali su svi ti alati, izuzev Java razvojnog okruženja, otvorenog koda.Međutim, i Javu svako može slobodno preneti sa Interneta i koristiti (mora se licencirati samo ukoliko se JDK isporučuje u okviru nekog proizvoda).Za potpun opis licence pogledati stranice za Javu.
Potpuno je fleksibilan.Sistem ima osnovno ponašanje (npr. izgled ili java Look and Feel, model podataka, osnovna forma,osnovni izveštaj, ali vi lako možete dodati vlastiti, bilo u okviru celog sistema ili za pojedine delove).Ova osobina je postignuta zahvaljujući korištenju razvojnog okruženja Spring.
Mapiranje objekata baze podataka (tabele, kolone, ograničenja i ostalo) u Java objekte.Za ovo se koristi ORM alat Hibernate.
Sistem radi sa nekom od baza podataka sa kojom radi hibernate.Možete naći spisak negde na hibernate strani, ali to su uglavnom sve poznate relacione baze.Naš model podataka traži samo da ta baza podržava skrolabilni ResultSet, zbog toga sto baze koje ne podržavaju ovo, kupe kompletan upit u memoriju.Mi smatramo da je takav sistem neupotrebljiv u praksi, jer nikad ne znamo koliko upit vraća redova i ako tabela ima, recimo, milion redova klijent će sigurno pasti zbog nedostatka memorije.Moguće je prepraviti naš model da radi sa ovakvim bazama (samo jedna metoda od desetak linija radi ovo).
Sistem je napravljen u čistom Java jeziku (pure Java) i može da radi na nekom operativnom sistemu za koji postoji Java razvojni sistem.Pritom baza (ili baze) i sistem ne moraju biti na istom operativnom sistemu.
Povezivanje (binding) vizuelnih elemenata (Java swing klasa kao JTextField,JCheckBox,JComboBox itd) u polja (property) Java klasa kreiranih kod mapiranja.Spring RCP razvojno okruženje se koristi za ovaj posao.Ovo znači da postoje tri sloja : baza podataka, ORM klasa mapirana prema bazi i vizuelni element povezan ORM klasom. Sve ovo razvojni sistem radi automatsk.Vi samo kreirate dizajn baze i hibernate fajl za mapiranje (postoje alati kao što je middlegen koji ovo rade automatski, ali mi radije ovo radimo "ručno" sa nekim editorom jer tako imamo veću mogućnost kontrole razvoja)
Validacija podataka.Postoje dve vrste validacije - sistem automatski pronalazi primarne ključeve (hibernate identifikatore) i strane ključeve i ovu vrstu validacije vrši automatski.Vi ne morate definisati stvarne primarne i strane ključeve (mada je poželjno).Dovoljno je da to definišete u okviru hibernate fajla za mapiranje.Druga vrsta validacije je ona koju postavljate na nivou sistema.Ovo se postavi jednom i radi u svim delovima sistema, npr. ako kažemo da kolona BROJNALOGA u okviru tabele NALOZI ne može biti veća od 10 znakova i da to moraju biti brojevi, to se definiše samo jednom.Stavke naloga mogu imati takođe kolonu BROJNALOGA, ali pošto to odgovara broju naloga u osnovnoj definiciji to više nije potrebno definisati za tabelu stavki. Praktično se osnovni podaci o nalogu tretiraju kao objekt i u ostalim delovima sistem se koristi samo referenca. Hibernate pronalazi odgovarajuće veze prema definiciji u mapi i izršava potrebne akcije prema bazi podataka.
Takođe, ako unosite broj naloga kod stavki, sistem automatski nalazi osnovne podatke o nalogu i nudi pomoć - listu vrednosti.Ovo ćemo pokazati na nekom od ekrana u daljem tekstu (samo da napomenemo da programer za ovo ponašanje ne mora da uradi ništa, jer sistem automatski dodaje ovo na osnovu definicija dizajna).
Sistem prozora i pogleda koji omogućuje kreiranje, dodavanje, brisanje i uopšte manipulaciju elementima grafičkog okruženja.Mi koristimo Infonode Docking Window, ali se relativno jednostavno može koristiti i neki drugi alat.
Kreiranje ekrana/forme je jednostavno (80% ekrana mogu se ostaviti u podrazumevanom ponašanju).
Ekran omogućuje osnovne operacije unosa novih redova, brisanje i izmenu (CRUD) i osim toga moćni sistem pretraživanja, sortiranja,kreiranja analitičkih tabela i kreiranje različitih izveštaja.Ovo pretraživanje, sortiranje i izveštaje ne radi programer, nego korisnik sam organizuje sebi posao.Za izveštaje mi koristiomo JFreeReport, ali kao i za ostale delove mogu se dodati drugi alati.Izveštaji se mogu pregledati na ekranu, štampati ili kreirati u formatima pdf, excel, html, csv (redovi sa poljima odvojeni zarezom ili nekim drugim znakom) i običnom tekstualnom formatu.Više u ovome će biti reči u nastavku opisa.
Osnovni izgled aplikacije je kao na slici (podaci nisu stvarni nego su uneseni proizvoljno).Za normalnu veličinu slike kliknite na nju :
Slika 1 - uobičajeni ekran aplikacije |
Slika 2 - lokalizacija na engleski |
Slika 3 - izgled ekrana na MS Windows XP |
Na slici se vidi osnovni ekran aplikacije.Na levoj strani je meni za aplikaciju, koji mi nećemo ovde detaljno opisivati. Želimo samo ukazati na mogućnost definisanja menija za različite jezike (kao i ostalih delova aplikacije).Meni se može pretraživati po nekom kriteriju u okviru različitih jezika.Slika 2 predstavlja isti ekran lokalizovan na engleski jezik. Slika 3 prikazuje ekran na MS Windows operativnom sistemu.Ekran prikazuje lokalizaciju menija.Lokalizacija menija ne koristi standardni način lokalizacije za Javu, jer mi želimo da imamo mogućnost pretraživanja menija i zato su lokalizacijske poruke za menije smeštene u bazu.
Za definiciju ovakvog ekrana potrebni su sledeći koraci :
Sada imamo spreman ekran/izveštaj koji ima sledeće opcije :
Opcije koje nisu dostupne u nekom modu su onemogućene, tako da je mogućnost greške operatera minimalna.Na primer opcija za spremanje u bazu je onemogućena ako korisnik nije napravio nikakvu izmenu ili ako nije sva validacija uredno urađena.
Snpe razvojni sistem omogućava moćan sistem za unos, validaciju i pomoć kod unosa podataka.Na slici je ekran za unos novog reda sa validacijom
Pogled/view 'Problemi' prikazuje greške.U ovom slučaju su greške tipa 'polje mora biti uneseno' ili problemi sa primarnim i stranim ključevima koje je sistem automatski našao iz dizajna baze.
Sistem će odmah obavestiti korisnika ako unese nalog koji već postoji ili recimo tip naloga koji ne postoji (strani ključ) i neće dozvoliti spremanje takvog naloga (neće čak ni ponuditi mogućnost - opcija za spremanje je onemogućena)
Korisnik dobija pomoć kod unosa.Naprimer, kada unosi 'tip naloga' korisnik ne zna šifre tipova, ali zna opis tipa.Jednostavno pređe na polje opis.Ukuca šta zna i pritisne CTRL BLANK (CTRL BLANK nije obavezno ako je korisnik izabrao da sistem daje pomoć kod liste vrednosti dok kuca; sistem će automatski da mu daje listu mogućnosti - izbor 'pretražuj dok kucam' je objašnjen u sledećem pasusu - pretraživanje).Ako ne zna ništa može ukucati CTRL BLANK u prazna polja (samo je bitno da je pozicioniran ili na tip ili naziv tipa).Dobiće sve stavke, koje može pregledati u tabeli, sortirati i prebaciti na ekran.Slika
Korisnik je ukucao P, sistem mu je dao sve tipove naloga koji počinju sa P (može se izabrati da li se razlikuju velika i mala slova) Korisnik sada može da ukuca šifru do kraja ili klikne na kolonu u tabeli desnim mišem i 'prenese listu vrednosti' na ekran za unos.Mi smo preneli stavku sa šifrom 08.Ekran je sada potpuno validan i opcija za spremanje je omogućena.
Pomoć je potpuno ista kod izmene reda.Kod izmene treba napomenuti samo da sistem automatski zabranjuje izmenu primarnog ključa (hibernate idenitifikatora).Za nas je to željeno ponašanje, jer izmena primarnog ključa može napraviti haos u integritetu podataka.Naš sistem to automatski zabranjuje, ali vi možete proširiti osnovnu klasu za ovo ponašanje i izmeniti ga.
Primetimo ovde da smo mi vršili pretragu lista vrednosti prema imenu tipa naloga.Kolona 'naziv tipa' uopšte se ne nalazi u tabeli naloga (dobar relacioni dizajn zahteva da ovo bude u sasvim drugoj tabeli tipova), ali smo mi izvršili pretragu po njoj.Moguće je ubaciti bilo koju kolonu iz tabele koja ima strani ključ (u stvari samo je tako definisana u fajlu za mapiranje za hibernate - ne mora stvarno imati strani ključ) i vršiti sve operacije koje smo mi definisali (pretraživanje, sortiranje, pa čak i unos direktno u polja iz druge tabele).Naprimer, ako imate šifru radnika negde na nekom ekranu (recimo radnika koji kreira nalog kod naloga za knjiženje) vi možete samo dodati na ekran ime, prezime i šta god hoćete od osnovnih podataka o radniku i sve operacije radite sa ovim kolonama kao da su sve definisane u tabeli naloga (a ne bi trebale da su u njoj, ako je baza dobro dizajnirana).Ili čak još više : kolona 'Saldo' čak i ne postoji u bazi.Ona je samo izvedeno polje u ORM mapiranju (jednostavna formula : saldo = duguje - potražuje), ali je moguće pretraživanje, sortiranje, analitičke funkcije, izveštaji i po ovoj koloni.Moguće su praktično sve operacije i za ovu kolonu osim unosa.Mi ne možemo iz salda dobiti dugovno i potražno stanje, ali ako bi ovo bilo moguće (za neku drugu izvedenu kolonu možda jeste) onda je i unos moguć.Ovo nismo našli ni u jednom postojećem sistemu za razvoj sa bazama podataka (kao uostalom ni mnoge druge osobine ovog sistema koje ćemo objasniti u nastavku).Ova osobina je postignuta zahvaljujući fenomenalnim mogućnostima hibernate ORM alata.
Liste vrednosti je bilo moguće napraviti kao ComboBox (specijalni vizuelni element), ali mi nismo izabrali ovu mogućnost, jer bi kompletnu listu morali puniti iz baze u memoriju, a lista može da bude velika (recimo lista kupaca u fakturi može da se kreće u više hiljada) i mnogo takvih lista u memoriji bi zagušilo sistem.Međutim, kao i za ostale funkcije, moguće je vrlo lako izmeniti ovo ponašanje.
Sistem automatski vrši mnoge vrste validacija - zahtevana polja, maksimalna dužina polja iz baze, strane ključeve, uredan tip promenljivih (datum,broj itd), a postoji i veoma bogat skup gotovih klasa/metoda za definisanje validacije od strane programera.Jednom definisana validacija za neko polje neke klase/tabele koristi se u celom sistemu.
Kada izaberete opciju za pretraživanje prelazite u poseban mod sistema.Podaci koji se unose koriste se tada za pretragu i ne spremaju se u bazu.U ovom modu ne postoje validacije.Pre svega potrebno je definisati karakteristike (zadnja opcija u paleti koju smo naveli prethodno). Postoje sledeće karakteristike :
Možete definisati da li će sistem pretraživati dok kucate.Ovo je zgodna opcija, ali može biti naporna kada je upit sporiji i tada se može onemogućiti.Napominjemo da korisnik bira pretragu, ne programer i korisnik može zadati sporiji upit, pogotovu ako se uzme u obzir da može zadavati uslov OR i razne uslove sortiranja.Kada je onemogućena upit se izvršava ili pozivanjem opcije
ili sa tastature sa CTRL SPACE.Ista stvar je i kod pretraživanja liste vrednosti.Liste vrednosti su, naprimer, kontni plan dok korisnik kuca konto u stavke naloga.Znači može da dobije listu i da iz liste prenese stavku koju želi.Ovo je objašnjeno u prethodnom primeru sa nalozima i tipovima naloga.
Opcija za velika i mala slova govori da li će sistem da ih razlikuje u pretrazi (naprimer je li Petrović, PETROVIĆ ili PeTrOvIć isto ili ne)
Sledeći tip karakteristika je za pretraživanje po uslovu LIKE (slično).Podrazumevano ponašanje je da se slovne promenljive (varchar, char,text u bazi ili String objekti u Javi) pretražuju po uslovu LIKE.Naprimer, ako korisnik traži nekog radnika sa prezimenom Petrović kada ukuca 'Pet' sistem će tražiti sve radnike koji počinju sa Pet.Ovo je podrazumevano i može se, kao što ćemo videti kasnije promeniti za svako polje na ekranu.Međutim, podrazumevano ponašanje se najviše koristi.
Ako su u pitanju brojne i datumske promenljive moguće je ovakvo pretraživanje ako baza može da to uradi (Oracle i Postgresql recimo mogu), ali je ovo isključeno kao podrazumevano ponašanje.
Uključi sve uslove u principu znači AND upit, tj. kada su svi zadani kriteriji tačni.Ako se ovo isključi koristi se OR i to je dosta sporo
Uključi da/ne se koristi kod JCheckBox - promenljive tipa tačno/netačno (bez obzira kako su definisane u bazi).Mogu se uključiti ili isključiti.Ove promenljive imaju i posebne kriterije za pretraživanje (u stvari manje kriterija, jer je većina za njih besmislena).
Poslednja opcija je samo za master/detail ekrane.Vi sami određujete da li će se detail automatski prikazivati kada se red u master promeni (recimo kod navigacije na mster ekranu).I ovo je samo zbog performansi.
Svaki ekran ima status liniju oblika
Korisnik vidi mod operacije (na slici pretraga, a može biti novi red ili izmena/normal), trenutno izabrani red (0 ako još nije izabran nijedan), ukupan broj redova trenutnog upita,da li je ekran ispravan (validacija) i da li je ekran menjan (ne koristi se u modu pretrage)
Za svako polje na ekranu korisnik može da postavi upit po sledećim kriterijima (kriteriji za pojedina polja se dobiju kada se pritisne desni taster miša na tom polju).
Primer kriterija za obične promenljive (string,datum broj i slično)
Mislimo da su kriteriji iz dosadašnjeg izalaganja jasni.Dodatak je samo kriterij 'od-do', koje predstavlja kriterij tipa BETWEEN.Kada korisnik izabere ovaj kriterij, tada svaki put kada se pozicionira na komponentu sa ovim kriterijem dobije još jedno polje na ekranu kao na sledećoj slici
Izabran je uslov od naloga 0 do naloga 3.Podešeno je sortiranje po rednom broju naloga (nelogično) da vidite da su izabrani samo nalozi od 0 do 3.
Za boolean (da/ne) promenljive postoji samo ovaj izbor
Sortiranje stavki u tabelarnom pregledu nekog ekrana je moguće po bilo kojem polju na ekranu (bez obzira da li je polje u baznoj tabeli za ekran ili ne; uostalom naš sistem i ne poznaje termin bazna tabela, ali ovo je iz nekih poznatih alata) Na sledećoj slici izabrane su stavke konta klase 5, od datuma 01.07.2003 do 31.12.2003 sortirane po kontu u opadajućem rasporedu, zatim po datumu u rastućem redu i na kraju po rednom broju stavke u nalogu u opadajućem rasporedu.Ovo je izabrano bez nekog rezona samo da prikažemo mogućnosti.Korisnik ima vizulenu indikaciju za redni broj kolone u sortiranju i za rastući ili opadajući redosled.
Korisnik sortiranje bira tako što klikne na zaglavlje kolone u tabeli (prvi put za rastući raspored, ponovo za opadajući) Prva kolona na koju klikne uzima se prva kod sortiranja (u primeru je to konto), pa druga itd.Kada klikne na kolonu prvu kolonu (redni broj u tabeli) brišu se sva sortiranja.Sortiranje i pretraživanje, koje je ovako definisano važi za izveštaje. Pretraživanje važi za analitičke funkcije, ali analitičke funkcije imaju tabelu u kojoj se posebno definiše sortiranje (lako i jednostavno kao i ovde).
Na kraju da dodamo da korisnik u tabeli može da prikazuje i sakriva kolone kako želi (klikom na kolonu RBR, koja se ne može sakriti).Korisnik takođe može da menja raspored i dimenzije kolona po želji u tabeli, ali ovo je standardna mogućnost swing tabela.
Klasični master-detail je nepotreban kod ovakvog sistema.Developer može jednostavno da definiše polja koja želi na ekranu (bilo da pripadaju master ili detail tabeli) i da ih koristi kao da su prirodno povezani.Međutim, ako želite klasični izgled možete u okviru modela podataka za neki master da definišete detail pogled (ovo je samo deklaracija), a korisnik bira da li će dobijati detail tabelu automatski ili kada pozove ikonu 'prikaži detalje'
kao primer mi smo definisali da ekran naloga ima detail stavke naloga i kada se aktivira opcija dobije se nešto slično ovom
Vrlo je teško opisati sve mogućnosti sistema.Na prethodnom ekranu smo pokazali kako izgleda zaključana stavka (nalog). Svaka tabela/klasa može biti zaključana (korisnik ne može vršiti izmene) i ovo ponašanje definiše developer kada definiše mapiranje za hibernate.Podrazumevano ponašanje za sve klase je da nisu zaključane.Korisnik, međutim, može da kopira sadržaj nekog polja u neki drugi dio sistema (klasičnim ctrl c, ctrl v) čak i kada je red zaključan.
Ovo je samo primer, a daleko je prirodnije da kreirate stavke i na njima normalno prikažete sve što želite o nalogu i ažurirate kao da se radi o jednom objektu (u stvari u terminima objekata to i jeste jedan objekat - nalog.On ima stavke, ali je to i dalje jedan objekat i najbolje je tretirati ga tako).Sistem (hibernate) će rasporediti sve u relacione tabele gde šta treba.
Kada korisnik prikaže tabelu za neki ekran on može da sebi kreira analitičku tabelu.Najbolje je videti iz slike.Recimo da korisnik želi da vidi bilans za poslednji kvartal u godini, tj. konto,duguje potražuje i saldo sumirano po kontu. Prvo izvrši pretraživanje po uslovima koje želi kao na slici
Sada desnim mišem klikne na zaglavlje kolone 'Konto' i izabere 'Grupiši po ovoj koloni' kao
Kada se neka kolona izabere da se grupiše po njoj ostale opcije za tu kolonu su onemogućene (kao na slici). Zatim izabere kolone 'Duguje','Potražuje' i 'Saldo' i kaže da želi da sumira ove kolone
Sada je onemogućena opcija grupisanja.Opcije sumiranja i proseka su uvek onemogućene za kolone koje nisu brojne.
Kada definiše sumiranje (ili prosek ili neku od opcija iz prikazanog menija) za sve kolone koje želi korisnik pozove opciju grupiranje iz glavnog menija
Dobije se sledeća tabela
Napominjemo ponovo da su sve ove mogućnosti : validacija, pretraživanje, sortiranje i grupne tabele urađene bez ikakve posebne intervencije programera.
Na kraju da pokažemo da je na osnovu ekrana moguće kreirati i izveštaje.U izveštaju se uzima u obzir pretraživanje i sortiranje, odnosno izveštaj će sadržavati samo redove koje korisnik izabere i biće sortiran kako je korisnik postavio sortiranje.Slika
Slika 4 - kliknite na sliku za normalnu veličinu
Izveštaj prikazuje podatke o nalogu,kontu,duguje i potražuje (izabrane kolone) za konto klase 4 (pretraživanje) sortiran po nalogu pa po kontu (sortiranje).Prikazana je četvrta od osam strana izveštaja (od rednog broja 136 i vidi se da su podaci (pretraživanje i sortiranje) isti na izveštaju i na ekranu.Takođe se vidi da se izveštaj može štampati i prebaciti u formatu pdf,excel,html,CSV i obični tekst.
Moguće je definisati pogled (view u relacionim bazama podataka) isto kao tabelu (možda bez mogućnosti ažuriranja, ali ako baza dopušta ažuriranje pogleda na neki način onda i sa ažuriranjem).Na ovim ekranima korisnik ima sve opcije kao i kod normalnih tabela : pretraživanje, sortiranje, grupiranje i izveštaji.
Na nekom od ekrana možete da vidite pogled/view Upit i Konzola.Oni su za developere i prikazuje hibernate upite u bazu (to su HQL upiti.HQL je sličan SQL, ali je orijentisan objektima umesto tabelama).Pogled konzola prikazuje log sistema koristan kod otklanjanja grešaka.Sistem, inače, koristi standardni apache log4j log sistem.
Mi smatramo da se 80% ekrana može ostaviti u podrazumevanom ponašanju, odnosno, da samo treba definisati dizajn baze i/ili mapiranje za hibernate.Takođe će kreirani izveštaji zadovoljiti 80% potreba s tim da korisnik (ne programer) može sam da kreira poglede na bazu, sortira, pravi izveštaje itd.Naprimer ekran (stavke naloga) koji smo koristili za primere, sadrži par desetaka linija koda i to je samo kod za vizuelni dio (dodavanje polja i uređenje ekrana).Vizuelni dio se može uraditi sa nekim Java alatom za GUI razvoj i samo dobijene vizuelne komponente povezati (binding) sa hibernate objektima (tabelama) u sistemu.Povezivanje je jednostavno pozivanje add metode u osnovnoj klasi forme.Mi smatramo da su GUI alati zgodni samo za početak (za prvih par ekrana dok se ne stekne rutina) i obično prave mnogo nepotrebnog koda koji je kasnije teško održavati.Izgled ekrana se može napraviti korištenjem JGoodies Forms layouta mnogo efektnije i brže kucanjem običnog Java teksta u dobrom Java editoru/IDE (eclipse ili netbeans su besplatni i odlični).
I najvažnije, kada promenite/dodate neku funkciju za ekran ili izveštaj funkcija je na raspolaganju celom sistemu, odnosno u svim ekranima i izveštajima.Ove funkcije može da doda/izmeni SnPe, ali možete i vi sami.
Snpe nastavlja da razvija navedeni sistemu. U planu je dodavanje mnogih funkcija korištenjem anotacija u Java 5.0 pre svega kod validacije i izveštaja, odnosno sistem će sam da radi više validacija i kreirani izveštaji će biti sofisticiraniji.Takođe ćemo napraviti kompletno uputstvo za korištenje i razvoj sa sistemom.Sistem ima ugrađen pogled(view) za help, ali su tu moguća mnoga poboljšanja.Vizuelni dio je, takođe, moguće poboljšati, ali mi smatramo da je logika i funkcionalnost važnija, tako da je vizuelni dio ostavljen za budući razvoj.U planu je takođe prenos kompletnog sistema na eclipse RCP (eclipse rich client platform - više o ovoj platformi na stranicam za eclipse).
Korišteni alati (imena korištenih alata su zaštitni znak kompanija ili organizacija koje su proizvele alate)
Kompletan razvoj je urađen na operativnom sistemu Linux.Ova stranica je urađena korištenjem Quanta Plus (dio KDE grafičkog okruženja za Linux/Unix) i Gimpa (alat sličan Photoshopu, samo bolji).
Sistem, verovatno radi na FreeBSD Unixu (ukoliko postoji JDK >= 1.4 za FreeBSD), ali mi smo koristili samo logo FreeBSD-a
koji možete videti na nekim snimcima ekrana.
Javite nam se za dodatne informacije.