Kottarainen-projekti

Sampsa Lintunen
Tiina Pöyhönen
Teemu Vähä-Ruka
Timo Ylönen

Sovellusraportti 18.6.2003

Jyväskylän yliopisto
Tietotekniikan laitos

Kottarainen-projektin tietoja
Tekijät: 	Sampsa Lintunen (sampsa@cc.jyu.fi)
Tiina Pöyhönen (tmpoyhon@cc.jyu.fi)
Teemu Vähä-Ruka (teemuvr@cc.jyu.fi)
Timo Ylönen (tylonen@cc.jyu.fi)
Yhteystiedot: Agora, huone C223.2, puh.nro. 014-260 49 64 projektiorganisaation sähköpostilista on kottarainen@korppi.jyu.fi. Sen keskustelua voi seurata osoitteessa http://korppi.it.jyu.fi/list-archive/kottarainen/. Kotisivu löytyy osoitteesta http://kotka.it.jyu.fi/kottarainen/.
Työn nimi: Kottarainen-projekti, sovellusraportti
Työ: Sovellusraportti tietotekniikan sovellusprojektiin
Tiivistelmä: Kottarainen-projekti toteutti prototyypin WWW-pohjaisesta kyselyjen hallintasovelluksesta. Projektissa keskityttiin kyselyn laatimiseen ja siihen vastaamiseen. Kottarainen-sovellus tulee olemaan yksi aiemmin toteutetun Korppi-järjestelmän moduuleista. Sovellusraportissa kuvataan määriteltyjen vaatimusten toteutumista sekä sovelluksen toteutusta ja toimintaa.
Avainsanat: Tiedonkeruu, kyselyt, palaute, WWW-lomakkeet, WWW-sovellus, Korppi-järjestelmä.
Versionhallinta
Versio	Päiväys	Tehnyt	Muutokset	
0.1	13.5.	Teemu Vähä-Ruka	Ensimmäinen versio.	
0.21	20.5.	Tiina Pöyhönen	Otsikot jsp-sivuista ja pari lausetta lisää sinne tänne.	
0.22	22.5.	Tiina Pöyhönen	Jatkokehitys-osioon lisää tarinaa.	
0.23	26.5.	Tiina Pöyhönen	Jatkokehitys-osioon lisäystä. Kuvat java-papujen hierarkiasta ja suhteista toisiinsa. Papusista otsikot ja selostusta tiedostoratkaisuista. Testausosio.	
0.3	1.6.	Timo Ylönen	Kuvaukset papujen toiminnasta ja jsp-sivuista.	
0.31	2.6.	Tiina Pöyhönen	Käyttöliittymäkuvat. Yhteenvetoselostus alulle. Hienosäätöä.	
0.32	3.6.	Tiina Pöyhönen	Teemun ehdottamia korjauksia. Koodikirjasimella papujen nimiä jne..	
0.35	9.6.	Timo Ylönen	Korjauksia Santasen kommenttien perusteella.	
0.40	10.6.	Timo Ylönen	Korjauksia Santasen kommenttien perusteella.	
0.41	11.6.	Teemu Vähä-Ruka	Lisää korjauksia ja kuvien muokkausta.	
0.42	16.6.	Tiina Pöyhönen	Korjauksia Santasen kommenttien perusteella.	
1.0	18.6.	Teemu Vähä-Ruka	Loput viilaukset. Hyväksytty dokumentti	

Sisällysluettelo
 
1	Johdanto
2	Termejä
3	Asetettujen tavoitteiden toteutuminen
3.1	Kyselyiden luominen
3.2	Vastausten tallentaminen
3.3	Tulosten esittäminen
4	Toteutustekniikat ja -työkalut
4.1	Palvelinratkaisut ja suhde muihin järjestelmiin
4.2	JSP-tekniikka
4.3	Java-pavut
4.4	Tietokanta
4.5	Apache ja TomCat
4.6	Kottarainen-sovelluksen tiedostoratkaisut
5	Tietokanta
5.1	Tietokannan rakennekaavio
5.2	Tietoa varastoivat taulut
5.3	Viitetaulut
5.4	Määritystaulut
5.5	Metatietotaulut
6	JSP-sivut
6.1	Sivujen käyttöliittymä
6.2	Navigointisivu
6.3	Kyselyn rakennesivu
6.4	Kyselyn metatietojen asettamissivu
6.5	Kysymysryhmän metatietojen asettamissivu
6.6	Kysymysten lisäys- ja muokkaussivu
6.7	Kyselyyn vastaamisen sivu
6.8	Kyselyyn vastaamisen kiitossivu
7	Java-pavut
7.1	HTML-pavut
7.1.1	HtmlQuestionnaire.java
7.1.2	HtmlQuestiongroup.java
7.1.3	HtmlQuestionasgroup.java
7.2	Tietokantatauluja vastaavat pavut
7.2.1	Questionnaire.java
7.2.2	Questiongroup.java
7.2.3	Questionasgroup.java
7.2.4	Question.java
7.2.5	Questionfield.java
7.2.6	Questionresult.java
7.3	Muut pavut
7.3.1	TemplateHandler.java
7.3.2	DBHandler.java
7.3.3	SaveAnswer.java
8	Testaaminen
9	Virheet, puutteet ja jatkokehitysideat
9.1	Luontityökalun toimintojen viimeistely
9.1.1	Tietojen välittämisrakenne
9.1.2	Kyselyn luominen ja muokkaaminen
9.1.3	Kysymysryhmien luominen ja muokkaaminen
9.1.4	Kysymysten luominen ja muokkaaminen
9.2	Kysymyspankki
9.3	Kyselyyn vastaamisen viimeistely
9.3.1	Kyselyn esittämissivun jatkokehitys
9.3.2	Kyselyn kiitossivun jatkokehitys
9.4	Vastausten ja tulosten raportointi
9.5	Ohjeet
9.6	Kehitysideoita
10	Yhteenveto
Lähteet
Liitteet: Tietokantataulujen rakenne
Liite 1: question
Liite 2: question_parameter-taulu
Liite 3: questionbankgroup-taulu
Liite 4: questionbankuseright-taulu
Liite 5: questionfield-taulu
Liite 6: questionfield_htmlparameter-taulu
Liite 7: questiongroup-taulu
Liite 8: questiongroup_parameter-taulu
Liite 9: questiongroup_question-taulu
Liite 10: questionnaire-taulu
Liite 11: questionnaire_parameter-taulu
Liite 12: questionnaire_questiongroup-taulu
Liite 13: questionnaire_usergroup
Liite 14: questionnaireaction-taulu
Liite 15: questionparametertype-taulu
Liite 16: questionresult-taulu
Liite 17: questionresult_parameter-taulu
Liite 18: questionstatus-taulu
Liite 19: questiontype-taulu

1	Johdanto
Kottarainen-niminen tietotekniikan Sovellusprojekti toteutti prototyypin WWW-pohjaisesta kyselyjen laatimis-, hallinta- ja analysointisovelluksesta Jyväskylän yliopiston käyttöön. Projektin puitteissa toteutuneita osia ovat kyselyiden luominen WWW-ympäristöön ja kyselyyn vastaaminen. Muut osiot siirrettiin jatkokehitykseen, mutta ne on huomioitu sovelluksen ja tietokannan rakenteessa sekä kirjattu vaatimusmäärittelyyn.
Kottarainen-sovellus on yksi Korppi-nimisen opetushallintajärjestelmän moduuleista. Järjestelmään ovat aiemmin toteuttaneet sovelluksia Kotka-, Korppi-, Halko-,
Kolibri-, Koppelo- ja Kiuru-projektit. Niitä on edelleen jatkokehitetty Jyväskylän yliopiston tietotekniikan laitoksella.
Dokumentissa kuvataan Kottarainen-sovellukselle asetettujen tavoitteiden sekä toimintojen ja ominaisuuksien toteutuminen. Lisäksi dokumentissa on kuvattuna sovelluksen toteutunut käyttöliittymä ja jatkokehitykseen jäävät ominaisuudet. Dokumentissa kuvataan myös Kottarainen-projektin tekemiä ratkaisuja tiedostokäytänteiden ja tietokannan suhteen sekä JSP-sivujen ja java-papujen tehtävät ja tärkeimmät toiminnot.
Aiemmin laadittuja dokumentteja ovat Projektiraportti ja Projektisuunnitelma, joissa kuvataan projektin toteutunut ja suunniteltu läpivienti. Sovellussuunnitelmassa, Vaatimusmäärittelyssä ja Haastatteluraportissa kuvataan sovelluksen suunniteltu toteutus, sovellukselle asetetut vaatimukset sekä haastatteluiden tulokset. 
Luvussa 2 esitellään aiheeseen liittyviä käsitteitä. Luvussa 3 kuvataan sovelluksen toteutuneita ominaisuuksia. Luku 4 esittelee käytössä olleet toteutustekniikat ja -työkalut. Luku 5 kuvaa sovelluksen tietokantarakennetta. Luvussa 6 kuvataan sovelluksen JSP-sivujen tietoja ja toimintaa. Luku 7 käsittelee Kottarainen-projektissa käytettyjä Java-papuja. Luvussa 8 on käsitelty sovelluksen testaamista ja sen tuloksia. Luvussa 9 on analysoitu virheitä, puutteita ja jatkokehitysideoita.
2	Termejä
Luvussa on selvennetty Kottarainen-projektissa käytettyä termistöä.
Kottarainen-projektin aihealueeseen ja Korppi-järjestelmään liittyviä termejä ovat seuraavat: 
Kohde	on tässä dokumentissa käytetty lyhenne, jolla tarkoitetaan kysymystä, kysymysryhmää tai kyselyä.
Korppi	on Jyväskylän yliopistossa kehitetty opetushallintajärjestelmä.
Kotka	on Korppi-järjestelmän tietokanta ja henkilötietojen hallintaosio.
Kysely 	käsittää koko kyselyn ja voi koostua yhdestä tai useasta kysymysryhmästä.
Kysymyspankki	on kokoelma kysymyssarjoja, joista voi valita uuden kyselynsä pohjaksi kokonaisia sarjoja, kysymysryhmiä tai yksittäisiä kysymyksiä.
Kysymysryhmä	käsittää yhden tai useampia loogisesti tai visuaalisesti samaan aihepiiriin liittyviä kysymyksiä.
Kysymyssarja	on kysymyspankkiin saataville sijoitettu kysely.
Looginen ryhmittely	on kysymysten ryhmittely analysointia varten asiasisällön mukaan.
Metatieto	on kohteisiin liitettävää käyttötapausta ja laatimista kuvaavaa lisätietoa, joka helpottaa kyselyitä haettaessa ja vastauksia analysoitaessa eri kohteiden liittämistä toisiinsa. Mahdollisia metatietoja ovat esimerkiksi kyselyn laatija ja laatimisajankohta.
SAS	on tilastollinen ohjelma.
SPSS	on yliopistolla laajasti käytetty tilastollinen analysointi-ohjelma.
SPSS Data Entry	on WWW-kyselyiden tekemiseen tarkoitettu ohjelma.
Survo	on käyttöympäristö tekstin ja numeerisen tiedon luovaan käsittelyyn.
Visuaalinen ryhmittely on kysymysten ryhmittely visuaalisesti eri ryhmiin niin, että käyttäjältä piilotetaan loogiset ryhmät.

