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.

Kehitetty relaatiotietokantojen visualisoija (myöhemmin Relaaja) 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äästiin kehitetyn järjestelmän myötä eroon.

1.2 Käsitteitä

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

2 Määrittely- ja suunnitteludokumentti

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

Suunnitteludokumentti löytyy osoitteesta http://www.cs.helsinki.fi/group/jasso/suundok/suundok.html

2.1 Käyttötapaukset

Määrittely- ja suunnitteludokumenttissa oli kuvattuna, miten käyttäjä ja järjestelmä toimivat eri käyttötapausten yhteydessä. Nämä tapaukset on esitetty yksityiskohtaisemmin käyttötapaustaulukossa.

3 Arkkitehtuurin kuvaus

3.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.

3.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.

3.3 Pakkaukset

Relaaja koostuu viidestä pakkauksesta: relaaja, relaaja.database, relaaja.database.parser, relaaja.gui ja relaaja.netlayout. Nuolen suunta ilmoittaa mitä kukin pakkaus käyttää. Esimerkiksi relaaja-pakkaus käyttää relaaja.netlayout-pakkausta mutta ei päinvastoin.

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 rakennetta ja välittävät sen edelleen relaaja.gui:n graafisille komponenteille.

Relaaja.database muodostaa relaaja.database.parser-pakkauksen kanssa itsenäisen kokonaisuuden. Relaaja.database sisältää tietokannan rakenteen tallentavat luokat sekä rajapinnan näiden käsittelyyn.  Relaaja.database.parser  puolestaan sisältää SQL-jäsentäjän, joka välittää tietoa tätä rajapintaa käyttäen.

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

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

3.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 (CGDNetLayoutArranger, SQLParser).

