Raamatute hinnavaatlus: ülesande spec
NB! Siin allpool on toodud ainult ülesanne ise, mitte soovitused, näitekood jne: loe kindlasti ülesande üldlehte Praktikumitöö: Raamatute hinnavaatlus
Ülesandeks on teha autori järgi raamatute otsimise ja kuvamise käsurea rakendus, mis kasutab Google base andmebaasisüsteemi ja Eesti Panga valuutakursside lehte käsurealt antud autori raamatute väljaotsimiseks ja nende seast hinnapäringu tegemiseks: leida tuleb kõik selle autori raamatud baasis (kui neid pole väga palju) ning odavaim, kalleim ja keskmine hind igale raamatule.
Loodav rakendus on käsurea programm, mis võtab käsurealt autori nime, näiteks:
java booksearch Tammsaare
siis teostab vastava otsingu ja trükib tulemuse csv tabelina välja, kusjuures hinnad on eesti kroonides ja iga rida on kujul:
Autor,Raamatu pealkiri,leitud raamatute arv,Min hind, Keskmine hind, Maks hind
Näiteks:
Tammsaare,Tode Ja Oigus : Romaan : I Jagu,3,200,210,270 Tammsaare,Tode Ja Oigus,1,220,220,220 Tammsaare,Porgupohja Uus Vanapagan,2,110,120,130
Korduvaid raamatu pealkirju tabelis ei tohi olla. Kuna raamatute pealkirjad baasis sisaldavad mitmesugust lisainfot (näiteks Tode Ja Oigus : Romaan : I Jagu (1. Anne)) siis tuleb pealkirjast alati välja visata sulgudes olev info. Seega tuleb pealkirjad Tode Ja Oigus : Romaan : I Jagu (1. Anne) ning Tode Ja Oigus : Romaan : I Jagu lugeda ühekssamaks raamatuks ning tulemuses esitada samal real, pealkirjaga Tode Ja Oigus : Romaan : I Jagu. Samas raamat baasis oleva pealkirjaga Tode Ja Oigus tuleb lugeda juba teiseks raamatuks ning tulemuses esitada eraldi real.
Kuna müügiks olevaid raamatuid võib autoril olla väga palju, tuleb otsida esimese 250 seast (arenduse ajal kasuta kiiruse huvides väiksemat arvu, näiteks 25).
Kuna serverid ei pruugi olla alati kättesaadavad, peab programm suutma töötada ka niimoodi, et xml data google basest ja kursid eesti pangast antakse ette failina, mitte url-ina: selleks peab programm suutma lugeda ka teist ja kolmandat argumenti, mis on vastavalt siis google base data xml faili ja valuutakursside csv faili nimed, näiteks:
java booksearch Tammsaare forex.csv java booksearch Tammsaare gdata.xml java booksearch Tammsaare gdata.xml forex.csv
Selliselt etteantud argumentide korral peab programm lugema infot siis failist, mitte võrgust. Kas etteantud fail on dgata fail või kursside fail, peab ta otsustama sufiksi (xml või csv) abil. Etteantud xml faili puhul ta loomulikult ei suuda tegelikult otsida õiget autorit, vaid peab lihtsalt kasutama raamatuid, mis seal failis toodud (sõltumatult autorist).
Ülesanne õpetab eeskätt järgmisi asju:
- Andmete lugemine võrgust ja failidest.
- Stringitöötlus.
- Mitmemõõtmeliste massiivide kasutamine.
Google base spetsiifilised detailid ja nõksud ei ole ülesande jaoks eriti olulised, praktikumitöös kasutame seda lihtsalt kui head näiteandmete allikat.
Täpsemad detailid siin lehel allpool.
Vigade töötlus
Mistahes vigade ilmnemisel ei tohi programm nö kokku kukkuda või anda Java enda, süsteemset veateadet, millest kasutaja aru ei saa.
Vead tuleb kinni püüda (kas if-dega kontrollides või try ... catch-i kasutades) ning kas anda kasutajale arusaadav veateade, või teha midagi muud mõistlikku.
Millised on vead, mis võivad juhtuda (näited: ei pea kasutama täpselt sellist vigade "kataloogi" ja veateateid):
- kasutaja ei andnud otsitavat autorit
- päringu jaoks vajalikku urli ei õnnestunud avada
- faili ei õnnestunud lugeda
- failil oli arusaamatu sufiks
- saadud string sisaldas valet infot (server maas, annab veateadet vms)
- ei leitud ühtegi raamatut sellelt autorilt
- hinda ei olnud antud
- hinna juures oli valuuta, mille kurssi ei olnud võimalik leida.
Mis on Google base ja kuidas seda kasutada
Google base kasutame toodete otsinguks: sinu programm otsib tooteid ainult Google basest.
Google base (avaleht http://www.google.com/base) on Google vaba kasutusega andmebaasisüsteem: igaüks saab sinna laadida mistahes andmeid ja siis kasutada Google spetsiaalset otsimootorit andmete otsimiseks, sorteerimiseks jne. NB! Google base ei ole Google harilik otsimootor vaid spetsiaalne rakendus, hoopis erinev harilikust Google otsingust.
Vaata avalehte http://www.google.com/base ja proovi veidi näiteks toodete otsingu brauseri-kasutajaliidest http://www.google.com/base/s2?a_n0=products&a_y0=9&hl=en&gl=US.
Google base ei pea kasutama brauserist: igaüks saab vabalt kirjutada oma programmi baasist otsingute tegemiseks. Selleks pakub Google õpetusi ja abi-kooditükid, nn API: http://code.google.com/apis/base/.
Praktikumis ei tohi kasutada mingeid Google oma abi-kooditükke. Nendest ei oleks selles praktikumis mh ka mingit abi: kulutaksid oma aega keerulise koodi kasutamise uurimisele, millest aga ülesande lahendamiseks tulu ei tõuse.
Google base tuleb praktikumis kasutada järgmisel viisil:
- Sinu programm paneb ise kokku vajaliku URLi ja loeb sellelt URLilt stringi, vt GBaseExample.java.
- Loetud stringist otsib sinu programm välja vajalikud osad ja ehitab nendest kahemõõtmelise stringimassiivi.
Hea leht esialgseks katsetamiseks on http://www.google.com/base/api/demo/html/demo.html. Vaata sealt lõiku pealkirjaga Query (HTTP GET), mille all on sisestusboks, kuhu saad panna päringu parameetrid. Siis vajuta Query nuppu ja samale lehele ilmub tulemus XML-stringi kujul.
Paar konkreetset katsepäringut (pane tähele, et nad kõik algavad samamoodi, erinevad ainult autori nime poolest):
- snippets?bq=[product type : books][author : Tammsaare]
- Täisurl: http://base.google.com/base/feeds/snippets?bq=%5Bproduct%20type%20:%20books%5D%5Bauthor%20:%20Tammsaare%5D
- Kodeerimata: base.google.com/base/feeds/snippets?bq=[product type : books][author : Tammsaare]
- snippets?bq=[product type : books][author : Mati Unt]
- Täisurl: http://base.google.com/base/feeds/snippets?bq=%5Bproduct%20type%20:%20books%5D%5Bauthor%20:%20Mati%20Unt%5D
- Kodeerimata: base.google.com/base/feeds/snippets?bq=[product type : books][author : Mati Unt]
- snippets?bq=[product type : books][author : Shakespeare]
- Täisurl: http://base.google.com/base/feeds/snippets?bq=%5Bproduct%20type%20:%20books%5D%5Bauthor%20:%20Shakespeare%5D
- Kodeerimata: base.google.com/base/feeds/snippets?bq=[product type : books][author : Shakespeare]
Selleks, et saada kohe rohkem tulemusi, kui vaikimisi 25, anna lisaparameeter max-results, niimoodi:
- snippets?max-results=250&bq=[product type : books][author : Shakespeare]
- Täisurl: http://base.google.com/base/feeds/snippets?max-results=250&bq=%5Bproduct%20type%20:%20books%5D%5Bauthor%20:%20Shakespeare%5D
- Kodeerimatal: base.google.com/base/feeds/snippets?max-results=250&bq=[product type : books][author : Shakespeare]
Pane tähele, et google basele saadetud urlid peavad olema url-encodetud. GBaseExample.java sisaldab näidet, kuidas seda lihtsamalt teha. Idee selles, et urlid ei tohi sisaldada suvalisi kirjavahemärke, näiteks tühikuid, klambreid jne. Sellised sümbolid tuleb asendada kolme sümboliga: esimene on protsent, teine ja kolmas aga sümboli ascii-koodi esitus hexas. Vaata lisaks http://www.blooberry.com/indexdot/html/topics/urlencoding.htm
NB!
- Sinu rakendus ei pea andmeid baasi sisetama ega kasutajaid autentima. Kogu juttu Authenticating users ja tokens ja Google account hankimise teemal tuleb lihtsalt ignoreerida: nende asjadega tegeleda ei tule.
- Ei ole mingit vajadust lugeda läbi kogu võrgus olevat keerulist juttu Google base kasutamisest. Kogu tegelikult vajalik info on toodud siin lehel allpool, koos koodinäidetega.
Eesti Panga valuutakursid
Eesti panga valuutakursse kasutame selleks, et kõik Google basest leitud hinnad teisendada eesti kroonideks.
Valuutakursse on kõige lihtsam tõmmata lehelt http://www.eestipank.info/dynamic/erp/erp_csv.jsp?day=25&month=9&year=2007. Pane tähele, et äsjatoodud urlis saab vabalt anda soovitud päeva. Praktikumirakendus peab kasutama sama või eelmise päeva kursse (sama päeva kursid ei ole kohe hommikul kättesaadavad).
Nimetatud lehel on kursid antud eesti locale csv formaadis: eraldajaks semikoolon, arvud komadega.