Projektin toteutusympäristöön sekä käytettäviin työkaluihin ja tekniikoihin liittyviä termejä ovat seuraavat:
Apache	on ilmainen HTTP-palvelinohjelmisto.
CSS	eli Cascading Style Sheets on WWW-sivujen ulkoasua kuvaava kieli.
CSV	eli Comma Separated Values on tiedon esitysmuoto, jossa eri arvot erotetaan toisistaan pilkulla.
CVS	(Concurrent Version System) on ohjelmistokehityksessä  käytettävä versionhallintajärjestelmä.
Eväste	(engl. cookie) on Netscapen luoma, mutta nykyään jo standardoitu menetelmä saada WWW-sivuista vuorovaikutteisempia. Palvelin lähettää pieniä tietopaketteja selaimelle, jonka perusteella käyttäjä asetuksineen tunnistetaan jatkossa.
HTML		on WWW-sivujen sisältöä kuvaava kieli.
HTTP	on WWW-arkkitehtuurin käyttämä tiedonsiirtoprotokolla.
Java	on Sunin kehittämä laitteistoriippumaton olio-ohjelmointikieli.
Java-pavut	(engl. JavaBeans) ovat Java-ohjelmointikielellä luotuja komponentteja, joita voidaan kutsua JSP-sivuilla.
JDBC	eli Java Database Connectivity on Java-teknologian käyttämä tietosilta erilaisiin tietokantoihin.
JSP	eli JavaServer Pages on ohjelmointikieli, jossa HTML-koodin sekaan mahdollista lisätä Java-koodia.
PostgreSQL		on ilmainen tietokannanhallintajärjestelmä.
Palvelin	on WWW-sovellusten tapauksessa ohjelmisto, joka palvelee asiakkaana toimivien selainten hakupyyntöjä.
Selain	on ohjelma, joka käyttäjän koneella tulkkaa HTML-kieliset sivut kuvaruudulla esitettävään muotoon.
Servletti	on palvelimella sijaitseva sovelma (engl. applet), joka toteuttaa HTTP-palvelimen pyynnöstä tietyn toiminnon.
Skripti	on ohjelmointikieltä muistuttava ja usein hieman yksinkertaistettu tulkattava kieli.
Skriptaus	tarkoittaa WWW-sivujen tapauksessa ohjelmakoodin kirjoittamista HTML-dokumenttien sisään. Palvelinpuolen skriptauksessa koodi ajetaan palvelinkoneessa ja asiakaspään skriptauksessa selaimessa.
SQL	eli Structured Query Language on tietokantojen hallintaan kehitetty standardi kieli.
TomCat		on ilmainen servletti- ja JSP-moottori.
XML	on rakenteinen dokumenttien määrittely- ja kuvauskieli.
3	Asetettujen tavoitteiden toteutuminen
Kottarainen-sovelluksen ensisijaiseksi vaatimukseksi projektin aikana muotoutui helppokäyttöisen kyselyiden luontityökalun ja vastaamisen käyttöliittymän toteuttaminen Korppi-järjestelmän yhteyteen. Kyselyn teko tapahtuu WWW-selaimella ja kysely tulee heti valmistuttuaan näkyviin palvelimelle. Jonkun vastattua kyselyyn vastaukset tallentuvat tietokantaan.
3.1	Kyselyiden luominen
Kysymysten, kysymysryhmien ja kyselyiden (myöhemmin näihin viitataan kohteina) luomisen käyttöliittymä suunniteltiin mahdollisimman helppokäyttöiseksi. Käytännössä käyttöliittymää ei ehditty hioa läheskään loppuun saakka, vaan se tehtävä jätettiin jatkokehitykseen. Sovelluksen virheitä, puutteita ja jatkokehitysideoita on kuvattu tarkemmin luvussa 9.
Valmistuneella työkalulla kyselyn luoja voi laatia kyselyitä, niihin liittyviä kysymysryhmiä ja kysymyksiä sekä tallentaa ne tietokantaan. Kun kysely on valmis, se tallennetaan palvelimelle ja on nähtävissä ja täytettävissä Kottarainen-sovelluksessa.
3.2	Vastausten tallentaminen
Kyselyjen vastaukset tallennetaan Kotka-tietokantaan. Olemassa olevaa tietokantaa laajennettiin ja muutettiin Kottarainen-sovelluksen tarpeiden mukaan. Tietokantaa kuvataan tarkemmin luvussa 5. 
Vastaukset tallennetaan tietokantaan niin, että niissä säilyy tieto kyselystä ja vastausajanhetkestä. Näin voidaan vertailla saatuja tuloksia esimerkiksi eri vuosien välillä. Lisäksi vastauksiin liitetään erilaisia metatietoja, kuten vastaajan yksilöivä tunniste. Tallentamisessa otetaan huomioon tietojen jatkokäytön vaatimukset (kuten vastausten tarkempi analysointi), joita kuvataan tarkemmin Vaatimusmäärittelyssä.
3.3	Tulosten esittäminen
Tuloksia ei tämän projektin puitteissa ehditty esittää lainkaan. Myös vastausten selaaminen siirrettiin jatkokehitykseen ajanpuutteen vuoksi.
Jatkokehitykseen siirrettiin myös vastausten siirrettävyys muihin ohjelmiin.
4	Toteutustekniikat ja -työkalut
Luvussa kuvataan Kottarainen-sovelluksen toteuttamiseen käytettyjä työkaluja ja ohjelmointiympäristöjä. Ryhmällä oli ohjelmointityökaluna käytössään NetBeans 3.4.1. Käyttöjärjestelminä kahdella projektin koneista oli Windows 2000 ja kahdella RedHat Linux 7.3.
4.1	Palvelinratkaisut ja suhde muihin järjestelmiin
Kotka-projektin valitsemaa palvelinratkaisua käytettiin myös Kottarainen-sovelluksessa, koska se on Korppi-opetushallintajärjestelmän moduli. Kuvassa 1 esitetään Kottarainen-sovelluksen suhdetta muihin olemassa oleviin järjestelmiin. 
Jatkokehitykseen jäi tulosten muuttaminen CSV-muotoon jatkoanalysointia varten. Lisäksi Kottarainen-sovelluksen jatkokehittäjien tulee aikataulun salliessa toteuttaa XML-muuntaja, joka tuottaa kyselyistä IMS-standardin mukaista XML-muotoa. Tällä tavoin on mahdollista siirtää kyselyitä muihin ympäristöihin, kuten esimerkiksi Optima-oppimisympäristöön.