Model-luokkia on neljä (DiagramModel, TableModel, 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. Commandit 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.

3.3.2 Database-pakkaus

Pakkaus relaaja.database sisältää tietokannan rakenteen kuvaamiseen tarvittavat luokat sekä rajapinnan niiden käyttämiseen. 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 DDDataType sekä DDParameter 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.

3.3.3 Parser-pakkaus

Pakkaus relaaja.database.parser sisältää SQL-jäsentäjän nimeltä SQLParser, joka jäsentää taulujen luonti- ja muokkaus-lauseista oleellisen tiedon tietokannan rakenteen muodostamiseksi. Tämän tiedon se välittää DataDefinition-rajapinnan yli database-pakkaukselle.

Jäsentäjä toteutus on esitelty erikseen omassa dokumentissään.

3.3.4 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ä.

Kaaviokomponentit 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.

3.3.5 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 viitteitä mihinkin tauluun. Sijoittelijan taas pitää palauttaa tiedot taulujen uusista sijainneista takaisin relaajalle. Pakkauksessa on kahdeksan luokkaa: CGDNetLayoutArranger, SPRINGNetLayoutArranger, NetLayoutArranger, NetLayout, NetNode, Size, Location ja PostArranger.

NetNode-luokka sisältää välineet taulun koon ja paikan asettamiseen. Käsiteltäväksi paikaksi on sovittu vasen ylänurkka. NetLayout toimii NetNoden ja NetLayoutArrengerin välillä. Se välittää tiedot tauluista molempiin suuntiin. NetLayoutArranger suorittaa sijoittelupyynnön joko CGDNetLayoutArranger- tai SPRINGNetLayoutArranger-luokalle. Sizen avulla saadaan kunkin taulun koko ja Locationin avulla sijainti. PostArranger etsii olemassa olevaan kaavioon lisätyille tauluille sijainnin kaavion vasemmasta reunasta. CGDNetLayoutArranger ja SPRINGNetLayoutArranger ovat sijoittelualgoritmien luokkia ja toimivat järjestelmän ja algorimien välissä.

3.4 Luokkakaavio

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

Database-paketin luokkakaavio on esitetty omassa luokkakaaviossaan.

3.5 Luokkien kuvaukset

Pakkausten luokat on kuvattu Javadoc-dokumenteissa.

3.6 Sovellusalue

Kehitetty 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 taulustaesitetää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ä Oraclen murteen mukaisia relaatiotietokannan määrityslauseita.
 

4 Toteutusratkaisut

4.1 Noudatettavat standardit

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

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

Jäsentäjän kielioppi on esitelty erikseen

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

Lähdekoodissa käytettiin Java 1.1:ssä määriteltyjä ominaisuuksia. Lähdekoodi kommentoitiin 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.

4.3 Muut tarvittavat apuohjelmat

Ohjelmoinnissa käytettiin apuvälineenä JDK:hon kuuluvaa Swing-luokkakirjastoa, joka sisältää valmiita käyttöliittymä komponentteja.

VGJ (Visualizing Graphs with Java) sisältää mm. Javalla kirjoitettuja sijoittelualgoritmeja. Näitä käytettiin kaavion automaattisen asettelun toteutuksessa.

Järjestelmän SQL-jäsentäjä luotiin JavaCC-metakääntäjän versiolla 0.7.1 ja siihen liittyvällä JJTree-jäsennyspuunluontiesikääntäjällä.
Jäsentäjän hyväksymä kielioppi määriteltiin BNF-muodossa.

4.4 Ohjelmointityyli

Ohjelmointityyli on kuvattu Java-tyylioppaassa.

4.5 Versionhallinta ja ylläpito

Relaajan lähdekoodit löytyvät projektin hakemistosta joka on /home/group/jasso/k98/common/.

Järjestelmästä on tehty asennuspaketti, joka sisältää tarvittavat tiedostot Relaajan käyttämiseen sekä Win32- että Linux-ympäristöissä. Asennuspaketti on tiedostossa /home/group/jasso/k98/install/Relaaja.zip.

Päivityksen yhteydessä saadaan asennuspaketti luotua uudestaan common-hakemiston tiedostoista ajamalla Linuxissa komentotiedosto /home/group/jasso/k98/install/makeinstall.

5 Testaus

5.1 Käyttötapauksittain

5.2 Database-pakkaus

5.3 SQL-parser

5.4 Layout-algoritmi

5.4.1 CGD-algoritmi

5.3.2 SPRING-algoritmi


6 Jatkokehitys

6.1 Toteuttamatta jääneet piirteet

Suunnitteludokumentissä määritelty viiteviivan merkitseminen on toteutettu siten että hiiren kohdistimen liikkuessa viiteviivan päälle tulee viiteviiva merkityksi ja merkintä lakkaa kohdistimen liikkuessa viivan päältä pois. Viiteviivaa ei voida merkitä painamalla hiiren valintanäppäintä.

Suunnitteludokumentissä määritelty Page Border On/Off -toimintoa ei toteuttu varsinaiseen kaavioikkunaan ja sen View-valikkoon vaan tulostuksen yhteyteen.

Suunnitteludokumentissä määritelty Windows-valikon Center-toimintoa ei toteutettu ollenkaan.

6.2 Hyödylliset lisäpiirteet

Hyödyllinen lisäpiirre olisi kaavioeditori jolla voisi luoda uusia tauluja, kenttiä ja viiteyhteyksiä. Näin vältyttäisiin siltä että käyttäjän tarvitsisi luoda SQL-lauseet jollakin toisella sovelluksella tai käsin. Samoin insertSQL-toiminnolla lisättäessä uusia tauluja olemassa olevaan kaavioon lisättävien taulujen ja kenttien sijoittelija voisi olla kehittyneempi.

Tulostus toimii tällä hetkellä heikosti johtuen javasta mutta jatkossa uusien java- versioiden avulla sekin voitaisiin saada toimimaan hyvin useimmissa ympäristöissä.

Kahden taulun välisen viiteviivan kutistaminen lyhyemmäksi olisi myöskin joissakin tapauksissa kätevä lisäpiirre.

Käytetyt järjestelyalgoritmit toimivat mutta eivät ole optimoituja tähän järjestelmään joten niitä voisi parannella tai jopa käyttää jotakin muuta algoritmia joka toimisi vielä paremmin tässä järjestelmässä.

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