1 Johdanto

1.1 Tausta ja tarkoitus

Hytky (Helsingin yliopiston tietojärjestelmien kehitysympäristö) on Tietojenkäsittelytieteen laitoksella käytössä oleva ohjelmistotuotannon apuvälineitä sisältävä ohjelmistokokonaisuus, joka on ensisijaisesti tarkoitettu ohjelmistotuotannon menetelmien opetuksen tueksi. Hytky-kokonaisuuteen sisältyvät MS-DOS-ympäristössä toimivat ohjelmat, joilla tuotetaan mm. tietovuokaavioita ja käsitemalleja. Tämän lisäksi käsitemalleja voidaan muokata edelleen relaatiotietokannan määrittelyiksi. Hytkyyn kuuluu myös relaatiotietokantojen visualisoija, joka muodostaa graafisen kaavioesityksen lukemistaan SQL-tietokannanmäärittelylauseista.

Kehitettävä relaatiotietokantojen visualisoija vastaa toiminnoiltaan pääosin Hytkyn visualisoijaa. Hytky on toteutettu DOS-ympäristöön, eikä se kaikin osin toimi kovin hyvin moderneissa tietokoneissa. Ongelmia on esimerkiksi hiiren käsittelyssä. Hytkyn tuottamat kaaviot ovat joissain tilanteissa puuttellisia. Se ei myöskään osaa lukea kannanpäivityslauseita. Näistä Hytkyä vaivaavista ongelmista ja rajoitteista päästään kehitettävän järjestelmän myötä eroon.

1.2 Käsitteitä

HYTKY
Helsingin yliopiston tietojärjestelmien kehitysympäristö
JDK
Java Development Kit - Sun Microsystems:n Java kehitys- ja ajoympäristö

2 Yleiskuvaus

2.1 Koko järjestelmä ja ohjelmiston rooli siinä

Tarkoituksena on tuottaa graafisessa ympäristössä toimiva Hytkyn visualisoijan kaltainen järjestelmä. Kehitettävässä järjestelmässä pyritään ottamaan huomioon ja korjaamaan Hytkyssä olevat puutteet.

2.2 Sovellusalue

Kehitettävä järjestelmä esittää SQL-kielellä määritellyt taulut ja niiden väliset suhteet graafisessa muodossa. Järjestelmään luetuista SQL-lauseista jäsennetään kannan kuvaus, joka esitetään kaaviokuvana. Kaavion taulut sijoitellaan automaattisesti, mutta käyttäjä voi muokata halutessaan kuvaesitystä. Kustakin kaaviokuvan taulusta esitetään kaikki attribuutit ja avainsarakkeet, viiteavaimet esitetään taulujen välisinä viivoina. Kuvaesitys voidaan tallentaa levylle, ja se voidaan myös tulostaa.

Järjestelmä tulkitsee sekä SQL 92 -standardin [ISO92] että ainakin Oraclen murteen mukaisia relaatiotietokannan määrityslauseita.


3 Määrittelydokumentti

Määrittelydokumentti löytyy osoitteesta http://www.cs.helsinki.fi/group/jasso/maardok/maartoc.html

3.1 Käyttötapaukset

Määrittelydokumenttissa oli kuvattuna, miten käyttäjä ja järjestelmä toimivat eri käyttötapausten yhteydessä. Nämä tapaukset on esitetty yksityiskohtaisemmin käyttötapaustaulukoissa.


4 Arkkitehtuuri

4.1 Yleisperiaattet

Järjestelmä on suunniteltu MVC (model-view-controller) -suunnittelumallin ympärille. Järjestelmästä voidaan erottaa malliluokat (model), jotka ylläpitävät kaiken sovelluksessa esitettävän informaation, sekä näkymäluokat (view-controller), jotka vastaavat informaation esittämisestä ja muokkaamisesta. Ratkaisusta seuraa, että yhdellä malliluokalla voi olla monta, mahdollisesti täysin erilaista, näkymää. Näkymäluokkien kautta käyttäjä voi muokata malliluokan informaatiota, joka puolestaan heijastuu kaikkiin näkymiin. Malliluokat on nimetty Model-päättellä, ja ne sijaitsevat pakkauksessa relaaja. Näkymäluokat ovat pakkauksessa relaaja.gui.