Kuva 1: Kottarainen-sovelluksen suhde muihin järjestelmiin.
4.2	 JSP-tekniikka
JSP-sivuilla on tavallisen HTML-koodin sekaan mahdollista lisätä Java-koodia. Kun WWW-palvelin vastaanottaa pyynnön selaimelta, se päättelee, onko kyseessä staattinen HTML-sivu vai JSP-sivu (katso kuva 2). Apache palauttaa pyydetyt staattiset sivut suoraan takaisin selaimeen.
JSP-sivun pyyntö välittyy servlettimoottorille, joka Korppi-järjestelmässä on TomCat. Se tutkii, onko kyselyä vastaava servletti jo olemassa. Olemassa oleva servletti suoritetaan ja se palauttaa selaimelle tuloksen HTML-muodossa. Jos servlettiä ei löydy, pyyntö ohjautuu JSP-moottorille, joka generoi servletin. Kuvassa 2 esitetään luvussa käsiteltyjen palvelinohjelmistojen suhteita toisiinsa.

Kuva 2: Palvelinohjelmistojen suhteet toisiinsa.
4.3	Java-pavut
Java-pavut (engl. JavaBeans) ovat uudelleen käytettävien komponenttien luontiin tarkoitettu standardi, joka on luotu erityisesti visuaalisia kehitysvälineitä ajatellen. Ne ovat Javalla toteutettuja luokkia, joihin Java-koodi pyritään keskittämään. Tällä tavoin varsinaiset JSP-sivut säilyvät helposti ylläpidettävinä sisältäen vain HTML-rakenteen ja staattiset tekstit.
Aikaisempien Korppi-järjestelmään moduleita toteuttaneiden projektien tavoin Kottarainen-projekti tuotti pääosin yleiskäyttöisiä ja hyvin kommentoituja Java-papuja, joita järjestelmän jatkokehittäjät voivat hyödyntää.
4.4	Tietokanta
PostgreSQL on vuonna 1986 alkunsa saanut avoimen lähdekoodin relaatiotietokannan hallintaohjelmisto, joka on käytössä Kotka-tietokannassa. Koska Kottarainen-sovelluksessa käytetään Kotka-tietokantaa, käytettiin myös kyseistä ohjelmistoa. Seuraavana on esitelty yleisellä tasolla tietokannan rakenne ja taulut.
4.5	Apache ja TomCat
HTTP-palvelimena projektissa käytettiin Apache-nimistä suosittua Linux-käyttöjärjestelmän ohjelmistoa. Apache oli jo aiemmin valittu Korppi-järjestelmän HTTP-palvelimeksi, joten ratkaisu oli selvä. 
TomCat on Apache-projektin haarauma, joka kääntää JSP-sivuista mahdollisten java-papujen avulla HTML-koodia. TomCatin avulla JSP-sivut siis muunnetaan selaimella esitettäviksi HTML-sivuiksi. TomCatiin on sisällytetty mukaan myös HTTP-palvelimen toiminnallisuus. HTTP-ominaisuuksia ei kuitenkaan käytetty, koska HTTP-palvelimena käytetyllä Apachella saatiin käyttöön myös SSL-salaus.
4.6	Kottarainen-sovelluksen tiedostoratkaisut
Kottarainen-sovellus on jaettu neljän tyyppisiin tiedostoihin. Näistä JSP-sivut ja Java-pavut ovat yleisesti käytössä JSP-tekniikkaa toteuttavissa sovelluksissa. 
Näiden lisäksi Kottarainen-sovellus käyttää sqlt- ja htmt-päätteisiä tiedostoja. Sqlt-tiedostot sisältävät lähes kaikki SQL-lauseet, mikä helpottaa virheiden etsimistä SQL-hauissa. Htmt-tiedostot puolestaan sisältävät lähes kaiken HTML-koodin. Näin ollen HTML-koodiin tulleet virheet on helpompi löytää ja sivujen ulkoasua on helppo muokata. 
Molempien tiedostojen muuttujien parsimiseen Java- ja JSP-koodin sekaan käytetään TemplateHandler-nimistä Java-papua. TemplateHandlerista on kirjoitettu oma käyttöohjeensa, joka on saatavissa Kottarainen-projektin kotisivuilta osoitteesta http://kotka.it.jyu.fi/kottarainen/.
5	Tietokanta
Kottarainen-projekti käytti Kotka-tietokantaa toteutettavan sovelluksen tietokannan pohjana. Vanha tietokanta ei sellaisenaan taipunut Kottarainen-sovelluksen tarpeisiin ja haluttujen ominaisuuksien toteuttamiseen, joten tietokantaan suunniteltiin ja toteutettiin Kottarainen-sovellusta varten kokonaan oma osio. Kotka-tietokannan dokumentointikäytännön mukainen yksityiskohtaisempi kuvaus tietokannasta löytyy Kotka-tietokantaraportin luvusta 9.
5.1	 Tietokannan rakennekaavio
Tietokannan rakennekaaviosta (katso kuva 3) käyvät ilmi Kottarainen-projektia varten luodut uudet taulut ja niiden sisältämät kentät. Tarkemmat kuvat tauluista sekä niiden avainkentistä löytyvät tämän dokumentin liitteistä.

Kuva 3: Tietokannan rakennekaavio.
5.2	
Tietoa varastoivat taulut
Tietoa varastoivat taulut ovat seuraavat:
questionnaire	sisältää kyselyn perustiedot.
questiongroup	sisältää kysymysten ryhmittelytiedot. Taulun rakenne on rekursiivinen, joten alkiot muodostavat puurakenteen, jossa kysymysryhmät voivat sijaita toistensa sisällä. Kysymysryhmän sisällä voi olla sekä kysymyksiä että muita kysymysryhmiä.
question	sisältää yksittäisen kysymyksen perustiedot. Käyttöliittymätasolla kysymys on teksti, joka esittää kysyttävän asian.
questionfield	sisältää kysymyksen yhteen kenttään tai useampiin kenttiin liittyvät tiedot. Käyttöliittymätasolla kenttä edustaa HTML-komponenttia, joita ovat mm. radiopainike, valintaruutu, tekstirivi, tekstialue ja valintalistan alkio.
questionresult	sisältää vastauksen tiettyyn kenttään. Huomioitavaa on, että esimerkiksi radiopainikekysymyksen kohdalla vastaus liittyy yksittäiseen radiopainikkeeseen, ei kysymykseen.
5.3	Viitetaulut
Viitetaulut ja niiden tarkoitus ovat seuraavat:
questionnaire_questiongroup	yhdistää kyselyyn sen kysymysryhmät. Taulu sisältää myös tiedon kyselyn järjestysnumerosta.
questionnaire_usergroup	yhdistää kyselyn tiettyyn käyttäjäryhmään. Taulussa määritellään myös toiminto, joka ryhmälle kyseiseen kyselyyn annetaan.
questiongroup_question	yhdistää kysymyksen yhteen kyselyyn tai useampiin kyselyihin. Taulussa kerrotaan myös, mihin kysymysrymään kysymys kuuluu.
questionfield_htmlparameter	määrittää HTML-ominaisuuksia kysymyskentälle. Taulun avulla saadaan esimerkiksi määrättyä tekstirivin pituus ja monirivisen tekstikentän korkeus ja leveys.
5.4	Määritystaulut
Seuraavana on esitelty määritystaulut ja niiden tarkoitus:
htmlparametertype	sisältää HTML-ominaisuustyypit kysymyskentille.
questionnaireaction	sisältää eri toiminnot, joita kyselylle voidaan suorittaa. Toimintoja ovat luonti, muokkaus, vastaus, tulosten luonti ja katselu.
questionstatus	sisältää määrittelyt kyselyn osien mahdollisisista tiloista. Eri tiloja voi olla piilotettu, auki ja luku.
questiontype	sisältää kysymyksille mahdolliset tyypit. Näitä ovat tekstirivi, tekstialue, monivalintaruutu, kommenttirivi, radiopainike ja alasvetolista.
question_bankgroup	sisältää ryhmittelyt (kuten esim. kyselyn näkyvyys organisaatiolle), joita kysymyspankissa voi eri kohteille olla. Taulu sisältää myös alkion salattu, jolloin kohde ei ole muiden saatavilla.
question_bankuseright	sisältää määrittelyt oikeuksille, joilla kohdetta on mahdollista uudelleenkäyttää. Eri oikeuksia ovat viite, viite lukuoikeuksin, kopio ja kopio vastauksin.
5.5	Metatietotaulut
Metatietotaulurakenteen avulla voidaan määritellä eri kohteiden ominaisuuksia. Tarkoituksena on, että ominaisuuksia voi lisätä jo valmiiseen sovellukseen koskematta lähdekoodiin. Taulun rakenne on sellainen, että kohteeseen liitetyn tiedon tyyppi ilmaistaan viitteellä, jolloin uuden tyypin lisääminen ei aiheuta muutoksia tietokannan rakenteeseen. Metatietotaulut ja niiden tarkoitus ovat seuraavat:
question_parametertype	sisältää määritykset eri metatietotyypeille. Tyyppejä voi lisätä valmiin sovelluksen julkaisun jälkeen.
questionnaire_parameter	yhdistää metatiedon kyselyyn. Alkio sisältää tiedon metatiedon tyypistä sekä tiedon varsinaisen sisällön.
questiongroup_parameter	yhdistää metatiedon kysymysryhmään. Alkio sisältää tiedon metatiedon tyypistä sekä tiedon varsinaisen sisällön.
question_parameter	yhdistää metatiedon kysymykseen. Alkio sisältää tiedon metatiedon tyypistä sekä tiedon varsinaisen sisällön.
questionresult_parameter	yhdistää metatiedon vastaukseen. Alkio sisältää tiedon metatiedon tyypistä sekä tiedon varsinaisen sisällön.
6	JSP-sivut
Luvussa kuvataan lyhyesti Kottarainen-projektin puitteissa luodut JSP-sivut ja niiden käyttötarkoitus. Sovelluksen ulkoasu on yhtenäinen Korppi-järjestelmän kanssa, koska se tässä vaiheessa toimii ainoastaan Korppi-järjestelmän alaisuudessa.
Kottarainen sovellukseen toteutettiin käyttöliittymät kyselyiden luomiseen ja hallintaan sekä käyttöliittymä kyselyihin vastaamiselle. Vastausten tarkastelu sekä tulosten ja raporttien tarkempi muodostaminen ja tarkastelu jätettiin jatkokehityksen ja myöhemmän projektin tehtäväksi.
6.1	Sivujen käyttöliittymä
Sivujen käyttöliittymä koostuu kolmesta eri osasta: kahdesta navigaatioalueesta sekä tietoalueesta. Navigaatioalueet ovat selainikkunan yläosassa oleva osio sekä vasemmassa reunassa oleva navigaatiopuu kalentereineen. 
Yläosiossa on Korppi-järjestelmän perustoiminnot: poistuminen, palaute, asetukset ja opastus. Vasemmassa reunassa olevassa puurakenteessa puolestaan on kaikki Korppi-järjestelmien eri osioihin liittyvät alipuut. Niiden avulla Korppi-järjestelmän käyttäjä pystyy liikkumaan eri osioiden välillä. Navigaatiopuussa on linkki myös Kottarainen-kyselysovellukseen.
Luontityökalu sisältää sivut kyselyn, kysymysryhmän ja kysymyksien luomiselle ja niiden tietojen muokkaamiselle. Vastaajan sivulle haetaan vastattava kysely tietokannasta. 
6.2	
Navigointisivu
Kuvassa 4 näkyvällä Kottarainen-sovelluksen pääsivulla main.jsp on linkki kaikkiin kyselyihin, joita käyttäjä on luonut ja joihin käyttäjä voi vastata.

