Toteutusdokumentti. Ohjelmistotuotantoprojekti XPerf. Helsingin yliopisto. Tietojenkäsittelytieteen laitos

Samankaltaiset tiedostot
Testaussuunnitelma. Ohjelmistotuotantoprojekti XPerf. Helsingin yliopisto. Tietojenkäsittelytieteen laitos

Suunnitteludokumentti

Kaavioista luettavat UML-laajennukset

Luonnosversio Tommi Koivula hyväksytty versio Tommi Koivula

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä. Tiedonkätkentä. Aksessorit. 4.2

UML-kielen formalisointi Object-Z:lla

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2

Olio-ohjelmointi Javalla

Tietojen syöttäminen ohjelmalle. Tietojen syöttäminen ohjelmalle Scanner-luokan avulla

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

Sisältö. 2. Taulukot. Yleistä. Yleistä

Sisällys. 12. Näppäimistöltä lukeminen. Yleistä. Yleistä

Ylläpitodokumentti. Boa Open Access. Helsinki Ohjelmistotuotantoprojekti HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos

12. Näppäimistöltä lukeminen 12.1

Olion elinikä. Olion luominen. Olion tuhoutuminen. Olion tuhoutuminen. Kissa rontti = null; rontti = new Kissa();

14. Poikkeukset 14.1

XML prosessori. XML prosessointi. XML:n kirjoittaminen. Validoiva jäsennin. Tapahtumaohjattu käsittely. Tapahtumaohjattu käsittely.

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. IX Suunnittelumallit Proxy, Factory Method, Prototype ja Singleton

Ohjelmoinnin perusteet Y Python

5. HelloWorld-ohjelma 5.1

Sisältö. 22. Taulukot. Yleistä. Yleistä

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma.

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti:

Subversion-ohje. Linux Traffic Control-käyttöliittymä Ryhmä paketti2

Taulukot. Jukka Harju, Jukka Juslin

Lohtu-projekti. Testaussuunnitelma

Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä

14. Poikkeukset 14.1

Hakemistojen sisällöt säilötään linkitetyille listalle.

Ohjelmoinnin perusteet Y Python

Harjoitustyö: virtuaalikone

Ohjelmoinnin jatkokurssi, kurssikoe

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?

2. Olio-ohjelmoinista lyhyesti 2.1

Ohjelmointi 2 / 2010 Välikoe / 26.3

4. Luokan testaus ja käyttö olion kautta 4.1

MPCC-työkalua voidaan käyttää yhden laitteen valvontaan ja yhden tai useamman laitteen konfigurointiin (Modbus broadcast, osoite 0).

Linkitetystä listasta perittyä omaa listaa käytetään muun muassa viestiin liittyvien vastausten säilömiseen.

Ohjelmisto on selainpohjaisen käyttöliittymän tarjoava tietokantajärjestelmä merikotkien seurantaan WWF:n Merikotka-työryhmän tarpeisiin.

Ohjelmoinnin perusteet Y Python

4. Olio-ohjelmoinista lyhyesti 4.1

UML -mallinnus TILAKAAVIO

CODEONLINE. Monni Oo- ja Java-harjoituksia. Version 1.0

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op

Sisällys. 6. Metodit. Oliot viestivät metodeja kutsuen. Oliot viestivät metodeja kutsuen

Analyysi, dynaaminen mallintaminen, yhteistoimintakaavio ja sekvenssikaavio

IDL - proseduurit. ATK tähtitieteessä. IDL - proseduurit

Luento 7: XML-ohjelmointirajapinnat

Käyttöohje. Boa Open Access. Helsinki Ohjelmistotuotantoprojekti HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos

8. Näppäimistöltä lukeminen 8.1

ATK tähtitieteessä. Osa 3 - IDL proseduurit ja rakenteet. 18. syyskuuta 2014

UML- mallinnus: Tilakaavio

Analyysi, dynaaminen mallintaminen, yhteistoimintakaavio ja sekvenssikaavio

Uutisjärjestelmä. Vaatimusmäärittely. Web-palvelujen kehittäminen. Versio 1.3

Sisällys. 7. Oliot ja viitteet. Olion luominen. Olio Java-kielessä

8. Näppäimistöltä lukeminen 8.1

7. Oliot ja viitteet 7.1

ELM GROUP 04. Teemu Laakso Henrik Talarmo

Tietokanta.java Luokka tarjoaa välineet tietokannan lukemiseen. Haetuista tiedoista muodostetaan kurssi- ja opetus-olioita.

