Suunnittelu Sahararyhmä Helsinki 25.8.2005 Ohjelmistotuotantoprojekti HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos
Kurssi 581260 Ohjelmistotuotantoprojekti (6 ov) Projektiryhmä Sanna Keskioja Sampo Lehtinen Hanna Liedenpohja Seppo Syrjänen Asiakas Joni Salmi Johtoryhmä Juha Taina Kimmo Simola Kotisivu http://www.cs.helsinki.fi/group/sahara Versiohistoria Versio Päiväys Tehdyt muutokset 0.1 8.6.2005 Ensimmäinen versio. Dokumenttipohja. SS 0.2 9.6.2005 Järjestelmän yleiskuvauksen luonnos. XMLRPC mainitaan jo. SS 0.3 14.6.2005 Prototyypitluvun luonnostelu.ss 1.4 5.7.2005 Kattava sisällysluettelo: ensimmäinen versio/ss. Luokkia ja rajapintoja/hl. 1.41 7.7.2005 Johdantoa ja arkkitehtuuria. 1.43 8.7.2005 Arkkitehtuuri ja standardilukuja. Sovelluksen RPCkuvausta./SS 1.5 18.7.2005 Tietokantataulujen kuvausta./ss 1.6 2.8.2005 Tekstin editointia ja siivousta /SK
Sisältö i 1 Johdanto 1 1.1 Dokumentin rakenne............................ 1 1.2 Termit.................................... 1 2 Järjestelmän yleiskuvaus 3 2.1 Laiteympäristö............................... 3 2.2 Ympäröivä järjestelmä........................... 3 3 Arkkitehtuuri 4 3.1 Asiakasohjelma............................... 4 3.2 Sovelluspalvelin............................... 4 3.3 Tietokantapalvelin.............................. 5 3.4 Algoritmit.................................. 5 3.4.1 Yksilötapaaminen......................... 5 3.4.2 Ryhmätapaaminen......................... 5 4 Sopimukset ja standardit [?] 6 4.1 Koodausperiaatteet............................. 6 4.2 Standardit.................................. 6 4.3 Käytettävät pakkaukset........................... 7 4.4 Prototyypit................................. 7 5 Käyttäjäsovellus 8 5.1 Käyttöliittymä................................ 8 6 Sovelluspalvelimen toteutus 9 6.1 XMLRPCrajapinta............................ 9 7 Tietokannan toteutus 10 7.1 Taulut.................................... 10 8 Kirjastometodit 12 9 Luokkakuvaukset 12 9.1 Kayttaja................................... 12
ii 9.1.1 haekayttaja()............................ 12 9.1.2 tarkistasahkoposti()........................ 12 9.1.3 tarkistasalasana().......................... 13 9.1.4 Kayttaja().............................. 13 9.1.5 poista()............................... 13 9.1.6 setetunimi()............................ 14 9.1.7 getetunimi()............................ 14 9.1.8 setsukunimi()............................ 14 9.1.9 getsukunimi()........................... 14 9.1.10 setsahkoposti()........................... 15 9.1.11 getsahkoposti()........................... 15 9.1.12 setsalasana()............................ 15 9.1.13 getsalasana()............................ 15 9.1.14 lisaaryhma()............................ 16 9.1.15 getryhmat()............................ 16 9.1.16 getsopivuudet()........................... 16 9.2 Ryhma.................................... 16 9.2.1 Ryhma().............................. 17 9.2.2 poista()............................... 17 9.2.3 setnimi().............................. 17 9.2.4 getnimi().............................. 17 9.2.5 lisaaosallistuja().......................... 18 9.2.6 poistaosallistuja()......................... 18 9.2.7 getosallistujat()........................... 18 9.2.8 getosallistujienlkm()....................... 19 9.2.9 lisaaaikataulu()........................... 19 9.2.10 getaikataulut()........................... 19 9.3 Aikataulu.................................. 19 9.3.1 Aikataulu()............................. 19 9.3.2 poista()............................... 20 9.3.3 setnimi().............................. 20 9.3.4 getnimi().............................. 20 9.3.5 settyyppi()............................. 20
iii 9.3.6 gettyyppi()............................. 21 9.3.7 setalkupvm()............................ 21 9.3.8 getalkupvm()............................ 21 9.3.9 setloppupvm()........................... 22 9.3.10 getloppupvm()........................... 22 9.3.11 settapaamisenkesto()....................... 22 9.3.12 gettapaamisenkesto()....................... 22 9.3.13 setviikonpaivat().......................... 23 9.3.14 getviikonpaivat().......................... 23 9.3.15 lisaatarjottuaika()......................... 23 9.3.16 gettarjotutajat().......................... 23 9.3.17 gettarjottujenaikojenlkm().................... 24 9.3.18 laskeaikataulu().......................... 24 9.4 TarjottuAika................................. 24 9.4.1 TarjottuAika()........................... 24 9.4.2 poista()............................... 25 9.4.3 setalkuaika()............................ 25 9.4.4 getalkuaika()............................ 25 9.4.5 setloppuaika()........................... 25 9.4.6 getloppuaika()........................... 26 9.4.7 getsopivuudet()........................... 26 9.4.8 setosallistuja()........................... 26 9.4.9 getosallistuja()........................... 26 9.5 Sopivuus................................... 27 9.5.1 Sopivuus()............................. 27 9.5.2 poista()............................... 27 9.5.3 setsopivuusarvo().......................... 27 9.5.4 getsopivuusarvo()......................... 27 9.6 Tieto/luokkaluonnoksia........................... 28 10 Sekvenssikaaviot eri käyttötapauksista 29 11 Testaussuunnitelma 30 11.0.1 T.................................. 30
iv 11.1 Testauksen tavoitteet............................ 30 11.2 Testauksessa käytettävät apuvälineet.................... 31 11.3 Testivaiheet................................. 31 11.3.1 Yksikkötestaus/Luokkatestaus (ohtu)............... 31 11.3.2 Integrointitestaus.......................... 32 11.3.3 Järjestelmätestaus.......................... 32 11.3.4 Hyväksymistestaus......................... 32
1 Johdanto 1 Tanjajärjestelmän suunnitteludokumentti kuvaa yksityiskohtaisesti sekä täsmällisellä teknisellä tasolla miten järjestelmä toimii ja miten se toteutetaan vaatimusmäärittelydokumentin pohjalta. 1.1 Dokumentin rakenne Suunnitteludokumentin toisessa luvussa kuvataan Tanjajärjestelmän laiteympäristö sekä ympäröivä järjestelmä. Kolmannessa luvussa selostetaan ohjelmiston asiakasohjelmaan, sovelluspalvelimeen ja tietokantapalvelimeent perustuva kolmitasoarkkitehtuuri. Lisäksi kuvataan ohjelman toiminnan kannalta oleelliset algoritmit. Neljännessä luvussa käsitellään työssä käytettäviin työkalujen ja ohjelmointikieliin liittyvät sopimukset ja standardit sekä tässä työssä noudatettavat periaatteet niiden noudattamiseksi. Viidennessä luvussa kuvataan toteutettava käyttöliittymä ja kuudennessa luvussa sovelluspalvelimen toteutus. Seitsemännessä luvussa puolestaan käsitellään tietokannan toteutusta ja kahdeksannessa luvussa luetellaan käytettävät kirjastomenetelmät. Toteutettavassa ohjelmistossa käytettävien luokkien kuvaukset ovat yhdeksännessä luvussa ja sekvenssikaavit eri käyttötapauksista kymmenennessä luvussa. Lopuksi yhdennessätoista luvussa ovat ohjeet toteutuksen testauksen eri vaiheita varten. 1.2 Termit Suunnitteludokumentissa käytetyt termit. Uudet termit on ilmaistu +merkillä. CSV, Comma Separated Values, pilkkuerotetut arvot Tiedonsiirtomuoto, jota käytetään osallistujen tietojen tuontiin leikepöydän kautta esim. Kurkijärjestelmästä. Ehdotettu aikataulu Järjestelmän muodostama aikataulu, joka perustuu kutsujan kutsujan määrittelemiin aikataulun ominaisuuksiin ja osallistujien antamiin sopivuustietoihin. +Järjestelmä Tanjan ohjelmiston (asiakas ja sovelluspalvelin) sekä tietokannan muodostama toiminnallinen kokonaisuus. Kurkijärjestelmä Laitoksen kurssikirjanpitojärjestelmä. Kutsuja Henkilö, joka haluaa tavata muita henkilöitä eli osallistujia itselleen sopivina ajankohtina. Käyttäjä Kutsuja tai osallistuja, joka käyttää järjestelmää jollain käyttöliittymällä. Lopullinen aikataulu Kutsujan hyväksymä aikataulu, joko järjestelmän alun perin ehdottama aikataulu tai kutsujan itse muokkaama aikataulu.
Muokattu aikataulu Ehdotettu aikataulu, johon kutsuja on tehnyt haluamiaan muutoksia. +Ohjelmisto Tanjajärjestelmän sovellukset: asiakas ja sovelluspalvelin. Osallistuja Henkilö, jonka kutsuja haluaa tavata. Osallistujan sopivuudet kutsujan määritteleminä aikoina syötetään järjestelmään. +RPC (Remote Procedure Call) Sovellusteknikka, jossa sovelluksen eri osat suoritetaan verkon kautta saavutettavissa toisissa koneissa. Ryhmä Kutsujan määrittelemä kokonaisuus, joka sisältää osallistujat sekä yhden tai useampia aikatauluja. Ryhmätapaaminen Ryhmän yhteinen tapaaminen, johon mahdollisimman moni ryhmän osallistujista osallistuu. Sopivuus Osallistujan tapaamisajoille annettu sopivuusarvo, "prioriteetti". Arvot ovat "Sopii hyvin", "Sopii kohtalaisesti"ja "Ei sovi". Järjestelmä käyttää myös arvoa "Ei tietoa"kuvaamaan sitä, että tietyltä osallistujalta ei ole tiedossa sopivuutta kyseiselle ajankohdalle. +Sovellus Tanjajärjestelmän asiakas tai palvelinohjelma. Tapaaminen Osallistujalle tai ryhmätapaamiselle valittu aika. Tapaamisen kesto Kutsujan valitsema yhden tapaamisen kesto. Vaihtoehdot ovat 10, 20, 15, 30, 45, 60 tai 120 minuuttia. Tapaamisen tyyppi Yhteen aikatauluun kuuluvien tapaamisten tyyppi. Aikataulu voi olla tyypiltään ryhmätapaaminen tai yksilötapaaminen. Tarjottu aika Kutsujan määrittelemä yksittäinen ajankohta (aloitus ja lopetusaika), jolloin hän haluaa tavata ryhmänsä osallistujia. Tarjottu aika sijoittuu tiettyihin viikonpäiviin tiettynä aikataulun määrittelemänä viikkojaksona. Vanhentunut aikataulu Aikataulu, jonka viikkojakso on jo päättynyt, mutta jota ei vielä ole poistettu järjestelmästä. Viikkojakso Kutsujan kalenterista valitsemat viikot, joiden aikana ryhmän tietty aikataulu on voimassa. Yksilötapaaminen Tapaaminen, jossa kutsuja tapaa henkilökohtaisesti yhden osallistujan. +XML (extensible Markup Language) Metakieli rakenteellisen tiedon kuvaamiseen. +XMLRPC Hajautettuissa verkkosovelluksissa käytetty RPCtoteutus (Remote Procedure Call), jossa metodikutsut toteutetaan HTTPprotokollan avulla vaihdettavilla XMLdokumenteilla. Ks. http://www.xmlrpc.com 2
2 Järjestelmän yleiskuvaus 3 Järjestelmää kehitetään ensisijaisesti Helsingin yliopiston tietojenkäsittelytieteen laitoksen käyttöön asennettavaksi. Vaikka ohjelmointikielenä käytetään sinäällään järjestelmäriippumatonta Javaa, ei testausta suoriteta kuin varsinaisissa kohdejärjestelmissä (kts. arkkitehtuuri). 2.1 Laiteympäristö Käyttöliittymä kehitetään yhtäaikaisesti kolmelle laiteympäristölle. Windows, Linux ja OS X järjestelmille toteutetaan yksi kaikille yhteinen sovellus. Käyttöliittymäsovelluksen laiteympäristönä voi olla lähes mikä tahansa tietokone. Palvelinsovellus kehitetään ja testataan db.cs.helsinki.fi nimiseen koneeseen asennettua Linuxjärjestelmää käyttäen. Tämä ei tarkoita, etteikö sovellus voisi toimia muissa ympäristöissä, mutta muita laiteympäristöjä ei pidetä varsinaisina kehityksen kohteina. 2.2 Ympäröivä järjestelmä Käyttöliittymäsovellus tarvitsee toimiakseen Java Runtime Environment (versio 5.0 tai uudempi). Sovellus käynnistetään käyttäen Java Web Start tekniikkaa. Palvelinsovellus tarvitsee toimiakseen tietokannan (PostgreSQL), wwwpalvelimen (Apache/tomcat) ja Javan ajonaikaisen ympäristön (Java Runtime Environment versio 5.0 tai uudempi).
3 Arkkitehtuuri 4 Tanja koostuu kolmesta pääosasta: asiakasohjelmasta, sovelluspalvelimesta sekä tietokannasta. Asiakasohjelma keskustelee sovelluspalvelimen kanssa verkon yli. Asiakasohjelman ja sovelluspalvelimen välinen keskustelu tapahtuu XMLRPCrajapinnan mukaisilla viesteillä. Sovelluspalvelin tallettaa pysyvää talletusta kaipaavat tiedot tietokantaan. Sovelluksen logiikka (aikataulujen laskenta) sijaitsee sovelluspalvelimessa. Asiakasohjelma on pääasiassa käyttöliittymä sovelluspalvelimen tarjoamille palveluille. Asiakasohjelma osaa käsitellä käyttäjän antamaa CSVmuotoista tietoa osallistujien tietojen syöttämisessä. Sovelluspalvelin lähettää sähköpostia. Muita ulkosia yhteyksiä ei ohjelmistolla ole. Kuva 1: Tanjajärjestelmän arkkitehtuuri. paikasta; voidaan vaihtaa resurssi toiseen; kaikki kyselyt yhdessä paikassa 3.1 Asiakasohjelma Tanjan asiakasohjelma (jatkossa asiakas) on graafisella käyttöliittymällä varustettu Javaohjelma (sovelma tai Web Start sovellus), joka käynnistetään WWWselaimella. Sovellus voidaan ohjata haluttuun tilaan WWWosoitteen (+URI) perusteella. Asiakas keskustelee XMLRPCviesteillä verkon yli sovelluspalvelimen kanssa esimerkiksi käyttäjä ja aikataulutietojen pysyväistalletusta varten. Asiakas pitää yllä yhteyttä sovelluspalvelimeen keepaliveviesteillä, joiden avulla sovelluspalvelin voi myös tiedottaa asiakkaalle mahdollisista virhetilanteista. Käyttäjien (kutsuja ja kutsuttava) tunnistus suoran URI:n perusteella ja siirtyminen haluttuun tilaan toteutetaan asiakkaan käynnistämän WWWsivun avustuksella avulla (esim. JavaScript). 3.2 Sovelluspalvelin Sovelluspalvelimen tehtävä on toimia sovelluksen ytimenä sekä huolehtia asiakasohjelmien ja tietokannan välisen liikenteen välittämisestä. Se vastaanottaa ja validoi asiakkailta tulevat palvelupyynnöt sekä toteuttaa ne.
Sovelluspalvelimen muodostaminen tapaamisaikataulujen muodostaminen annettujen sopivuuksien perusteella on koko järjestelmän tarkoitus. Aikataulut talletetaan tietokantaan. Sovelluspalvelin pitää kirjaa järjestelmään kirjautuneista kutsujakäyttäjistä ja katkaisee edellisen yhteyden jos sama käyttäjä kirjautuu sisälle toiseen kertaan. Sovelluspalvelimena toimii db.cs.helsinki.fi ja se toteutetaan Javatekniikalla. 5 3.3 Tietokantapalvelin Tietokantapalvelimeksi kelpaa mikä tahansa nykyaikainen SQLpalvelin. Talletettavat tietomäärät eivät ole suuria eikä tehokkaiden hakujen toteuttaminen tuota ongelmia. Tanjaohjelmisto käyttää PostgreSQLtietokantaa. 3.4 Algoritmit Tässä kappaleessa kuvataan aikataulujen muodostamisessa käytettävät algorimit. 3.4.1 Yksilötapaaminen MWMB: Yksilöaikataulu lasketaan kaksijakoisen verkon painotetulla sovituksella (Maximum Weighted Matching in Bipartite Graphs). Algoritmista on valmiita toteutuksia myös Javakielellä, mutta ne vaatinevat jonkin verran muokkausta soveltuakseen Tanjan käyttöön. 3.4.2 Ryhmätapaaminen Triviaali: Ryhmäaikataulussa valitaan aika, joka sopii mahdollisimman monelle osallistujalle edes tasolla Sopii kohtalaisesti. Riittää siis laskea mikä aika on mainittu useimpien osallistujien sopivuuksissa. Jos useampi aika sopii osallistujille yhtä hyvin, valitaan ajoista ensimmäinen.
4 Sopimukset ja standardit [?] 6 Tässä osassa kuvataan sovelluksen toteutuksessa noudatettavat standardit ja käytännöt. 4.1 Koodausperiaatteet Koodauksessa noudatetaan seuraavia käytäntöjä: Koodin ja kommentien kieli on suomi seuraavin poikkeuksin: 1) käytettään vain kirjanmerkkejä az, 2) aksessorimetodit alkavat sanoilla get ja set. Kommentointi javadoctyylin mukaan. Luokkien nimet kirjoitetaan isolla alkukirjaimella, metodien ja muuttujien nimet pienellä alkukirjaimella. Sanat aloitetaan isolla kirjaimella. Muuttujat nimetään tietokannan attribuuttien mukaan. 4.2 Standardit SQLrelaatiotietokantojen määrittelystandardi kvkielikoodit maakoodit merkistöt XML? HTML? PHP? JavaScript/ ECMA script Javadoc SMPT??? Nyt en muista jäikö asiakkaan haluamiin vaatimuksiin mitään meilin lähetystä
7 4.3 Käytettävät pakkaukset Ohjelmistossa käytetään seuraavia pakkauksia: Kuvaus Nimi ja versio Pakkaus PostgreSQLtietokantayhteys JDBC pg74jdbc3.jar Asiakassovelluspalvelin yhteys (XMLRPC) Apache XmlRpc 2.0 xmlrpc2.0.jar Sähköpostin lähetys JavaMail x.x.x mail.jar Yksikkötestaustyökalu JUnit x.x.x junit.jar 4.4 Prototyypit Sovellus rakennetaan ja testataan vaiheittain eritasoisilla prototyypeillä. Aikataulunmuodostusalgoritmit: irrallinen Javasovellus, joka hakee syöttötietonsa tekstitiedostosta. Sovelluspalvelin: Perl/PHPproto, jolla sovellus pääsee keskustelemaan tietokannan kanssa. Tarjoaa mahdollisesti tietokannan selailun WWWselaimella. Korvataan Javaversiolla, joka huolehtii (osan) sovelluslogiikasta. Asiakasohjelma: graafinen ohjelma, jossa suunnilleen oikeat välilehdet, mutta jossa arvot annetaan hiirellä valitsemisen/merkkaamisen sijasta esim. tekstisyöttökentillä ja pudotusvalikoilla. Käyttöliittymä: irrallinen sovellus, jolla tutkitaan graafisen käyttöliittymän rakentamista ja tarvittavien komponenttien (kalenteritaulukot, hiirellä valitseminen jne.) toteutusta.
5 Käyttäjäsovellus 8 miten käyttäjälle näkyvä osa sovelluksesta (appletti, Web Start sovellus, webisivu) toimii sisäänkirjautumislinkin toteutus virhetilanteet 5.1 Käyttöliittymä Käyttöliittymän elementit on määritelty niin, että niistä voidaan tehdä uudempia ja/tai hienompia versioita ilman, että niiden rajapinta muun sovelluksen suuntaan muuttuu [ks. protoluku]. Kuva 2: Tanjajärjestelmän yleisrakenne. Kuva 3: Tanjajärjestelmään perustettavien ryhmien perustietosivu Kuva 4: Järjestelmään tallennettujen ryhmien osallistujien tietojen syöttö ja hallinnointi. käyttöliittymän rakenne virhetilanteet
9 Kuva 5: Järjestelmän laskeman aikataulun esitys ja muokkaussivu. 6 Sovelluspalvelimen toteutus Tanjaohjelmiston sovelluspalvelin (jatkossa palvelin) muodostaa tapaamisaikatauluja tietokantaan talletettujen tarjottujen aikojen ja niihin liittyvien sopivuustietojen perusteella. login/logout miten sovelluspalvelin kommunikoi käyttäjäsovelluksen ja tietokannan kanssa virhetilanteet 6.1 XMLRPCrajapinta Asiakkaan ja palvelimen välinen tiedonsiirto tapahtuu sovelluksen kannalta läpinäkyvästi XMLRPCprotokollalla siten, että osa asiakkaan metodikutsuista päätyy käytännössä lähettämään RPCpyynnön sovelluspalvelimelle. Asiakkaan metodia vastaa yksi yhteen palvelimen vastaava varsinaisen sovelluslogiikan tekevä metodi. Asiakas koodaa metodin parametrit, suorittaa metodikutsun ja jää odottamaan paluuarvoa ja purkaa sen sen saatuaan. Palvelin vastaanottaa kutsun, purkaa parametrit, toteuttaa pyynnön, paketoi paluuarvon ja lähettää vastauksen. määritellään vaihdettavat XMLRPCviestit sekä niiden sisällöt. tai todetaan mitkä rajapinnat/metodit toteutetaan XMLRPC:llä. Välitettävät viestit voivat kuvata sovelluksen eri abstraktiotasoja: Sisältö Selitys Sovelluslogiikka SQLlauseet Sovelluspalvelin on vain yhdyskäytävä tietokantaan. Mahdollinen Asiakasohjelmassa. protototeutus. Sovellus Sovellusluokkien get/setmetodit: ryhmät, aikataulut, osallistujat. Palvelimessa. Käyttöliittymä Käyttöliittymäluokkien get/setmetodit: välilehdet, luettelot, näytöt, tekstikentät. Palvelimessa. Tanjajärjestelmä toteutetaan käyttöliittymätason RPCkutsuilla eli itse sovelluslogiikka sijaitsee sovelluspalvelimessa. Toteutettavien luokkien/metodien yhteydessä mainitaan onko kyseessä RPCrajapinnan asiakas vai palvelintoteutus. virhetilanteet
7 Tietokannan toteutus 10 tietokantakaaviot 7.1 Taulut Taulut on nimetty yksikkömuotoon (KAYTTAJA, RYHMA). [HUOM: Pidetäänkö kenttänimet kokonaan yksikäsitteisinä vai onko jokaisen idkenttä nimeltään id ]. Merkintä =tbl:f tarkoittaa eheystarkistusta taulun tbl kentän f kanssa eli että tämä kenttä voi saada vain arvoja, jotka esiintyvät taulun tbl kentässä f. Toteutetaan CONSTRAINTmääreellä kentän luontivaiheessa: kid int constraint ryhma_kayttaja_id_check references kayttaja(kid) Aikaleimojen Datetyyppi toteutetaan PostgreSQL:n timestamp with time zone tyypillä. Taulu KAYTTAJA Käyttäjien tiedot kid serial Tietokannan generoima juokseva yksikäsitteinen tunniste. Asetetaan halutuksi näin: select setval( kayttaja_kid_seq,372). etunimi varchar sukunimi varchar sposoite varchar Sähköpostiosoite. salasana varchar uusisalasana varchar Asetettu, jos salasanaa ollaan vaihtamassa, muuten NULL. viimkaytto date Viimeisin käyttöaika. Päivitetään kun [tarvitaan tarkka lista!] käyttäjä loggaa sisälle, käyttäjän tiedot muuttuvat tai kun käyttäjälle määritellään sopivuuksia. Taulu RYHMA Ryhmien tiedot rid serial Juokseva tunniste. rnimi varchar Ryhmän nimi. kid =kayttaja:kid Ryhmän kutsuja. viimkaytto date Viimeisin käyttöaika. Päivitetään kun ryhmän aikatauluja päivitetään? Taulu OSALLISTUMINEN Ryhmiin osallistuminen kid =kayttaja:kid Käyttäjä kid osallistuu ryhmään rid. rid =ryhma:rid viimkaytto date Viimeisin käyttöaika. TARVITAANKO? Voidaanko edes päivittää?
Taulu AIKATAULU Aikataulujen tiedot aid serial Juokseva tunniste. rid =ryhma:rid Ryhmä, johon aikataulu liittyy. viikonpaivat varchar Koodataan viikonpäivälista merkkijonoksi: 0 2 3 5. alkupvm date Viikkojakson alku. loppupvm date Viikkojakson loppu. tap_pituus int Minuutteja. tap_tyyppi int 1=Yksilötapaaminen, 2=Ryhmätapaaminen. viimkaytto date Viimeinen käyttöaika. Päivitetään kun aikatauluja lasketaan. Taulu TARJOTTU Tarjotut ajat aid =aikataulu:aid Aikataulu, johon tarjotut ajat kuuluvat. kid =kayttaja:kid Aika varattu ko. käyttäjälle, NULL (tai 0) jos vapaa. Eheystarkistus ei ehkä onnistu koska NULL on sallittava. alkuaika date Tarjotun ajan alku. loppuaika date Tarjotun ajan loppu. Näiden erotus on tapaamisen pituus. viimkaytto date Päivitetään milloin? Taulu SOPIVUUS Sopivuudet aid =aikataulu:aid Aikataulu, jonka sopivuuksia käyttäjälle kid kerrotaan. kid =kayttaja:kid alkuaika date Sopivuus alkaa tähän aikaan. loppuaika date Sopivuus loppuu tähän aikaan. Näiden väliin jää aikaväli, joka jaketaan aikataulusta saatavan tap_pituuskentän mukaisiksi paloiksi, joille muodostetaan aikataulu. sopivuus int Sopivuusarvo 03. viimkaytto date Viimeisin käyttöaika. Päivitetään milloin? Taulu POHJA Viestipohjat aid =aikataulu:aid Aikataulu, jonka viestipohjia muokataan. tyyppi int Arvot: 1=kutsu, 2=kutsuotsikko, 3=ilmoitus, 4=ilmoitusotsikko. teksti varchar(1000) Pohjateksti. viimkaytto date Viimeisin käyttöaika. Miten päivitetään? Taulu TILA Ohjelman tila kid =kayttaja:kid Käyttäjän kid edellinen näkymä sovelluksessa. tila int Käyttöliittymän näytön tunnusnumero. Taulu YHTEYS Käyttäjän yhteys sovellukseen kid =kayttaja:kid Käyttäjän kid istunnon aktiivisuus. login date Milloin istunto on alkanut. Jos sisääntullessa löydetään uudempi kuin [MÄÄRITELTÄVÄ] X istunto, heitetään edellinen ulos. 11
8 Kirjastometodit 12 tämä ehkä tulee muualta 9 Luokkakuvaukset Tässä luvussa esitellään luokat ja niiden tarjoamat palvelut. [LISÄÄ TEKSTIÄ TÄHÄN esim nimeämisestä] Palvelut on kuvattu seuraavassa muodossa: palvelunnimi() Kuvaus palvelun toiminnasta. nimi tyyppi arvojoukko Tyyppi (paluuarvon kuvaus) Palveluun liittyvät poikkeustilanteet 9.1 Kayttaja Käyttäjä voi olla kutsuja tai osallistuja. [LISÄÄ KUVAUSTEKSTIÄ] 9.1.1 haekayttaja() Staattinen metodi, joka hakee tietyn Kayttajaolion parametrinä annetun sähköpostiosoitteen perusteella. sahkoposti String määritelty vaatimuksissa Kayttaja (haettu Kayttajaolio, jos ei löydy niin Null) sähköpostiosoitteella ei löydy käyttäjää 9.1.2 tarkistasahkoposti() Staattinen metodi, joka tarkistaa, että annettu sähköpostiosoite on oikean muotoinen. sahkoposti String määritelty vaatimuksissa
13 boolean (true, jos osoite oikean muotoinen, muuten false) 9.1.3 tarkistasalasana() Staattinen metodi, joka tarkistaa, että annettu salasana on oikean muotoinen. salasana String määritelty vaatimuksissa boolean (true, jos osoite oikean muotoinen, muuten false) 9.1.4 Kayttaja() Konstruktori, joka luo uuden Kayttajaolion. öntä konstruktoria ei ole, koska kaikki parametrinä annettavat attribuutit ovat pakollisia. Metodi tarkistaa ensin, että sähköpostiosoite ei ole vielä käytössä. etunimi String sukunimi String sahkoposti String määritelty vaatimuksissa salasana String määritelty vaatimuksissa Kayttaja (uusi Kayttajaolio tai Null, jos olion luominen ei onnistu) Sähköpostiosoite on jo käytössä eivät oikean muotoisia 9.1.5 poista() Poistaa Kayttajaolion. boolean (true, jos poisto onnistui, muuten false)
14 9.1.6 setetunimi() Asettaa tai vaihtaa käyttäjän etunimen. etunimi String void 9.1.7 getetunimi() Hakee käyttäjän etunimen. String (käyttäjän etunimi) 9.1.8 setsukunimi() Asettaa tai vaihtaa käyttäjän sukunimen sukunimi String void 9.1.9 getsukunimi() Hakee käyttäjän sukunimen String (käyttäjän sukunimi)
15 9.1.10 setsahkoposti() Asettaa tai vaihtaa käyttäjän sähköpostiosoitteen. Sähjöpostiosoitteen kelvollisuus tarkistetaan metodilla tarkistasahkoposti(). [HUOM Miten toimitaan sähköpostiosoitteen kuittausviestin kanssa salasanan vaihdossa?] sahkoposti String määritelty vaatimuksissa void 9.1.11 getsahkoposti() Hakee käyttäjän sähköpostiosoitteen. String (käyttäjän sähköposti) 9.1.12 setsalasana() Asettaa tai vaihtaa käyttäjän salasanan. Salasanan kelvollisuus tarkistetaan metodilla tarkistasalasana(). salasana String määritelty vaatimuksissa void 9.1.13 getsalasana() Hakee käyttäjän salasanan. String (käyttäjän salasana)
16 9.1.14 lisaaryhma() Lisää käyttäjälle (kutsuja) uuden ryhmän. [HUOM nimellä tai ilman] nimi String Ryhma (uusi ryhmä) ei voi lisätä ryhmiä jos käyttäjä ei kutsuja 9.1.15 getryhmat() Hakee käyttäjän ryhmät. Collection [? TARKISTA] (kokoelma Ryhmaolioita) ei ryhmiä jos käyttäjä vain osallistuja? tai palauttaa tyhjän kokoelman? tehdäänkö eri metodit kutsujan ja osallistujien ryhmien hakuun? 9.1.16 getsopivuudet() Hakee käyttäjän sopivuudet tietyssä aikataulussa. aikataulu Aikataulu Collection [? TARKISTA] (kokoelma Sopivuusolioita) 9.2 Ryhma Ryhmien ylläpitotoimet yms [LISÄÄ KUVAUSTEKSTIÄ]
17 9.2.1 Ryhma() Konstruktori, joka luo uuden Ryhmaolion. [HUOM Kuormitetaan? Tehdään sekä tyhjä konstruktori sekä konstruktori, jossa annetaan ryhmän nimi parametrinä, koska nimi ei ole pakollinen attribuutti ryhmän luonnissa.] nimi String Ryhma (uusi Ryhmaolio) voidaan luoda myös nimetön ryhmä 9.2.2 poista() Poistaa Ryhmaolion ja siihen kuuluvat Aikatauluoliot. boolean (true, jos poisto onnistui, muuten false) 9.2.3 setnimi() Asettaa tai vaihtaa ryhmän nimen. nimi String void 9.2.4 getnimi() Palauttaa ryhmän nimen. String (ryhmän nimi)
18 9.2.5 lisaaosallistuja() Lisää osallistujan ryhmään. Ennen osallistujan lisäämistä metodi tarkistaa, löytyykö sähköpostiosoitteella jo Kayttajaolio Tanjajärjestelmästä ja jos ei löydy, luo osallistujaa varten uuden Kayttajaolion. etunimi String sukunimi String sahkoposti String määritelty vaatimuksissa Kayttaja (lisätty osallistuja) osallistuja on jo ryhmässä [HUOM ei tehdä mitään?] kutsuja lisää itsensä ryhmään [HUOM ok?] 9.2.6 poistaosallistuja() Poistaa osallistujan ryhmästä. Samalla poistetaan osallistujan sopivuudet ryhmän aikatauluissa. osallistuja Käyttäjä boolean (true, jos poisto onnistui, muuten false) 9.2.7 getosallistujat() Hakee ryhmän osallistujat. Collection [? TARKISTA] (kokoelma Kayttajaolioita)
19 9.2.8 getosallistujienlkm() Hakee ryhmän osallistujien lukumäärän. int (osallistujien lukumäärä) 9.2.9 lisaaaikataulu() Lisää ryhmälle aikataulun. [HUOM Kuormitetaanko: nimi tai ilman nimeä] nimi String Aikataulu (uusi aikataulu) 9.2.10 getaikataulut() Hakee ryhmän aikataulut. paluuarvo Collection [? TARKISTA] (kokoelma Aikatauluolioita) 9.3 Aikataulu Aikataulun ylläpito ja käsittely, laskenta yms [LISÄÄ KUVAUSTEKSTIÄ] 9.3.1 Aikataulu() Konstruktori, joka luo uuden Aikatauluolion.[HUOM Kuormitetaan? Tehdään sekä tyhjä konstruktori sekä konstruktori, jossa annetaan aikataulun nimi parametrinä, koska nimi ei ole pakollinen attribuutti aikataulun luonnissa.] nimi String
20 Aikataulu (uusi Aikatauluolio) voidaan luoda myös nimetön aikataulu 9.3.2 poista() Poistaa Aikatauluolion ja siihen liittyvät TarjottuAika ja Sopivuusoliot. boolean (true, jos poisto onnistui, muuten false) 9.3.3 setnimi() Asettaa tai vaihtaa aikataulun nimen. nimi String Palauttaa true/false? 9.3.4 getnimi() Palauttaa aikataulun nimen. String (aikataulun nimi) 9.3.5 settyyppi() Asettaa tai vaihtaa aikataulun tyypin (yksilö tai ryhmätapaaminen).
21 tyyppi int 1 tai 2 tms [HUOM tarkista] Palauttaa true/false? ei voi vaihtaa kun aikataululla on olemassa sopivuuksia 9.3.6 gettyyppi() Palauttaa aikataulun tyypin. String (aikataulun tyyppi) 9.3.7 setalkupvm() Asettaa tai vaihtaa aikataulun viikkojakson alkupäivän. alkupvm Date alkupvm >= tänään AND alkupvm <=loppupvm boolean (true jos muutos onnistui, muuten false) ei voi vaihtaa kun aikataululla on olemassa sopivuuksia 9.3.8 getalkupvm() Palauttaa aikataulun viikkojakson alkupäivän. Date (viikkojakson alkupäivä)
22 9.3.9 setloppupvm() Asettaa tai vaihtaa aikataulun viikkojakson loppupäivän. loppupvm Date alkupvm >= tänään AND alkupvm <=loppupvm boolean (true jos muutos onnistui, muuten false) ei voi vaihtaa kun aikataululla on olemassa sopivuuksia 9.3.10 getloppupvm() Palauttaa aikataulun viikkojakson loppupäivän. Date (viikkojakson loppupäivä) 9.3.11 settapaamisenkesto() Asettaa tai vaihtaa aikataulun tapaamisten keston. kesto int määritelty vaatimuksissa void ei voi vaihtaa kun aikataululla on olemassa sopivuuksia 9.3.12 gettapaamisenkesto() Palauttaa aikataulun tapaamisten keston. int (tapaamisen kesto)
23 9.3.13 setviikonpaivat() Asettaa tai vaihtaa aikataulun viikonpäivät. viikonpaivat int [MÄÄRITELTÄVÄ] void ei voi vaihtaa kun aikataululla on olemassa sopivuuksia 9.3.14 getviikonpaivat() Palauttaa aikataulun viikonpäivät. int (viikonpäivät) 9.3.15 lisaatarjottuaika() Lisää aikatauluun kutsujalle sopivan tarjotun ajan. alkuaika Date [MÄÄRITELTÄVÄ miten osuu oikealle aikavälille?] loppuaika Date [MÄÄRITELTÄVÄ] TarjottuAika (uusi tarjottu aika) 9.3.16 gettarjotutajat() Hakee kaikki aikataulun tarjotut ajat Collection (kokoelma TarjottuAikaolioita)
24 9.3.17 gettarjottujenaikojenlkm() Hakee tarjottujen aikojen lukumäärän, jotta sitä voidaan käyttöliittymässä verrata ryhmän osallistujamäärään. int (tarjottujen aikojen lukumäärä) 9.3.18 laskeaikataulu() Laskee osallistujien sopivuusarvojen perusteella optimaalisen aikataulun. (HUOM Yhdistää tarjotun ajan tietyyn osallistujaan?] Collection (kokoelma TarjottuAikaolioita, joihin on lisätty viite johonkin osallistujaan) 9.4 TarjottuAika Tarjotun ajan ylläpito ja käsittely. [HUOM miten tarjottu aika määritellään, koska se on joka viikko samaan aikaan? ei voi käyttää päivämääriä?] 9.4.1 TarjottuAika() Konstruktori, joka luo uuden TarjottuAikaolion. alkuaika Date loppuaika Date TarjottuAika (uusi TarjottuAikaolio) jos tarjottu aika ei sisälly kalenterin viikkojaksoon?
25 9.4.2 poista() Poistaa TarjottuAikaolion ja siihen liittyvät Sopivuusoliot. boolean (true, jos poisto onnistui, muuten false) 9.4.3 setalkuaika() Asettaa tai vaihtaa tarjotun ajan alkuajan. alkuaika Date [TARKISTA] void 9.4.4 getalkuaika() Palauttaa tarjotun ajan alkuajan. Date (tarjotun ajan alkuaika) 9.4.5 setloppuaika() Asettaa tai vaihtaa tarjotun ajan loppuajan. loppuaika Date [TARKISTA] void
26 9.4.6 getloppuaika() Palauttaa tarjotun ajan loppuajan. Date (tarjotun ajan loppuaika) 9.4.7 getsopivuudet() Palauttaa tiettyyn tarjottuun aikaan annetut sopivuudet. Collection [? TARKISTA] (kokoelma Sopivuusolioita) 9.4.8 setosallistuja() Liittää tarjottuun aikaan osallistujan, jolloin tarjotusta ajasta tulee tapaaminen. osallistuja Kayttaja joku Käyttäjäolio, joka on ryhmän osallistuja void 9.4.9 getosallistuja() Palauttaa tiettyyn tarjottuun aikaan liitetyn osallistujan. Kayttaja (tarjottuun aikaan liitetty osallistuja)
27 9.5 Sopivuus Sopivuuden ylläpito ja käsittely. 9.5.1 Sopivuus() Konstruktori, joka luo uuden Sopivuusolion. sopivuusarvo int määritelty vaatimuksissa Sopivuus (uusi Sopivuusolio) 9.5.2 poista() Poistaa Sopivuusolion. boolean (true, jos poisto onnistui, muuten false) 9.5.3 setsopivuusarvo() Asettaa tai vaihtaa sopivuuden sopivuusarvon. sopivuusarvo int boolean (true, jos onnistui, muuten false) 9.5.4 getsopivuusarvo() Palauttaa sopivuuden sopivuusarvon nimen.
28 int (sopivuusarvo) 9.6 Tieto/luokkaluonnoksia käyttäjänhallinta login login.uri register ryhmät add delete properties osallistujat add delete properties csvimport line separator sopivuus add delete aikataulut add delete invite.email properties calculate display edit sort notify.email näytön tila getstate setstate
10 Sekvenssikaaviot eri käyttötapauksista 29 Kuvataanko käyttötapaukset sekvenssikaavioina?
11 Testaussuunnitelma 30 Tanjaohjelmisto testataan tässä dokumentissa kuvatulla tavalla. Kuinka testataan, mitä välineitä käytetään, testausstrategia (yksikkö, integraatio, järjestelmä, hyväksymistestaus). Kuvataan testitapaukset, henkilöstö, laitteisto ja menettelytavat. Mitä testataan, osaalueisiin jako Mikä on hyväksyttävä testitulos Vastuuhenkilö, kuka hyväksyy Selkeä maininta mitä ei testata Jokaisessa testitapauksessa: syöte ja odotettu tulos Miten ja kenelle virheistä raportoidaan 11.0.1 T estitapausluokka < testitapaus (= pienin testattava osa, yksittäinen testi) Testitapausten luokittelu esim. tärkeysjärjestyksessä (1,2,3...), vakavuusluokittain (A,B,C...) tai tyypeittäin (esim. a palvelinvirhe, b tietokantavirhe, c clientvirhe) Luokittelu myös esim: toiminnalliset, eitoiminnalliset, oletetut tavanomaiset käyttötapaukset, virhetilanteet, rajaarvotilanteet Avuksi tilasiirtymäkaavio tai sekvenssikaavio. Myös näyttökartta. 11.1 Testauksen tavoitteet Testauksen tavoitteena on varmistua siitä, että valmistuva ohjelmisto toimii virheettömästi ja toteuttaa sille asetetut vaatimukset (kuvattu vaatimusdokumentissa). Menettelytavat: Jako: mitä tapahtuu missäkin + käyttäjäryhmittäin Käytetään samaa numerointia kuin vaatimusdokumentissa (jatka samaa numerointia myös testausraportissa!) Testaussuunnitelmaan numero + testitapauksen nimi Testausraportissa testin numero ja testitapaus Virheanalyysi: Milloin virhe tehtiin Mitä tehtiin väärin Miten virhe olisi voitu estää Miksei virhettä havaittu aiemmin Miten virhe olisi voitu havaita aiemmin
31 Miten virhe havaittiin => Tavoitteena ymmärtää miten tuotantoprosessia tulee muuttaa jottei virhettä toistettaisi. Testausraportin muoto riippuu testaussuunnitelmasta esim. kynällä täytettävä, wwwlomake jne.(esimerkki: http://db.cs.helsinki.fi/s/mpori/bugi) 11.2 Testauksessa käytettävät apuvälineet Eclipse JUnit RITA? 11.3 Testivaiheet Testataan toiminnalliset vaatimukset (määrittelydokumentista) Muut (eitoiminnalliset vaatimukset) Mitä ohjelma ei saa tehdä 11.3.1 Yksikkötestaus/Luokkatestaus (ohtu) Matalimman tason testausta. Siinä testataan yksittäisiä luokkia tai ryppäitä (clusters). Luokka testataan lähettämällä luokan metodeille yksi kerrallaan viestejä (kutsumalla niitä). Luokka testataan metodiensa kautta. Pelkkä yksittäisten metodien kutsuminen ei riitä kun luokan metodeilla on keskinäisiä riippuvuuksia. (Kokeiltava eri tiloja vaihtelemalla metodien kutsujärjestystä). Yliluokat: Luokka on kokoelma sille määriteltyjä ja sen yliluokilta perimiä metodeja ja attribuutteja > pelkkä aliluokan metodien käyttö testauksessa ei välttämättä riitä (koska aliluokan metodit voivat muuttaa perittyjen yliluokan metodien toimintaa muuttamalla olioiden tiloja.) Mahd. ratkaisu: litistetään luokka eli otetaan testattavaksi luokaksi yhdistelmä aliluokasta ja sen perimistä kaikista yliluokista => Voi olla kallista jos syvä perintähierarkia! Milloin luokkaa voi testata:1) Kun se on kirjoitettu valmiiksi ja siihen on integroitu metodit. 2) Luokassa ei ole testausta estäviä isoja virheitä. Luokan valmistelu testausta varten: 1) Yksinkertaiset luokat: kootaan metodit yhteen (Small Pop kokoaminen) 2) Monimutkaiset ja ehkä isoja virheitä sisältävät luokat Alfa Omega syklillä. AlfaOmega sykli: Jokaiselle oliolle voidaan määritellä 2 virtuaalitilaa (alfa ja omega) Alfa: olion tila juuri ennen sen luontia Omega: olion tilaa heti sen tuhoamisen jälkeen.
AOsyklissä suoritetaan savutesti suorittamalla jokainen sen metodi ainakin kerran. Jos sykli menee läpi, olion katsotaan olevan testauskelpoisessa kunnossa. whitebox: kukin koodirivi vähintään kerran kaikki haaraumat testataan silmukat: ei kertaakaan, kerran, normaali, maksimi, kerran yli maksimin 32 11.3.2 Integrointitestaus usein sulautuu joko yksikkötestaukseen tai järjestelmätestaukseen. blackbox: rajapinnat 11.3.3 Järjestelmätestaus käyttöliittymän kautta 11.3.4 Hyväksymistestaus Asiakkaan kanssa vaatimusdokumentin opastamana.