Kuva 4 : Käyttöliittymänäkymä aloitussivusta.
6.3	
Kyselyn rakennesivu
Rakennesivulla index.jsp esitetään kyselyn eri kysymysryhmät sekä linkit, joiden avulla ryhmiä pääsee muokkaamaan. Tällä sivulla voi myös luoda uuden kysymysryhmän ja siirtyä muokkaamaan tai lisäämään siihen kysymyksiä. Rakennesivun käyttöliittymä on esitetty kuvassa 5.

Kuva 5 : Rakennenäkymä.
6.4	
Kyselyn metatietojen asettamissivu
Metatietojen asettamissivulla questionnairehandler.jsp (katso kuva 6) annetaan kyselyä koskevia metatietoja, joiden avulla kyselyjä hallitaan ja kenties myöhemmin lajitellaan. Metatiedot ovat erityisen tärkeitä uudelleenkäytön kannalta, johon myöhemmin toteutettava kysymyspankki antaa mahdollisuuden. 

Kuva 6: Kyselyn metatietojen asetussivu.
6.5	
Kysymysryhmän metatietojen asettamissivu
Kysymysryhmän metatietojen asettamissivulla questiongrouphandler.jsp annetaan kysymysryhmiä koskevia metatietoja, joiden tavoitteena on parantaa uudelleenkäytettävyyttä. Sivu on esitelty kuvassa 7.

Kuva 7: Kysymysryhmän metatietojen asettamissivu.
6.6	
Kysymysten lisäys- ja muokkaussivu
Kyselyn luontityökalun toiminnallisin ja olennaisin osio on sivulla questionasgrouphandler.jsp. Kuvassa 8 näkyvällä sivulla muokataan yhden kysymysryhmän kysymyksiä kerralla. Käyttäjä voi lisätä kysymyksiä sekä valita niiden tyypin lisäksi kysymysmatriisien tapauksessa rivien ja sarakkeiden lukumäärän. Jokaiselle kysymykselle voi myös asettaa vastaajalle näkyvän oletusarvon. 
Kaikissa kysymystyypeissä on pyritty johdonmukaisuuteen siten, että myös tekstikentistä ja -alueista kysytään rivien ja sarakkeiden lukumäärää. Näin esimerkiksi 3x3-tekstialuematriisin teko on todella helppoa. Tavoitteena tähän ratkaisuun päädyttäessä on ollut, että lyhyellä kokemuksellakin on helppo omaksua erilaisten kysymystyyppien luominen kaikkien käyttäytyessä samalla tavalla. Kysymystyypit ja niiden ulkoasu käyvät ilmi kuvasta 9.
Myöhemmin tälle sivulle toteutetaan myös uusi, laajennettu, näkymä, joka on tarkoitettu kokeneemmille Kottarainen-sovelluksen käyttäjille. Laajennettu näkymä tullee tarjoamaan runsaasti pieniä valintoja, joiden avulla kyselyä voi muokata mieleisekseen.

Kuva 8: Kysymyksien muokkaaminen.
6.7	
Kyselyyn vastaamisen sivu
Kyselyyn vastaamisen sivu resultHandler.jsp luodaan hakemalla halutun kyselyn id-numerolla kysely sessiomuistiin ja pyytämällä siltä tulostus vastaamista varten. Tämän jälkeen tulostetaan vastaussivu ja hävitetään oliorakenne muistia kuormittamasta. Kun käyttäjä on vastannut kyselyyn ja painaa Lähetä-painiketta, hänet ohjataan luvun 6.8 kiitossivulle.

Kuva 9: Kuva kyselyn vastaamissivusta.
6.8	Kyselyyn vastaamisen kiitossivu
Kuittaussivulle tullaan, kun kyselyn vastaus on lähetetty ja sille tulostuu teksti Kiitos vastauksestasi. Käytännössä resultReady.jsp-sivulla myös tallennetaan kyselyn vastaukset tietokantaan SaveAnswer-pavun avulla. 
Jatkokehityksessä kiitossivun viesti poimitaan kyselyn pakolliseksi metatiedoksi. Tiedot kyselyn tarkoituksesta ja tekijästä sekä kiitosviesti tulostuvat vastaajan näkyviin vastauksen tallennuttua, jolloin kyselyyn vastaajalle jää selvä kuva siitä, että tiedot on otettu vastaan ja ne tullaan käsittelemään asiallisesti.
7	Java-pavut
Kottarainen-projektin toteuttamat pavut on jaettavissa neljään luokkaan: HTML-pavut, tietokantatauluja vastaavat pavut, yleiskäyttöiset käsittelijäpavut sekä vastauksen tallentamisen hoitava papu. Papujen suhde toisiinsa, htmt-ja sqlt-tiedostoihin sekä JSP-sivuihin ja tietokantaan on esitetty kuvassa 10. 

Kuva 10: Java-papujen suhteet toisiinsa.
7.1	HTML-pavut
HTML-pavut HtmlQuestionnaire, HtmlQuestiongroup ja HtmlQuestionasgroup on peritty vastaavannimisistä pavuista Questionnaire, Questiongroup ja Questionasgroup. Tarkoituksena on, että alkuperäiset pavut ovat paremmin uudelleenkäytettäviä, kun HTML-koodin muodostukseen liittyvät metodit on kirjoitettu perittyihin papuihin.
7.1.1	HtmlQuestionnaire.java
Papu hoitaa kyselytason HTML-tulostukset. Sen kautta määritellään eri tulostustilat, jotka sitten välitetään myös alemmille pavuille. Eri tiloja voivat olla esimerkiksi kyselyn laatimistila ja vastaamistila.
7.1.2	HtmlQuestiongroup.java
Luokka huolehtii kysymysryhmien tulostamisesta. Se kysyy Questionasgroup-luokalta, miten ne tulostetaan ja muotoilee tulokset otsikkotietojen ja tilan mukaisesti halutun kaltaiseksi. 
7.1.3	HtmlQuestionasgroup.java
Luokka hoitaa eri kysymysten tulostuksen. Tulostettava yksikkö on siis kysymysmatriisi, joka voi pitää sisällään yhden tai useita samantyyppisiä kysymyksiä. Luokka kysyy Questionilta ja edelleen Questionfieldiltä, miten ne tulee tulostaa ja muotoilee saamansa tiedon perusteella sen hetkisen tilan mukaisen tulosteen.
7.2	Tietokantatauluja vastaavat pavut
Tietokantatauluja vastaavat pavut muodostavat varsinaisen oliorakenteen Kottarainen-sovelluksessa. Luvuissa 7.2.1-7.3.3 esitetyt java-pavut sisältävät kukin alemmista olioista koostuvan taulukon. Tätä hierarkiaa kuvataan tarkemmin kuvassa 11. 
Kyselyn luomisen ja kyselylomakkeen tulostamisen aikana luodaan parhaimmillaan kuvan 11 esittämä rakenne Questionnaire-luokasta Questionfield-luokkaan. Vastausten tallentamisessa on resurssien säästämiseksi kuitenkin luotu uusi luokka SaveAnswer. Tämä toimii säiliönä Questionfield-olioille, joilla taas on omistuksessaan Questionresult-olioita. Questionresulttien avulla varsinaiset vastaukset tallentuvat tietokantaan. Tämän avulla koko raskasta hierarkiaa ei tarvitse luoda vastauksien saattamiseksi tietokantaan.
Kaikki pavut osaavat lukea itseensä liittyvät tiedot tietokannasta ja tallentaa ne sinne. Alaisilla tarkoitetaan tästä eteenpäin olion subElements-vektorissaan säilyttämiä olioita. Jos pavulla on alaisia, sillä on myös alaisten käsittelyyn sopivia metodeja, kuten lisääminen ja poistaminen. Tällaiset pavut osaavat myös käskeä alaisiaan suorittamaan eri toimintoja, kuten tietokannasta lukemisen ja tallennuksen.