StanForD-XML. Juha-Antti Sorsa, Tapio Räsänen, Vesa Imponen

List-luokan soveltamista. Listaan lisääminen Listan läpikäynti Listasta etsiminen Listan sisällön muuttaminen Listasta poistaminen Listan kopioiminen

JAKELUPISTE KÄYTTÖOHJE 2/6

TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 30. marraskuuta 2015

Harjoitus 5 (viikko 48)

Kompositio. Mikä komposition on? Kompositio vs. yhteyssuhde Kompositio Javalla Konstruktorit set-ja get-metodit tostring-metodi Pääohjelma

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

Testausraportti. Orava. Helsinki Ohjelmistotuotantoprojekti HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos

Ohjelmistotekniikan menetelmät, suunnittelumalleja

ITKP102 Ohjelmointi 1 (6 op)

Ohjelmointi 2 / 2008 Välikoe / Pöytätestaa seuraava ohjelma.

9. Periytyminen Javassa 9.1

Mikä yhteyssuhde on?

Eye Pal Solo. Käyttöohje

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

Harjoitus 5. Esimerkki ohjelman toiminnasta: Lausekielinen ohjelmointi I Kesä 2018 Avoin yliopisto 1 / 5

Ohjelmistojen mallintamisen ja tietokantojen perusteiden yhteys

Ohjelmistojen suunnittelu

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Poikkeukset ja tietovirrat: Virhetilanteiden ja syötevirtojen käsittely

812341A Olio-ohjelmointi Peruskäsitteet jatkoa

Operaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta

Kehitysohje. ETL-työkalu. ExtraTerrestriaLs / Aureolis Oy

Harjoitus 5 (viikko 41)

Kooste. Esim. Ympyrän keskipiste voidaan ajatella ympyrän osaksi.

11. Javan toistorakenteet 11.1

on ohjelmoijan itse tekemä tietotyyppi, joka kuvaa käsitettä

Ohjelmoinnin perusteet Y Python

TIE Samuel Lahtinen. Lyhyt UML-opas. UML -pikaesittely

5. HelloWorld-ohjelma 5.1

Suunnitteluvaihe prosessissa

Ohjelmoinnin perusteet Y Python

Sisällys. Metodien kuormittaminen. Luokkametodit ja -attribuutit. Rakentajat. Metodien ja muun luokan sisällön järjestäminen. 6.2

Määrittelydokumentti. Ohjelmistotuotantoprojekti XPerf. Helsingin yliopisto. Tietojenkäsittelytieteen laitos. Tommi Koivula.

Sisällys. 18. Abstraktit tietotyypit. Johdanto. Johdanto

CSV - XML ohjelman käyttöohje

Sisällys. JAVA-OHJELMOINTI Osa 7: Abstrakti luokka ja rajapinta. Abstraktin luokan idea. Abstrakti luokka ja metodi. Esimerkki

Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista

15. Ohjelmoinnin tekniikkaa 15.1

Transkriptio:

Helsingin yliopisto Tietojenkäsittelytieteen laitos Ohjelmistotuotantoprojekti XPerf Toteutusdokumentti Tommi Koivula Antti Levomäki Juha Mondolin Timo Suomela Versio 1.0 11. toukokuuta 2003

Versiohistoria Versio Päivämäärä Kommentti / muutokset Tekijä 1.0 11.5.2003 Tommi Koivula Timo Suomela Juha Mondolin

Sisällys 1. Johdanto...1 2. Vaatimusten toteutuminen...1 2.1. Toiminnallisten vaatimusten toteutuminen...1 2.2. Ei-toiminnallisten vaatimusten toteutuminen...2 2.3. Käytettävyysvaatimusten toteutuminen...3 3. Tarkennukset suunniteltuun arkkitehtuuriin...4 4. Osajärjestelmien toteutuksen kuvaus...4 4.1. Lukumoduulin valintajärjestelmä...4 4.2. Prolog-lukumoduuli...8 4.3. XMI-lukumoduuli...8 4.4. Tiedostonluvun käyttöliittymä...13 Liite A JavaDoc-kuvaukset toteutetuista luokista...1