Kun käyttäjä tekee muutoksen näkymään, esimerkiksi siirtämällä taulua kuvaavaa graafista komponenttia, komponentti luo komento-olion. Komento liitetään komentolistaan ja suoritetaan. Suoritettaessa se tekee käyttäjän ilmaisemat muutokset malliluokkiin. Komento myös tallentaa ennen suorittamistaan kaiken sellaisen tilainformaation, jota tarvitaan sen perumiseen (undo).

Näkymäluokat rekisteröityvät kuuntelijoiksi niihin malliluokkiin, joiden sisältämää informaatiota ne esittävät. Kun mallissa tapahtuu muutoksia, malliluokka tiedottaa kaikille rekisteröityneille kuuntelijoille asiasta. Tällöin näkymäluokka päivittää itsensä näyttämään uutta, muuttunutta informaatiota.

4.2 Luokat ja niiden väliset suhteet

Järjestelmän sisällä tiedostoja käsitellään omassa tallennusmuodossaan, jonka tunnisteeksi on sovittu .schema-pääte.

4.3 Pakkaukset

Relaaja koostuu neljästä pakkauksesta: relaaja, relaaja.gui, relaaja.database ja relaaja.netlayout.

Relaaja sisältää ohjelman pääluokan, model-luokat ja komentojärjestelmän. Relaaja käyttää kaikkia muita pakkauksia. Model-luokat vastaavat relaaja.database:n tallentamaa rakennettaja välittävät sen edelleen relaaja.gui:n graafisille komponenteille.

Relaaja.gui toteuttaa käyttöliittymän ja graafiset elementit. Graafisten elementtien tiedot se saa relaaja-pakkauksen model-luokilta.

Relaaja.database on itsenäinen pakkaus, joka sisältää SQL-jäsentäjän ja tietokannan rakenteen tallentavat luokat sekä näiden välisen rajapinnan määrittelyn.

Myös relaaja.netlayout toimii muista pakkauksista itsenäisenä. Pakkaus sisältää verkon sijoittelualgoritmin sekä tämän käytössä tarvittavat rajapintaluokat.

4.3.1 Relaaja-pakkaus

Relaaja-pakkauksen luokat toimivat relaaja.database- ja relaaja.gui-pakettien sisältämien luokkien välissä. Relaaja-paketti sisältää Relaaja-luokan, joka on sovellusluokka, Model-luokat, joihin tallennetaan sovelluksessa esitettävä informaatio, sekä Command-luokat, jotka suorittavat Model-luokkia päivittäviä kaavion editointikomentoja.

Relaaja-luokka luodaan sovellusta käynnistettäessä. Relaaja-luokka luo ne sovelluksen luokat, joita luodaan vain yksi ohjelman suorituskertaa kohden (STTNetLayoutArranger, SQLParser).

Model-luokkia on neljä (DiagramModel, TableBoxModel, CornerModel, ReferenceLineModel). Niissä kuvataan se tietokantakaavion data, joka vaikuttaa komponenttien esittämiseen kaavioikkunassa, esim. komponentin sijainti ja koko. Model-luokat kuuntelevat vastaavia relaaja.database-paketin luokkia, rekisteröivät niissä tapahtuvat muutokset ja päivittävät itsensä tarvittaessa. Relaaja.gui-paketin luokat kuuntelevat vastaavia Model-luokkia. Model-luokat välittävät itsessään tapahtuneet muutokset vastaaville visuaalisille komponenteille, jotta nämä voisivät päivittää itsensä.