Kuva 11: Papujen hierarkia Kottarainen-sovelluksessa.
7.2.1	Questionnaire.java
Luokka pitää sisällään tietokannan questionnaire-taulua vastaavat tiedot. Sillä on tallessa kaikki siihen liittyvät metatiedot ja alaiset. Niiden avulla se hoitaa kaikki kyselyn hallintaan liittyvät toiminnot. 
Alla on esitelty luokan olennaisimmat metodit. Asteriskilla (*) merkityt metodit löytyvät myös Questiongroupista, siitä peritystä Questionasgroupista, Questionista sekä Questionfieldistä. 
*addMetaElements	lisää parametrina viedyn määrän metatietoelementtejä metaElements-vektoriin.
*addSubElements	lisää parametrina viedyn määrän alaisia ja lisää ne subElements-nimiseen vektoriin.
buildQuestionnaireId	hakee tietokannasta ensimmäisen vapaan id-numeron ja asettaa sen olion arvoksi.
*createSubId	rakentaa tunnisteen, jonka avulla eri oliot yksilöidään WWW-sivuilla.
Empty	tyhjentää vektorit ja alustaa olion.
*getMetaElementsFromdb	hakee metatietotyypit tietokannasta ja luo jokaisesta ilmentymän.
getState	palauttaa olion tilan, jonka avulla päätellään tulostusmuoto ja eräiden metodien lukitseminen.
*getSubElementsFromDb	hakee alaiset tietokannasta ja lisää ne subElements-vektoriin.
*getValuesFromDb	hakee arvot tietokannasta.
*update	päivittää olion tiedot lukemalla Internet-selaimen lähettämien muuttujien arvot Requestista.
updateSubElements	käskee alaisia päivittämään itsensä.

7.2.2	Questiongroup.java
Questiongroup-luokka toimii Questionnaire-luokan alaisuudessa ja sen alaisia ovat Questionasgroupit. Attribuutti parentid on aina nolla. Se ilmaisee tietokannassa eron Questiongroupien ja Questionasgroupien välillä. Attribuutin parentid ollessa nolla tietokannassa questiongroup-taulussa oleva Questiongroup kuuluu aina Questionnairelle. Tärkeimmät metodit ovat seuraavat:
getMetaElementsFromdb	hakee metatietotyypit tietokannasta ja luo jokaisesta ilmentymän.
getSubElementsFromDb	hakee alaiset tietokannasta ja lisää ne subElements-nimiseen vektoriin.
setPointerDeleted	poistaa ryhmän viittauksen viitetaulusta. 

7.2.3	Questionasgroup.java
Questionasgroup-papu on ilmentymä samasta tietokannan taulusta kuin Questiongroupkin. Erona on se, että Questiongroup kuuluu kyselyn, eli Questionnairen alaisuuteen, kun taas Questionasgroup on jonkin ryhmän alaryhmä. Tällöin siis sen parentid-attribuutti viittaa toiseen saman taulun ilmentymään, Questiongroupiin. Tämän pavun avulla saadaan toteutettua esimerkiksi radioryhmät kysymysryhmien sisälle. 
7.2.4	Question.java
Question-papu ilmentää yksittäistä kysymystä, johon voi liittyä yksi tai useampia syöttökenttiä. Question-papua vastaa tietokannassa taulu question. Esimerkiksi radioryhmässä Question-pavun ilmentymä on yksi rivi, joka pitää sisällään kysymyksen ja yhden tai useampia Questionfieldejä (kenttien ilmentymiä). 
7.2.5	Questionfield.java
Questionfield-papu ilmentää HTML-lomakkeella olevaa yksittäistä ohjainta, joita voivat olla tekstikenttä, tekstialue, valintaruutu, radiopainike tai valintalistan alkio. Yhtä kysymystä kohti voi olla rajoittamaton määrä Questionfieldejä. Tietokannan taulu Questionfieldeille on nimeltään questionfield.
7.2.6	Questionresult.java
Questionresult-pavun ilmentymä pitää tallessa yhteen Questionfield-olioon käyttäjältä saadun vastauksen. Periaatteessa jokaista Questionfieldiä vastaa siten yksi Questionresult yhtä kyselyyn vastaajaa kohden. 
Jos Questionfieldille ei saada arvoa JSP-sivulta, Questionresult-oliota ei tallenneta tietokantaan ollenkaan. Näin esimerkiksi radioryhmän tapauksessa säästetään tietokannan resursseja, kun tallennetaan questionresult-tauluun vain sen Questionfieldin tila, joka on valittuna.
7.3	Muut pavut
Muut pavut hoitavat joko todella yleisiä tehtäviä tai erittäin tarkasti määriteltyjä erikoistehtäviä. TemplateHandler- ja DBHandler-papuja käytetään lähes jokaisessa muussa luokassa, kun taas SaveAnswer on vastausten tallennuksen nopeuttamiseksi luotu erikoisratkaisu. 
7.3.1	 TemplateHandler.java
TemplateHandler-papu käsittelee sille parametreinä annettujen tietojen perusteella jotakin tiedostopohjaa ja lisää muuttujissa olevan tiedon tekstimuodossa pohjaan. Tarkemmin kyseisen pavun toiminnasta on kerrottu TemplateHandlerin käyttöohjeessa. Alla on kuvattu tärkein metodi:
completeTemplate	täydentää tiedostopohjan sille tuodun taulukon alkioilla.