1 1. Johdanto Tässä dokumenttissa on kuvaus XPerf-ohjelmistotuotantoprojektin toteutusvaiheen kulusta ja sen tuloksena syntyneesta tuotteesta. XPerf-projektin tehtävänä oli toteuttaa MAISAtyökaluun [1] laajennus, jonka avulla MAISA-työkaluun voidaan lukea UML-kaavioita [2] XMI-dokumenteista [3]. Tarkempi kuvaus MAISA-työkaluun tehdyistä uusista ominaisuuksista löytyy määrittelydokumentista [4] ja yksityiskohtainen kuvaus toteutetusta arkkitehtuurista löytyy suunnitteludokumentista [5]. Luvussa 2 esitellään toteutettujen lisäominaisuuksien suhdetta niille asetettuihin vaatimuksiin. Luvussa 3 on esitelty ne vähäiset tarkennukset arkkitehtuuriin, joita toteutusvaiheessa on tehty. Luvussa 4 esitellään lyhyesti kunkin toteutetun osajärjestelmän toteutusperiaatteet, jotka eivät selviä pelkästään JavaDoc-dokumentaatiosta [liite A]. 2. Vaatimusten toteutuminen 2.1. Toiminnallisten vaatimusten toteutuminen XMI.01 Pystyy lukemaan ArgoUML:llä tuotettuja XMI-dokumentteja. Dokumenteista luetaan vain tiedot, joita MAISA-työkalu tarvitsee. Jos XMI-dokumentissa on viite kielioppiin, tulee viitatun DTD:n olla saatavilla ja dokumentin oikeellisuus tarkastetaan. Jos viitettä kielioppiin ei ole, oikeellisuutta ei myöskään tarkasteta.

2 Mai.01 MAISA-järjestelmä osaa tiedostotyypin perusteella valita oikean mekanismin tiedostonlukua varten. Jokainen lukumoduuli vastaa itse tietoisuudesta, osaako se lukea annettua tekstivirtaa vai ei. XMI- ja prolog-lukumoduulin kohdalla tunnistaminen tapahtuu tiedostotyypin sisällön perusteella, ei tiedostonnimestä. Mai.02 MAISA-työkaluun ladataan ajonaikaisesti käytettävissä olevat lukumoduulit, jolloin kaikki tiedostotyypit, joita ladutut lukumoduulit tukevat, voidaan lukea. Mai.06 Jos XMI-dokumenttia jäsennettäessä kohdataan virheitä, lopetetaan jäsentäminen välittömästi ja kaikki MAISA-työkalun jo täytetyt tietorakenteet tyhjennetään. 2.2. Ei-toiminnallisten vaatimusten toteutuminen Dok.01 Dokumenteista käyttöohje ja ylläpitodokumentti on kirjoitettu englanniksi. Muut dokumentit on kirjoitettu suomeksi. Yll.01 MAISA-työkalun eri tiedostotyyppien luku on muutettu modulaariseksi. Ts. jokaista tiedostotyyppiä vastaa oma moduulinsa. Moduulit ladataan MAISA-työkaluun ajonaikaisesti ja kaikki niiden tukemat tiedostotyypit ovat avattavissa MAISA-työkaluun. XMI- ja prolog-tiedostotyyppejä vastaavien uusien tiedostotyyppien lisääminen jatkossa ei vaadi muutoksia MAISA-järjestelmään.

3 Koe.01 Kokeellinen osuus korvataan asiakkaan pyynnöstä tutkimuksella XMI-tuen laajentamisesta tukemaan myös XMI-versiota 1.2. Laajentamista tutkitaan sen teknisen toteuttamisen kannalta. Myös laajennuksen työmäärästä tehdään arvio. 2.3. Käytettävyysvaatimusten toteutuminen Mai.03 Maisa tunnistaa luettavan tiedoston formaatin automaattisesti ilman käyttäjän toimenpiteitä. Tämä toteutuu vaatimuksen Mai.01 yhteydessä kuvatulla tavalla. Mai.04 Tiedostonlukuoperaation toiminta ilmaistaan käyttäjälle Javan valmiilla käyttöliittymäkomponentilla. Käyttäjä saa vain tiedon, että lukuoperaatio on käynnissä, mutta ei operaation jäljellöolevasta kestosta tai prosentuaalisesta osuudesta. Tämä siksi, ettei monien tiedostotyyppien (esim. XMI-dokumentit) yhteydessä tämä tieto ole saatavilla. Mai.05 Jos XMI-dokumentin jäsennyksessä törmätään virheisiin, ilmoitetaan tästä välittömästi käyttäjälle. Virheen sattuessa jäsennys keskeytetään. Virhetilanteiden raportointia käyttäjälle ei muutettu.