Command-luokkien ilmentymät luodaan tarvittaessa. Luodut Commandit tallennetaan luontijärjestyksessä CommandManagerin komentopinoon mahdollisia undo-ja redo-toimintoja varten. Varsinaisia Command-luokkia on kahdeksan. Ne suorittavat Model-luokkia päivittäviä komentoja, jotka kohdistuvat käyttöliittymän visuaalisiin komponentteihin. Commandeja ovat mm. käännepisteen siirto ja poisto, viiteviivan suoristus, SQL-lauseiden lisäys kaavioon ja valintajoukon siirto.

4.3.2 Database-pakkaus

Pakkaus relaaja.database sisältää tietokannan rakenteen kuvaamiseen tarvittavat luokat sekä SQL-jäsentäjän, jota voidaan käyttää rakenteen luomiseen ja muokkaamiseen. Pakkauksen avulla voidaan mm. luoda ja poistaa seuraavia rakenteita: tauluja, taulujen sarakkeita, taulujen välisiä yhteyksiä sekä arvojoukkoja.

Käyttäjän kannalta paketin tärkein luokka on Schema, jonka välityksellä tehdään suurin osa tietokannan rakenteeseen vaikuttavista operaatioista. Tiedot rakenteen muutoksista Schema saa DataDefinition-rajapinnan tuntevalta oliolta.

DataDefinition määrittelee rajapinnan tietokannan rakennetta muokkaavan olion (SQLParser) ja tietokannan rakenteen tallentavan olion välille (Schema). Rajapintaan kuuluvat myös luokat DDColumnType sekä DDConstraintParameter aliluokkineen. Näihin muokkaava olio tallentaa kaiken tietokannan rakenteesta löytämänsä tiedon. Rakenteen tallentavan olion ei tarvitse tuntea kaikkea näissä luokissa määriteltyä tietoa pystyäkseen ylläpitämään rakennetta. Tallentava olio voi palauttaa rajapinnassa määritellyt oliot pakkausta käyttävälle oliolle. Tämä mahdollistaa päivitystilanteissa sen, että varsinaiseen rakenteen tallentamiseen osallistuviin olioihin ei välttämättä tarvitse koskea lainkaan vaan riittää, että päivitykset tehdään DataDefinition rajapintaa käyttävään olioon ja pakkausta käyttävään olioon.

Schema sisältää myös metodit, joilla tietokannan rakennetta voidaan päivittämisen lisäksi myös tutkia. Scheman kautta saadaan mm. Table-, Column- ja Constraint-olioita, jotka kuvaavat vastaavia tietokannan rakenteita.

Taulut, sarakkeet ja yhteydet perivät luokan Observable, joten mikä tahansa Observer-luokka voi saada tiedon oliossa tapahtuneesta muutoksesta. Jos esim. taulu saa uuden sarakkeen, taulun graafisesta esitysmuodosta vastaava olio saa tästä tiedon ja taulu päivittää itsensä ruudulla vastaamaan uutta tilannetta.

4.3.3 Gui-pakkaus

Pakkaus sisältää sovelluksen käyttöliittymään sekä kaavioiden piirtämiseen tarvittavat graafiset komponentit. Käyttöliittymään kuuluvat valikot ja työkalupalkki. Kaaviot esitetään omissa ikkunoissaan sovelluksen pääikkunan sisällä.

Kaavioikomponentit perustuvat MVC-suunnittelumalliin. Tämä mahdollistaa esimerkiksi sen, että yhtä kaaviota kohden voi avoimena olla useita kaavioikkunoita. Yhteen ikkunaan tehdyt muutokset heijastuvat kaikkiin muihin.

Pakkauksen komponentit perustuvat Swing 1.0 -luokkakirjastoon.


4.3.4 Netlayout-pakkaus