7.3.2	 DBHandler.java
DBHandler-papu hoitaa tietokantayhteyksien muodostamiseen liittyvät rutiinitoimenpiteet. Alla on esitelty tärkeimmät metodit:
bringFromDatabase		hakee dataa tietokannasta annetuilla hakuehdoilla. Metodista on myös ylikuormitettu versio, joka käyttää parametrina tuotua tietokantayhteyttä.
insertIntoDatabase	lisää dataa tietokantaan annetuilla parametreillä. Metodista on myös ylikuormitettu versio, joka käyttää parametrina tuotua tietokantayhteyttä.
7.3.3	 SaveAnswer.java
SaveAnswer.java on Question-pavusta peritty papu. Se mahdollistaa kyselyn vastauksien tallentamisen ilman, että koko oliorakennetta tarvitsee luoda uudestaan. 
Papu saa parametrina JSP-sivulta haluttujen Questionfieldien id-numerot taulukossa. Tämän taulukon mukaan sitten käydään Questionfieldit läpi ja tallennetaan niiden vastaukset Questionresult-papua hyödyntäen. SaveAnswer-papu nopeuttaa merkittävästi vastausten tietokantaan tallentamista.
8	Testaaminen
Projektiryhmä ei ehtinyt toteuttaa riittävää testausta projektin puitteissa. Testausta tehtiin kuitenkin koko ajan sovellusta luotaessa niin, että jokainen sovelluksen komponentti oli toimiva ennen yhdistämistä muihin osiin. Sovelluksen osien valmistuttua ne yhdistettiin yksi kerrallaan isommaksi kokonaisuudeksi. Tällöin pyrittiin löytämään kaikki mahdolliset ongelmakohdat sovelluksessa ja testaamaan sekä korjaamaan toiminta.
Kottarainen-projektille tärkein toteutettava osa sovelluksesta oli helppokäyttöinen kyselynlaadintaosio, joten käyttöliittymän prototyyppiä kehitettiin yhdessä tilaajien ja tulevien käyttäjien kanssa. Käytännössä sovellus on kuitenkin niin keskeneräinen, että käyttöliittymään tulee vielä paljon muutoksia jatkokehityksen aikana. Joitakin toiminnallisiakin virheitä löytyi ulkopuolisten testaajien avulla. Testausta on vielä jatkettava komponenttien yhteentoimivuuden varmistamiseksi. 
Testaukseen osallistuivat ryhmän jäsenten lisäksi jonkin verran tilaajien edustajat sekä ohjaajat. Testausapuna olivat myös Petri Heinonen ja Tommi Lahtonen Jyväskylän yliopistolta sekä Tiina Pöyhösen opiskelijaystävä Mirva Paavola. Näin saatiin tuoreita mielipiteitä käyttöliittymään ja havaittiin joitakin ongelmakohtia, joita sovelluksen kehittämiseen osallistuneet eivät olleet havainneet. Testauksen aikana havaittiin lisäksi, että jatkokehityksessä on paneuduttava entistä enemmän luontityökalun helppokäyttöisyyden lisäämiseen, sillä jotkin testaajat pitivät käyttöliittymää aivan liian hankalana ensimmäisellä käyttökerralla. Testauksessa havaittuja virheitä on kuvattu luvussa 9.
9	Virheet, puutteet ja jatkokehitysideat
Luvussa kuvataan jatkokehitykseen jääneitä ominaisuuksia ja jatkokehityssuunnitelmaa. Jatkokehityksen ensimmäiseksi tehtäväksi jäi ohjelman tarkempi testaaminen sekä löytyneiden virheiden korjaaminen. Tämän lisäksi toteutetaan vaatimuksien mukaisia ominaisuuksia, jotka jäivät projektin puitteissa toteuttamatta. 
9.1	 Luontityökalun toimintojen viimeistely
Seuraavissa luvuissa on selitetty tarkemmin eri luomisen vaiheisiin liittyviä jatkokehityksen asioita. Kaikkien tässä luvussa mainittujen osioiden jatkokehityksen tehtävänä on näiden lisäksi mahdollisten virheiden etsiminen ja niiden korjaaminen.
9.1.1	Tietojen välittämisrakenne
Tärkein jatkokehitykseen jäävä luontityökalun ominaisuus liittyy tietojen välittämiseen WWW-sivulta toiselle siirryttäessä. Tällä hetkellä luontityökalussa pohjaudutaan aivan liiaksi sessiossa säilytettävään oliorakenteeseen, joka rasittaa järjestelmää huomattavasti. Session koko on saatava pienemmäksi, jotta luontityökalun käyttäminen Korppi-järjestelmässä on mahdollista. Session sijaan tietoa tulee välittää esimerkiksi URI-osoitteessa ja piilokentissä sekä tiedot on tallennettava tietokantaan mahdollisimman usein.
Kaikilta kyselyn luomisen sivuilta tulee olla mahdollisuus päästä esikatselemaan luotavaa kyselyä. Lisäksi kaikille sivuille tulee lisätä selkeät ohjeet helposti saataville. 
9.1.2	Kyselyn luominen ja muokkaaminen
Luomistyökalun kyselyn muokkausosasta puuttuvia ominaisuuksia ovat WWW-osoitteiden lisääminen, kyselyn voimassaoloajan huomioonottaminen, yksilöivän nimen antaminen sekä muut niin sanotut lisäominaisuudet (katso Vaatimusmäärittelyn luku 4.4). Myös metatietojen lisäämisen käyttöliittymä jäi osittain jatkokehityksen tehtäväksi, kyselyyn ja kysymysryhmään liittyviä metatietoja lukuunottamatta. Näiden metatietojen antamista on kuvattu luvuissa 6.4 ja 6.5.
Käyttäjäryhmien ja käyttöoikeuksin liittäminen kyselyyn vastaamisoikeuksien ja kyselyn muokkausoikeuksien suhteen jää täysin jatkokehittäjien harteille. Lisäksi käyttäjäoikeuksien hallinnasta tulisi laatia kattava dokumentti myöhemmille jatkokehittäjille. Kyselyt tulee voida myös liittää tiettyyn kurssiin tai ryhmään ihmisiä, jolloin kyseisen kurssin kotisivuilta tulee olla linkki kyselyyn. Tällöin kurssille ilmoittautuneille ihmisille tulee antaa automaattisesti vastaamisoikeus kyselyyn.
Kyselyyn liitettävien lisätietojen syöttämisen suhteen on tehtävä tarkistuksia, jotta kaikki oleelliset tiedot tulee annettua. Kyselyn laatijaa on huomautettava, mikäli jokin tieto on pakko täyttää.
Kyselyn laatijan on lisäksi tulevaisuudessa saatava määrittää kyselylle tyylitiedosto, joka määrää kyselyn ulkoasun vastausvaiheessa. Oletuksena kysely käyttää Korppi-järjestelmän tyylitiedostoa. Kyselyn laatijan on myös saatava päättää, näkyykö Korpin navigaatioalue vastaamissivun yläreunassa.
9.1.3	Kysymysryhmien luominen ja muokkaaminen
Kysymysryhmän luominen tulee tapahtua ”wizardimaisesti” eli askel kerrallaan niin, että käyttäjän tulee syöttää ryhmälle nimi ja välttämättömät lisätiedot ennen kuin ryhmä tulee näkyviin kyselyn rakennesivulle (katso kuva 5 luvussa 6.3). 
Muita puuttuvia ominaisuuksia ovat ryhmien järjestyksen vaihtaminen, metatietojen lisäämisen käyttöliittymä (osittain) sekä esikatselu pelkästään juuri muokattavan kysymysryhmän kysymyksistä.
Kysymysryhmien poistaminen tulee tapahtua ryhmän kysymysten muokkaussivulta nykyisen rakennesivulta tapahtuvan poistamisen sijaan. Lisäksi poistamiseen tulee lisätä vahvistuksen pyytäminen käyttäjältä.
Toivottava ominaisuus on lisäksi mahdollisuus siirtyä yhden ryhmän tietojen muokkaamisesta suoraan seuraavan ryhmän tietojen muokkaamiseen ilman, että käyttäjän tarvitsee käydä välillä kyselyn rakennesivulla.
9.1.4	Kysymysten luominen ja muokkaaminen
Kysymysten luomisesta ja lisäämisestä puuttuu vielä kysymyksiin liittyvien metatietojen syöttöominaisuus, joka on alustavasti suunniteltu toteutettavaksi välilehtityylisellä ratkaisulla. 
Käyttäjän tulee voida jatkossa vaihtaa kysymyksien järjestystä. Lisäksi kysymyksille täytyy lisätä myös poistomahdollisuus. 
Toivottava ominaisuus on lisäksi mahdollisuus siirtyä yhden ryhmän kysymyksien muokkaamisesta suoraan seuraavan ryhmän kysymysten muokkaamiseen ilman, että käyttäjän tarvitsee käydä välillä kyselyn rakennesivulla valitsemassa toinen ryhmä.
9.2	 Kysymyspankki
Kysymyspankin toteuttaminen jää kokonaan jatkokehitykseen. Kyselynlaadintaoikeudet omaavan henkilön tulee nähdä ja saada käyttää kaikkia laatimiaan kyselyitä sekä kaikkia muitakin kyselyitä, joiden käyttämiseen ja muokkaamiseen hänen oikeutensa riittävät. Käyttöoikeusryhmiä ei ole vielä määritelty. 
Kaikilla Korppi-järjestelmän käyttäjillä, joilla on oikeus laatia kyselyitä, tulee olla myös oikeus ottaa kohteita kysymyspankista ja tallentaa tekemänsä kohteet sinne. Mikäli kysymyspankkiin julkaisemista päädytään rajoittamaan, on kaikki kysymyspankkiin siirrettävät kohteet hyväksytettävä sovitulla taholla. Tätä toimintamallia puoltaisi se, että näin toimimalla kysymyspankin sisältö saataisiin pysymään korkealaatuisena ja hyvin jäsenneltynä.
Kysymykset, kysymysryhmät ja kysymyssarjat tulee tallentaa kysymyspankkiin niin, että niissä säilyy tiettyjä metatietoja. Näitä ovat mm. laatija, luontipäivämäärä ja
-tarkoitus sekä kurssikyselyiden tapauksessa kurssin nimi. 
Kohteita tulee voida hakea kysymyspankista kysymyksessä olevan sanan tai laatijan, päivämäärän sekä muiden kohteeseen liittyvien metatietojen perusteella. Jos kysymys on liitetty nimenomaan kurssikyselyyn, täytyy se voida hakea myös kurssin nimen perusteella.
Laatijan tulee voida halutessaan julkaista kysymyspankkiin tallentamansa kohteet, jolloin kaikki muutkin kyselyiden laatimiseen oikeutetut käyttäjät saavat ne näkyviinsä. Tällöin laatija kuitenkin antaa muille käyttäjille oikeudet kohteiden vapaaseen hyödyntämiseen. Pankkiin julkaistuja kohteita ei saa pystyä muokkaamaan, vaan muokkaamisen tulee luoda kohteesta uusi ilmentymä.
9.3	 Kyselyyn vastaamisen viimeistely
Kyselyyn vastaaminen saatiin toteutettua projektin puitteissa hyvin, mutta pientä hienosäätöä jäi vielä jatkokehityksen puolelle. Luvussa on esitelty kyseisiä parannusideoita.
9.3.1	Kyselyn esittämissivun jatkokehitys
Kyselyn esittämissivun (resultHandler.jsp) tulee jatkossa käyttää käyttäjän antaman tyylitiedoston määrityksiä. Lisäksi kyselystä tulee voida muodostaa tulostettava versio. 
Korppi-järjestelmän navigaatioalueen näkyminen vastaamisen yhteydessä tulee olla kyselyn laatijan valittavissa. Navigaatioalueen tulisi tulla näkyviin vain, kun kysely on selkeästi kurssiin liittyvä. Muutoin navigaatiopalkki saattaa hämätä vastaajia.
9.3.2	 Kyselyn kiitossivun jatkokehitys
Tulevaisuudessa laatija saa kyselyä luodessaan määrätä kiitostekstin, joka tulostuu resultReady.jsp-sivulle. Sivua tulee muuttaa siten, että sille voidaan tuoda kyseinen teksti sekä lisätä tiettyjen pakollisten metatietojen tulostuminen. Tällaisia metatietoja ovat esimerkiksi laatijan nimi, laatimisajankohta sekä kyselyn tarkoitus.
Koska vastaukset tallentuvat tietokantaan varsinaisesti vasta resultReady.jsp-sivulla, tulee sen toimintaa testata huolellisesti, ettei vastauksia muokatessa ole millään tavalla mahdollista muokata myös itse kyselyä.
9.4	 Vastausten ja tulosten raportointi
Kottarainen-projekti ei ehtinyt toteuttaa minkäänlaista tarkastelumuotoa kyselyiden vastauksille. Jatkokehityksen ensimmäinen tehtävä onkin tuottaa tietokantaan tallennetuista vastauksista raportteja. Alustavasti riittäisi pystyä tarkastelemaan yhden ihmisen vastauksia kerrallaan vastaamisnäkymässä. Tämän jälkeen kaikkien ihmisten vastaukset tulee koostaa yhteen. Kyselyn laatijalla tulee myös olla mahdollisuus kommentoida ja ryhmitellä saatuja vastauksia.
Lisäksi tulokset on saatava ulos CSV-muodossa (Comma Separated Values), jotta tieto on siirrettävissä muille analysointisovelluksille. Kaikki analysointiin liittyvä tiedonkäsittely päätettiin jo projektin puolivälissä jättää tuleville projektiryhmille.
Tarkemmat raportteja sekä tulosten muodostamista koskevat vaatimukset käyvät ilmi Vaatimusmäärittelystä.
9.5	 Ohjeet
Luontityökalu vaatii kattavat ja selkeät ohjeet, joiden laatiminen jää jatkokehitykseen. Ohjeissa tulee olla etenkin kysymysten lisäämistä koskien selkeitä kuvia ja selityksiä erilaisten kysymystyyppien ulkoasusta. Ohjeisiin tulee päästä kaikilta sivuilta ja mieluiten linkistä suoraan esimerkiksi kysymystyypin otsikkoa klikkaamalla (katso kuva 8 luvusta 6.6).
9.6	Kehitysideoita
Sovelluksen testausvaiheessa puhuttiin siitä, että kysymysten lisäämisessä tulisi olla mahdollisuus yksi kerrallaan lisäämiseen. Tämä parantaisi luontityökalun käytettävyyttä ja ymmärrettävyyttä. Tarkemmin sanoen yksi kysymys luotaisiin kerrallaan valmiiksi ja sitten vasta lisättäisiin seuraava. 
Sovellusta kehityksen aikana testanneet ihmiset pitivät kysymysten lisäämisen nykyistä käyttöliittymää hankalana, koska kysymyksiä voi kerrallaan lisätä useamman kuin yhden. Toisaalta tilaajat puolestaan toivoivat näkevänsä kokonaisuuden, joten usean kysymyksen luominen yhdellä kertaa säilyy tulevaisuudessakin ainakin rinnakkaisena vaihtoehtona. 
10	Yhteenveto
Kottarainen-projektiryhmä toteutti prototyypin WWW-pohjaiselle tiedon keräämiseen ja hallintaan tarkoitetulle sovellukselle. Sovellus koostuu kahdesta osasta: kyselyiden luominen ja kyselyyn vastaaminen sekä tiedon hallinta. Tulosten esityksen toteuttaminen päätettiin projektin kuluessa siirtää omaksi jatkoprojektikseen. Vastausten selailu puolestaan siirrettiin jatkokehityksen puolelle projektin loppuvaiheessa. 
Sovelluksen prototyyppi myöhästyi suunnitellusta aikataulustaan neljä viikkoa, eikä täyttänyt läheskään kaikkia sille alunperin asetettuja vaatimuksia. Jatkokehitykseen jäivät vastausten ja tulosten raportointi, monia käyttöliittymään liittyviä asioita, sovelluksen nopeuden optimointi ja perinpohjainen testaaminen. Valmiilla sovelluksella pystyy kuitenkin laatimaan kyselyitä ja vastaamaan niihin, mikä oli ensisijainen tavoite.
Suurimpia syitä myöhästymiseen olivat vaatimusten määrittelyn ja rajaamisen epäonnistuminen sekä väärä valinta sovelluksen toteutustekniikan osalta. 
Toteutustekniikan osalta ryhmä ajautui väärään ratkaisuun, koska yksi ryhmän jäsenistä oli käyttänyt valittua tekniikkaa menestyksellä työelämässä. Kukaan ryhmän jäsenistä ei tiennyt sessio-muistin käyttöön perustuvan tekniikan osalta havaituista aiemmista ongelmista Korppi-järjestelmässä, joten sitä käytettiin. Ongelmalta oltaisiin vältytty, mikäli Korppi-järjestelmän ohjelmointikäytännöistä sekä yleiskäyttöisistä luokista olisi pidetty kunnon perehdytys projektin puolivälissä. Tätä ei kuitenkaan osattu pyytää, joten ryhmä oli yksittäisen ja suppeahkon Korpin koodausohjeen varassa. 
Lähteet
Antti Auerin, Eija Ihanaisen ja Jari Rantamäen toimittamat esimerkit heidän tarpeistaan kyselyn osalta.
Hillebrand Minna, Silván Markus, Vanhanen Antti ja Ylitalo Marko, ”Koppelo-projektin projektikansio”, Jyväskylän yliopisto, tietotekniikan laitos, 2002.
Hilpinen Toni, Koivuniemi Marko, Mäkinen Jussi ja Nurminen Miika, ”Kiuru-projektin projektikansio”, Jyväskylän yliopisto, tietotekniikan laitos 2002.
Horppu Ismo, Mielityinen Markku ja Vire Markku, ”Kotka-projektin projektikansio”, Jyväskylän yliopisto, tietotekniikan laitos, 2000.
Hillebrand Minna, Horppu Ismo, Kuittinen Jussi, Lintunen Sampsa, Lupari Matti, Mielityinen Markku, Nurminen Miika, Pekkanen Markku, Vire Markku, ”Kotka-järjestelmän tietokantaraportti”, Jyväskylän yliopisto, tietotekniikan laitos, 2003.
Jaakkola Mia, Juutinen Sanna, Lupari Matti ja Nieminen Mikko, ”Kolibri-projektin projektikansio”, Jyväskylän yliopisto, tietotekniikan laitos, 2001.
Kujala Pauli, Lahtonen Tommi, Lappalainen Vesa ja Nurminen Miika, ”Korpin koodausohje”, Jyväskylän yliopisto, tietotekniikan laitos, 2003.
Kyppö Jorma ja Vesterholm Mika, ”Java-ohjelmointi”, Talentum Media Oy, 2001.
Lesonen Minna, Pekkanen Hannu, Tawast Tuukka ja Uuksulainen Heikki, ”Korppi-projektin projektikansio”, Jyväskylän yliopisto, tietotekniikan laitos, 2001.
Lintunen Sampsa, ”TemplateHandler-käyttöohje” Jyväskylän yliopisto, tietotekniikan laitos, 2003.
Lintunen Sampsa, Pöyhönen Tiina, Vähä-Ruka Teemu, Ylönen Timo, ”Kottarainen- projektin Vaatimusmäärittely” Jyväskylän yliopisto, tietotekniikan laitos, 2003.
Lintunen Sampsa, Pöyhönen Tiina, Vähä-Ruka Teemu, Ylönen Timo, ”Kottarainen- projektin Projektisuunnitelma” Jyväskylän yliopisto, tietotekniikan laitos, 2003.
Lintunen Sampsa, Pöyhönen Tiina, Vähä-Ruka Teemu, Ylönen Timo, ”Kottarainen- projektin Sovellussuunnitelma” Jyväskylän yliopisto, tietotekniikan laitos, 2003.
Lintunen Sampsa, Pöyhönen Tiina, Vähä-Ruka Teemu, Ylönen Timo, ”Kottarainen- projektin Projektiraportti” Jyväskylän yliopisto, tietotekniikan laitos, 2003.
Lintunen Sampsa, Pöyhönen Tiina, Vähä-Ruka Teemu, Ylönen Timo, ”Kottarainen- projektin Haastatteluraportti” Jyväskylän yliopisto, tietotekniikan laitos, 2003.
Momjian Bruce, “PostgreSQL: Introduction and Concepts”, saatavilla WWW-muodossa <URL: http://www.postgresql.org/docs/aw_pgsql_book/>, 8.1.2002.
Santanen Jukka-Pekka, ”Opinnäytteiden kirjoittaminen, lyhyt oppimäärä”, Jyväskylän yliopisto, tietotekniikan laitos, 2000.
Santanen Jukka-Pekka, ”Tietotekniikan Sovellusprojektien ohje”, Jyväskylän yliopisto, tietotekniikan laitos, 2002.
Sun Microsystems, “JavaTM 2 Platform, Standard Edition, v 1.4.1 API Specification”, saatavilla WWW-muodossa <URL: http://java.sun.com/j2se/1.4.1/docs/api/>, 16.9.2002.
Liitteet: Tietokantataulujen rakenne
Liite 1: question
Field	Type	Length	Not Null	Default	
deleted 	bool 	1  	Yes 	 	
questionid 	int4 	4  	Yes 	 	
questiontypeid 	int4 	4  	Yes 	 	
label 	varchar 	var  	Yes 	 	
uri 	varchar 	var  	No 	 	
bankgroupid 	int4 	4  	Yes 	 	
bankuserightid 	int4 	4  	Yes 	 	
personid 	int4 	4  	Yes 	 	

