HELSINGIN YLIOPISTO TIETOJENKÄSITTELYTIETEEN LAITOS OHJELMISTOTUOTANTOPROJEKTI ASSARI Suunnitteludokumentti versio 1.1 Teemu Andersson Mikko Lukkari Vesa-Matti Mäkinen Olli-Pekka Ruuskanen Sami Termonen 11.5.2004
Versiohistoria: versio päivämäärä kommentit/muutokset 0.1 4.3.2004 Dokumentin sisällön hahmotteleminen. 0.2 14.3.2004 Sisällön tarkentaminen arkkitehtuurikuvauksen osalta. 0.3 18.3.2004 Dokumentin sisällön uudelleenryhmitteleminen ja tarkentaminen. 0.4 21.3.2004 Projektipäällikön korjauksia ja täydennyksiä. 0.5 23.2.2004 Projektipalaverissa todettujen puutteiden korjaukset. 0.6 1.4.2004 Cache-rakenteen toiminnan korjauksia. 1.0 6.4.2004 Jäädytetty versio. 1.1 11.5.2004 Dokumentti päivitetty vastaamaan toteutusvaiheen jälkeistä ohjelmiston tilaa. II
Sisältö: 1. JOHDANTO... 1 1.1 Dokumentin tarkoitus...1 1.2 Dokumentin rakenne...1 1.3 Sanasto...2 2. JÄRJESTELMÄN YLEISKUVAUS... 3 2.1 Sovellusalueen kuvaus...3 2.2 Toimintaympäristö...3 2.3 Toteutusrajoitukset...3 3. ARKKITEHTUURIKUVAUS... 4 3.1 Järjestelmän kokonaisarkkitehtuuri...4 3.2 Komponenttien yhteistoiminta...5 3.2.1 Tehtävien määritteleminen...5 3.2.2 Tehtävien esittäminen...6 3.2.3 Vastausten analysoiminen...7 3.2.4 Palautteen esittäminen...8 4. KEHYSKOODI... 9 4.1 Kehyskoodiservlettien abstrakti määrittely...9 4.1.1 Servlettien tehtävät...9 4.1.2 Servlettien tarjomat palvelut...9 4.1.3 Servlettien säännöt ja rajoitukset...9 4.1.4 Servlettien rajapinnat...9 4.2 Kehyskoodiservlettien luokkakaavio...10 4.3 Kehyskoodiservlettien parametrit...11 5. CACHE-TIETORAKENNE... 13 5.1 Tiedon kulku cache-tietorakenteelta ohjelmistokomponenteille...13 5.2 Tiedon kulku analysointikomponentilta cachelle...14 III
6. TIETOKANTA... 15 6.1 Nykyisen tietokantarakenteen kuvaus...15 6.2 Tietokantaan tehtävät muutokset...16 6.3 Tietojen sijoittuminen tietokantaan...17 6.3.1 Tehtävätyyppien tiedot...17 6.3.2 Tehtävätyyppikohtaiset tiedot...18 6.3.3 Tehtävänmäärittelytiedot...19 6.3.4 Käyttöliittymäelementtien tiedot...22 7. TEHTÄVÄNMÄÄRITTELYKOMPONENTIT... 23 7.1 Tehtävänmäärittelykäyttöliittymät...23 7.2 Controller-servlet...24 7.3 Tietorakenteet...26 7.3.1 Tehtävätiedot...26 7.3.2 Istuntotiedot...28 7.3.3 Kielitiedot...28 7.4 Tukipalvelut...29 7.4.1 Tietojen haku ja tallennus...29 7.4.2 Muut tukipalveluluokat...30 7.5 Tehtävänmäärittelynäkymien tiedonvälitys...31 8. ESITYSKOMPONENTIT... 32 8.1 Esityskomponenttien abstrakti määrittely...32 8.1.1 Komponenttien tehtävät...32 8.1.2 Komponenttien tarjoamat palvelut...32 8.1.3 Komponenttien säännöt ja rajoitukset...32 8.1.4 Komponenttien rajapinnat...32 8.2 Esityskomponenttien tietosisältö ja palvelut...33 8.3 Esityskomponenttien parametrit...34 8.4 Esityskäyttöliittymien ulkoasun muokkaaminen...35 IV
9. ANALYSOINTIKOMPONENTIT... 36 9.1 Analysointikomponenttien abstrakti määrittely...36 9.1.1 Komponenttien tehtävät...36 9.1.2 Komponenttien tarjoamat palvelut...36 9.1.3 Komponenttien säännöt ja rajoitukset...36 9.1.4 Komponenttien rajapinnat...36 9.2 Analysointikomponenttien tietosisältö ja palvelut...37 9.3 Analysointikomponenttien parametrit...38 10. PAKKAUSRAKENNE... 40 11. LÄHTEET... 41 12. LIITTEET... 42 Liite 1: Tehtävänmäärittelyn käyttöliittymien tietosisältö...42 Liite 2: Käyttöliittymäkuvat...48 Liite 3: Käyttöliittymän ulkoasun muokkaaminen...61 Liite 4: Tehtävänmäärittelyn käyttöliittymäelementtien nimet ja kielikohtaiset arvot...63 Liite 5: Tehtävänmäärittelyn käyttöliittymäelementtien tallentaminen tietokantaan...68 V
1. JOHDANTO 1.1 Dokumentin tarkoitus Tämä dokumentti on tarkoitettu Helsingin yliopiston Tietojenkäsittelytieteen laitoksella kevätlukukaudella 2004 toteutettavan ohjelmistotuotantoprojektin Assari-ryhmälle sisäiseksi ohjeeksi siitä, kuinka sen tuottama ohjelmisto tulee toteuttaa. Dokumentissa kuvataan projektin aikana tuotettava ohjelmisto sellaisella tarkkuudella, että sen aikaansaaminen on mahdollista yksinomaan tämän dokumentin pohjalta. Dokumentti on kirjoitettu määrittelydokumentin version 1.0 pohjalta. 1.2 Dokumentin rakenne Dokumentti muodostaa itsenäisen kokonaisuuden, joka antaa lukijalleen riittävän kuvan jo olemassa olevasta järjestelmästä ja siihen projektin aikana liitettävistä ohjelmistokomponenteista niiden toteuttamista ajatellen. Valittu esitystapa johtaa väistämättä osittaiseen päällekkäisyyteen määrittelydokumentin kanssa, mutta jotta suunnitteludokumentin ymmärtäminen olisi mahdollista myös projektiryhmään kuulumattomille lukijoille ilman, että heidän tarvitsee perehtyä muihin projektidokumentteihin, on valittu esitystapa nähty perustelluksi. - 1. luku toimii johdantona muuhun dokumenttiin ja siinä perustellaan dokumentin rakenteeseen ja laajuuteen liittyvät ratkaisut. - 2. luku antaa perustiedot järjestelmästä, jonka osaksi toteutettavat ohjelmistokomponentit liitetään, sekä toteutukselle asetetuista rajoituksista. - 3. luku antaa yleiskuvan toteutettavien ohjelmistokomponenttien arkkitehtuurista sekä niiden yhteistoiminnasta halutun toiminnallisuuden toteuttamiseksi. - 4. luku kuvaa ohjelmistokomponenttien toimintaa kontrolloivan kehyskoodin rakenteen ja toiminnan. - 5. luku kuvaa tietokantaoperaatioista vastaavan cache-tietorakenteen toiminnan. - 6. luku kuvaa järjestelmän tietokannan rakenteen ja toiminnan. - 7. luku kuvaa tehtävänmäärittelykomponenttien rakenteen ja toiminnan. - 8. luku kuvaa tehtävänesityskomponenttien rakenteen ja toiminnan. - 9. luku kuvaa analysointikomponenttien rakenteen ja toiminnan. - 10. luku kuvaa projektissa toteutettavien luokkien jakautumisen pakkauksiin. - 11. luku listaa dokumentissa viitatut lähteet. - 12. lukuun on koottu dokumentin liitteet. 1
1.3 Sanasto Cache Keskusmuistitietorakenne, johon tallennetaan osakokonaisuus järjestelmän tietokantaan tallennetuista tiedoista. Tehostaa järjestelmän suorituskykyä tarjoamalla pääsyn tietoihin ilman toistuvia tietokantakyselyitä. Java API Java SDK JSP Servletti SQL Java Application Programming Interface. Sun Microsystems Inc:n laatima määrittelykokoelma Java-kielen tarjoaman valmiskaluston rajapinnoista. Java Software Development Kit. Sun Microsystems Inc:n laatima kehitysympäristö Java-sovellusten kehittämiseksi. Java Server Pages. Dynaamisten HTML ja XML-sivujen generoimiseen käytetty Java-tekniikka, joka mahdollistaa Java-koodin upottamisen staattisiin HTML -sivuihin. Www-palvelimella suoritettava Java-luokka, joka vastaanottaa pyyntöjä ja generoi niiden kautta saamiensa parametrien perusteella dynaamisia HTML-sivuja. Structured Query Language. Alunperin IBM:n kehittämä ja ANSI:n (American National Standards Institute) ja ISO:n (International Standardization Organization) standardoima relaatiotietokantoihin kohdistuvien operaatioiden tekemiseen tarkoitettu kysekykieli. 2
2. JÄRJESTELMÄN YLEISKUVAUS 2.1 Sovellusalueen kuvaus Assari on Helsingin yliopiston Tietojenkäsittelytieteen laitoksen ohjelmistotuotantoprojekti. Projektissa tuotetaan www-pohjaiseen opetusympäristöön komponentteja erityyppisten harjoitus- ja koetehtävien määrittelyyn ja käyttöön. Projektin pohjana toimii asiakkaan kehittämä eassari-opetusjärjestelmä [LAI03], joka tarjoaa nykyisellään mahdollisuuden tietokantakyselyiden harjoitteluun www-ympäristössä. Tässä projektissa järjestelmää laajennetaan uusilla tehtävätyypeillä. Kaikissa tehtävätyypeissä opiskelijalle esitetään tehtävänanto, johon opiskelijan on laadittava ratkaisu tehtävätyyppikohtaisin välinein. Järjestelmä analysoi ratkaisun ja antaa opiskelijalle palautetta, joka auttaa häntä huomaamaan omissa tiedoissaan mahdollisesti olevia puutteita. eassari-järjestelmä mahdollistaa tehtävien paketoimisen eri opintokokonaisuuksien osaksi. Nämä kokonaisuudet voidaan toteuttaa joko opetus- tai tenttitilassa. Opetustilassa vastaus tarkastetaan ja palaute annetaan opiskelijalle välittömästi vastaamisen jälkeen. Tenttitilassa palaute talletetaan myöhemmin esitettäväksi. Käyttötilan valinta tapahtuu nyt toteutettavien ohjelmistokomponenttien ulkopuolella, mutta komponenttien on tuettava molempien tilojen käyttöä. 2.2 Toimintaympäristö Ohjelmisto toteutetaan Tietojenkäsittelytieteen laitoksen Java-ympäristössä käyttäen Java SDK versiota 1.4.2. Www-osioiden toteutuksessa hyödynnetään Java Servlet -luokkia noudattaen v.2.3 API-määrittelyä. Sovelluspalvelimena käytetään Apache Tomcat 4 ja tietokantapalvelimena Oracle 9 -tuotteita. Palvelinvalmistajien tuotespesifisiä välineitä ei käytetä, joten sovellus voidaan suoraviivaisesti asentaa mille tahansa Java- ja SQL-alustalle. 2.3 Toteutusrajoitukset Toteutuksessa on otettava huomioon olemassa olevan eassari-järjestelmän rakenne ja toiminta. Vaikka asiakas onkin antanut luvan järjestelmän tietokannan muokkaamiseen tarvittavilta osin, pyritään toteutuksessa säilyttämään tietokannan nykyinen rakenne mahdollisimman pitkälle. Tarvittavat laajennukset tehdään nykyisen tietokantarakenteen kanssa yhteensopivin menetelmin. 3
3. ARKKITEHTUURIKUVAUS 3.1 Järjestelmän kokonaisarkkitehtuuri Kuva 1 esittää projektin aikana toteutettavien ohjelmistokomponenttien sijoittumisen eassariopetusjärjestelmän kokonaisarkkitehtuuriin. Kuva 1: Järjestelmän kokonaisarkkitehtuuri Tehtävänmäärittelykomponentit tallentavat ja hakevat tehtävätiedot suoraan tietokannasta, mutta käyttävät cachea kielikohtaisten käyttöliittymäelementtien hakemiseen tietokannasta. Esitys- ja analysointikomponentit hoitavat sen sijaan kaikki tietokantayhteytensä cachen kautta. 4
3.2 Komponenttien yhteistoiminta Toteutettavien ohjelmistokomponenttien yhteistoiminta ja interaktio kehyskoodin kanssa on esitetty toimintokohtaisina sekvenssikaavioina kuvissa 2-5. Tarkemmat komponenttikohtaiset kuvaukset esitetään luvuissa 7-9. 3.2.1 Tehtävien määritteleminen Kuva 2: Tehtävienmäärittelyn sekvenssikaavio 5
3.2.2 Tehtävien esittäminen Kuva 3: Tehtävien esittämisen sekvenssikaavio 6
3.2.3 Vastausten analysoiminen Kuva 4: Vastausten analysoinnin sekvenssikaavio 7
3.2.4 Palautteen esittäminen Kuva 5: Palautteen esittämisen sekvenssikaavio 8
4. KEHYSKOODI eassari-järjestelmän kehyskoodi muodostuu kolmesta eri servlet-luokasta, jotka vastaavat HTTPkutsun POST-parametrien vastaanottamisesta sekä tehtävien määrittely-, esitys- ja analysointikäyttöliittymien esittämisestä käyttäjille. 4.1 Kehyskoodiservlettien abstrakti määrittely 4.1.1 Servlettien tehtävät - tehtäväparametrien vastaanottaminen www-sivuilta. - tehtävätyyppikohtaisten määrittely-, esitys- ja analysointikomponenttien aktivoiminen. - tehtäväparametrien välittäminen määrittely-, esitys- ja analysointikomponenteille. - XHTML-koodin vastaanottaminen komponenteilta ja esittäminen käyttäjälle. - virheilmoitusten generoiminen ja esittäminen tarvittaessa. 4.1.2 Servlettien tarjomat palvelut - www-sivujen generoiminen käyttäjien selaimille. - tehtäväparametrien välittäminen määrittely-, esitys- ja analysointikomponenteille. 4.1.3 Servlettien säännöt ja rajoitukset - osattava päätellä tehtävätyyppi. 4.1.4 Servlettien rajapinnat - www-selainrajapinta - istuntotietojen käsittely. - POST-parametrien vastaanottaminen. - tehtävänmäärittelykäyttöliittymän/tehtävänannon/palautteen/virheilmoituksen esittäminen. - cache-rajapinta (vain tehtävänmäärittelyservletti) - kielikohtaisten tehtävänmäärittelyn käyttöliittymätietojen noutaminen. - kielikohtaisten tehtävätietojen noutaminen. - kielikohtaisten tehtävänmäärittelytietojen välittäminen tallennettaviksi tietokantaan. - Feedback-oliorajapinta - palautteen vastaanottaminen (vain vastauksenanalysointiservletti). - virheilmoituksen vastaanottaminen. 9
- komponenttirajapinta - tehtäväparametrien välittäminen esityskomponentille (vain tehtävänesitysservletti). - tehtävänannon vastaanottaminen esityskomponentilta (vain tehtävänesitysservletti). - tehtävään annetun vastauksen välittäminen analysointikomponentille (vain vastauksenanalysointiservletti) 4.2 Kehyskoodiservlettien luokkakaavio Kuvassa 6 on esitetty järjestelmän kehyskoodiservletit luokkakaaviona. Kuva 6: Kehyskoodiservlettien luokkakaavio TrainerServlet on kehyskoodiservlettien yliluokka, joka huolehtii kaikille aliluokilleen yhteisen cache-tietorakenteen (TaskBase) luomisesta. 10
4.3 Kehyskoodiservlettien parametrit Servlettien aktivoiminen: Opetusmateriaaliin on määritelty linkkejä, joiden aktivoiminen kutsuu tehtävänesitysservlettiä. Tehtävään vastaaminen puolestaan aktivoi analysointiservletin. Tehtävänmäärittelyservletin kutsuminen tapahtuu nyt toteutettavien ohjelmistokomponenttien ulkopuolelta eassari-järjestelmän muista osista. Kaikki servletit hakevat HTTPServletRequest-parametrijoukosta tehtävänmäärittely-, tehtävänesitys- tai analysointikomponenteille välitettävät tiedot, jotka on esitetty taulukossa 1. tyyppi: nimi: tarkoitus: String userid käyttäjätunnus (vain määrittely- ja analysointiservletit). Käytetään opettajan tunnistamiseen hänen määrittelemiensä tehtävien listaamiseksi ja opiskelijan tunnistamiseen suorituksen kirjaamiseksi tietokantaan tarvittaessa. String tasktype tehtävätyyppi (vain esitys- ja analysointiservletit). Käytetään servlettien aktivoimien esitys-/analysointikomponenttien tyypin tunnistamiseen. String taskid tehtävätunnus (vain esitys- ja analysointiservletit). Käytetään esitettävän/analysoitavan tehtävän tunnistamiseen. String language esityskieli. Taulukko 1: Yleiset kutsuparametrit Tehtävänmäärittelykomponenttien aktivoiminen: Tehtävänmäärittelyservletti välittää taulukossa 2 listatut tiedot tehtävänmäärittelykomponentille. tyyppi: nimi: tarkoitus: String userid käyttäjätunnus. String language käyttöliittymän esityskieli. Taulukko 2: Tehtävänmäärittelykomponenttien kutsuparametrit Tehtävänesityskomponenttien aktivoiminen: Tehtävänesitysservletti aktivoi tehtävätyyppikohtaisen esityskomponentin, jolle se välittää taulukossa 3 esitetyt tiedot tehtävän esitysnäkymän generoimiseksi. tyyppi: nimi: tarkoitus: String taskid esitettävän tehtävän tunnus. String language haluttu esityskieli. Taulukko 3: Esityskomponenttien kutsuparametrit 11
Vastauksenanalysointikomponenttien aktivoiminen: Tehtävänanalysointiservletti aktivoi tehtävätyyppikohtaisen analysointikomponentin, jolle se välittää taulukossa 4 listatut tiedot tehtävään annetun vastauksen analysoimiseksi. tyyppi: nimi: tarkoitus: String userid käyttäjätunnus. String taskid tehtävätunnus. String language käytetty esityskieli. int[] answer opiskelijan valintatehtävään antamat vastaukset. String[] answer opiskelijan järjestystehtävään antama vastaus. String[] answer opiskelijan aukkojentäyttötehtävään antamat vastaukset. Taulukko 4:Analysointikomponenttien kutsuparametrit Tehtävänmäärittelyn, tehtävänannon, palautteen tai virheilmoituksen välittäminen servletille: Servletit käyttävät toista taulukossa 5 esitetyistä metodeista hakeakseen aktivoimiensa ohjelmistokomponenttien tuottaman XHTML-sivun. tyyppi: nimi: tarkoitus: String getscript käyttäjälle esitettävä tehtävänmäärittelykäyttöliittymä/ tehtävänanto. Feedback analyse käyttäjälle esitettävä palaute/virheilmoitus. Taulukko 5: Palautusparametrit 12
5. CACHE-TIETORAKENNE Cache-keskusmuistitietorakenne (TaskBase) sijoittuu järjestelmässä tietokannan ja sitä käyttävien ohjelmistokomponenttien väliin kuvan 1 (sivu 4) mukaisesti. Cache-rakenne sisältää toiminnot analysointikomponenttien välittämien vastausten tallentamiseksi tietokantaan, sekä tietokantaan tallennetun datan noutamiseksi ja palauttamiseksi sitä pyytävälle ohjelmistokomponentille. Tietorakenteen toteutus pohjautuu eri hajautustauluihin, joihin sijoitetaan tieto järjestelmässä aktiivisina olevista tehtävistä, tehtävätyypeistä sekä tehtäväattribuuteista. 5.1 Tiedon kulku cache-tietorakenteelta ohjelmistokomponenteille Cache-tietorakenne tarjoaa getattribute-metodin, jota kutsumalla muut komponentit voivat hakea tietokantaan tallennettujen attribuuttien arvoja: public String getattribute (String objtype, String objid, String attributename, String language) Kutsuparametreina kutsuja antaa tyyppinsä, nimensä, tarvitsemansa attribuutin nimen ja kielen, jolla se haluaa attribuutin arvon. Cache-rakenne muodostaa kutsuparametreista hajautusavaimen, jonka perusteella se hakee loadedattributes-hajautustaulusta pyydetyn parametrin arvon ja palauttaa sen pyytäjälle merkkijonona. Mikäli pyydettyä tietoa ei ole hajautustaulussa, laatii cache tietokantakyselyn pyydetyn dataelementin (esim. XHTML-sivun otsikko) sekä kaiken siihen sidoksissa olevan datan (esim. koko XHTML-sivu) noutamiseksi tietokannasta. Saatuaan datan tallentaa cache sen hajautustauluunsa ja palauttaa sitten pyydetyn attribuutin arvon sitä pyytäneelle ohjelmistokomponentille. Cache tallentaa tietokannan attributevalues-taulusta noutamansa attribuutit ylläpitämäänsä hajautustauluun seuraavasti: hajautusavain [tyyppi, id, esityskieli, attribuutin nimi] hajautustauluun tallennettava arvo attribuutin arvo Taulukko 6: Hajautustauluparametrit Cache tarjoaa myös erityisen attribcount-metodin, jonka avulla tehtäväattribuutteja tarvitsevat ohjelmistokomponentit voivat tiedustella cachelta tarvitsemiensa attribuuttien kuten esim. valintatehtävien vastausvaihtoehtojen lukumäärää: public int attribcount(string objectid, String attributename, String language) Kutsuja välittää metodille parametreina tehtävän tunnuksen, haettavan attribuutin nimiosan ja käytettävän esityskielen. Metodi palauttaa kutsujalle niiden attribuuttien lukumäärän, jotka täyttävät hakuehdot. 13
gettaskid-metodi palauttaa kutsujalleen tiettyyn kurssi-, moduuli- ja sekvenssitunnusyhdistelmään liitetyn tehtävän tunnuksen: public String gettaskid (String courseid, String moduleid, int seqno) languagedefined-metodi totuusarvoisen tiedon siitä, onko jokin tehtävä määritelty tietokantaan tietyllä kielellä: public boolean languagedefined (String taskid, String language) 5.2 Tiedon kulku analysointikomponentilta cachelle Vastauksenanalysointikomponentit kutsuvat cache-rakenteeseen toteutettavaa saveanswer-metodia välittääkseen tietokantaan tallennettavan vastauksen cachelle, joka vastaa järjestelmän tietokantaoperaatioista. Esityskomponentit eivät tallenna mitään tietokantaan. public void saveanswer(string userid, String courseid, String moduleid, int seqno, int trynumber, int correctness, String whenanswered, String answer, String language) 14
6. TIETOKANTA 6.1 Nykyisen tietokantarakenteen kuvaus eassari-järjestelmän tietokanta koostuu nykyisin kuvassa 7 esitetyistä tauluista. Kuva 7: Tietokannan rakenne Tehtävätyyppien yleistiedot tallennetaan tasktype tauluun, jossa mm. liitetään oikeat esitys- ja analysointikomponentit tehtävätyyppiin komponenttien luokkanimien avulla. Tehtävätyyppiin liittyvien attribuuttien tiedot tallennetaan taskattributes tauluun. Jokaisen attribuutin osalta 15
tallennetaan mm. attribuutin nimi sekä tieto siitä, miten attribuutti saadaan: tietokannasta, generoimalla vai ulkopuoliselta komponentilta. Tehtävätyypin attribuutin arvo tallennetaan attributevalues tauluun. Tehtävänmäärittely käyttää task-taulua tehtävää koskevien yleisten parametrien tallentamiseen. Tehtävälle yksilölliset arvot, kuten tehtävänanto ja oikeat vastaukset, tallennetaan attributevaluestauluun. Käyttöliittymäelementtien tiedot tallennetaan tietokannan attributevalues tauluun. 6.2 Tietokantaan tehtävät muutokset Tietokantaan lisätään systemlanguages-niminen taulu, joka sisältää järjestelmään määriteltyjen kielten korkeintaan kolmikirjaimisen tunnisteen ja esityskielikohtaiset nimet. Taulun rakenne on seuraavanlainen: create table systemlanguages( /* code for the language*/ languagecode varchar(3) not null primary key, ); /* name of the language*/ languagename varchar(40) not null unique, 16
6.3 Tietojen sijoittuminen tietokantaan Tässä luvussa kuvataan yksityiskohtaisesti tehtävänmäärittely- ja suoritustietojen sijoittuminen tietokantaan. 6.3.1 Tehtävätyyppien tiedot Kaikkiin tehtävätyyppeihin liittyy tehtävätyypistä ja määrittelykielestä riippumatta taulukossa 7 listatut tiedot. parametri typename author datecreated description displayer analyser tasktypestyle displayerinit analyserinit tietokantataulu, kenttä ja tyyppi [tasktype] typename: varchar (40) [tasktype] author: varchar (4) [tasktype] datecreated: date [tasktype] description [tasktype] displayer: varchar (40) [tasktype] analyser: varchar (40) [tasktype] tasktypestyle: varchar (80) [tasktype] displayerinit: varchar (1000) [tasktype] analyserinit: varchar (1000) kuvaus - tehtävätyypin nimi - arvon tuottaa tehtävätyypin määrittelijä - tehtävätyypin määrittelijän nimi - arvon tuottaa tehtävätyypin määrittelijä - päivä jolloin määrittely tehty - arvon tuottaa ohjelmisto - tehtävätyyppiin liittyvää metadataa - arvon tuottaa tehtävätyypin määrittelijä - ei käytössä toistaiseksi - tehtävätyyppiin liittyvän esityskomponentin luokan nimi - arvon tuottaa tehtävätyypin määrittelijä - tehtävätyyppiin liittyvän analysointikomponentin luokan nimi - arvon tuottaa tehtävätyypin määrittelijä - tehtävätyyppiin liittyvän tyylitiedoston nimi - arvon tuottaa tehtävätyypin määrittelijä - tehtävätyyppikohtaiset alustusparametrit esityskomponentille - arvon tuottaa tehtävätyypin määrittelijä - tehtävätyyppikohtaiset alustusparametrit analysointikomponentille - arvon tuottaa tehtävätyypin määrittelijä Taulukko 7: Tehtävätyyppien tiedot 17
6.3.2 Tehtävätyyppikohtaiset tiedot Kuhunkin tehtävätyyppiin liittyy joukko tietoa, joka määritellään taulukossa 8 osoitetulla tavalla. parametri tasktype attributename typeofvalue tietokantataulu, kenttä ja tyyppi [taskattributes] tasktype: varchar (40) [taskattributes] attributename: varchar (40) [taskattributes] typeofvalue: varchar (12) languagedependent [taskattributes] languagedependent: char (Y/N) howobtained [taskattributes] howobtained kuvaus -sen tehtävätyypin nimi, johon attribuutti liittyy - arvon tuottaa attribuutin määrittelijä - attribuutin nimi - arvon tuottaa attribuutin määrittelijä - attribuutin arvon tyyppi. Arvona: NONE (= ei arvoa), TEXT (= tekstiarvo) tai NUM (= numeerinen arvo) - arvon tuottaa attribuutin määrittelijä - tieto siitä, onko attribuutti kieliriippuvainen - arvon tuottaa attribuutin määrittelijä - tieto tavasta, jolla attribuutin arvo saadaan. Arvona: STORED (attribuutin arvo saadaan tietokannasta), GENERATED (attribuutin arvo generoidaan) tai EXTERNAL (attribuutin arvo tuotetaan ulkopuolisen ohjelmistokomponentin avulla) - arvon tuottaa attribuutin määrittelijä Taulukko 8: Tehtävätyyppikohtaiset tiedot 18
6.3.3 Tehtävänmäärittelytiedot Uusia tehtäviä määriteltäessä tallennetaan määrittelytiedot tietokantaan. Kaikki tehtävätyypit sisältävät joukon yleisiä määrittelytietoja. Lisäksi tehtävien sisältöön ja palautteeseen liittyy tietoa, jonka tallennus vaihtelee tehtävätyypeittäin. Yleiset tehtävätiedot: Jokaiseen tehtävään liittyy joukko tehtävätyypistä ja esityskielestä riippumattomia parametreja, jotka kuvataan taulukossa 9. parametri author datecreated taskname taskid task tasktype language positivefeedback negativefeedback cutofvalue tietokantataulu, kenttä ja tyyppi [task] author: varchar (40) [task] datecreated: date [task] taskname: varchar (40) [task] taskid: varchar (20) [attributevalues] attributevalue: varchar (2000) [task] tasktype: varchar (40) [attributevalues] language: varchar (3) [attributevalues] attributevalue: varchar (2000) [attributevalues] attributename: varchar (2000) [task] cutoffvalue: integer immediatefeedback [task] shouldevaluate_def: char registertry [task] shouldregistertry_def: char kuvaus - tehtävänmäärittelijän nimi - arvon tuottaa ohjelmisto - päivä jolloin määrittely on tehty - arvon tuottaa ohjelmisto - tehtävän nimi - arvon tuottaa tehtävän määrittelijä - tehtävän tunniste - arvon tuottaa ohjelmisto - tehtävänanto - arvon tuottaa tehtävän määrittelijä - tehtäväntyypin nimi - arvon tuottaa tehtävän määrittelijä - tehtävän kieli - arvon tuottaa tehtävän määrittelijä - arvo viedään jokaisen attributevaluestauluun menevän parametrin languagekentän arvoksi - tehtävään liittyvä globaali positiivinen palaute - arvon tuottaa tehtävän määrittelijä - tehtävään liittyvä globaali negatiivinen palaute - arvon tuottaa tehtävän määrittelijä - tehtävän hyväksyttyyn suoritukseen vaadittava oikeellisuusprosentti - arvon tuottaa tehtävän määrittelijä - tieto siitä, annetaanko tehtävästä palaute välittömästi -oletusarvo, jota voidaan muuttaa paketointivaiheessa - arvon tuottaa tehtävän määrittelijä - tieto rekisteröidäänkö yritys - oletusarvo, jota voidaan muuttaa paketointivaiheessa - arvon tuottaa tehtävän määrittelijä 19
saveanswer numberoftries loginrequired [task] shouldstoreanswer_def: char [task] numberoftries_def: int [task] shouldknowstudent_def: char - tieto tallennetaanko annettu vastaus - oletusarvo, jota voidaan paketointivaiheessa muuttaa - arvon tuottaa tehtävän määrittelijä - tieto sallittujen vastausyritysten määrä - oletusarvo, jota voidaan muuttaa paketointivaiheessa - arvon tuottaa tehtävän määrittelijä - tieto pitääkö tehtävään vastaajan olla kirjautuneenä järjestelmään - oletusarvo, jota voidaan muuttaa paketointivaiheessa - arvon tuottaa tehtävän määrittelijä Taulukko 9: Yleiset tehtävätiedot Valintatehtävien tiedot: Merkillä # kuvataan tallennettavan tiedon sekvenssinumeroa tapauksissa, joissa tietokenttien lukumäärää ei tiedetä etukäteen. Sekvenssinumerot generoidaan tehtävänmäärittelykäyttöliittymissä. parametri option# isselected# positivefeedback negativefeedback tietokantataulu, kenttä ja tyyppi [attributevalues] attributevalue: varchar (2000) [attributevalues] attributevalue: varchar (2000) [attributevalues] attributevalue: varchar (2000) [attributevalues] attributevalue: varchar (2000) kuvaus - vaihtoehdon # kuvaus - arvon tuottaa tehtävän määrittelijä - tieto siitä, pitääkö vaihtoehdon # olla valittuna - arvon tuottaa tehtävän määrittelijä -vaihtoehdon # oikeaan ratkaisuun liittyvä palaute - arvon tuottaa tehtävän määrittelijä -vaihtoehdon # virheelliseen ratkaisuun liittyvä palaute - arvon tuottaa tehtävän määrittelijä Taulukko 10: Valintatehtävien tiedot 20
Järjestystehtävien tiedot: Merkillä # kuvataan tallennettavan tiedon sekvenssinumeroa tapauksissa, joissa tietokenttien lukumäärää ei tiedetä etukäteen. Sekvenssinumerot generoidaan tehtävänmäärittelykäyttöliittymässä. parametri object# correctfeedback# tietokantataulu, kenttä ja tyyppi [attributevalues] attributevalue: varchar (2000) [attributevalues] attributevalue: varchar (2000) tooearlyfeedback# [attributevalues] attributevalue: varchar (2000) toolatefeedback# placeofobject# [attributevalues] attributevalue: varchar (2000) [attributevalues] attributevalue: varchar (2000) kuvaus - järjestettävän objektin # kuvaus - arvon tuottaa tehtävän määrittelijä - objektiin # liittyvä palaute, tapauksessa jossa objekti on oikealla paikalla - arvon tuottaa tehtävän määrittelijä - objektiin # liittyvä palaute, tapauksessa jossa objekti on liian aikaisella paikalla - arvon tuottaa tehtävän määrittelijä - objektiin # liittyvä palaute, tapauksessa jossa objekti on liian myöhäisellä paikalla - arvon tuottaa tehtävän määrittelijä - objektin # oikea paikka - arvon tuottaa tehtävän määrittelijä Aukkojentäyttötehtävien tiedot: Taulukko 11: Järjestystehtävien tiedot Merkillä # kuvataan tallennettavan tiedon sekvenssinumeroa tapauksissa, joissa tietokenttien lukumäärää ei tiedetä etukäteen. Sekvenssinumerot generoidaan tehtävänmäärittelykäyttöliittymässä. parametri text tietokantataulu, kenttä ja tyyppi [attributevalues] attributevalue: varchar (2000) positivefeedback# [attributevalues] attributevalue: varchar (2000) negativefeedback# [attributevalues] attributevalue: varchar (2000) gap# [attributevalues] attributevalue: varchar (2000) Kuvaus - teksti, joka sisältää aukot kaksinkertaisin hakasulkein ([[ ja ]])merkittyinä - arvon tuottaa tehtävän määrittelijä - aukkoon # liittyvä palaute tapauksiin, joissa aukko on täytetty oikein - arvon tuottaa tehtävän määrittelijä - aukkoon # liittyvä palaute tapauksiin, joissa aukko on täytettyväärin - arvon tuottaa tehtävän määrittelijä - aukossa # esiintyvä sana - arvon tuottaa ohjelmisto etsimälllä sanan tekstistä, johon määrittelijä on merkinnyt aukkopaikat Taulukko 12: Aukkojentäyttötehtävien tiedot 21
6.3.4 Käyttöliittymäelementtien tiedot Tietokantaan tallennetaan myös käyttöliittymäkenttien kuvaukset taulukossa 13 esitetyllä tavalla. Parametri Objecttype objectid attributename language valuetype attributevalue tietokantataulu, kenttä ja tyyppi [attributevalues] objecttype [attributevalues] objected [attributevalues] attributename: varchar (40) [attributevalues] language: varchar (3) [attributevalues] valuetype: char [attributevalues] attributevalue: varchar (2000) Kuvaus - objektin tyyppi, johon attribuutin arvo liittyy (esityskomponentissa arvona D) - arvon tuottaa attribuutin määrittelijä - attribuutin viittaaman objektin tunniste - esityskomponentissa arvona luokan nimi - arvon tuottaa attribuutin määrittelijä - attribuutin viittaaman objektin nimi - arvon tuottaa attribuutin määrittelijä - attribuutin arvon kieli - arvon tuottaa attribuutin määrittelijä - attribuutin arvon tyyppi - arvona C (= character) tekstiarvoille ja N (= number) numeerisille arvoille - arvon tuottaa attribuutin määrittelijä - attribuutin arvo - arvon tuottaa attribuutin määrittelijä Taulukko 13: Käyttöliittymäelementtien tiedot 22
7. TEHTÄVÄNMÄÄRITTELYKOMPONENTIT Tehtävänmäärittelykomponentit koostuvat neljäntyyppisistä alikomponenteista: 1. Käyttöliittymät Käyttöliittymät ovat www-selaimessa näytettäviä JSP-sivuja, joiden kautta käyttäjä voi määritellä tehtäviä. 2. Controller-Servlet Controller-komponentti on käyttöliittymiltä saatavien http-kutsujen käsittelyyn ja näkymienhallintaan toteutettava Servlet-luokka. Controller-komponentti lukee jokaisella kutsukerrallaan http-kutsussa vastaanotetut parametrit, päättelee parametritietojen perusteella tarvittavat toimenpiteet ja kutsuu näihin liittyviä tukipalveluita, muodostaa seuraavan käyttöliittymäkomponentin syötteenään tarvitsemat tietorakenteet ja ohjaa kontrollin seuraavalle käyttöliittymälle. 3. Tietorakenteet Tehtävien määrittelytietojen väliaikaistallennukseen ja käsittelyyn toteutetaan tehtävätyyppikohtaiset tietorakenteet. 4. Tukipalveluluokat Controller-komponentti ei suorita itsenäisesti tehtävänmäärittelyjen parametritietojen tietokantatallennuksia ja tietokantahakuja. Sen sijaan controller-komponentti kutsuu erillisiä tukipalveluluokkia, jotka huolehtivat tietokantatoiminnoista. Tietokantatoimintojen lisäksi tukipalveluluokat huolehtivat esimerkiksi tehtävänmäärittelynäkymien tietojen pakkaamisesta tietorakenteisiin ja syötteiden prosessoinnista: esimerkiksi aukkojen etsimisestä tekstimassasta aukkojentäyttötehtävässä. 7.1 Tehtävänmäärittelykäyttöliittymät Käyttöliittymänäkymät tarjoavat järjestelmää käyttävälle opettajalle liittymän tehtävien selaamiseen, uusien tehtävien luomiseen, sekä olemassa olevien tehtävien muokkaamiseen ja poistamiseen. Tehtävätyypit 1 ja 2 eli monivalinta- ja valintatehtävä toteutetaan yhdistetyn tehtävänmäärittelyliittymän avulla. Mikäli tehtävään määritellään täsmälleen yksi oikea ratkaisu, esitetään tehtävä monivalintatehtävänä. Muissa tapauksissa tehtävä esitetään valintatehtävänä. Aukkojentäyttötehtävä ja järjestystehtävä toteutetaan omien kahteen näkymään jakautuvien määrittelyliittymiensä avulla. 23
Taulukossa 14 on listattu kaikki järjestelmän tehtävänmäärittelynäkymät, sekä JSP-sivut, joiden avulla näkymät toteutetaan. Liite 2 sisältää kuvankaappaukset kaikista toteutettavista tehtävänmäärittelykäyttöliittymistä. Näkymän tehtävä JSP-sivu Kuva Kirjautuminen login.jsp Liite 2, kuva 5 Tehtävien listaus tasklist.jsp Liite 2, kuva 6 Tehtävän yleisten parametrien määrittely tasksettings.jsp Liite 2, kuva 7 Monivalinta- ja valintatehtävien määrittely optiontask.jsp Liite 2, kuva 8 Aukkojentäyttötehtävän tekstin ja aukkojen blankfill1.jsp Liite 2, kuva 9 määrittely Aukkojentäyttötehtävän palautteen määrittely blankfill2.jsp Liite 2, kuva 10 Järjestystehtävän järjestettävien objektien ja ordering1.jsp Liite 2, kuva 11 palautteen määrittely Järjestystehtävän oikean järjestyksen määrittely ordering2.jsp Liite 2, kuva 12 Taulukko 14: Tehtävienmäärittelyn käyttöliittymät Kaikki määrittelykäyttöliittymät toteutetaan kieliriippumattomasti. Näkymissä esiintyvät tekstiosiot talletetaan tietokantaan ja noudetaan käyttöliittymiä esitettäessä AttributeCache-oliosta. Liite 4 kuvaa tehtävänmäärittelynäkymien kielikohtaiset arvot ja liite 5 listaa näiden sijoittumisen järjestelmän tietokannassa. 7.2 Controller-servlet Tehtävänmäärittelytehtävien hallintaan toteutetaan yksi keskitetty controller-komponentti, jonka vastuulla on kaikkien tehtävänmäärittelyn käyttöliittymänäkymien osalta: POST-kutsujen vastaanottaminen ja parametrien lukeminen. tarvittavien tukipalvelujen, kuten tietokantatoimintojen kutsuminen. seuraavan käyttöliittymänäkymän tarvitsemien tietorakenteiden valmistelu. seuraavan käyttöliittymänäkymän aktivointi. Controller-Servlet päättelee kullakin kutsukerralla tarvittavat toimenpiteet jokaisen kutsun yhteydessä välitettävän event-post-parametrin avulla. Event-parametrit luetaan html-näkymiä generoitaessa sekä controller-servletissä vakiomuuttujia sisältävästä EventParameters-luokasta. Parametrit toimintokuvauksineen on esitetty taulukossa 15. Event-parametrimuuttuja LIST_TASKS NEW_TASK EDIT_TASK EDIT_TASK_AS_NEW EDIT_TASK_AS_NEW_LANG SUBMIT_TASK Toiminnon kuvaus Kaikkien kirjautuneen käyttäjän luomien tehtävien listaus. Uuden tehtävän lisäys. Olemassa olevan tehtävän muokkaus. Olemassa olevan tehtävän muokkaus siten, että muokattu versio tallennetaan uutena tehtävänä. Olemassa olevan tehtävän muokkaus siten, että muokattu versio tallennetaan saman tehtävän erikielisenä versiona. Tehtävän yleisten tietojen tallennus. 24
DELETE_TASK Olemassa olevan tehtävän poistaminen. OPTION_TASK_COMPOSE Monivalinta/valintatehtävän käsittelyliittymän esittäminen. Parametrina välitetään tietorakenne, jossa on kaikki tulee parametrina olevassa tietorakenteesta saada helposti kaikki muokattavan tehtävän tiedot. OPTION_TASK_COMPOSE_ADD_OPTI Monivalinta/valintatehtävän käsittelyliittymän esittäminen ONS siten, että tyhjien valinnansyöttökenttien määrää lisätään. Servletin tulee pakata vastaanotetut POST-parametrit tietorakenteeseen, kasvattaa numberofoptions-parametrin arvoa kahdellakymmenellä ja palauttaa kontrolli monivalinta/valintatehtävän käsittelyliittymälle. OPTION_TASK_SUBMIT Monivalinta/valintatehtävän tallentaminen. BLANKFILL_TEXT_COMPOSE Aukkojentäyttötehtävän käsittelyliittymän ensimmäisen osion esittäminen. Ensimmäisessä osassa määritellään teksti ja siihen liittyvät aukkokohdat. BLANKFILL_TEXT_EDIT Aukkojentäyttötehtävän käsittelyliittymän ensimmäisen osion muokkaaminen. Ensimmäisessä osassa määritellään teksti ja siihen liittyvät aukkokohdat. BLANKFILL_TEXT_SUBMIT Aukkojentäyttötehtävän käsittelyliittymän ensimmäisen osion tallentaminen. BLANKFILL_FEEDBACK_COMPOSE Aukkojentäyttötehtävän käsittelyliittymän toisen osion esittäminen. Toisessa osassa määritellään valittuihin aukkokohtiin liittyvät palautteet. Tämä käyttöliittymä vaatii syötteenään BlankDTO-keskusmuistitietorakenteen, josta aukkopaikat voidaan helposti poimia palautteen määrittelyä varten. BLANKFILL_FEEDBACK_EDIT Aukkojentäyttötehtävän käsittelyliittymän toisen osion muokkaaminen. Toisessa osassa määritellään valittuihin aukkokohtiin liittyvät palautteet. Tämä käyttöliittymä vaatii syötteenään BlankDTO-keskusmuistitietorakenteen, josta aukkopaikat voidaan poimia palautteen määrittelyä BLANKFILL_ FEEDBACK_SUBMIT varten. Aukkojentäyttötehtävän käsittelyliittymän toisen osion tallentaminen. ORDERING_OPTIONS_COMPOSE Järjestystehtävän ensimmäisen osion esittäminen. Ensimmäisessä osassa määritellään järjestettävät objektit ja niihin liittyvä palaute. ORDERING_OPTIONS_EDIT ORDERING_OPTIONS_COMPOSE_ADD _OPTIONS ORDERING_OPTIONS_SUBMIT ORDERING_ORDER_COMPOSE Järjestystehtävän ensimmäisen osion muokkaaminen. Ensimmäisessä osassa määritellään järjestettävät objektit ja niihin liittyvä palaute. Järjestystehtävän käsittelyliittymän ensimmäisen osion esittäminen siten, että tyhjien syöttökenttien määrää lisätään. Servletin tulee pakata vastaanotetut POSTparametrit tietorakenteeseen, kasvattaa numberofoptionsparametrin arvoa kahdellakymmenellä ja palauttaa kontrolli järjestystehtävän käsittelyliittymälle. Järjestystehtävän käsittelyliittymän ensimmäisen osion tallentaminen. Järjestystehtävän toisen osion esittäminen. Toisessa osassa määritellään järjestettävien objektien oikea 25
järjestys. ORDERING_ORDER_EDIT Järjestystehtävän toisen osion muokkaaminen. Toisessa osassa määritellään järjestettävien objektien oikea järjestys. ORDERING_ORDER_SUBMIT Järjestystehtävän käsittelyliittymän toisen osion tallentaminen. TEST Event-parametri testikäyttöön. Tämän event-tapauksen yhteydessä Servletin tulee tulostaa kaikki POST-kutsussa saadut parametrit html-sivulle. Taulukko 15: Event-parametrit 7.3 Tietorakenteet Tehtävänmäärittelykomponentit käsittelevät tehtäviin, käyttäjän istuntoon ja järjestelmän kieliin liittyviä tietoja JavaBean-tietorakenteiden avulla. Tehtävätiedot ja käyttäjän istuntoon liittyvät tiedot tallennetaan HttpSession-olioon. 7.3.1 Tehtävätiedot Tehtävänmäärittelytietojen väliaikaistallennukseen käytetään TaskDTO-tietorakennetta, joka on esitetty kuvassa 8. TaskDTO tarjoaa get- ja set- metodit kaikille tehtävätyypin yleistiedoille sekä sisältää hashmap-rakenteen tehtävätyyppikohtaisille tiedoille. Tietorakennetta muokataan HttpSession-olion kautta ja lopullinen tietokantatallennus tehdään vasta tehtävän käsittelyn ollessa valmis. Täten vältetään rikkonaisen tiedon kerääntyminen tietokantaan. 26
Kuva 8: Tehtävätiedot sisältävä TaskDTO-tietorakenne 27
7.3.2 Istuntotiedot Käyttäjän kirjautuessa järjestelmän tehtävänmäärittelyosioon, tallennetaan annettu käyttäjänimi ja käyttökieli TeacherSession-tietorakenteeseen, joka on esitetty kuvassa 9. Kuva 9: Istuntotiedot sisältävä TeacherSession-tietorakenne 7.3.3 Kielitiedot Järjestelmässä esitettävien kielivalintojen kielitiedot tuodaan tukipalveluilta käyttöliittymäkomponenteille erillisten kieliä kuvaavien LanguageDTO-tietorakenteiden avulla. Tietorakenne sisältää get- ja set-palvelut kielen nimelle ja tunnistelyhenteelle. LanguageDTOtietorakenne on esitetty kuvassa 10. Kuva 10: Kielitiedot sisältävä LanguageDTO-tietorakenne 28
7.4 Tukipalvelut Tehtävien määrittelyyn liittyvät tukipalvelut, kuten tietojen tallennus ja haku toteutetaan erillisten tukipalveluluokkien avulla. Controller-servlet kutsuu näitä palveluita tarvittaessa. 7.4.1 Tietojen haku ja tallennus Tietokannan käsittelyyn toteutettavat apuluokat tarjoavat palvelut tehtävätyyppikohtaisten tietorakenteiden sisällön tietokantatallennuksiin sekä määrittelytiedot sisältävien tietorakenteiden hakuun. Kuvassa 11 on esitetty luokkakaavio tietokannan käsittelyyn tarvittavista luokista. DataBaseBase on yliluokka, joka sisältää yhteiset tietokantayhteyden hallintaan liittyvät palvelut. Kuva 11: Tietokannan käsittelyluokat 29
Taulukossa 16 listataan yksityiskohtaisesti tietokantaa käsittelevien apuluokkien metodien toiminta. Luokka Metodi Metodin kuvaus DatabaseBase public Connection Avaa tietokantayhteyden ja palauttaa getconnection(); valmiin Connection olion. public void Sulkee tietokantayhteyden. closeconnection(); AllTasksDataBase TaskDatabase public abstract int savedata(basetaskdto data); public abstract TaskDTO loaddata(); public Collection getallauthortasks(string author, String language) public int savedata(taskdto datatosave); public int updatedata(taskdto datatoupdate); Public TaskDTO loaddata(string taskid, String language); Abstrakti metodi, joka toteutetaan aliluokissa. Abstrakti metodi, joka toteutetaan aliluokissa. Hakee kaikki käyttäjän hallinnoimat tehtävät ja palauttaa ne TaskDTO-tietorakenteista koostuvana Collection-oliona. Tallentaa parametrina saadun TaskDTOtietorakenteen tiedot tietokantaan. Päivittää parametrina saadun TaskDTOtietorakenteen tiedot tietokantaan. Hakee kaikki määrättyyn tehtävään liittyvät tiedot annetulla kielellä ja palauttaa ne TaskDTO tietorakenteessa. Taulukko 16: Tietokannankäsittelymetodit 7.4.2 Muut tukipalveluluokat Controller-servlet hyödyntää tukipalveluluokkia myös käyttöliittymiltä saatavien POST-parametrien lukemiseen, tietorakenteiden muodostamiseen sekä tietotyyppimuunnoksiin. Lisäksi aukkojentäyttötehtävässä hyödynnetään erillistä apuluokkaa aukkopaikkojen tunnistamiseen käyttäjän syöttämästä tekstistä. Nämä apuluokat on esitetty taulukossa 17. Luokka Authorization BlanksParser DbOperationsManager Kuvaus Apuluokka tehtävänmäärittelyn kutsujen autentikointiin. Sisältää palvelut käyttäjän tehtävänmuokkausoikeuksien varmentamiseen. Apuluokka aukkojentäyttötehtävien määrittelyyn. Etsii aukkokohdat käyttäjän antamasta tekstistä, ja pakkaa ne tehtävää kuvaavan TaskDTO-tietorakenteen hashmap-tauluun. Sisältää tehtävätietojen käsittelyyn tarvittavien tietokantalauseiden kutsupalvelut. Luvussa 7.4.1 kuvatut tietokantapalvelut hyödyntävät tämän luokan metodeja palveluidensa toteuttamiseen. 30
LanguageHandler PostParameterParser TaskTypes Apuluokka kieliarvojen noutamiseen tietokannasta. Sisältää palvelumetodit kaikkien järjestelmän kielien ja annetun tehtävän määrittelykielien selvittämiseen. Palauttaa kieliarvot LanguageDTO-tietorakenteina. Apuluokka POST-parametrien käsittelyyn. Tarjoaa palvelut usein käytettyjen parametrien hakuun suorilla palvelumetodeilla ja Vakioluokka tehtävätyyppien käsittelyyn. Sisältää merkkijonomuotoiset nimet kaikille tehtävätyypeille POSTkutsuissa käytettäviksi. Taulukko 17: Muut tukipalveluluokat 7.5 Tehtävänmäärittelynäkymien tiedonvälitys Tehtävänmäärittely jakautuu kaikille tehtävätyypeille yhteiseen yleiseen tehtävänmäärittelyosaan sekä tehtävätyyppikohtaiseen osaan, jossa määritellään: tehtävänannon elementit, kuten monivalinta- ja valintatehtävän valinnat, järjestystehtävän järjestettävät objektit sekä aukkojentäyttötehtävän teksti aukkoineen. tehtävänannon oikea ratkaisu. tehtävään liittyvä yksityiskohtainen palaute. muu mahdollinen tehtäväkohtainen tieto. Tiedot välitetään käyttöliittymiltä controller-servletille http-post-parametreina. Tarkat parametritiedot on listattu liitteessä 1 taulukossa 18 osoitetulla tavalla. Parametrien käyttö Parametrilistaus Kaikissa post-kutsuissa välitettävät yleiset Liite 1, taulukko 1. parametrit Kirjautumisvaiheen parametrit. Liite 1, taulukko 2. Yleisen tehtävänmäärittelyvaiheen parametrit. Liite 1, taulukko 3. Monivalinta- ja valintatehtävien parametrit. Liite 1, taulukko 4. Aukkojentäyttötehtävien parametrit. Liite 1, taulukko 5. Järjestystehtävien parametrit. Liite 1, taulukko 6. Taulukko 18: Käyttöliittymien POST-parametrit Monivalinta- ja valintatehtävissä, järjestystehtävissä sekä aukkojentäyttötehtävissä esiintyy tietoja, joiden määrää ei tiedetä etukäteen. Näiden parametrien nimien perään katenoidaan käyttöliittymänäkymiä generoitaessa sekvenssinumero, jota esitetään liitteenä olevissa parametrilistauksissa merkillä #. Numerointi alkaa luvusta 1. 31
8. ESITYSKOMPONENTIT Esityskomponentit vastaavat tehtävän esityskäyttöliittymän sisällön generoimisesta. Tehtävätietojen käsittelyyn käytetään cache-tietorakennetta, joka on kuvattu luvussa 5. 8.1 Esityskomponenttien abstrakti määrittely 8.1.1 Komponenttien tehtävät - Käyttäjälle esitettävän tehtävänannon muotoileminen. 8.1.2 Komponenttien tarjoamat palvelut - Tehtävänannon palauttaminen kehyskoodille käyttäjän www-selaimella näytettäväksi. 8.1.3 Komponenttien säännöt ja rajoitukset - Osattava esittää kaikki tehtävätyypit. - Toteutettava AttributeCache-rajapinnan vaatimukset. 8.1.4 Komponenttien rajapinnat - Esitysservlettirajapinta - tehtäväparametrien vastaanottaminen (mm. esityskieli) - tehtävänannon palauttaminen - Cache-rajapinta - kielikohtaisten tehtävätietojen noutaminen 32
8.2 Esityskomponenttien tietosisältö ja palvelut Kuvassa 12 on kuvattu toteutettavat esityskomponentit luokkakaaviona. Kaikki esityskomponentit toteuttavat DisplayerInterface-rajapinnan ja perivät CommonDisplayer-luokan, joka sisältää esityskomponenteille yhteiset palvelut. Tehtävätyyppikohtainen getsetting()-metodi palauttaa varsinaisen tehtävänannon XHTML-merkkijonona. Kuva 12: Esityskomponenttien luokkakaavio DisplayerInterface-rajapintaluokka vaatii jokaisen esityskomponentin sisältävän toteutuksen ainakin seuraaville metodeille: public void init (String taskid, String language, String initparams); Toiminta: Alustetaan tarvittavat muuttujat. Initparams-muuttuja on xml-muodossa annettu merkkijono, joka tulkitaan jos parametreja on annettu. 33
public String getscript () throws CacheException; Toiminta: Tuotetaan käsiteltävää tehtävää koskevan XHTML-esityskäyttöliittymän headerosaan lisättävät dynaamiset skriptiosiot. public String getsetting(string [] initval, String params, String hiddens, boolean allowtry) throws CacheException; Toiminta: Tuotetaan käsiteltävää tehtävää koskevan XHTML-esityskäyttöliittymän varsinainen sisältö. 8.3 Esityskomponenttien parametrit Tämä luku kuvaa esityskomponenttien käyttämät parametrit tehtävätyypeittäin. Esityskomponenttien aktivoiminen: tyyppi: nimi: tarkoitus: String taskid esitettävän tehtävän tunnus. String language haluttu esityskieli. Taulukko 19: Esityskomponenttien kutsuparametrit Tehtävänmäärittelytietojen noutaminen cache-rakenteesta - valintatehtävät: tyyppi: nimi: tarkoitus: String task tehtävänanto. String helpline käyttäjälle esitettävä ohjeteksti. String option# vastausvaihtoehto nro. # String submitbutton vastauspainikkeen teksti. Taulukko 20: Valintatehtävien esitysparametrit Tehtävänmäärittelytietojen noutaminen cache-rakenteesta - järjestystehtävät: tyyppi: task tarkoitus: String task tehtävänanto. String helpline käyttäjälle esitettävä ohjeteksti. String object# järjestettävä elementti nro #. String submitbutton vastauspainikkeen teksti. Taulukko 21: Järjestystehtävien esitysparametrit 34
Tehtävänmäärittelytietojen noutaminen cache-rakenteesta - aukkojentäyttötehtävät: tyyppi: nimi: tarkoitus: String task tehtävänanto. String helpline käyttäjälle esitettävä ohjeteksti. String text aukkoja sisältävä teksti. String submitbutton vastauspainikkeen teksti. Taulukko 22: Aukkojentäyttötehtävien esitysparametrit Sisällön palauttaminen kehyskoodiservletille: tyyppi: palauttava metodi: tarkoitus: String pageheader( ) XHTML-sivun header-osio. String bodybegin( ) XHTML-sivun body-osion alkuosa. String getsetting( ) XHTML-sivun body-osiossa esitettävä varsinainen tehtävänanto. String bodyend( ) XHTML-sivun body-osion loppuosa. String footer( ) XHTML-sivun loppuosa. Taulukko 23: Tehtävän esitysparametrit 8.4 Esityskäyttöliittymien ulkoasun muokkaaminen Tehtävien esittämisessä generoitavien xhtml-sivujen ulkoasua voidaan muokata toteuttamalla kurssikohtainen css-tiedosto, jossa on liitteen 3 taulukossa 1 listatut css-class tyylimäärittelyt. Mikäli joitain luokkia ei ole toteutettu kurssikohtaisessa tyylitiedostossa, käytetään esittämiseen esityskomponenttien käyttöön toteutettavia oletustyylejä. Omia tyylitiedostoja käytettäessä tulee käyttäjän itse huolehtia tyylimäärittelyjen toimivuuden testaamisesta järjestelmä ei validoi käyttäjien tyylitiedostoja millään tavalla. 35
9. ANALYSOINTIKOMPONENTIT Analysointikomponentit vastaavat käyttäjän antamien vastausten arvioinnista ja palautteen muodostamisesta. Palaute kootaan Feedback-olioon, joka palautetaan kehyskoodiservletille. Tehtävätietojen, kuten oikeiden vastausten ja palautteen, käsittelyyn käytetään cachetietorakennetta, joka on kuvattu luvussa 5. 9.1 Analysointikomponenttien abstrakti määrittely 9.1.1 Komponenttien tehtävät - tehtävään annetun vastauksen arvioiminen. - käyttäjälle esitettävän palautteen muodostaminen. - Feedback-olion luominen. 9.1.2 Komponenttien tarjoamat palvelut - Feedback-olion palauttaminen kehyskoodille 9.1.3 Komponenttien säännöt ja rajoitukset - osattava analysoida kaikki tehtävätyypit. - toteutettava AttributeCache-rajapinnan vaatimukset. - sisällytettävä palautteeseen oikeellisuusprosentti: numeerinen arvio vastauksen oikeellisuudesta. ilmoitusteksti: varsinainen palauteteksti. liiteaineisto: mahdollinen muu tieto, esim. suoritettavan SQL-kyselyn tulos. - tallennettava palaute Feedback-olioon. - palautettava Feedback-olio kehyskoodille. 9.1.4 Komponenttien rajapinnat - vastausservlettirajapinta - tehtäväparametrien vastaanottaminen - vastauksen vastaanottaminen - Feedback-olion palauttaminen - cache-rajapinta - kielikohtaisten oikean vastauksen kuvailutietojen noutaminen - Feedback-oliorajapinta - palautteen tallentaminen 36
9.2 Analysointikomponenttien tietosisältö ja palvelut Kuvassa 13 on kuvattu toteutettavat analysointikomponentit luokkakaaviona. Kaikki analysointikomponentit toteuttavat AnalyserInterface-rajapinnan, ja perivät CommonAnalyserluokan, joka sisältää esityskomponenteille yhteiset tiedot. Tehtävätyyppikohtainen analyse()-metodi arvioi annetun vastauksen ja palauttaa Feedback-olion kehyskoodiservletille. Kuva 13: Analysointikomponenttien luokkakaavio AnalyserInterface-rajapintaluokka vaatii jokaisen analysointikomponentin sisältävän toteutuksen ainakin seuraaville metodeille: public void init (String taskid, String language, String initparams); Toiminta: Alustetaan tarvittavat muuttujat. Initparams-muuttuja on xml-muodossa annettu merkkijono, joka tulkitaan jos parametreja on annettu. 37
public Feedback analyse (String [] answer, String params) throws CacheException; Toiminta: Suorittaa varsinaisen analysoinnin. Answer-parametrin sisältämää vastausta verrataan tietokantaan määriteltyyn oikeaan vastaukseen. public void registercache(attributecache cache ); Toiminta: Rekisteröidään cache analysointikomponenttiin, jotta sitä voidaan käyttää vastauksen analysoinnissa. 9.3 Analysointikomponenttien parametrit Tämä luku kuvaa analysointikomponenttien käyttämät parametrit tehtävätyypeittäin. Analysointikomponentin aktivoiminen: tyyppi: nimi: tarkoitus: String userid käyttäjätunnus. String taskid tehtävätunnus. String language käytetty esityskieli. String[] answer opiskelijan tehtävään antamat vastaukset. Taulukko 24: Analysointikomponenttien kutsuparametrit Oikean vastauksen kuvailutietojen noutaminen cache-rakenteesta - valintatehtävät: tyyppi: nimi: tarkoitus: String isselected# vastausvaihtoehdon nro. # oikeellisuustieto. String positivefeedback# oikein valittuun vaihtoehtoon nro. # annettava palaute. String negativefeedback# väärin valittuun vaihtoehtoon nro. # annettava palaute. Taulukko 25: Valintatehtävien analysointiparametrit 38
Oikean vastauksen kuvailutietojen noutaminen cache-rakenteesta - järjestystehtävät: tyyppi: nimi: tarkoitus: String placeofobject# elementin nro. # oikean paikan sijaintitieto. String correctfeedback# oikeaan paikkaan sijoitettuun elementtiin nro. # liittyvä palaute. String tooearlyfeedback# liian aikaiseen paikkaan sijoitettuun elementtiin nro. # liittyvä palaute. String toolatefeedback# liian myöhäiseen paikkaan sijoitettuun elementtiin nro. # liittyvä palaute. Taulukko 26: Järjestystehtävien analysointiparametrit Oikean vastauksen kuvailutietojen noutaminen cache-rakenteesta - aukkojentäyttötehtävät: tyyppi: nimi: tarkoitus: String gap# aukkoon nro. # kuuluva oikea syöte. String positivefeedback# oikein täytettyyn aukkoon nro. # annettava palaute. String negativefeedback# väärin täytettyyn aukkoon nro. # annettava palaute. Taulukko 27: Aukkojentäyttötehtävien analysointiparametrit Palautteen välittäminen kehyskoodiservletille: tyyppi: nimi: tarkoitus: Feedback feedback käyttäjälle esitettävä palaute. Taulukko 28: Palautteenvälitysparametrit 39
10. PAKKAUSRAKENNE Projektissa toteutettavat luokat jaetaan taulukossa 29 esitettyyn pakkausrakenteeseen. Paketti fi.hy.eassari.displayers fi.hy.eassari.showtask.trainer fi.hy.eassari.taskdefinition fi.hy.eassari.taskdefinition.util fi.hy.eassari.taskdefinition.servlets fi.hy.eassari.tests Selite Tehtävien esityskomponenttien luokat. Muut tehtävien esityksen ja analysoinnin luokat. Tehtävänmäärittelyn luokat. Tehtävänmäärittelyn apuluokat. Tehtävämäärittelyn Servlet-luokat. Kaikki järjestelmän testiluokat. Taulukko 29: Pakkausrakenne 40
11. LÄHTEET [LAI03] Harri Laine: eassari Practicing, assesment and exam engine http://www.cs.helsinki.fi/u/laine/eassari.pdf (9.2.2004) 41
12. LIITTEET Liite 1: Tehtävänmäärittelyn käyttöliittymien tietosisältö Kaikissa post-kutsuissa välitettävät yleiset parametrit Nimi Merkitys Tyyppi Muuta event Tähän POST-kutsuun liittyvän tapahtuman tunniste, jonka avulla vastaanottava Servlet osaa tehdä tarvittavat toimenpiteet. int Event-parametrien arvot luetaan aina EventParametersluokasta. taskid Tehtävän tunniste String Vain olemassa olevilla tehtävillä on id-arvot. Jos arvoa ei saada POST:n yhteydessä, on kyseessä uusi tehtävä. Jokaisen kutsun yhteydessä on validoitava onko käyttäjällä oikeutta käsitellä taskidparametrin osoittamaa tehtävää. Taulukko 1: Jokaisen post-kutsun yhteydessä käytettävät yleiset parametrit Tehtävänmäärittelyyn kirjautumisen post-parametrit Nimi Merkitys Tyyppi Muuta userid Tähän POST-kutsuun int Event-parametrien arvot liittyvän tapahtuman luetaan aina EventParametersluokasta. tunniste, jonka avulla vastaanottava Servlet osaa tehdä tarvittavat toimenpiteet. password Tehtävän tunniste int Vain olemassa olevilla tehtävillä on id-arvot. Jos arvoa ei saada POST:n yhteydessä, on kyseessä uusi tehtävä. Jokaisen kutsun yhteydessä on validoitava onko käyttäjällä oikeutta käsitellä taskidparametrin osoittamaa tehtävää. language Järjestelmän käyttökieli String Arvona saadaan kielen tunniste (esim. FI, EN, SWE) Taulukko 2: Kirjautumiskutsun yhteydessä käytettävät parametrit 42
Yleisen tehtävänmäärittelyvaiheen post-parametrit Nimi Merkitys Tyyppi Muuta task Tehtävänanto. String tasktype Tehtävän tyyppi, esim. String monivalintatehtävä. Tämän tiedon avulla Servlet osaa kirjata tietokantaan tehtävätyyppiin liittyvän analysointikomponentin ja esityskomponentin, sekä ohjata kontrollin oikeaan tehtävänmäärittelyliittymä än. taskname Tehtävän nimi String language Tehtävän määrittelykieli. String positivefeedback Koko tehtävää koskeva String palaute, joka esitetään jos ratkaisu on hyväksyttävä. negativefeedback Koko tehtävää koskeva String palaute, joka esitetään jos ratkaisu ei ole hyväksyttävä cutofvalue Tehtävän hyväksymisraja oikeellisuusprosenttina. int (0-100) immediatefeedback Tieto siitä, esitetäänkö int (0 tai 1) palaute välittömästi. numberoftries Ratkaisuyrityskertojen yläraja. Mikäli parametrin arvo POST-kutsussa ei ole nollaa suurempi kokonaisluku, ei yrityskertojen määrää rajoiteta. registertry Tieto siitä, int (0 tai 1) rekisteröidäänkö tehtävän ratkaisuyritykset. saveanswer Tieto siitä, tallennetaanko int (0 tai 1) tehtävään annetut vastaukset. loginrequired Tieto siitä, onko int (0 tai 1) opiskelijan oltava kirjautuneena järjestelmään suorittaakseen tehtävän. saveasnew Tieto siitä, tallennetaanko tehtävä uudeksi tehtäväksi. Jos tämä parametri on int (0 tai 1) 43
arvoltaan 0, tallennetaan määrittely aiemman tehtävän tilalle. saveasnewlanguage Tieto siitä, tallennetaanko tehtävä olemassa olevan tehtävän erikieliseksi variaatioksi. Jos tämä parametri on arvoltaan 1, tallennetaan tehdyt muutokset saman tehtävän erikielisiksi kuvaustiedoiksi. int (0 tai 1) Taulukko 3: Yleisen tehtävänmäärittelyvaiheen post-parametrit 44
Monivalinta- ja valintatehtävien parametrit Nimi Merkitys Tyyppi Muuta option# #. vaihtoehdon nimi. String Todellisten parametrien nimet ovat option1, option2, option3,, optionn (N=vaihtoehtojen määrä) isselected# positivefeedback# negativefeedback# numberofoptions Tieto siitä, tuleeko vaihtoehdon # olla valittuna oikeassa ratkaisussa. Vaihtoehtoon # liittyvä palaute tapauksiin, joissa vaihtoehtoon liittyvä ratkaisu on oikein. Vaihtoehtoon # liittyvä palaute tapauksiin, joissa vaihtoehtoon liittyvä ratkaisu ei ole oikein. Lomakkeella esitettävien vaihtoehtojen määrä. Osa tarjotuista vaihtoehdoista voi olla tyhjiä. Mikäli jonkin vaihtoehdon option#- kenttä on tyhjä, ei vaihtoehtoa tule tallentaa tietokantaan. Tällöin tätä vaihtoehtoa seuraavien vaihtoehtojen sekvenssinumerot tulee korjata oikeellisiksi. int (0 tai 1) String String int Todellisten parametrien nimet ovat isselected1, isselected2, isselected3,, isselectedn (N=vaihtoehtojen määrä) Todellisten parametrien nimet ovat positivefeedback1, positivefeedback2, positivefeedback3,, positivefeedbackn (N=vaihtoehtojen määrä) Todellisten parametrien nimet ovat negativefeedback1, negativefeedback2, negativefeedback3,, negativefeedbackn (N=vaihtoehtojen määrä) Kaikissa yllä esitetyissä parametreissa # numberofoptions. Taulukko 4: Monivalinta- ja valintatehtävien parametrit 45
Aukkojentäyttötehtävien parametrit Nimi Merkitys Tyyppi Muuta text Tehtävänantoon liitettävä teksti, joka sisältää aukkopaikat kaksinkertaisin hakasulkumerkein ([[ ja ]]) merkittyinä. String Tyhjän aukkopaikan merkintä onnistuu merkitsemällä tekstiin kaksinkertaiset hakasulut, joiden sisällä ei ole tekstiä. Sisällöllisen aukkopaikan merkintä tehdään ympäröimällä aukon oikea täyttötapa kaksinkertaisilla positivefeedback# Aukkopaikkaan # liittyvä palaute tapauksiin, joissa aukko on täytetty oikein. negativefeedback# Aukkopaikkaan # liittyvä palaute tapauksiin, joissa aukkoa ei ole täytetty oikein. numberofblankspot s Aukkojen lukumäärä. Taulukko 5: Aukkojentehtävien parametrit hakasulkumerkeillä. Palaute määritellään eri näkymässä kuin edellä mainittu parametri text. Ennen palautteen määrittelyä käsittelevä Servlet on käsitellyt text-parametrin ja muodostanut keskusmuistitietorakenteen, josta aukkopaikat on helppo poimia palautteen määrittelyä varten. Palaute määritellään eri näkymässä kuin edellä mainittu parametri text. Ennen palautteen määrittelyä käsittelevä Servlet on käsitellyt text-parametrin ja muodostanut keskusmuistitietorakenteen, josta aukkopaikat on helppo poimia palautteen määrittelyä varten. Tämä tieto välitetään ainoastaan palautteenmäärittelynäkymästä. 46
Järjestystehtävien parametrit Nimi Merkitys Tyyppi Muuta object# # järjestettävän objektin nimi. String Todellisten parametrien nimet ovat object1, object2, object3,, objectn (N=objektien correctfeedback# tooearlyfeedback# toolatefeedback# numberofoptions placeofobject# Objektiin # liittyvä palaute tapauksiin, joissa objekti on järjestetty oikealle paikalleen. Objektiin # liittyvä palaute tapauksiin, joissa objekti on järjestetty liian aikaiselle paikalle. Objektiin # liittyvä palaute tapauksiin, joissa objekti on järjestetty liian myöhäiselle paikalle. Lomakkeella esitettävien vaihtoehtojen määrä. Osa tarjotuista vaihtoehdoista voi olla tyhjiä. Mikäli jonkin vaihtoehdon option#- kenttä on tyhjä, ei vaihtoehtoa tule tallentaa tietokantaan. Tällöin tätä vaihtoehtoa seuraavien vaihtoehtojen sekvenssinumerot tulee korjata oikeellisiksi. Objektin # sijainnin kuvaava järjestysnumero. String String String int int Taulukko 6: Järjestystehtävien parametrit määrä) Todellisten parametrien nimet ovat positivefeedback1, positivefeedback2, positivefeedback3,, positivefeedbackn (N=vaihtoehtojen määrä) Todellisten parametrien nimet ovat negativefeedback1, tooearlyfeedback2, tooearlyfeedback3,, tooearlyfeedbackn (N=vaihtoehtojen määrä) Todellisten parametrien nimet ovat toolatefeedback1, toolatefeedback2, toolatefeedback3,, toolatefeedbackn (N=vaihtoehtojen määrä) Kaikissa yllä esitetyissä parametreissa # numberofoptions. Tämä parametri tulee huomioida ainoastaan ORDERING_ORDER_SUBMITevent-parametria käsiteltäessä. Tämän event-parametrin käsittelyssä voidaan muut tämän taulukon parametrit jättää huomioimatta. 47
Liite 2: Käyttöliittymäkuvat Tehtävien esittäminen Kuva 1: Monivalintatehtävän vastauskäyttöliittymä 48
Kuva 2: Valintatehtävän vastauskäyttöliittymä 49
Kuva 3: Aukkojentäyttötehtävän vastauskäyttöliittymä 50
Kuva 4: Järjestystehtävän vastauskäyttöliittymä 51
Tehtävien määritteleminen Kuva 5: Kirjautumisnäkymä 52
Kuva 6: Tehtävien listausnäkymä 53
Kuva 7: Tehtävän yleisten parametrien määrittelynäkymä 54
Kuva 8: Monivalinta- ja valintatehtävien määrittelynäkymä 55
Kuva 9: Aukkojentäyttötehtävän tekstin ja aukkojen määrittelynäkymä 56
Kuva 10: Aukkojentäyttötehtävän palautteenmäärittelynäkymä 57
Kuva 11: Järjestystehtävän järjestettävien objektien ja palautteen määrittelynäkymä Kuva 12: Järjestystehtävän oikean järjestyksen määrittelynäkymä 58
Palautteen esitys Kuva 13: Monivalinta- ja valintatehtävien palautteenesitysynäkymä Kuva 14: Aukkojentäyttötehtävän palautteenesitysynäkymä 59
Kuva 15: Järjestystäyttötehtävän palautteenesitysynäkymä 60