Suunnittelu Sahararyhmä Helsinki 31.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 jarajapintoja/hl. 1.41 7.7.2005 Johdantoa ja arkkitehtuuria. 1.43 8.7.2005 Arkkitehtuuri ja standardilukuja. SovelluksenRPCkuvausta./SS 1.5 18.7.2005 Tietokantataulujen kuvausta./ss 1.6 2.8.2005 Tekstin editointia ja siivousta /SK 1.7 27.8.2005 Viimeistely ja alkusanat./ss 1.71 31.8.2005 Viimeiset korjaukset./ss
Sisältö i 1 Alkusanat ja huomautus 1 2 Johdanto 1 2.1 Dokumentin rakenne............................ 1 2.2 Termit.................................... 1 3 Järjestelmän yleiskuvaus 4 3.1 Laiteympäristö............................... 4 3.2 Ympäröivä järjestelmä........................... 4 4 Arkkitehtuuri 5 4.1 Asiakasohjelma............................... 5 4.2 Sovelluspalvelin............................... 5 4.3 Tietokantapalvelin.............................. 6 4.4 Algoritmit.................................. 6 4.4.1 Yksilötapaaminen......................... 6 4.4.2 Ryhmätapaaminen......................... 6 5 Toteutusperiaatteet ja ympäristö 7 5.1 Koodausperiaatteet............................. 7 5.2 Käytettävät pakkaukset........................... 7 5.3 Prototyypit................................. 7 6 Käyttäjäsovellus 8 6.1 Käyttöliittymä................................ 8 7 Sovelluspalvelimen toteutus 9 7.1 XMLRPCrajapinta............................ 10 8 Tietokannan toteutus 11 8.1 Taulut.................................... 11 9 Luokkakuvaukset 13 9.1 Kayttaja................................... 13 9.1.1 haekayttaja()............................ 13
ii 9.1.2 tarkistasahkoposti()........................ 15 9.1.3 tarkistasalasana().......................... 15 9.1.4 Kayttaja().............................. 15 9.1.5 poista()............................... 15 9.1.6 setetunimi()............................ 16 9.1.7 getetunimi()............................ 16 9.1.8 setsukunimi()............................ 16 9.1.9 getsukunimi()........................... 17 9.1.10 setsahkoposti()........................... 17 9.1.11 getsahkoposti()........................... 17 9.1.12 setsalasana()............................ 17 9.1.13 getsalasana()............................ 18 9.1.14 lisaaryhma()............................ 18 9.1.15 getryhmat()............................ 18 9.1.16 getsopivuudet()........................... 18 9.2 Ryhma.................................... 19 9.2.1 Ryhma().............................. 19 9.2.2 poista()............................... 19 9.2.3 setnimi().............................. 19 9.2.4 getnimi().............................. 20 9.2.5 lisaaosallistuja().......................... 20 9.2.6 poistaosallistuja()......................... 20 9.2.7 getosallistujat()........................... 20 9.2.8 getosallistujienlkm()....................... 21 9.2.9 lisaaaikataulu()........................... 21 9.2.10 getaikataulut()........................... 21 9.3 Aikataulu.................................. 21 9.3.1 Aikataulu()............................. 22 9.3.2 poista()............................... 22 9.3.3 setnimi().............................. 22 9.3.4 getnimi().............................. 22 9.3.5 settyyppi()............................. 23 9.3.6 gettyyppi()............................. 23
iii 9.3.7 setalkupvm()............................ 23 9.3.8 getalkupvm()............................ 23 9.3.9 setloppupvm()........................... 24 9.3.10 getloppupvm()........................... 24 9.3.11 settapaamisenkesto()....................... 24 9.3.12 gettapaamisenkesto()....................... 24 9.3.13 setviikonpaivat().......................... 25 9.3.14 getviikonpaivat().......................... 25 9.3.15 lisaatarjottuaika()......................... 25 9.3.16 gettarjotutajat().......................... 25 9.3.17 gettarjottujenaikojenlkm().................... 26 9.3.18 laskeaikataulu().......................... 26 9.4 TarjottuAika................................. 26 9.4.1 TarjottuAika()........................... 26 9.4.2 poista()............................... 26 9.4.3 setalkuaika()............................ 27 9.4.4 getalkuaika()............................ 27 9.4.5 setloppuaika()........................... 27 9.4.6 getloppuaika()........................... 28 9.4.7 getsopivuudet()........................... 28 9.4.8 setosallistuja()........................... 28 9.4.9 getosallistuja()........................... 28 9.5 Sopivuus................................... 29 9.5.1 Sopivuus()............................. 29 9.5.2 poista()............................... 29 9.5.3 setsopivuusarvo().......................... 29 9.5.4 getsopivuusarvo()......................... 29 10 Testaus 31
1 Alkusanat ja huomautus 1 Tanjajärjestelmän suunnitteludokumentti oli etenkin käyttöliittymän toteutuksen kohdalta vielä puutteellinen siinä vaiheessa, kun projektiryhmä päätti luopua järjestelmän toteuttamisesta tässä dokumentissa suunnitelluilla tekniikoilla: Java solvelma/web Start sovellus + XMLRPC + Javasovelluspalvelin. Toteutettavaksi valitun PHPversion käyttöliittymä sekä suurin osa sovelluslogiikasta on kuitenkin toteutettu tässä dokumentissa esitetyllä tavalla. Toteutuksen yksityiskohdat on kuvattu toteutusdokumentissa. 2 Johdanto Tanjajärjestelmän suunnitteludokumentti kuvaa yksityiskohtaisesti sekä täsmällisellä teknisellä tasolla miten järjestelmä toimii ja miten se toteutetaan vaatimusmäärittelydokumentin pohjalta. 2.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. 2.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ä. +URI Universal Resource Identifier, WWWosoitteiden yleinen muoto. Viikkojakso Kutsujan kalenterista valitsemat viikot, joiden aikana ryhmän tietty aikataulu on voimassa. 2
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 3
3 Järjestelmän yleiskuvaus 4 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). 3.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 moderni tietokone. Palvelinsovellus kehitetään ja testataan db.cs.helsinki.finimiseen 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. 3.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) ja Javan ajonaikaisen ympäristön (Java Runtime Environment versio 5.0 tai uudempi).
4 Arkkitehtuuri 5 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 ulkoisia yhteyksiä ei ohjelmistolla ole. Kuva 1: Tanjajärjestelmän arkkitehtuuri. 4.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 sitä kutsuvan 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). 4.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. Sovelluspalvelin toimii koneessa db.cs.helsinki.fi ja se toteutetaan Javatekniikalla. 6 4.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 koneessa db.cs.helsinki.fi. 4.4 Algoritmit Tässä kappaleessa kuvataan aikataulujen muodostamisessa käytettävät algorimit. 4.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. 4.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.
5 Toteutusperiaatteet ja ympäristö 7 Tässä osassa kuvataan sovelluksen toteutuksessa noudatettavat standardit ja käytännöt. 5.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. 5.2 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 1.0.2 mail.jar Yksikkötestaustyökalu JUnit 3.8.1 junit.jar 5.3 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 myös 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.
8 6 Käyttäjäsovellus Tanjan käyttäjäsovellus on käyttäjän koneessa WWWselaimen käynnistämä Javaohjelma, joko sovelma tai Web Start sovellus. 6.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. Käyttöliittymän ulkoasu on kuvattu määrittelydokumentissa. Kuvissa 25 on sen olennaisten osien toteutusluonnokset Swingkomponenteilla toteutettaessa. YlaPaneeli (JPanel) FlowLayout Sivun yleisrakenne ValikkoPaneeli (JPanel) GridLayout RyhmaValikkoPaneeli (JPanel) BorderLayout AikatauluValikkoPaneeli (JPanel) BorderLayout JLabel JButton JLabel JButton Logo (Image?) JTable + JScrollPane JTable + JScrollPane TanjaSovelma (JApplet) BorderLayout ValilehtiPaneeli (JTabbedPane) Välilehdittäin vaihtuvat paneelit (JPanel) Katso seuraava sivu > Lähde: A Visual Index to the Swing Components http://java.sun.com/docs/books/tutorial/uiswing/components/components.html Kuva 2: Tanjajärjestelmän käyttöliittymän yleisrakenne.
9 Perustiedotvälilehti PerustiedotOikeaPaneeli (JPanel) BorderLayout ValilehtiPaneeli JLabel JToolBarl JLabel (JTabbedPane) JLabel JTable JRadioButton PerustiedotPaneeli (JPanel) JLabel BorderLayout JList PerustiedotVasenPaneeli (JPanel) FlowLayout? Kalenteri? Kuva 3: Tanjajärjestelmään perustettavien ryhmien perustietosivu Osallistujatvälilehti OsallistujatOikeaPaneeli (JPanel) BorderLayout ValilehtiPaneeli (JTabbedPane) JLabel JLabel JToolBarl JLabel JTable OsallistujatPaneeli (JPanel) BorderLayout JTable OsallistujatVasenPaneeli (JPanel) FlowLayout? JButton JButton Kalenteri? Kuva 4: Järjestelmään tallennettujen ryhmien osallistujien tietojen syöttö ja hallinnointi. 7 Sovelluspalvelimen toteutus Tanjaohjelmiston sovelluspalvelin (jatkossa palvelin) muodostaa tapaamisaikatauluja tietokantaan talletettujen tarjottujen aikojen ja niihin liittyvien sopivuustietojen perusteella.
10 Aikatauluvälilehti AikatauluOikeaPaneeli (JPanel) BorderLayout ValilehtiPaneeli (JTabbedPane) JLabel JLabel Kalenteri? JTable AikatauluPaneeli (JPanel) BorderLayout AikatauluVasenPaneeli (JPanel) FlowLayout? JButton JButton Kuva 5: Järjestelmän laskeman aikataulun esitys ja muokkaussivu. 7.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. 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 kokonaan sovelluspalvelimessa. Toteutettavien luokkien/metodien yhteydessä mainitaan onko kyseessä RPCrajapinnan asiakas vai palvelintoteutus. Tanjan protoversioissa käytetään sekä tietokanta että sovellustason RPCkutsuja.
8 Tietokannan toteutus 11 Tässä luvussa esitellään Tanjan käyttämän tietokannan taulut. 8.1 Taulut Taulut on nimetty yksikkömuotoon (KAYTTAJA, RYHMA). 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. 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 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
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:aidaikataulu, 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 kun aika määritellään. Taulu SOPIVUUS Sopivuudet aid =aikataulu:aidaikataulu, 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. Taulu POHJA Viestipohjat aid =aikataulu:aidaikataulu, jonka viestipohjia muokataan. tyyppi int Arvot: 1=kutsu, 2=kutsuotsikko, 3=ilmoitus, 4=ilmoitusotsikko. teksti varchar(1000) Pohjateksti. viimkaytto date Viimeisin käyttöaika. 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 määriteltävää aikaa vanhempi voimassa oleva istunto, heitetään se ulos. 12
9 Luokkakuvaukset 13 Tässä luvussa esitellään Tanjan sovelluslogiikan (aikataulujen muodostaminen) luokat ja niiden tarjoamat palvelut. Seuraavalla sivulla olevassa kuvassa on kuvattu järjestelmän luokat. 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. 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ää
Kayttaja etunimi:string sukunimi:string sahkoposti:string salasana:string kutsujanryhmat:collection osallistujansopivuudet:collection +Kayttaja():Kayttaja +poista():boolean +setetunimi(_etunimi:string):void +getetunimi():string +setsukunimi(_sukunimi:string):void +getsukunimi():string +setsahkoposti(_sahkoposti:string):void +getsahkoposti():string +setsalasana(_salasana:string):void +getsalasana():string +lisaaryhma():ryhma +getryhmat():collection +getsopivuudet(aikataulu:aikataulu):collection +haekayttaja(sahkoposti:string):kayttaja +tarkistasahkoposti(sahkoposti:string):boolean +tarkistasalasana():void * Kutsuja Osallistuja Tapaaminen * 1..* Ryhma nimi:string kutsuja:kayttaja osallistujat:collection aikataulut:collection +Ryhma():Ryhma +poista():boolean +setnimi(_nimi:string):void +getnimi():string +lisaaosallistuja():kayttaja +poistaosallistuja():boolean +getosallistujat():collection +getosallistujienlkm():int +getaikataulut():collection alkuaika:date loppuaika:date osallistuja:kayttaja sopivuudet:collection TarjottuAika * * tyyppi:int tapaamisenkesto:int alkupvm:date loppupvm:date viikonpaivat:int tarjotutajat:collection Aikataulu +Aikataulu():Aikataulu +poista():void +settyyppi(_tyyppi:int):void +gettyyppi():int +settapaamisenkesto(_tapaamisenkesto:int):void +gettapaamisenkesto():int +setalkupvm(_alkupvm:date):void +getalkupvm():date +setloppupvm(_loppupvm:date):void +getloppupvm():date +setviikonpaivat(_viikonpaivat:int):void +getviikonpaivat():int +lisaatarjottuaika(alkuaika:date,loppuaika:date):void +gettarjotutajat():collection +gettarjottujenaikojenlkm():int +laskeaikataulu():collection Osallistuja Sopivuus sopivuusarvo:int osallistuja:kayttaja tarjottuaika:tarjottuaika * * +TarjottuAika(alkuaika:Date,loppuaika:Date):void +poista():void +getsopivuudet():collection +setosallistuja(_osallistuja:kayttaja):void +getosallistuja():kayttaja +getalkuaika():date +setalkuaika(_alkuaika:date):void +getloppuaika():date +setloppuaika(_loppuaika:date):void +Sopivuus():Sopivuus +poista():boolean +getsopivuusarvo():int +setsopivuusarvo(_sopivuusarvo:int):void 14 Created with Poseidon for UML Community Edition. Not for Commercial Use.
15 9.1.2 tarkistasahkoposti() Staattinen metodi, joka tarkistaa, että annettu sähköpostiosoite on oikean muotoinen. sahkoposti String määritelty vaatimuksissa 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.
16 boolean (true, jos poisto onnistui, muuten false) 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
17 9.1.9 getsukunimi() Hakee käyttäjän sukunimen String (käyttäjän sukunimi) 9.1.10 setsahkoposti() Asettaa tai vaihtaa käyttäjän sähköpostiosoitteen. Sähjöpostiosoitteen kelvollisuus tarkistetaan metodilla tarkistasahkoposti(). 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
18 9.1.13 getsalasana() Hakee käyttäjän salasanan. String (käyttäjän salasana) 9.1.14 lisaaryhma() Lisää käyttäjälle (kutsuja) uuden ryhmän. 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 (kokoelma Ryhmaolioita) ei ryhmiä jos käyttäjä vain osallistuja 9.1.16 getsopivuudet() Hakee käyttäjän sopivuudet tietyssä aikataulussa. aikataulu Aikataulu
19 Collection (kokoelma Sopivuusolioita) 9.2 Ryhma Ryhmien ylläpitotoimet. 9.2.1 Ryhma() Konstruktori, joka luo uuden Ryhmaolion. 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
20 9.2.4 getnimi() Palauttaa ryhmän nimen. String (ryhmän nimi) 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ä kutsuja lisää itsensä ryhmään: estetään 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.
21 Collection (kokoelma Kayttajaolioita) 9.2.8 getosallistujienlkm() Hakee ryhmän osallistujien lukumäärän. int (osallistujien lukumäärä) 9.2.9 lisaaaikataulu() Lisää ryhmälle aikataulun. nimi String Aikataulu (uusi aikataulu) 9.2.10 getaikataulut() Hakee ryhmän aikataulut. paluuarvo Collection (kokoelma Aikatauluolioita) 9.3 Aikataulu Aikataulun ylläpito ja käsittely, laskenta.
22 9.3.1 Aikataulu() Konstruktori, joka luo uuden Aikatauluolion. nimi String 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)
23 9.3.5 settyyppi() Asettaa tai vaihtaa aikataulun tyypin (yksilö tai ryhmätapaaminen). tyyppi int 1 tai 2. 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ä)
24 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)
25 9.3.13 setviikonpaivat() Asettaa tai vaihtaa aikataulun viikonpäivät. viikonpaivat int 0=ma, 1=mati, 2=make,..., 6=masu. 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 loppuaika Date Date TarjottuAika (uusi tarjottu aika) 9.3.16 gettarjotutajat() Hakee kaikki aikataulun tarjotut ajat. Collection (kokoelma TarjottuAikaolioita)
26 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. 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. 9.4.1 TarjottuAika() Konstruktori, joka luo uuden TarjottuAikaolion. alkuaika Date loppuaika Date TarjottuAika (uusi TarjottuAikaolio) jos tarjottu aika ei sisälly kalenterin viikkojaksoon? 9.4.2 poista() Poistaa TarjottuAikaolion ja siihen liittyvät Sopivuusoliot.
27 boolean (true, jos poisto onnistui, muuten false) 9.4.3 setalkuaika() Asettaa tai vaihtaa tarjotun ajan alkuajan. alkuaika Date void 9.4.4 getalkuaika() Palauttaa tarjotun ajan alkuajan. Date (tarjotun ajan alkuaika) 9.4.5 setloppuaika() Asettaa tai vaihtaa tarjotun ajan loppuajan. loppuaika void Date
28 9.4.6 getloppuaika() Palauttaa tarjotun ajan loppuajan. Date (tarjotun ajan loppuaika) 9.4.7 getsopivuudet() Palauttaa tiettyyn tarjottuun aikaan annetut sopivuudet. Collection (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)
29 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.
30 int (sopivuusarvo)
10 Testaus 31 Tanjan testaus on kuvattu erillisessä testaussuunnitelmassa ja testausraportissa.