Keyname	Unique	Primary	Field	
question_pkey	Yes	Yes	questionid	

Liite 2: question_parameter-taulu
Field	Type	Length	Not Null	Default	
deleted 	bool 	1  	Yes 	 	
questionid 	int4 	4  	Yes 	 	
parametertypeid 	int4 	4  	Yes 	 	
value 	varchar 	var  	Yes 	 	

Keyname	Unique	Primary	Field	
question_parameter_pkey	Yes	Yes	parametertypeid	
question_parameter_pkey	Yes	Yes	questionid	

Liite 3: questionbankgroup-taulu
Field	Type	Length	Not Null	Default	
deleted 	bool 	1  	Yes 	 	
bankgroupid 	int4 	4  	Yes 	 	
name 	varchar 	120  	Yes 	 	

Keyname	Unique	Primary	Field	
question_bankvisibility_pkey	Yes	Yes	bankgroupid	

Liite 4: questionbankuseright-taulu
Field	Type	Length	Not Null	Default	
deleted 	bool 	1  	Yes 	 	
bankuserightid 	int4 	4  	Yes 	 	
name 	varchar 	120  	Yes 	 	

Keyname	Unique	Primary	Field	
question_bankuseright_pkey	Yes	Yes	bankuserightid	

Liite 5: questionfield-taulu
Field	Type	Length	Not Null	Default	
deleted 	bool 	1  	Yes 	 	
questionfieldid 	int4 	4  	Yes 	 	
questionid 	int4 	4  	No 	 	
defaultvalue 	varchar 	var  	No 	 	
weight 	int2 	2  	No 	 	
ordernum 	int2 	2  	Yes 	1 	
label 	varchar 	var  	No 	 	
genericname 	varchar 	var  	No 	 	