4 3. Tarkennukset suunniteltuun arkkitehtuuriin Suunnitteluvaiheessa suunniteltuun arkkitehtuuriin ei tehty toteutusvaiheessa enää merkittäviä muutoksia. Yksityiskohtia, jotka tarkoituksella jätettiin suunnitteludokumentista kirjaamatta, esitellään lyhyesti luvussa 4. 4. Osajärjestelmien toteutuksen kuvaus Tässä luvussa esitellään lyhyesti kunkin toteutetun osajärjestelmän toteutusperiaatteet, jotka eivät selviä pelkästään JavaDoc-dokumentaatiosta [liite A]. Tällaisia toteutusperiaatteita ovat esimerkiksi yksityiset metodit ja attribuutit, joiden tarkoitus ei ole itsestäänselvä. perustelut valitulle luokan sisäiselle rakenteelle 4.1. Lukumoduulin valintajärjestelmä Lukumodulin valintajärjestelmä (ja itse tiedoston luku) on vaatinut muutoksia MAISA_tool ja MAISA_system -luokkiin. MAISA_tool luokan metodissa update(observable, Object) passivoidaan käyttöliittymä ja ajetaan sopiva MAISA_tool.ResourceLoader luokasta perityn luokan ilmentymä, projektikansion kohdalla MAISA_tool.ProjectLoader, kaaviotiedoston kohdalla MAISA_tool.DiagramLoader -luokan ilmentymä. Resurssit ladataan erillisessä säikeessä, jotta käyttöliittymä ei pysähdy latauksen ajaksi ja update( ) metodi palaa heti käynnistettyään säikeen. Valittu lataaja ensimmäisenä käynnistää ajastinsäikeen, joka odotettuaan kolme sekunttia avaa animaation sisältävän

5 indikaattoridialogin (IndeterminateProgressMonitor). Jos lataaminen on valmis ennen ajastimen laukeamista, dialogia ei näytetä. Kun lataus on suoritetty loppuun tai se on käyttäjän (tai virheen) toimesta keskeytetty, aktivoidaan käyttöliittymä. Jos lataus on viety onnistuneesti loppuun asti, lisätään luettu projekti tai kaavio(t) käyttöliittymän projektinäkymään. ResourceLoader luokka toteuttaa Template Method -suunnittelumallin vaikkakin abstraktoitu algoritmi on hyvin yksinkertainen ja ainoa abstrakti askel on metodi loadresource(bitset). Luokan run() metodi käynnistää ensimmäisenä indikaattorin ajastimen jonka jälkeen se kutsuu loadresource(bitset) metodia. Metodin parametrin tarkoitus on toimia viestikanavana lataajalle käyttäjän aiheuttaman keskeytyksen tapahtuessa. Keskeytyksen tapahtuessa asetaan välitetyn BitSet-ilmentymän bitti MAISA_system.LOAD_CANCELLED_BIT pystyyn. Metodi palauttaa onnistuessa DefaultMutableTreeNode -olion joka sisältää luetut kohteet. Odotetut poikeukkset MaisaParseException ja IOException siepataan ja virheilmoitukset otetaan talteen. Viimeisenä run() metodissa kutsuttaan evaluateresult() metodia, josssa ensimmäisenä pysäytetään indikaattorin laukaisuajastin. Jos lukijassa ei ole tapahtunut virhettä eikä käyttäjä ole keskeyttänyt sitä, liitetään loadresource(bitset) metodin palauttama solmu projektinäkymän puuhun, jonka jälkeen aktivoidaan käyttöliittymä. Jos lukijassa on tapahtunut virhe niin siihen liittyvä virheilmoitus näytetään pääikkunan yläpalkissa. DiagramLoader luokka lataa yksittäisen kaaviotiedoston ja saa konstruktorissa luettavan tiedoston nimen ja projektinäkymän puun solmun, jonka alle tiedostosta luetut kaaviot lisätään. Solmuviite voi olla null, misää tapauksessa kaaviot luetaan uuden projektin alaisuuteen. Luokan loadresource(bitset) -toteutus kutsuu MAISA_system luokan opendiagram(string, BitSet) tai opendiagram(string, DefaultMutablTreeNode, BitSet) metodia riippuen siitä, onko konstruktorissa annettu solmuviite null vai ei ja välittää sen paluuarvon eteenpäin.

