Viimeksi päivitetty $Date: 2001/04/20 13:41:34 $.
1. Johdanto
2. Suunnittelupäätökset
2.1. Kalenteriprotokolla
2.1.1. CAP-protokolla
2.1.2. CAP-parseri
2.2. Palvelimeen liittyvät päätökset
2.2.1. Ohjelmiston ydin
2.2.2. Kielellinen älykkyys
2.2.3. Kalenterimerkintöjen tallentaminen
2.2.4. Yksikkötestaus
2.2.5. Suodattimet
2.2.6. Moduulit
2.2.7. Todo- ja tapahtumamerkinnät
2.3. Asiakasohjelmistoon liittyvät päätökset
2.3.1. Toteutusarkkitehtuuri
2.3.2. Yksittäisten HTML-sivujen toteutus
2.3.3. Merkkien suodattaminen
Versio |
Pvm |
Muutos |
Muuttaja |
1.0 |
5.2.2001 |
T3-vaiheen ensimmäinen versio |
Juha, Kari, Santeri, Teemu |
1.1 |
18.3.2001 |
T4-vaiheen versio |
Juha, Teemu |
1.2 |
8.4.2001 |
LU-vaiheen versio |
Santeri |
Dokumentti on asiakkaan toivomuksesta tehty koottu kokoelma suunnittelupäätöksiä. Dokumentin tarkoituksena on täydentää ja tuoda taustaa projektin teknisen määrittelyn sisältämille yksityiskohdille. Dokumentin tarkoituksena on toimia eräänlaisena referenssinä ja vastata kysymyksiin, jotka heräävät esimerkiksi ohjelmistojen lähdekoodia luettaessa.
Dokumenttia päivitetään projektin kuluessa.
CAP-protokollan [CAP] ja iCalendar-olioiden esitystavan [RFC2445] käyttö palvelimien ja asiakasohjelmistojen välillä.
Tärkeimmät perusteetKatsottiin tärkeäksi potentiaalinen yhteensopivuus muiden kalenteriohjelmistojen kanssa tulevaisuudessa. Protokollan valinta on siis tietoinen riski, koska kyseessä on vasta ehdotus protokollaksi ja sitä ei tueta missään kalenteriohjelmistossa.
VaihtoehdotAlkuperäinen suunnitelma oli käyttää kalenteriserverin ulkoisena rajapintana XML-pohjaista esitysmuotoa. XML-esitysmuoto olisi helpottanut jonkin verran parsimista, mutta tärkeämmäksi katsottiin CAP-protokollan tarjoama yhteensopivuus tulevaisuudessa sitä tukevien kalenteriohjelmistojen kanssa. XML:lle ei vastaavasti löytynyt potentiaalista standardia tiedon siirtoon.
Vaihtoehtona olisi myös ollut tehdä oma protokolla. Tämä koettiin kuitenkin turhaksi CAP:n speksin ollessa verrattain hyvällä tasolla jo projektin alkuvaiheessa.
SyncML hylättiin jo alkumetreillä, koska julkista tietoa protokollasta ei ollut saatavilla tarpeeksi aikaisin.
Vaikutukset tiivistettynä
Tekninen määrittely, CAP-spesifikaatio [CAP].
CAP-parserin toteutus JLex:llä ja JavaCUP:lla.
Tärkeimmät perusteetCAP on verrattain monipuolinen protokolla. Luotettavan parserin teko käsin ilman apuvälineitä koettiin turhaksi ja liikaa aikaa vieväksi tehtäväksi. Sen sijaan päätettiin käyttää tuttuja työkaluja leksikaalisen analyysin (JLex) ja parsinnan toteuttamiseksi (JavaCUP) nopeasti.
VaihtoehdotVaihtoehtona olisi ollut tehdä oma parseri tai käyttää muita samantyyppisiä työkaluja parsinnan toteuttamiseen. JavaCUP ja JLex edustavat toteukseltaan kuitenkin perinteisiä Unix-työkaluja kääntäjien teossa, joten muiden työkalujen käyttö ei ollut perusteltua.
TCP/IP-pohjaisen protokollan parsintaan JavaCUP ja JLex eivät ole valitettavasti niitä kaikkein parhaita esim. Streamin lopun havaitsemisen suhteen. Toteutuksessa vaadittiin siis pientä kikkailua.
Vaikutukset tiivistettynä
-
Ytimestä tehtiin pelkästään moduulien jakopaikka
Tärkeimmät perusteetYtimestä haluttiin mahdollisimman kevyt ja yksinkertainen, vieläpä siten että se ottaa hyvin vähän kantaa itse kalenterisovellukseen. Nykyinen rakenne toteuttaa vaatimukset hyvin. Siinä ei ole mitään kalenterispesifisyyttä, mutta se takaa kuitenkin helpon laajennettavuuden.
VaihtoehdotYdin vastaanottaa viestejä ja välittää viestit tyypin perusteella oikealle moduulille. Koska tässä vaiheessa ei kuitenkaan ollut selvää kuvaa mitä ytimen tulisi osata, tämä toiminnallisuus siirtyi CalendarModulelle. Samoin haluttiin ettei ytimen rajapinta muutu vaikka viestintä jouduttaisiinkin muuttamaan erilaiseksi.
Täysin toinen lähestymistapa olisi ollut kalenterirungon rakentaminen monoliittisesti, mutta tästä ajatuksesta luovuttiin välittömästi, sillä vaatimukset pakottavat mahdollisimman modulaariseen lähestymistapaan.
Vaikutukset tiivistettynäModuulit kommunikoivat käyttäen ydintä. Moduuleilla ei ole suoria linkkejä toisiinsa.
MääriteltyTekninen määrittely.
Ulkoinen kieliohjelmisto jätettiin pois
Tärkeimmät perusteetAlunperin asiakkaan ajatuksissa oli käyttää GATE-projektin tuottamaa monipuolista tekstin analysointiohjelmistoa GATE:a [GATE]. Ohjelmisto osoittautui kuitenkin kaikkea muuta kuin sopivaksi reaaliaikaiseen kalenteripalvelimeen nopeutensa puolesta. Ohjelmisto päätettiin hylätä tämän vuoksi.
Kielellisen älykkyyden myöhemmin lisäämistä varten arkkitehtuuriin jätettiin kuitenkin selkeä oma paikkansa.
VaihtoehdotYksi vaihtoehto olisi ollut tehdä oma kielellistä älyä sisällään pitävä analysaattori. Tämä ei kuitenkaan kuulunut missään määrin projektin tavoitteisiin, joten päätettiin toteuttaa hyvin yksinkertainen avainsanoihin perustuva kielellinen älykkyys (ks. tekninen määrittely).
Vaikutukset tiivistettynä
Tekninen määrittely.
Relaatiokannan käyttö kalenterivarastona
Tärkeimmät perusteetKalenterivarastoksi tarvittiin persistentti varasto ja yksinkertaisesti helpoimmaksi vaihtoehdoksi todettiin relaatiokannan (RDBMS) käyttö JDBC-yhteyden avulla.
Lisäksi relaatiokantoja löytyy useita kappaleita ilmaisversioina, minkä katsottiin olevan selkeä etu projektin luonteen vuoksi.
VaihtoehdotObjektipohjainen tietokanta (ODBMS) olisi tarjonnut suoremman konversion sisäisen iCalendar-objektirakenteen ja tietokannan välillä, mutta toimivia vapaasti levitettäviä ja laajasti käytössä olevia oliokantoja ei ole olemassa. Relaatiokantaa käytettäessä syntyi jonkin verran ns. mapping koodia relaatiosta sisäiseen objektimuotoon ja päinvastoin.
Vaikutukset tiivistettynä
Tekninen määrittely
JUnitin käyttö yksikkötestauksessa
Tärkeimmät perusteetMuutettaessa jotain kohtaa ohjelmasta, on helppo rikkoa muita siitä riippuvia osia. JUnitin avulla on mahdollista automatisoida testit, jotka tarkastavat koko ohjelman toiminnan. Toisekseen yksittäiset moduulit saadaan niitä toteuttaessa helposti testattua, kun testikoodia varten ei tarvita erillisjärjestelyitä.
JUnit testit ovat vielä vaiheessa T3 laajamittaisesti toteuttamatta.
VaihtoehdotMuita testausohjelmia ei juuri tutkittu JUnitista kuultujen positiivisten kokemusten vuoksi, lähinnä eXtreme Programming -prosessin kanssa käytettynä. Vaihtoehtona oli lähinnä yksikkötestien tekemättä jättäminen ja luottaminen siihen, että ohjelman uudelleenkääntäminen ja pieni testiajo paljastavat riippuvuudet.
Vaikutukset tiivistettynä
Testaussuunnitelma
http://www.junit.org/
http://www.extremeprogramming.org/
Javalla toteutetun suodatinjärjestelmän käyttö
Tärkeimmät perusteetKoska eri kalentereiden tapahtumia yhdistellessä dataa tulee varsin paljon, tarvittiin joustava tapa valita kiinnostavimmat. Monipuolisen suodatuksen toteuttaminen oli yksinkertaisinta serverissä muutenkin käytössä olevalla kielellä, eli Javalla. Suodatinten dynaaminen luonne oli helppoa toteuttaa ohjelmoimalla eri tarkoituksia varten yksittäisiä suodattimia ja panemalla niitä sopivassa järjesteyksessä, ja eri parametreilla peräkkäin. CPU-kuormaa saadaan myös siirrettyä helpommin hajautettaville käyttäjien henkilökohtaisille servereille päin suosittujen paikkaservereiden sijaan.
VaihtoehdotJonkinlaista suodatusta oltaisiin voitu tehdä myös CAP-protokollaan kuuluvilla SQL-kyselyillä, mutta sillä ei oltaisi saatu aikaan riittävän monipuolista järjestelmää.
Vaikutukset tiivistettynä
Älyominaisuuksien sijoittaminen jalostajamoduuleihin ja parametrien kuljettaminen icalendarin categoryissä.
Tärkeimmät perusteetArkkitehtuurin on tarkoitus olla pohja jatkotutkimukselle ja mahdollistaa mielivaltaisten älyominaisuuksien lisääminen. Ainoa mahdollinen tapa toteuttaa tällainen rakenne on tunkea älytoiminnot jonkinlaiseen mustaan laatikkoon, niin että meillä on käytössä minimaalinen rajapinta, joka antaa maksimaalisen vapauden itse moduulille.
Ensimmäisen tarvekartoituksen perusteella sopivaksi rajapinnaksi löytyi profiilin ja VEventin välittäminen jalostajamoduulille. Profiili kuitenkin havaittiin pian tarpeettomaksi osassa moduuleista, samoin VEvent huomattiin liian suppeaksi tavaksi välittää tietoa. Muokattu rajapinta ottaa vastaan VCommand-olion ja näyttää riittävän hyvin monimutkaistenkin moduulien tarpeisiin.
Moduulit tarvitsevat myös paikan, jonne tallettaa generoimaansa tietoa. Sen sijaan että olisimme tarjonneet moduuleille tavan tallettaa mielivaltaista tietoa päädyimme toteuttamaan tietovaraston pelkkinä arvopari merkkijonoina CAP:n categories-kenttiin. Moduulit voivat siis tallettaa mitä tahansa, kunhan pystyvät ilmaisemaan sen avain-arvo -merkkijonoparina.
VaihtoehdotVaihtoehtona oli älytoimintojen liittäminen kalenterioperaatiomoduuliin ja moduulien tarvitsemien kenttien lisääminen suoraan icalendar-tietorakenteisiin. Tämä olisi lyhyellä tähtäimellä helpottanut tehtävää, mutta ratkaisuna se olisi ollut ala-arvoinen.
Nykyisen toteutuksen vaihtoehtona mietittiin myös useampivaiheisia jalostajamoduuleita Apache-moduulien tyyliin. Apachessa moduulit voivat liittyä työnkulun eri vaiheisiin: autentikointiin, urlin uudelleenkirjoitukseen, sisällöntuottoon. Tämä vaihtoehto hylättiin kuitenkin sen vaatiman ylimääräisen työmäärän takia, mutta sitä voisi tutkia myöhemmin uudestaan. Nyt lähes sama toiminnallisuus saadaan efektiivisesti moduulien tarkalla latausjärjestyksellä (esim. autorisointimoduuli ladataan ennen muita jalostajamoduuleita).
Lisäksi hyödyllinen ominaisuus jalostajilla olisi mahdollisuus "äänestää", joidenkin kenttien arvosta. Voi nimittäin olla, että moduuli on jostain asiasta vain esimerkiksi 50%:n varma. Tällöin jonkun toisen moduulin päättely voisi varmistaa tapahtuman todeksi. Tätä toiminnallisuutta ei ajanpuutteen vuoksi sen kummemmin suunniteltu.
Vaikutukset tiivistettynä
Tekninen määrittely.
Tekninen määrittely.
Asiaskasohjelmisto toteutetaan Java-Servlettinä
Tärkeimmät perusteetAsiakasohjelmistoa voidaan näin käyttää miltä tahansa päätelaitteelta, jolta löytyy WWW-selain, joka tukee kehyksiä. Ohjelmiston ulkoasu on suunniteltu käytettäväksi täysikokoiselta grafiikkanäytöltä, mutta käyttö onnistuu myös tekstiselaimella tai jopa PDA:lla. Muokkaus kyseisille laitteille sopivammaksi on helppo suorittaa myöhemmin.
VaihtoehdotItsenäisen ohjelman toteuttaminen katsottiin liikaa aikaa vieväksi. Käyttöliittymän tekemiseen kuluva aika olisi pois toiminnallisuuden toteuttamiselta. WWW-ympäristössä käyttöliittymä on jo toteutettu valmiiksi WWW-selaimien kautta.
JSP-sivut olivat tasa-arvoisessa asemassa Java-Servlettien kanssa alustaa valittaessa, joten valinta suoritettiin henkilökohtaisten preferenssien perusteella.
Valmiit kalenteriohjelmistot hylättiin vapaasti muokattavan ohjelmiston löytämisen mahdottomuuden vuoksi. Kaupalliset ja suljetut ratkaisut eivät sovi projektin luonteeseen.
Vaikutukset tiivistettynä
Tekninen määrittely, Asiakasohjelmistoliite
Kaikki asiakasohjelmiston WWW-sivut toteutetaan Java-luokkina.
Tärkeimmät perusteetProjektin alkuvaiheessa ei vielä ollut tiedossa, mitkä servlet-sivut tulisivat olemaan staattisia ja mitkä dynaamisia. Kaikkien sivujen tuottaminen Java-luokkien avulla mahdollisti toiminnallisuuksien helpomman luomisen mille tahansa servlet-sivulle.
VaihtoehdotStaattiset servlet-sivut olisi ollut mahdollista (ja helpompaakin) luoda suoraan puhtaina HTML-sivuina, joita kutsuttaisiin kuten mitä tahansa muitakin WWW-sivuja. Tällöin kuitenkin sivun muutaminen servlet-sivuksi tarpeen niin vaatiessa olisi ollut hankalampaa kuin alunperin ko. HTML-sivun toteuttaminen suoraan Java-luokkana.
Puhtaat HTML-sivut ovat kuitenkin kevyempiä käsitellä kuin Java-luokat, joten asiakasohjelmiston ajo kuluttaa nyt tarpeettomasti resursseja generoimalla staattiset servlet-sivut Java-virtuaalikoneella. Koska stattisia sivuja on kuitenkin suhteellisesti vähän dynaamisiin sivuihin verrattuna, kokonaishäviö ei ole merkittävä.
Vaikutukset tiivistettynä
-
Kalenteripalvelin hyväksyy mm. tapahtumien kuvaamisessa vain puhdasta tekstiä, numeroita yms. "tavallisia" merkkejä.
Tärkeimmät perusteetTällä taataan, että kalenteripalvelin pysyy toimintakykyisenä missä tahansa asiakasohjelmistoympäristössä, jossa palvelimelle saatetaan syöttää vahingossa tai tahallaan vääränlaista dataa.
VaihtoehdotSuodatus toteutettaisiin asiakasohjelmistossa. Vaihtoehto ei ole hyväksyttävä, sillä mahdollinen asiakasohjelmiston virhe saattaa aiheuttaa sen, että kalenteripalvelimen toiminta keskeytyy väärässä paikassa olevaan kontrollimerkkiin.
Vaikutukset tiivistettynä
-
VIITTEET:[CAP] S. Mansour, D. Rouer, G. Babics, Calendar Access Protocol (CAP), www.ietf.org/internet-drafts/draft-ietf-calsch-cap-03.txt, viitattu 5.2.2001
[GATE] GATE-projekti, GATE - General Architecture for Text Engineering WWW-sivut, http://www.dcs.shef.ac.uk/research/groups/nlp/gate, viitattu 5.2.2001
[RFC2445] Dawson, F. Stenerson, D. Internet Calendaring and Scheduling Core Object Specification (iCalendar), ftp://ftp.funet.fi/pub/standards/RFC/rfc2445.txt, viitattu 5.2.2001