Keyname	Unique	Primary	Field	
questionfield_pkey	Yes	Yes	questionfieldid	

Liite 6: questionfield_htmlparameter-taulu
Field	Type	Length	Not Null	Default	
deleted 	bool 	1  	Yes 	 	
questionfieldid 	int4 	4  	Yes 	 	
parametertypeid 	int4 	4  	Yes 	 	
value 	varchar 	var  	No 	 	

Keyname	Unique	Primary	Field	
questionfield_htmlparamete_pkey	Yes	Yes	parametertypeid	
questionfield_htmlparamete_pkey	Yes	Yes	questionfieldid	

Liite 7: questiongroup-taulu
Field	Type	Length	Not Null	Default	
deleted 	bool 	1  	Yes 	 	
questiongroupid 	int4 	4  	Yes 	 	
parentid 	int4 	4  	No 	 	
label 	varchar 	var  	Yes 	 	
uri 	varchar 	var  	No 	 	
bankgroupid 	int4 	4  	Yes 	 	
bankuserightid 	int4 	4  	Yes 	 	
personid 	int4 	4  	Yes 	 	

Keyname	Unique	Primary	Field	
questiongroup_pkey	Yes	Yes	questiongroupid	

Liite 8: questiongroup_parameter-taulu
Field	Type	Length	Not Null	Default	
deleted 	bool 	1  	Yes 	 	
questiongroupid 	int4 	4  	Yes 	 	
parametertypeid 	int4 	4  	Yes 	 	
value 	varchar 	var  	Yes 	 	

Keyname	Unique	Primary	Field	
questiongroup_parameter_pkey	Yes	Yes	parametertypeid	
questiongroup_parameter_pkey	Yes	Yes	questiongroupid	

Liite 9: questiongroup_question-taulu
Field	Type	Length	Not Null	Default	
deleted 	bool 	1  	Yes 	 	
questiongroupid 	int4 	4  	Yes 	 	
questionid 	int4 	4  	Yes 	 	
questionstatusid 	int4 	4  	Yes 	 	
ordernum 	int4 	4  	Yes 	 	

Keyname	Unique	Primary	Field	
questiongroup_question_pkey	Yes	Yes	questiongroupid	
questiongroup_question_pkey	Yes	Yes	questionid	

Liite 10: questionnaire-taulu
Field	Type	Length	Not Null	Default	
deleted 	bool 	1  	Yes 	 	
questionnaireid 	int4 	4  	Yes 	 	
begintime 	timestamp 	8  	No 	 	
endtime 	timestamp 	8  	No 	 	
bankgroupid 	int4 	4  	Yes 	 	
bankuserightid 	int4 	4  	Yes 	 	
personid 	int4 	4  	Yes 	 	
uri 	varchar 	var  	No 	 	
label 	varchar 	var  	No 	 	

Keyname	Unique	Primary	Field	
questionnaire_pkey	Yes	Yes	questionnaireid	

Liite 11: questionnaire_parameter-taulu
Field	Type	Length	Not Null	Default	
deleted 	bool 	1  	Yes 	 	
questionnaireid 	int4 	4  	Yes 	 	
parametertypeid 	int4 	4  	Yes 	 	
value 	varchar 	var  	Yes 	 	

Keyname	Unique	Primary	Field	
questionnaire_parameter_pkey	Yes	Yes	parametertypeid	
questionnaire_parameter_pkey	Yes	Yes	questionnaireid	

Liite 12: questionnaire_questiongroup-taulu
Field	Type	Length	Not Null	Default	
deleted 	bool 	1  	Yes 	 	
questionnaireid 	int4 	4  	Yes 	 	
questiongroupid 	int4 	4  	Yes 	 	
questionstatusid 	int4 	4  	Yes 	 	
ordernum 	int4 	4  	Yes 	 	

Keyname	Unique	Primary	Field	
questionnaire_questiongrou_pkey	Yes	Yes	questiongroupid	
questionnaire_questiongrou_pkey	Yes	Yes	questionnaireid	

Liite 13: questionnaire_usergroup
Field	Type	Length	Not Null	Default	
deleted 	bool 	1  	Yes 	 	
questionnaireid 	int4 	4  	Yes 	 	
usergroupid 	int4 	4  	Yes 	 	
questionnaireactionid 	int4 	4  	Yes 	 	

Keyname	Unique	Primary	Field	
questionnaire_group_pkey	Yes	Yes	questionnaireactionid	
questionnaire_group_pkey	Yes	Yes	questionnaireid	
questionnaire_group_pkey	Yes	Yes	usergroupid	

Liite 14: questionnaireaction-taulu
Field	Type	Length	Not Null	Default	
deleted 	bool 	1  	Yes 	 	
questionnaireactionid 	int4 	4  	Yes 	 	
name 	varchar 	120  	Yes 	 	

Keyname	Unique	Primary	Field	
questionnaireaction_pkey	Yes	Yes	questionnaireactionid	

Liite 15: questionparametertype-taulu
Field	Type	Length	Not Null	Default	
deleted 	bool 	1  	Yes 	 	
parametertypeid 	int4 	4  	Yes 	 	
name 	varchar 	120  	Yes 	 	

Keyname	Unique	Primary	Field	
question_parametertype_pkey	Yes	Yes	parametertypeid	

Liite 16: questionresult-taulu
Field	Type	Length	Not Null	Default	
deleted 	bool 	1  	Yes 	 	
questionresultid 	int4 	4  	Yes 	 	
questionfieldid 	int4 	4  	Yes 	 	
personid 	int4 	4  	Yes 	 	
markerid 	int4 	4  	Yes 	 	
value 	varchar 	var  	Yes 	 	

Keyname	Unique	Primary	Field	
questionresult_pkey	Yes	Yes	questionresultid	

Liite 17: questionresult_parameter-taulu
Field	Type	Length	Not Null	Default	
deleted 	bool 	1  	Yes 	 	
questionresultid 	int4 	4  	Yes 	 	
parametertypeid 	int4 	4  	Yes 	 	
value 	varchar 	var  	Yes 	 	

Keyname	Unique	Primary	Field	
questionresult_parameter_pkey	Yes	Yes	parametertypeid	
questionresult_parameter_pkey	Yes	Yes	questionresultid	

Liite 18: questionstatus-taulu
Field	Type	Length	Not Null	Default	
deleted 	bool 	1  	Yes 	 	
questionstatusid 	int4 	4  	Yes 	 	
name 	varchar 	120  	Yes 	 	

Keyname	Unique	Primary	Field	
questiostatus_pkey	Yes	Yes	questionstatusid	

Liite 19: questiontype-taulu
Field	Type	Length	Not Null	Default	
deleted 	bool 	1  	Yes 	 	
questiontypeid 	int4 	4  	Yes 	 	
name 	varchar 	120  	Yes 	 	

Keyname	Unique	Primary	Field	
questiontype_pkey	Yes	Yes	questiontypeid