6 ProjectLoader luokka lataa kokonaisen hakemiston kaikki tuetut kaaviotiedostot ja saa konstruktorissa luettavan hakemiston nimen. Luokan loadresource(bitset) -toteutus kutsuu MAISA_system-luokan openproject(string, BitSet) metodia ja valittää sen paluuarvon eteenpäin. Projektihakemisto luetaan MAISA_system-luokan openproject(string, BitSet) metodissa. Metodi käy silmukassa läpi kaikki annetun hakemiston tiedostot jotka eivät ole itse hakemistoja ja kutsuu kunkin kohdalla parsediagramfile(file, DefaultMutableTreeNode, String)-metodia, joka tulkitsee tiedoston sisällön. Silmukan alussa tarkistetaan ensin onko lukuoperaatio keskeytetty, eli onko parametrina annetun BitSet-ilmentymän bitti MAISA_system.LOAD_CANCELLED_BIT pystyssä. Jos näin on niin metodi palautta heti null arvon. Kun kaikki tiedostot on näin käyty läpi, käydään tiedostot uudestaan läpi ja luetaan kaikki kaavioihin ja projektiin liittyvät resurssitiedostot. Resurssien lukemiseen käytettyyn logiikkaan ei ole tehty muita muutoksia kuin suunnitteludokumentissa mainittu kuvatiedostojen assosiaatio luettuun kaavioon ja kaaviotiedostojen lukusilmukassa käytetty keskeytyksen tarkistus. Jos lukua ei ole keskeytetty niin viimeisenä kutsutaan luodun Cproject-luokan ilmentymän updategui() metodia, johon on siiretty logiikka joka näyttää tarvittaessa luetun sekvenssikaavion viestien aikavaatimusten rajojen määrittelyyn tarkoitetun ikkunan. Yksittäinen kaaviotiedosto luetaan MAISA_system luokan opendiagram(string, BitSet) metodilla, jos sitä ei lueta jo ennestään luetun projektin alaisuuteen. Metodissa luodaan uusi CProject-luokan ilmentymä käyttäen luettavan tiedoston hakemiston nimeä projektin nimenä ja kutsutaan metodia opendiagram(string, DefaultMutableTreeNode, BitSet). Yksittäinen kaaviotiedosto luetaan opendiagram(string, DefaultMutableTreeNode, BitSet) -metodilla. Metodi kutsuu parsediagramfile(file, DefaultMutableTreeNode, String) - metodia jonka jälkeen liitetään luettuihin kaavioihin mahdolliset kuvatiedostot samasta

7 hakemistosta. Logiikka tässä on sama kuin projektihakemistoa lukiessa openproject(string, BitSet) -metodissa. Jokainen kaaviotiedosto luetaan parsediagramfile(file, DefaultMutableTreeNode, String) -metodissa. Metodissa pyydetään ensin DocumentReaderFactory-luokalta sopivaa lukijaa parametrina saadulle tiedostolle. Jos DocumentReaderFactory-luokan getdocumentreader(file) -metodi palauttaa jonkin DocumentReader-luokan ilmentymän, kutsutaan sen read(bufferedreader, PrintWriter, CProject) -metodia. Seuraavaksi käydään läpi kaikki CProject-olion kaaviot tekemällä kaaviolistasta kopio ja poistamalla kopiosta kaikki ne kaaviot, joita jo vastaa yksi projektia vastaavan puusolmun lapsista. Jäljellejääneille kaavioille asetetaan projekti omistajaksi ja lisätään projektia vastaavaan puusolmuun yksi lapsi kutakin kaaviota kohden. DocumentReaderFactory-luokka toteuttaa Singleton ja Factory Method -sunnittelumallit. Luokalta pyydetään sopivaa lukijaa getdocumentreader(file) -metodilla. Metodi iteroi lukijalistan ylitse ja tarjoaa tiedostoa luettavaksi jokaiselle lukijalle vuorollaan kutsumalla tämän canread(bufferedreader) -metodia kunnes jokin näistä palauttaa arvon true. DocumentReaderFactory-luokan konstruktorissa kutsutaan loadreaderlist() -metodia, joka lataa käytettävissä olevat lukijaluokat. Lukijaluokat luetaan javan Propertiesformaatissa olevast konfiguraatiotiedostosta jonka kullakin rivillä määritellään yksi lukijaluokka siten, että attribuutin nimi on symboolinen nimi lukijalle ja attribuutin arvo on lukijaluokan täydellinen nimi. Konfiguraatiotiedoston sijainti selvitetään seuraavalla tavalla: Jos ympäristömuuttuja maisareaders.configuration on määritelty, sen arvo yritään tulkita konfiguraatiotiedoston URL-viitteenä.