Netlayout-pakkaus huolehtii tiedonkulusta muun järjestelmän ja automaattisen sijoittelijan välillä. Olennaiset tiedot näiden välillä ovat taulujen ominaisuudet, kuten koko, sekä tieto siitä, mistä tauluista on viiteavaimia mihinkin tauluun. Sijoittelijan taas pitää palauttaa tiedot taulujen ja viiteviivojen sijainnista. Pakkauksessa on kuusi luokkaa: NetEdge, NetLayoutArranger, NetLayout, NetNode sekä Size ja Location.

NetNode-luokka sisältää välineet taulun koon ja paikan asettamiseen. Käsiteltäväksi paikaksi on sovittu vasen ylänurkka. NetEdge-luokka tietää kahden taulun välisen yhteyden. NetLayout toimii NetNoden ja NetLayoutArrengerin välillä. Se välittää tiedot tauluista molempiin suuntiin. NetLayoutArranger suorittaa sijoittelupyynnön järjestelmän ulkopuoliselle sijoittelijalle. Sizen avulla saadaan kunkin taulun koko ja Locationin avulla sijainti.

4.4 Luokkakaavio

Järjestelmän käyttämät luokat ja niiden väliset suhteet on esitetty luokkakaaviossa.

4.5 Olioyhteistyö keskeisissä käyttötapauksissa

Muutamista käyttötapauksista on piirretty skenaariokaaviot, joista nähdään, miten työnjako olioiden välillä toimii kyseisten käyttötapauksien kohdalla.

4.6 Pakkauksien Javadoc-dokumentit

Pakkausten luokat on kuvattu Javadoc-dokumentissa.


5 Käyttöliittymä

Käyttöliittymä on kuvattuna määrittelydokumentissa kohdassa 4.1 Käyttöliittymä.


6 Rajoitteet toteutukselle

6.1 Noudatettavat standardit

Järjestelmän dokumentointi ja help-toiminnon näyttämät ohjeet tallennetaan HTML-muodossa.

Järjestelmään luettava syöteaineisto noudattelee SQL-standardia [ISO92], mutta järjestelmän on kyettävä tunnistamaan myös ainakin Oraclen murretta.

6.2 Ohjelmointikielet ja käyttöjärjestelmät

Lähdekoodissa käytetään Java 1.1:ssä määriteltyjä ominaisuuksia. Lähdekoodi kommentoidaan siten, että siitä voidaan generoida javadoc-dokumentaatio.

Järjestelmä on ympäristöriippumaton, kunhan Java 1.1:stä on olemassa standardinmukainen toteutus ympäristölle.

6.3 Muut tarvittavat apuohjelmat

Ohjelmoinnissa käytetään apuvälineenä JDK:hon kuuluvaa Swing-pakettia, joka sisältää valmiita elementtejä toteutukseen.

VGJ (Visualizing Graphs with Java) sisältää mm. Javalla kirjoitettuja sijoittelualgoritmeja. Näitä tullaan käyttämään toteutettaessa kaavion automaattista asettelua.

Järjestelmän SQL-jäsentäjä luodaan JavaCC-metakääntäjällä ja siihen liittyvällä JJTree-esikääntäjällä. Näille annetaan syötteenä BNF-kielioppi, jossa toiminnallisuus on kirjoitettu produktioiden yhteyteen.

6.4 Ohjelmointityyli

Ohjelmointityyli on kuvattu Java-tyylioppaassa.


7 Testaussunnitelma

7.1 Relaaja-paketin testausuunnitelma

Relaaja-paketin luokkien toiminnan testaa pääasiassa kunkin luokan tekijä.

Testauserät sisältävät useita testitapauksia, joissa testataan sekä normaalitapauksia että virheitä provosoivia tapauksia. Lisää testitapauksia voidaan laatia testausaikana. Kaikki testitapaukset on kirjattava. Havaitut virheet luokitellaan vakavuusasteen mukaan ja niistä raportoidaan luokan tekijälle.

Testauserät:

1. Kaavion perustaminen, poistaminen
2. Taulunmallin lisäys, muutos, poisto
3. Viiteviivamallin lisäys, muutos, poisto
4. Käännepisteen siirto, poisto, lisäys
5. Kaavion kommunikointi tietokannan kanssa
6. Observereille ilmoittaminen Modeleissa tapahtuneista muutoksista
7. Komennon suoritus, peruminen ja perumisen palautus
8. Komennon perumiseen varautuminen

7.2 Relaaja.databasen-paketin testaussuunnitelma

Helpoin testausmenetelmä on valmiissa järjestelmässä ladata SQL-lauseita ja katsoa muodostuuko lauseita vastaava kuva ruudulle. Jos tämä epäonnistuu saattaa vika kuitenkin olla myös muualla kuin relaaja.database pakkauksessa

Tästä hieman luotettavampi menetelmä on antaa jäsentäjälle SQL-lauseita, joista tämä kutsuu Schema:n metodeja. Schemaan ja muihin pakkauksen sisältöolioihin toteutetaan toString() operaatiot, jolloin kannan rakenteen muokkaamisen jälkeen verrataan Schema.toString() tulosta syötteenä annettuihin SQL-lauseisiin.

Edellistä voidaan tarkentaa niin, että jätetään jäsentäjä pois ja annetaan suoraan DataDefinition rajapinnan mukaisia komentoja ja verrataan Schema.toString() tulosta annettuihin komentoihin.

Näiden lisäksi Schemassa on oma checkDatabase() metodi, joka tarkastaa, että kannan rakenne on kunnollinen. Yksittäisiä DataDefinitionin komentoja varten voidaan rakentaa omat testitapauksensa.

7.3 Relaaja.Netlayout-paketin testaussuunnitelma

Paketin keskeinen tehtävä on siirtää järjestelmän antamat taulut järjestelmän ulkopuoliselle sijoittelijalle. Tämän toimivuus saadaan testattua kokeilemalla, tuottaako algoritmi oikean tuloksen tällaisilla syötteillä.

Toinen puoli paketin tehtävää on siirtää sijoittelijan tuottama tulos (taulujen ja mahdollisten käännepisteitten sijainnit) järjestelmälle. Tämän toimivuus testataan tulostamalla lopputulos tekstitiedostoon, josta pystytään sitten tarkistamaan tuloksen oikeellisuus.

7.4 Käyttöliittymän testaussuunnitelma

Käyttöliittymä testataan järjestelmällisesti käyttötapauksittain. Kaikkia ohjelman toimintoja kokeillaan. Myös virheellisiä syötteitä ja niistä toipumista testataan. Kaavioeditori on sovelluksen keskeisimpiä osia, sen toimivuuden testaaminen on siis erityisen tärkeää.

Testausta suoritetaan eri myös isoilla kaaviolla. Erityisesti isojen kaavioiden tulostamiseen kiinnitetään huomiota.

7.5 Selaimen ja jäsentäjän testaussuunnitelma

Selaimen ja jäsentäjän muodostama kokonaisuus testataan kokoavasti.

Metakääntäjän tarjoamat virheenjäljitystulostukset riittävät selaamisen ja jäsennyspuun luonnin testaamiseen.

Aluksi testataan selaimen tekstialkioiden oikea muodostuminen. Tämän jälkeen kaikki jäsentäjän produktiot käydään läpi yksi kerrallaan alkaen jäsennyspuun lehtisolmut luovista produktioista edeten kohti juurta. Produktioiden toimivuus testataan produktiokohtaisesti suunnitellulla syöteaineistolla, jolloin käydään erikseen läpi SQL-92 -standardin ja Oraclen määrittelemät ominaisuudet.

Jäsennyspuuhun liittyvä toiminnallisuus testataan DataDefinition-rajapinnan toteuttavan olion avulla.

Lähteet

Kär92
Kärhä, Heli: Relaatiotietokannan visualisointi. (Raportti C-1992-21 Helsingin yliopisto, tietojenkäsittelyopin laitos.)
ISO92
ISO/IEC 9075: 1992: Information technology - Database languages - SQL