8 Jos yllä mainittua ympäristömuuttujaa ei ole asetettu tai sen arvoa ei voida tulkita URL- viitteenä, yritetään ladata maisareaders.properties niminen tiedosto luokkapolun varrelta käyttäen Class.getResourceAsStream(String) -metodia. Jos yllä mainitut yritykset epäonnistuvat, yritetään avata maisareaders.properties niminen tiedosto nykyisestä työhakemistosta. 4.2. Prolog-lukumoduuli Tähän luokkaan on suunnitellusti siirretty prolog-muotoisten kaavioiden lukuoperaatiot, jotka aiemmin sijaitsivat CDiagram-luokan laajennoksissa sekä CProject-luokan read()- metodi että DocumentReader-rajapintaan kuuluvat operaatiot. Jokaista kaaviota vastaava lukuoperaatio on tehty omaksi julkiseksi metodikseen. Alkuperäisissä lukumetodeissa olleet viittaukset kaavioluokan sisäisiin tietorakenteisiin on muutettu tarvittaessa set- ja get-metodien kutsuiksi. Osa näistä metodeista oli implementoitu luokkiin jo aiemmin, osa lisättiin tarpeen mukaan. Prolog-lukumoduuliin siirrettyä entistä CProject-luokan read()-metodia on muutettu siten, että kuvatiedostojen lukeminen ym. toiminnallisuus on siirretty MAISA_system-luokkaan. 4.3. XMI-lukumoduuli XMIDocumentReader XMIDocumentReader-luokan canread()-metodi lukee SAX-jäsennintä hyväksi käyttäen annettua virtaa, kunnes se löytää XMI-elementin tai virheellisen kohdan dokumentissa (kohdan, joka ei ole XML:n mukainen). Jos XMI-version on 1.0, palauttaa metodi true, muuten false. Koska SAX-jäsennin keskeyttää dokumentin jäsentämisen heti kun se huomaa virheitä dokumentissa, ei virtaa lueta pitkään binääri- ja ei-xml-dokumenttien

9 kohdalla. XML-dokumenttien, jotka eivät ole XMI:tä, kohdalla lukeminen jatkuu koko dokumentin läpi. Tämä tietysti, varsinkin isojen tiedostojen kohdalla, voi hidastaa projektien avaamista Maisa-järjestelmään. Näin saavutetaan kuitenkin toimivuus kaikilla mahdollisilla XMI-dokumenteilla. canread-metodin toiminta epäonnistuu, jos SAX-jäsennintä ei saada alustettua. Tämä voi tapahtua, koska SAX-jäsennin ladataan ajonaikaisesti. Jos alustus ei onnistu, heittää metodi IOException-poikkeuksen, jonka viesti on "Cannot initialize XML-parser. XMIDocumentReader-luokan read-metodi alustaa DOM-jäsentimen ja jäsentää annetusta virrasta dokumentin Document-olioksi, jonka avulla dokumentti käsitellään hierarkisesti. Metodi luo myös TreeWalker-olion ilmentymän, joka laitetaan osoittamaan Foundation.Core.Model-elementtiin ja ko. elementin kiinostavasta sisällöstä tehdään malli käyttäen hyväksi ModelNode luokkaa. Näiden avulla alustetaan XMIParser, jolla kunkin löydetyn hierarkian ylimmän tason elementti välitetään sitä vastaavalle lukijaluokalle, Oikea lukijaluokka, XMIDiagramReader-rajapinnan ilmentymä, valitaan käyttäen XMIDiagramReaderFactory-luokkaa. Multiplicity-elementtien luku lisättiin read-metodiin johtuen argouml:n oudosta tavasta tallentaa niitä XMI-dokumenttiin. Koko dokumenttin käydään läpi SAX-jäsennintä käyttäen ja Multiplicity-elementit luetaan staattiseen taulukkoon, josta kaavioiden lukijat voivat tarvittaessa lukea niitä. SAX-jäsennyksessä käytetään hyväksi DefaultHandlerluokan ilmentymää MAISA.reader.xmi.MultiplicityHandler. Jotta yllä mainittu Multiplicity-elementtien lukeminen pystyttiin käytännössä lisäämään, jouduttiin read-metodin parametrina saatu tiedostovirta tallentamaan ensin levylle väliaikaistiedostoon, josta se voidaan lukea useammassa otteessa. Tämä tapahtuu XMIDiagramReader-luokan metodien savestreamtodisk, gettempstreamfromdisk ja deletestreamtempfile avulla.

10 XMIParser ja ModelNode XMIParserin luomiseksi tarvitaan org.w3c.dom.traversal.treewalker olio, joka osoittaa dokumentin johonkin elementtiin. XMIParser tarvitsee myös mallin. Malli annetaan XMIParserille antamalla mallin juurisolmu (ModelElement). Mallin juurisolmun elementin on oltava sama kuin annetun TreeWalker-olion osoittama dokumentin elementti. Jos näin ei ole XMIParser-olion parse()-metodin kutsumisen hetkellä, heittää XMIParser XMIParseException poikkeuksen. Jäsentämisen mallia tehtäessä ModelNode-olioilla, on huomioitava, että jokaiselle mallin solmuista on syytä antaa yksilöllinen nimi, jotta solmut voidaan käsittelijöissä tunnistaa toisistaan nimien perusteella. Mallia ei voida enää muuttaa, kun XMI-jäsentimen parse()-metodia on kutsuttu. Tämä siksi, että jäsentimen toimintaa muuttuu ennustamattomaksi, jos mallin tehdään sen toiminnan aikana muutoksia. Jos parse()-metodin kutsumisen jälkeen yritetään käyttää ModelNode-olion metodeita jotka muuttavat sen tilaa, heitetään ajonaikainen poikkeus UnmodifiableException. Tätä ajonaikaista poikkeusta ei tarvitse ottaa kiinni. Jos mallia halutaan käyttää useampien dokumenttien jäsentämiseen, on malli luotava aina uudelleen jäsentämisen jälkeen. Malli voi sisältää myös tiettyjä rekursiivisia solmuja, ts. solmuja, joiden lapsina on solmu itse. Tällöin dokumentista voidaan lukea rajoittamaton määrä sisäkkäisiä samoja elementtejä. Sisäkkäisten elementtien määrää ei tällöin kuitenkaan voi eri tasoilla määritellä, vaan rajat elementtien lukumäärille ovat samat jokaisella tasolla. Esimerkki sallitusta rekursiivisesta mallista: ModelNode root = new ModelNode( root, rootelem ); ModelNode child = new ModelNode( child, childelem );

11 root.addchild( child, Limit.ONE ); child.addchild( child, Limit.ZERO_TO_FINITE ); Rekursiiviset solmut, jossa solmu ei ole itsensä välitön lapsi, eivät ole sallittuja. Esimerkiksi seuraava rakenne ei ole sallittu: ModelNode root = new ModelNode( root, rootelem ); ModelNode child = new ModelNode( child, childelem ); root.addchild( child, Limit.ZERO_TO_ONE ); child.addchild( root, Limit.ZERO_TO_FINITE ); Jos yo. mukaisia ei-sallittuja malleja tehdään, XMIParser ei huomaa rekursiota vaan solmun lapsissa vierailevat ModelNode-luokan metodit jäävät ikuisen silmukkaan. XMIParser-luokalla on myös gettaggedvaluexxx metodit toteutettuna kuten suunnitteludokumentissa mainitaan, mutta niitä laajennettiin palauttamaan kaikki haettua avainta vastaavat arvot taulukkona, koska elementillä voi olla samaa taggedvalue-avainta useita. Toisin kuin suunnitteludokumentissa mainitaan [5 s.10], XMIParser ei käytä NodeFilterrajapintaa elementtien poisrajaukseen, koska XMIParserin rajapinta DOM-jäsentimeen tapahtuu jo olemassaolevan TreeWalker-olion kautta ja NodeFilter on rekisteröitävä jo TreeWalker-olion konstruktorissa. Käytännössä NodeFilterin alustaminen tapahtuu siis XMIDocumentReader-luokasta, jossa TreeWalker-olio luodaan. Toiminnallisuus on kuitenkin tässä täsmälleen sama kuin suunnitteludokumentissa esitetyssä. NodeActionListener ja XMINode NodeActionListener-rajapinta on toteutettu kuten suunnitteludokumentissa mainitaan [5 s.10], eikä siihen ole tarkennettavaa.

12 XMICollaborationReader Ei muutoksia suunniteltuun toteutukseen nähden. XMIClassDiagramReader Luokkakaavion actionevent()-metodi käyttää hyväkseen XML-jäsentimen TreeWalkeroliota dokumentissa liikkumiseen, vaikka se ei olekaan suotavaa. Tämä on kuitenkin välttämätöntä muutamissa kohdinä XML:n rakenteellinen monimutkaisuuden takia. TreeWalker-oliota käytetään suoraan seuraavissa kohdissa: Sisäkkäiset pakkaukset Luokan liittäminen omistavaan pakkaukseen Pakkauksen sisällä olevat muut kaaviot (esim. tilakaavio tai aktiviteettikaavio) ArgoUML tallentaa omituisesti XMI-dokumenttiin Multiplicity-elementit. Niiden tallentaminen tapahtuu siten, että ensimmäinen esiintymiskerta jotakin tiettyä monikertaa tallennetaan sellaisenaan ja lopuissa käytetään vain viitettä ensimmäiseen. Näin ollen assosiaatioiden monikerrat voivat viitata ihan mihin tahansa dokumentissa, jolloin niitä ei välttämättä pystytä lukemaan. Esimerkiksi Rational Rosessa tätä ongelmaa ei ole. Ongelma korjattiin siten, että koko dokumentin kaikki Multiplicity-elementit luetaan jo XMIDiagramReader-luokan read-metodissa staattiseen hajautustauluun. Luokkakaavion assosiaatioiden lukemisessa viitatut monikerrat luetaan tästä hajautustaulusta. Näin kaikki dokumentit pystytään varmasti lukemaan.

13 XMIActivityDiagramReader XMIActivityDiagramReader-luokka on toteutettu kuten suunnitteludokumentissa mainitaan. Koska tuettavalla CASE-väline ArgoUMLla ei voida tuottaa kaikkia laajennetun UML:n ominaisuuksia, kuten esimerkiksi sisäkkäisiä aktiviteettikaavioita, on näiden tuki jätetty pois. Nämä osiot ovat kuitenkin helposti lisättävissä mikäli se on tarpeen. XMIStateMachineReader XMIStateMachineReader-luokan actionevent(xminode) -metodin toteutus perustuu tilakoneeseen, jolla on neljä mahdollista tilaa, perustila (STATE_DEFAULT), ja yksi tila jokaista luettavaa elementtiä kohden: STATE_IN_MACHINE (itse tilakaavio), STATE_IN_VERTEX (yksittäinen kaavion tila) ja STATE_IN_TRANSITION (kaavion tilojen välinen siirtymä). Jokaisella kutsulla actionevent(xminode) lukee työstettävän XMINode-arvon talteen aiemmin buildmodel() -metodin avulla rakennettua mallia tulkiten. Lopuksi metodissa kutsutaan shiftstate(int) -metodia joka tulkitsee annetun parametrin avulla onko luku siirtynyt kahden elementin välisen rajan yli. Jos näin on, yritetään luoda viimeisen tilan mukainen elementti ja siirrytään uuteen tilaan. XMIDiagramReaderFactory Ei muutoksia suunniteltuun toteutukseen nähden. 4.4. Tiedostonluvun käyttöliittymä Käyttäjälle näkyvä tiedostonlukuindikaattori on toteutettu luokassa IndeterminateProgressMonitor. Suunnitteludokumentissa mainitusta Java 1.4 ympäristön mukana tulevasta ProgressMonitor-luokan käytöstä luovuttiin, sillä se ei tukenut indikaattoria tehtäville, joiden kokoa ei tiedetä. IndeterminateProgressMonitor-luokkalla ei ole mitään omia metodeja. Konstruktorissa luokka (joka perii JDialog- luokasta) lisää

14 itseensä JProgressBar olion ja sen alle keskeytysnapin. Nappiin liitetään konstruktorissa annettava kuuntelia.

15 Lähteet [1] MAISA, Metrics for Analysis and Improvement of Software Architectures http://www.cs.helsinki.fi/group/maisa/ [2] Unified Modelling Language (UML) version 1.3 spesifikaatio, Copyright (C) 1997-2003 Object Management Group, Inc., [http://www.omg.org/cgi-bin/doc?formal/00-03-01]. [3] XML Metadata Interchange (XMI) version 1.0, Copyright 1997-2003 Object Management Group, Inc., [http://www.omg.org/cgi-bin/doc?formal/00-06-01] [4] Xperf, Xperf ohjelmistotuotantoprojektin määrittelydokumentti, 2003 [http://www.cs.helsinki.fi/group/maisa/xperf/doc/maarittelydokumentti_1.1.6.pdf] [5] Xperf, Xperf ohjelmistotuotantoprojektin suunnitteludokumentti, 2003 [http://www.cs.helsinki.fi/group/maisa/xperf/doc/suunnitteludokumentti_1.0.4.pdf]

Liite A JavaDoc-kuvaukset toteutetuista luokista 1