Tik-76.115 Tekninen suunnitelma

 
 

Synapsi: Automaattinen ohjelmiston etäpäivitys
NetSeal Technologies
Tietojenkäsittelyn ohjelmatyö Tik-76.115

 


Dokumentin muutoshistoria

Versio Editoija Päiväys Kommentti
0.1 Mika Mäntylä 30.11.2000 Tämä dokumentti lisätty CVS:ään. Virheenkäsittely tehty (7) 
0.2 Mikko Varso 30.11.2000 Lisätty arkkitehtuurin kuvausta 
0.3 Mikko Varso 30.11.2000 Korjattu ja lisätty arkkitehtuurin kuvausta
0.4 Mika Mäntylä 03.12.2000 Lisätty "tietokannan" kuvaus
0.5 Mikko Varso 04.12.2000 Korjauksia arkkitehtuurin kuvaukseen 
0.6 Mikko Varso 05.12.2000 Lisätty asiakkaan tilakaavio ja pieniä korjauksia
0.7 Mika Mäntylä 06.12.2000 Lisätty liittymät (2.2) ja kuvaus moduulista synapsi.data
0.8 Antti Vainio 07.12.2000 Päivitetty osat 1.1, 1.5 sekä lisätty GUI-osan kuvaus
0.9 Mikko Varso 10.12.2000 Lisätty asiakkaan kuvausta
0.10 Mikko Varso 10.12.2000 Lisätty moduulikuvausta NC:n osalta (+ linkit doc++ dokumentteihin)
0.11 Mikko Varso 10.12.2000 Lisätty osa moduulikuvauksista NC:n osalta (4.2.x)
0.12 Mikko Varso 10.12.2000 Lisätty NC:n moduulien kuvauksia.
1.0 Juho Anttila, Mika Mäntylä 11.12.2000 Katselmoitu ja hyväksytty
1.1 Juho Anttila, Mikko Varso 12.02.2001 Javadoc ja client_doc viitteet päivitetty vastaamaan nykytilannetta
2.0 Juho Anttila, Mika Mäntylä 12.02.2001 Katselmoitu ja hyväksytty
2.1 Mikko Varso 23.02.2001 Päivitetty PUP-protokolla sisältämään tiedostonimen välitys
2.2 Mikko Varso 14.03.2001 Päivitetty PUP-protokollaan tarkempi kuvaus tarkistussumma -kentästä
3.0 Juho Anttila, Mika Mäntylä 19.03.2001 Katselmoitu ja hyväksytty
4.0 Juho Anttila, Mika Mäntylä 23.04.2001 Tarkistettu ja hyväksytty lopulliseksi versioksi


SISÄLLYSLUETTELO

0. VERSIOHISTORIA

1. JOHDANTO

1.1 Tarkoitus ja kattavuus

1.2 Tuote ja ympäristö

1.3 Määritelmät, merkintätavat ja lyhenteet

1.4 Yleiskatsaus dokumenttiin

2. JÄRJESTELMÄN YLEISKUVAUS

2.1 Sovellusalueen kuvaus

2.2 Järjestelmän liittyminen ympäristöönsä

2.3 Laitteistoympäristö(n kuvaus)

2.4 Ohjelmistoympäristö(n kuvaus)

3. ARKKITEHTUURIN KUVAUS

3.1 Ratkaisun suunnitteluperiaatteet

3.2 Tietokanta-arkkitehtuuri

3.2.1 Yleiskuvaus

3.2.2 Neuroni palvelin

3.2.3 Neuroni asiakas

3.3 Ohjelmistoarkkitehtuuri, moduulit ja prosessit

3.3.1 PUP protokolla

3.3.2 Neuroni palvelin

3.3.3 Neuroni asiakas

4. MODUULI (JA PROSESSI) KUVAUKSET

4.1 Yleistä

4.2 Moduulikuvaukset

4.2.1 synapsi.data

4.2.2 synapsi.gui

4.2.3 synapsi.updateThread

4.2.4 synapsi.main

4.2.5 synapsi.connect

4.2.6 NCMain

4.2.7 NCStates

4.2.8 NCGUi

4.2.9 NCConnect

4.2.10 NCData

4.2.11 NCError

4.2.12 NCUtil

5. MUUT ERITYISET TEKNISET RATKAISUT

6. HYLÄTYT RATKAISVAIHTOEHDOT

7. VIRHEKÄSITTELY

Viitteet


1. JOHDANTO



 

1.1 Tarkoitus ja kattavuus

Tämä dokumentti ottaa kantaa projektimme lopputuotteen (työnimi Neuroni) tekniseen suunnitteluun sekä toteutukseen. Dokumentti on tehty projektitiimille hahmottamaan tulevaa tekemistä sekä myöskin asiakkaallemme, jotta he voivat ottaa kantaa toteutusehdotuksiin ja mahdollisesti antaa hyväksynnän toteutuksemme ehdotukselle. Dokumentin lukee myös Tik-76.115 Tietojenkäsittelyopin ohjelmatyö -kurssihenkilökunta, ja tätä seikkaa on tietyin kohdin pyritty myös ottamaan huomioon.

Dokumentti sisältää projektin lopputuotteen teknisen kuvauksen sisältäen tuotteen käyttöympäristön kuvauksen, järjestelmän arkkitehtuurin ja toiminnallisuuden kuvauksen sekä yleisellä tasolla että yksittäisten ohjelmamoduulien tasolla ja käytetyn ohjelmistoarkkitehtuurin kuvauksen. Varsinainen lopputuote - Neuroni-ohjelmisto - tullaan toteuttamaan dokumentissa kuvattujen ratkaisujen pohjalta. Tämä dokumentti siis määrittelee sen, miten projektin toiminnallisessa määrittelyssä kuvattu ohjelmistotuote tullaan varsinaisesti toteuttamaan.

Dokumentti käsittelee koko Neuroni-ohjelmiston toteutuksen kuvauksen yleisestä arkkitehtuurista aina moduuli- ja luokkatasolle asti.
 

1.2 Tuote ja ympäristö

Dokumentissa käsiteltävä ohjelmistotuote on automatisoituun ohjelmiston etäpäivitykseen tarkoitettu ohjelmisto. Ohjelmistosta ei ole olemassa aiempaa versiota ja näin ollen projektin aikana siitä tullaan valmistamaan versio numero 1. Tuotteella ei ole varsinaista nimeä ja se tullaan integroimaan osaksi projektin asiakkaan RoamMate-ohjelmistoa. Työnimenä tullaan käyttämään nimeä Neuroni.

Ohjelmiston tarkoituksena on se, että RoamMate-server voi clientin tullessa sen alueelle päivittää RoamMate:n moduuleita eli esim. vaihtaa koneessa oleva NetSeal-ajuri uudempaan tms. Järjestelmän tavoitteena on saada automaitsoitua kyseinen toimenpide mahdollisimman pitkälle ja näin helpottaa clientin ohjelmiston päivitystä.

Projektin tuote tulee perustumaan client-server -mallille. RoamMate Serverin päässä tullaan määrittelemään päivitettävät ohjelmakomponentit. Nämä komponentit päivittyvät ja tulevat automaattisesti käyttöön Mobile Unitin päässä. MU-ohjelmistosta tullaan tekemään toimiva versio Windows NT:lle. RS-versio tulee toimimaan JRE:n päällä.

1.3 Määritelmät, merkintätavat ja lyhenteet

 
JavaDoc JDK:n (Java Development Kit) mukana tarjottava työkalu, jonka avulla voidaan generoida tiettyjen sääntöjen mukaan kommentoiduista kooditiedostoista määrämuotoinen dokumentaatio.
JRE Java Runtime Environment, Java-ohjelmien tarvitsema ajonaikainen ympäristö(Virtuaalikone).
MU Mobile Unit, liikkuva yksikkö. Tässä dokumentissa, mikä tahansa liikkuvayksikkö, johon on asennettu asiakkaan RoamMate Client ohjelmisto.
RoamMate Projektin asiakkaana toimivan yrityksen client-server -mallille perustuva ohjelmisto, johon projektissa tehdään laajennuksia
Netseal Netseal Techonologies. Projektissa asiakkaana oleva yritys
Neuroni Projektissa valmistettavan ohjelmistotuotteen työnimi
PUP Program Update Protocol. Neuroni asiakkaan ja palvelimen välinen kommunikointiprotokolla.

1.4 Yleiskatsaus dokumenttiin

Tekninen suunnitelma rakentuu seitsemästä pääosiosta, joissa käsitellään Neuroni-ohjelmiston teknistä toteutusta eri näkökulmista.

Ensimmäisessä luvussa käydään läpi asioita, jotka helpottavat ko. dokumentin lukemista ja ymmärtämistä kuten selitetään käytetyt termit sekä annetaan viitteet muihin dokumentteihin, jotka liittyvät tähän tekniseen määrittelyyn.

Toisessa luvussa käsitellään toteutettavaa Neuroni-ohjelmistoa korkealla tasolla ja käsitellään sen toteuttamisen vaikuttavat rajoitukset ja reunaehdot. Luvussa kuvataan myös ohjelmiston tuleva käyttö- ja toteutusympäristö. Luvun tarkoituksena on antaa yleiskuva tuotteen toteutukselle asetetuista rajoituksista ja tavoitteista.

Kolmannessa luvussa siirrytään toteutettavan ohjelmiston arkkitehtuurin kuvaukseen ja kuvataan korkealla tasolla ohjelmiston rakenne sekä komponentit. Luku sisältää myös ohjelmiston käyttämän tiedonsiirtoprotokolla (PUP) kuvauksen. Tämän osion luettuaan lukijalla pitäisi olla hyvä yleisen tason käsitys ohjelmiston toiminnasta.

Neljäs luku menee syvemmälle ohjelmiston toteutukseen - siinä kuvataan tarkasti ohjelmistossa käytetyt ohjelmamoduulit, niiden väliset rajapinnat sekä kuvataan moduulien toteutus. Luvussa käsitellään ohjelmiston yksityiskohtainen toiminta ja toteutus.

Luvussa viisi paneudutaan sellaisiin ohjelmiston toteutuksen ratkaisumalleihin, joista on tarvetta erikseen mainita niiden erityisen elegantin toteutuksen vuoksi. Luvussa kuusi taas summataan hylättyjä ratkaisumalleja - tämän luvun perusteella voidaan myöhemmin tarkastella, miksi jokin ratkaisuvaihtoehto hylättiin, jolloin ei jouduta enää uudelleen miettimään samoja asioita. Viimeinen luku kertoo ohjelmistossa käytettävän virheenkäsittelyn toiminnasta ja periaatteista.

2. JÄRJESTELMÄN YLEISKUVAUS


2.1 Sovellusalueen kuvaus

Projektin lopputuote tullaan integroimaan osaksi asiakkaan olemassa olevaa RoamMate-ohjelmistoa. Neuroni mahdollistaa ohjelmistojen etäpäivityksen automaattisesti, jolloin käyttäjältä ei juuri toimenpiteitä vaadita.

2.2 Järjestelmän liittyminen ympäristöönsä

Kuten sanottua, ohjelmisto integroidaan osaksi RM-ohjelmistoa. Neuroni Server ja RoamMate Server kommunikoivat muutamalla yksinkertaisella metodikutsulla. Clientin päässä Neuroni Client tulee lopulta osaksi RoamMate Clientia, ja ne kommunikoivat RoamMate Clientissä käytetyn viestinvälityksen avulla.

2.3 Laitteistoympäristö

Ohjelmisto tulee toimimaan Windows NT -ympäristössä ja vaatii siis x86 käskykantaa tukevan prosessorin. Ohessa listattu vielä yksityiskohtaiset laitevaatimukset. Kyseessä siis minimikokoonpano.

Client-kone:

Server-kone:

2.4 Ohjelmistoympäristö

Client-kone: Server-kone:

3. ARKKITEHTUURIN KUVAUS


3.1 Ratkaisun suunnitteluperiaatteet

Neuroni palvelimen toteutuksessa pyritään selkeään oliorakenteeseen.  Palvelimen eri osat toteutetaan omissa luokissaan/luokkahierarkioissaan ja näiden väliset rajapinnat ovat ohjelmiston toiminnan kannalta oleellisia. Asiakas koodataan pääosin C/C++:lla joka jo sinällään hiukan rajoittaa valintaa oliorakenteen ja perinteisen ratkaisun välillä. Neuronin asiakasosan on tarkoitus olla mahdollisimman siirrettävä eli sen tulisi olla mahdollisuuksien mukaan ANSI-C:tä. Tämän vuoksi asiakaspäässä pitäydytään perinteisessä modulaarisessa rakenteessa ilman varsinaista olioajattelua.

Ohjelmistoarkkitehtuuri on korkeimmalla tasolla asiakas-palvelin -malli, mutta yhden fyysisen yksikön (eli koneen) sisällä perinteinen yksi suorituskelpoinen ohjelma. Palvelimen toteutuksessa hyödynnetään Javan säikeitä toteutettaessa useamman asiakkaan yhtäaikainen päivittäminen.
Asiakkaan ja palvelimen välinen työnjako: Asiakas kuuntelee palvelimen ehdotuksia ja vastaa niihin. Lisäksi se hoitaa asiakaskoneen ohjelmiston varsinaisen päivityksen, joka sisältää ohjelmiston asennusohjelman käynnistyksen ja Windowsin rekisterin päivitystä ja lukemista. Asiakas tarjoaa RMC:n käyttäjälle mahdollisuuden päättää päivityksen aloituksesta. Palvelin pitää kirjaa saatavilla olevista ohjelmistoversioista ja tarjoaa ylläpidolle käyttöliittymän asiakkaiden versiotietojen ja palvelimella olevien ohjelmistoversioiden hallintaan. Palvelimen tehtävä on ehdottaa sen alueelle saapuville asiakkaille päivitystä ja lähettää päivityspaketteja. Lisäksi sen on osattava pitää kirjaa asiakkaiden versiotiedoista.

GUI:n suunnittelussa painopiste on palvelimen toteutuksessa, koska asiakkaan GUI tulee olemaan melko yksinkertainen. Käyttöliittymäsekä asiakaspäässä että palvelimessa on graafinen. Palvelimessa teteutus on suoraan Java1.2.2 kirjastoilla ja asiakkaan päässä MFC-kirjastolla.

Tietojen tallennus toteutetaan palvelimessa Java-luokkina, jotka serialisoidaan levylle/levyltä; varsinaista tietokantaa ei ole. Asiakaspäässäkään ei ole tietokantaa, vaan ainoastaan muutama rekisteriin talletettu arvo. Kaikki muu data on ajonaikaista ohjelman sisäisesti tarvitsemaan informaatiota.

Moduulijaossa pyritään noudattamaan periaatetta, että jaetaan ongelma riittävän pieniksi osiksi, mutta ei yhtään pienemmiksi. Neuroni-palvelimen moduulijako on, ja yleensäkin suunnittelun tarkkuus on, huomattavasti tärkeämpi kuin Neuroni-asiakkaan tapauksessa, ja siksi siihen tullaan kiinnittämään paljon enemmän huomiota. Palvelimessa moduulijako on myös helpompi toteuttaa järkevästi, koska valittu ohjelmointikieli tukee sitä paremmin.

Ohjelmointikieleksi valittiin palvelimen toteutuksessa Java. Asiakaspää toteutus tehdään mahdollisuuksien mukaan ANSI-C:llä. C++ -kieltä/kirjastoja tullaan käyttämään, mutta varotaan käyttämästä kielen erityisominaisuuksia ja muitakin vaikeasti siirrettäviä ominaisuuksia. Yksinkertaisuus ja siirrettävyys ovat tässä yhteydessä toivimuuden lisäksi tärkeimpiä ominaisuuksia.
 

3.2 Tietokanta-arkkitehtuuri

3.2.1 Yleiskuvaus

Ohjelmassa ei ole käytössä varsinaista tietokantaa. Palvelimen puolella ohjelman tiedot tallennetaan serialisoituviin luokkiin synapsi.data -pakkauksessa. Client puolella ohjelma tallentaa tarvitsemansa tiedot Windows NT:n rekisteriin.

3.2.2 Neuroni palvelin

Palvelimen päässä talletetaan tietoa clienteista, client-ryhmistä ja ohjelmistoversioista. Näitä tietoja kantavat sisällään luokat synapsi.data.DataClient, synapsi.data.DataGroup, synapsi.data.DataVersion. Tämän lisäksi server tallettaa tietoa yleisistä käyttöasetuksista luokassa  synapsi.data.DataSettings. Tietoihin pääsee käsiksi rajapinnan DataForMain kautta. DataMain.html

Yllä olevassa UML-kaaviossa selviää dataluokkien keskinäiset suhteet. Myös luokat identifioiva tieto näkyy kuvassa. DataSettings-luokalla ei luonnollisesti ole identifioivaa tietoa, koska luokan ilmentymiä on vain yksi. DataMain säilyttää viittauksia DataClient-, DataGroup- ja DataVersion-instansseihin Javan tarjoamissa vektori-luokissa. Mikäli tietojen hakeminen vektorien avulla osoittautuu jatkossa pullonkaulaksi, voidaan ne korvata jollain tehokkaammalla menetelmällä esim. hajautustaululla, binääripuulla. Tietojen tallentaminen ja lukeminen levyltä suoritetaan Java-kielen tarjoamalla serialisointi- ja deserialisointirutiineilla.

3.2.3 Neuroni asiakas

Asiakas-ohjelmalla on käytössään Windows NT:n rekisterissä kolme avainta PreviousVersion, CurrentVersion, ShouldBeVersion. PreviousVersion kertoo version, joka oli käytössä ennen edellistä käynnistystä. CurrentVersion kertoo version, joka on sillä hetkellä ajossa. ShouldBeVersion kertoo, mikä versio pitäisi olla ajossa.

3.3 Ohjelmistoarkkitehtuuri, moduulit ja prosessit

Neuroni-ohjelmisto jakaantuu ylimmällä tasolla palvelimeen ja asiakkaaseen. Neuroni-palvelin on osa RMS-ohjelmistoa ja Neuroni-asiakas osa RMC-ohjelmistoa. Nämä kaksi Neuronin osaa kommunikoivat keskenään käyttäen PUP-protokollaa. PUP-protokollan toteutus voi olla palvelimessa ja asiakkaassa erilainen, mutta molemmat toteutukset käyttävät TCP-socket rajapintaa viestien varsinaiseen lähettämiseen verkon yli.

3.3.1 PUP protokolla

Program Update Protocol.

PUP protokolla toimii lähettämällä ASCII-muotoisia rivinvaihtoon (0x0a) päättyviä komentoja. Komentojen parametrit erotetaan toisistaan ja komentojen nimistä välilyönneillä. Neuronin palvelinpää aloittaa aina protokolla-ajon, eikä palvelinpään tarvitse siis jatkuvasti kuunnella, mitä asiakkaalla on sanottavaa, vaan se voi lähettää viestin ja odottaa vastausta (tai aikakatkaisua). Asiakaspää sen sijaan on velvollinen kuuntelemaan jatkuvasti palvelimen yhteysyrityksiä ja jatkamaan protokolla-ajon jälkeenkin kuuntelua.

Neuroni asiakkaan PUP-protokollan tilakaavio on esitetty kohdassa 3.3.3Neuroni asiakas.

 

Protokollan viestit ryhmiteltyinä käyttöajankohdan- ja tarkoituksen mukaan:

3.3.2 Neuroni palvelin

Neuroni palvelin on jaettu moduuleihin palvelimen päätehtävien mukaisesti. Moduulijaossa on pyritty siihen, että rajapinnat eri moduulien välillä olisivat mahdollisimman siistit ja yksinkertaiset luomatta silti liikaa ja/tai liian pieniä moduuleja. Palvelimen tilakoneen kaavio:

3.3.3 Neuroni asiakas

Neuroni-asiakkaan moduulijaossa on korostettu toteutuksen yksinkertaisuutta ehkä jopa modulaarisuuden kustannuksella. Tämä siksi, että asiakaspää joudutaan palvelinta todennäköisemmin kirjoittamaan kokonaan uudestaan ja sen toteutus on palvelinta huomattavasti yksinkertaisempi. Kaikki hankala toiminnallisuus on tarkoitus olla palvelimessa ja asiakkaan kirjoittaminen ei ole siis aivan yhtä vaativaa kuin palvelimen. Asiakaspäässä GUI on hyvin pelkistetty ja tullaan myöhemmin ehkä liittämään osaksi RMC:n GUI:ta.

Neuroni asiakkaan PUP-protokollan mukainen tilakaavio:

4. MODUULI- JA PROSESSIKUVAUKSET

4.1 Yleistä


Oheisessa kappaleessa on kuvattu Neuroni-ohjelmiston moduulien yksityiskohtaiset kuvaukset sisältäen yleiskuvaukset, toteutukseN sekä virheiden käsittelyn. Tämän lisäksi kustakin moduulista joka on toteutettu Java-kielellä, on konstruoitu JavaDoc-työkalun avulla ohjelmakooditiedostoissa olevista kommenteistä kyseisen moduulin rajapinnat kuvaava HTML-sivusto. Näin ollen moduulien rajapintoja ei ole tässä dokumentissa varsinaisesti käsitelty vaan se on löydettävissä kunkin moduulin kohdalta linkin takana olevalta JavaDoc-sivustolta. C/C++ -kielellä toteutetuista mooduleista on vastaavasti rajapintojen kuvaukset toteutettu generoimalla kooditiedostoista Doc++ -työkalulla HTML-sivusto.

Kuten projektisuunnitelmassa on määritelty, ohjelmoinnissa käytettävä kielenä on englanti. Ohjelmakoodin yhtenäisen ulkoasun takaamiseksi koodin kommentit on kirjoitettu myös englanninkielellä. Tämän vuoksi generoidut JavaDoc- ja Doc++ -dokumentit ovat myös englanninkielisiä. Näiden rajapintakuvausten kääntämistä edelleen suomeksi ei ole katsottu tarpeelliseksi projektin puitteissa.
 

4.2 Moduulikuvaukset


Tässä kappaleessa on kuvattu asiakkaan ja palvelimen moduulien toiminta.
 

4.2.1 synapsi.data

4.2.1.1 Yleinen kuvaus

Kyseinen moduuli vastaa tietojen tallennuksesta ja säilytyksestä Neuroni serverissä. Moduuli siis toimii palvelin pään "tietokantana", jota kuvattiin jo edellä luvussa 3.2.2. Moduulin säilyttämiin datoihin pääse kiinni DataForMain.java rajapinnan avulla. Luvussa 3.2.2 on myös kuvattu tarkemmin kyseisen moduulin sisäistä rakennetta ja sen käyttämiä tietorakenteita.

4.2.1.2 Rajapinta

synapsi.data

4.2.1.3 Virhekäsittely

Moduuli tarkastaa kaikki rajapintansa läpi saamat parametrit ennen käyttöä, joten "ulkopuolelta" sen saattaminen epästabiiliin tilaan ei pitäisi onnistua. Mikäli virheellisiä parametreja on annettu, palaa kyseinen metodi heti eikä suorita aiottua operaatiota.

Moduuli myös tarkistaa levyltä lukemansa tietojen eheyden Javan deserialisointi rutiinien lisäksi MD5-tiivisteen avulla. Mikäli levyltä yritetään lukea virheellistä dataa, kieltäytyy moduuli tästä ja käynnistyy kuten ensimmäisellä käyttökerralla, jolloin mitään tallennettua dataa ei luonnollisestikaan ollut. Käyttäjälle pyritään luonnollisesti tekemään virheilmoitus korruptoituneesta levydatasta moduulin synapsi.gui avulla.

Muihin virhetilanteisiin ei ole toistaiseksi varauduttu. Virhetilanteet raportoidaan muun "erityisraportoinnin" lisäksi niiden vakavuuden mukaisesti synapsi.Log luokalle kuten luvussa 7 on kuvattu.
 

4.2.2 synapsi.gui

4.2.2.1 Yleinen kuvaus

Synapsi.gui-moduuli tarjoaa Neuroni-ohjelmiston palvelinosan graafisen käyttöliittymän käyttäjälle, jonka kautta palvelinosan käyttäjä voi hallinnoida järjestelmässä olevia ohjelmistopaketteja (versioita), clientien ryhmittelyä sekä muita palvelimen käyttöön kuuluvia toimintoja. Moduuli antaa myös reaaliaikaista dataa palvelimen alueella olevista clienteista.

Moduuli kommunikoi muiden moduulien kanssa synapsi.main-moduulin välityksellä, joka toimii ikään kuin viestin välittäjänä moduulien välillä. Tyypillisessä tilanteessa synapsi.gui käyttää synapsi.datan palveluja main-moduulin välityksellä esim. hakiessaan tietyn asiakasryhmän tietoja ohjelmiston tietokannasta.
 

4.2.2.2 Rajapinta

synapsi.gui

4.2.2.3 Toteutus

Ohjelmiston käyttöliittymä sisältää useita ikkunoita - kukin ikkunoista on toteutettu omana luokkanaan muutamaa poikkeusta lukuun ottamatta. Nämä poikkeukset ovat tilanteita, joissa jokin ikkuna on havaittu yleiskäyttöiseksi ja näin ollen sitä on voitu hyödyntää usean eri ikkunan tarpeisiin. Tästä esimerkkinä on mm. EditGroup-luokka, jonka kuvaamaa ikkunaa hyödynnetään aktiivisen ryhmän hallintaan, tietyn ryhmän editointiin sekä ryhmän lisäämiseen.

Ikkunoiden kuvaamisluokat on toteutaan käyttäen Java Swingin tarjoamia standardikomponentteja, widgettejä, kuten nappulat, menut ja tekstikentät. Luodut ikkunatyypit (luokat) perivät joko JFrame-luokan (pääikkuna ja help-ikkuna) tai JDialog-luokan (muut ikkunat). Tällä järjestelyllä voidaan kätevästi toteuttaa se, että toteutuksessa vain päällimmäinen ikkuna on ainoastaan aktiivisena. Poikkeuksena tähän on help-ikkuna, joka voi olla aktiivisena samaan aikaan jonkin muun ikkunan kanssa.

Ikkunassa tapahtuvien tapahtumien (nappuloiden painallukset yms.) vastaanotto ja käsittely tapahtuu kyseisen ikkunaluokan metodilla (actionPerformed) eli ikkunaluokat toteuttavat myös ActionListener-rajapinnan. Tällaisella rakenteella tapahtumien käsittely on helppo hajauttaa omiin luokkiinsa ja moduulin rakenne pysyy näin selkeänä.
 

4.2.2.4 Virhekäsittely

Moduulin virheidenkäsittelyssä ensi sijaisesti on huomioitava käyttäjän syöte, jonka virheettömyyttä tulee tutkailla. Virheitä vältetään toteuttamalla merkkien syöttöön tarkoitettu tekstikenttä omana luokkanaan (perii JTextField-luokan), joka hyväksyy syötteenään vain haluttuja merkkejä. Mikäli syöttökenttänä on tarkoitus ottaa vastaan yksi arvo jostakin joukosta (esim. tietty ohjelmistoversio kaikkien versioiden joukosta) hyödynnetään combo-box -widgettiä, joka sallii vain yhden alkion valinnan halutusta listasta.

Mikäli käyttäjä yrittää suorittaa toimenpiteen, joka aiheuttaa virhetilanteen (esim. sellaiset ohjelmistoversion poisto, joka on vielä jonkin ryhmän käytössä), annetaan käyttäjälle virheilmoitus ja pyydetty toiminto jätetään suorittamatta. Käyttäjän antama syöte siis aina tarkistetaan ennen halutun operaation suorittamista.
 

4.2.3 synapsi.net.UpdateThread

4.2.3.1 Yleiskuvaus

Moduulin tehtävä on suorittaa asiakkaan version tarkistus ja päivitys tarvittaessa. Moduuli toteuttaa myös säikeen, jotta useampien asiakkaiden päivitys yhtäaikaa on mahdollista.

4.2.3.2 Rajapinta

synapsi.net.UpdateThread

4.2.3.3 Toteutus

Moduuli on toteutettu johtamalla se java.lang.Thread -luokasta. Yhteys asiakkaaseen otetaan käyttäen synapsi.net.Connection -luokkaa. Säikeessä ajetaan tilakonetta, joka toteuttaa PUP-protokollan palvelin puolen. Tilakoneen tilakaavio löytyy kappaleesta 3.3.2. Palvelimen osuus protokollasta toimii suoraviivaisesti komentoja lähettäen ja niihin vastauksia odottaen. Aluksi selvitetään onko päivitykselle tarvetta ja haluaako asiakas tehdä päivityksen. Tämän jälkeen tarkistetaan ServerMain-luokalta, että maksimimäärä päivityksiä ei ole käynnissä. Jos maksi on saavutettu laitetaan säie odottamaan käynnistystä mainilta.

4.2.3.4 Virheenkäsittely

Virhetilanteita voivat olla, ettei sockettia saada avattua, yhteys katkeaa kesken tai asikkaalta saadan väärä vastaus. Nämä kaikki aiheuttavat sen, että tilakone menee disconnect- tai close-tilaan, riippuen siitä onko asiakkaan päässä havaittu Neuroni-asiakas. Kaikki virheet raportoidaan käyttäen synapsi.error.Log -luokkaa käyttäen.

4.2.4 synapsi.main

4.2.4.1 Yleiskuvaus
Moduulilla on rajapinnat NSUpdateThreadin ja RMS:n kanssa. Rajapinta RMS:n kanssa on ainoa ohjelmatasolla oleva rajapinta NS:stä ulospäin. Moduuli hoitaa viestien välityksen muiden moduulien välillä ja toimii yleisesti ottaen NS:n arkkitehtuurin kulmakivenä. Päivitysthreadien aloittaminen ja asiakkaiden jonon hallinnointi kuuluu moduulin tehtäviin.

4.2.5 synapsi.Connection

4.2.5.1 Yleiskuvaus

Moduuli tarjoaa yksinkertaisen käyttöliittymän TCP/IP-socketteihin. Moduuli tarjoaa metodit ASCII-rivien ja binääridatan lähettämiseen ja vastaanottamiseen.

4.2.5.2 Rajapinta

synapsi.net.Connection

4.2.5.3 Toteutus

Moduuli käyttää yhteyden muodostamiseen java.net.Socket-luokkaa. Rivien lukemiseen ja kirjoittamiseen käytetään java.io.BufferedWriter ja java.io.BufferedReader -luokkia. Binaaridatan lähettämiseen ja vastaanottamiseen käytetään java.io.DataInputStream ja java.io.DataOutputStream -luokkia. Luettaessa tietoa socketista asetetaan aina haluttu aikakatkaisu, jonka ajan metodi blokkaa ja palauttaa virheen mikäli haluttua tietomäärää ei ole saatu luettua.

4.2.5.4 Virheenkäsittely

Virhetilanteissa metodit palauttavat joko negatiivisen arvon tai nullin, riippuen paluuarvon tyypistä. Kaikissa metodeissa parametrit, sekä yhteyden tila tarkistetaan. Myös kaikki poikkeukset raportoidaan. Virheiden raportointiin käytetään synapsi.error.Log -luokkaa.

4.2.6 Moduuli NCMain

4.2.6.1 Yleiskuvaus

Nimi:
NCMain
Tyyppi:
Moduuli
Yleinen kuvaus:
Neuroni-asiakkaan päämoduuli. Tehtävänä alustaa asiakas ja kutsua muiden moduulien funktioita. Moduuli on tarkoituksella hyvin yksinkertainen ja kaikki oleellinen toiminnallisuus on tarkoitus olla muissa NC:n moduuleissa.

4.2.6.2 Rajapinta

Rajapinnan kuvaa parhaiten lähdekoodista generoitu dokumentaatio.

4.2.6.3 Toteutus

Toteutus on yksinkertaisesti C:n main() -funktio, jossa kutsutaan nc_connect_init() -funktiota NCConnect-moduulin alustamiseksi ja aloitetaan Neuroni Serverin kuuntelu kutsumalla nc_states_listen() -funktiota. Aluksi on myös kysyttävä versiotieto NCData-moduulilta.

4.2.6.4 Virhekäsittely

Moduuli saa ulkopuolista dataa lähinnä käynnistysparametrien muodossa. Näiden oikeellisuus tarkistetaan. Moduulin ainoan funktion paluuarvona palautetaan negatiivinen arvo, mikäli alustus epäonnistui. Muuten virhekäsittely on annettu muiden moduulien sisäiseksi tehtäväksi ja yleisellä tasolla moduulin NCError tehtäväksi.

4.2.7 Moduuli NCStates

4.2.7.1 Yleiskuvaus

Nimi:
NCStates
Tyyppi:
Moduuli
Yleinen kuvaus:
Toteuttaa PUP protokollan Neuroni asiakkaan osalta. Sisältää proseduurit, jotka kuvaavat tilakoneen tiloja. Tilakoneen siirrot ovat proseduurien kutsuja toisille proseduureille. Proseduurit saavat kaiken tarvitseman informaation siitä mihin tilaan siirrytään käyttämällä NCConnect, NCData ja NCUtil moduulien palveluja.

4.2.7.2 Rajapinta

Rajapinnan kuvaa parhaiten lähdekoodista generoitu dokumentaatio.

4.2.7.3 Toteutus

Moduuli on tarkoitus olla mahdollisimman puhdas asiakaspään logiikan toteutus ja kirjoittaa ANSI-C:llä. Moduulin ainoa merkittävä tietorakenne on yksittäinen tilamuuttuja, joka on globaali, koska myös NCMain-moduulin on päästävä siihen käsiksi.

4.2.7.4 Virhekäsittely

Moduuli raportoi kaikki virhetilanteet NCError-moduulin välityksellä käyttäen funktiota NC_error_handler().

Virhetilanteet joihin on varauduttu ja vastaava virheen vakavuustaso sekä virheilmoituksen teksti:
 

  • Protokollan vastainen viesti serveriltä tai vastaus viipyy:
  • warning, "Unexpected message or timeout.".
  • Viesti lukukelvoton tai viestin parametrin arvo on invalid
  • warning, "Garbled message."
  • Päivityspakettia ei saada luettua:
  • Paketti saapuu perille, mutta on viallinen (liian lyhyt tai checksum ei täsmää):
  • warning, "Receiving update packet failed."
  • Serverin kertoma paketin pituus on yli maksimipituuden:
  • warning, "Packet exeeds maxsimum lenght."
  • Muistin allokointi ei onnistu:
  • error, "Cannot allocate memory".


    Koska tämä moduuli ei voi aiheuttaa fataaleja virheitä (NC_error_hanleriä ei kutsuta tasolla FATAL), kaikkien virhetilanteiden jälkeen päivitetään epäonnistuneiden määrän kertovaa globaalia muuttujaa ja palataan kutsuvaan funktioon ilman suurempia seremonioita.

    4.2.8 Moduuli NCGUI

    4.2.8.1 Yleiskuvaus

    Käyttäjälle näkyvä osuus NC:in toiminnallisuudesta.

    4.2.8.4 Virhekäsittely

    Ei voi aiheuttaa suurempia virheitä. Jos NT:n oma graafinen puoli hajoaa, niin siinä ei liene paljoakaan tehtävissä.

    4.2.9 Moduuli NCConnect

    4.2.9.1 Yleiskuvaus

    Nimi:
    NCConnect
    Tyyppi:
    Moduuli
    Yleinen kuvaus:
    Sisältää funktiot TCP-yhteyden käsittelyyn: socketin avaaminen, kuuntelu, kirjoittaminen, lukeminen ja sulkeminen. Tarjoaa rajapinnan viestien välitykseen TCP:n yli ja tietyn pituisen datamäärän vastaanottamiseen.

    4.2.9.2 Rajapinta

    Rajapinnan kuvaa parhaiten lähdekoodista generoitu dokumentaatio.

    4.2.9.3 Toteutus

    Toteutuksessa käytetään Winsock 2 API:n tarjoamaa rajapintaa sockettien käsittelyyn. Moduulin on tarkoitus pitää kaikki socketteihin liittyvä tieto (mukaan lukien virhetilanteet, jotka tietysti raportoidaan) omanaan ja tarjota käyttäjälleen (pääasiassa NCStates-moduuli) rajapinta, joka on alustariippumaton ja helppokäyttöinen. Rajapinnan tarjoamilla palveluilla on pystyttävä toteuttamaan suoraan PUP-protokollan vaatimat toimet. Toteutuksessa käytetään moduulin sisäisiä muuttujia, jotka kertovat moduulin tilan: onko socket avattu, kuunnellaanko sitä, mikä on oma osoite (IP ja porttinumero), mikä on serverin osoite. Ulospäin tarjottavan rajapinnan lisäksi moduulin toteutuksessa käytetään tarvittaessa sisäisiä apufunktioita, mikäli tarve vaatii. Viestien vastaanoton tarjoava(t) funktio(t) on toteutettava niin, että ne eivät blokkaa ikuisesti, vaan annetaan jokin aika-arvo, jonka kuluessa kutsun on palattava (tällöin palautetaan tietysti virhekoodi). Rajapinnassa olevan NC_connect_init() -funktion on tarkoitus alustaa moduuli, niin että voidaan olla varmoja, että Winsock 2 rajapinta on saatavilla ja että se toimii. Socketin avaus kuuluu kuitenkin vasta NC_connect_listen() -funktioon. Tätä voidaan virhetilanteessa kutsua uudelleen, jolloin yritetään avausta uuteen kertaan. NC_connect_send_* ja NC_connect_receive_* -funktioiden on tarkistettava moduulin sisäinen tila ennen mitään toimenpiteitä jo virheraporttien järkevyydenkin takia.

    4.2.9.4 Virhekäsittely

    Moduuli raportoi kaikki virhetilanteet NCError moduulin välityksellä käyttäen funktiota NC_error_handler().

    Virhetilanteet joihin on varauduttu ja vastaava virheen vakavuustaso, virheilmoituksen teksti sekä mahdollinen toimenpide:
     

  • Lukeminen socketista palauttaa INVALID_SOCKET:
  • warning, "Reading from invalid socket".
    Suljetaan yhteys serveriin.
  • Lukeminen socketista ei tuota viestin loppumerkkiä '\n':
  • warning, "Incomplete message string".
    Suljetaan yhteys serveriin.
  • Winsock versio 2:n alustus ei onnistu:
  • fatal, "WinSock 2 not available."
    Ilmoitetaan käyttäjälle alustuksen epäonnistumisesta.
    (koska fatal, NC poistuu takavasemmalle samantien)
  • Muistin varaus ei onnistu:
  • error, "Cannot allocate memory".
  • Socketin avaus palauttaa INVALID_SOCKET:
  • error, "Cannot open socket".
  • Socketin kuuntelu palauttaa SOCKET_ERROR:
  • error, "Error listening to socket"
  • Accept -kutsu palauttaa INVALID_SOCKET:
  • warning, "Error accepting connection".
  • Yritetään lähettää ilman yhteyttä serveriin:
  • warning, "Tryiing to send when not connected."
  • Lähetetään väärällä viestin ID:llä:
  • warning, "Sending with an unknown message type".
  • Send -kutsu palauttaa INVALID_SOCKET:
  • 4.2.10 Moduuli NCData

    4.2.10.1 Yleiskuvaus

    Pitää yllä asiakkaan tarvitsemaa tietoa tilastaan.
     

    4.2.11 Moduuli NCError

    4.2.11.1 Yleiskuvaus

    Nimi:
    NCError
    Tyyppi:
    Moduuli
    Yleinen kuvaus:
     Neuroni asiakkaan virheenkäsittely ja lokiviestien muodostaminen ja kirjoitus.

    4.2.11.2 Rajapinta

    Rajapinnan kuvaa parhaiten lähdekoodista generoitu dokumentaatio.

    4.2.11.3 Toteutus

    Toteutuksena funktio NC_error_init(), joka mm. tallettaa tiedon siitä mihin on tarkoitus lokiviestit tulostaa. Funktio NC_error_handler() hoitaa virheilmoituksen käsittelyn ja fatal-tyyppisessä virhetilanteessa ohjelman keskeytyksen kuten myös virheen kirjaamiseen lokiin.

    4.2.11.4 Virhekäsittely

    Tämän moduulin virhetilanteita ei voida kunnolla raportoida, koska moduulin tarkoitus on juuri toteuttaa virheenraportointi. Jotain sentään on syytä yrittää tehdä, jotta moduuli ei käyttäytyisi täysin mielivaltaisesti virhetilanteissa.

    Virhetilanteet joihin on varauduttu:
     

  • Kutsuva funktio antaa epäkelvon tulostuskohteen NC_error_init():lle:
  • Palautetaan kutsuvalle funktiolle negatiivinen paluuarvo.
  • Kutsuva funktio antaa tuntemattoman argumentin (level or module id) NC_error_handler():lle:
  • Kirjoittetaan lokiin virheellisen parametrin arvon kohdalle <UNKNOWN>.
  • Kutsuva funktio antaa tuntemattoman argumentin (null-merkkijono viestinä) NC_error_handler():lle:
  • Kirjoitetaan lokiin tyhjä merkkijono.
    Virhetilanteet, joihin ei ole varauduttu:
     
  • Kutsuva funktio antaa argumenttina merkkijonon, joka ei pääty '\0' -merkkiin:
  • Kirjoitetaan mitä sattuu lokiin, kunnes '\0' -merkki löytyy muistista.

    4.2.12 Moduuli NCUtil

    4.2.12.1 Yleiskuvaus

    Nimi:
    NCUtil
    Tyyppi:
    Moduuli
    Yleinen kuvaus:
    Sisältää apufunktioita muiden NC:n moduulien toteutukseen.

    4.2.12.2 Rajapinta

    Rajapinnan kuvaa parhaiten lähdekoodista generoitu dokumentaatio.

    4.2.12.3 Toteutus

    Tämän moduulin tarkoituksena on tarjota yleiskäyttöisiä funktioita muiden moduulien toteutukseen. Toteutus on mahdollisimman yksinkertainen: mitään hankalaa logiikkaa tai suuria tehtäviä ei tähän moduuliin saa rakentaa. Tyypillisiä funktioita moduulissa ovat mm. viestin tyypin etsiminen merkkijonosta, yksinkertaisen merkkijonoviestin kirjoittaminen tyypin ja argumenttien perusteella ja tarkistussumman laskeminen pakettidatalle. Toteutuksessa käytetään vain ja ainoastaan ANSI-C:n mukaisia kirjastorutiineja ja kielen piirteitä. Moduuli ei saa olla käyttöjärjestelmä- tai ympäristöriippuvainen ja kaikki funktiot joko tekevät tehtävänsä loppuun tai palauttavat virheilmoituksen.

    4.2.12.4 Virhekäsittely

    Tämä moduuli ei raportoi mitään virheitä NC_error_handler():in kautta, vaan palauttaa vain ja ainoastaan virhekoodin funktion paluuarvona. Tämä siksi, että on käytännössä mahdotonta päätellä yksinkertaisessa apufunktiossa, että mitä oikeastaan meni pieleen ja antaa järkevä virheilmoitus. On kutsuvien moduulien vastuulla tarkistaa kaikkiin tämän moduulien paluuarvot ja päätellä ja raportoida virheet sen mukaan.
     
     

    5. MUUT ERITYISET TEKNISET RATKAISUT


    Muita erityisiä teknisiä ratkaisuja ei ole tässä vaiheessa tullut esille eikä suunniteltu toteutettaviksi.

    6. HYLÄTYT RATKAISUVAIHTOEHDOT


    Ei toistaiseksi hylättyjä ratkaisuvaihtoehtoja.

    7. VIRHEKÄSITTELY


    Yleinen virheenkäsittely

    Jokainen moduuli pitää itsenäisesti huolen "omasta hyvinvoinnistaan". Tämä tarkoittaa siis sitä, etteivät mitkään rajapinnan läpi tulevat parametrit saa aiheuttaa moduulin kaatumista tai epävakautta. Huonoista parametreista/syötteestä tulee toki raportoida alla olevan kohdan mukaisesti.

    Virheilmoitusten tekeminen

    Kaikki järjestelmän tulostamat virheilmoitukset tehdään sekä palvelin- että client-päässä yhden moduulin kautta. Aina virhetilanteen sattuessa tulee virheenraportointi metodeita/funktiota kutsua asian mukaisilla parametreilla. Yksikään muu ohjelman osa ei saa siis itsenäisesti alkaa tulostelemaan omia virheilmoituksia. Käyttöliittymällä on oikeus antaa käyttäjälle vain sellaisia virheilmoituksia, joihin käyttäjä voi vaikuttaa. Näiden käyttäjälle tulevien ilmoitusten on oltava ulkonäöltään yhteneviä ja havainnollisia.

    Testaustarkoituksia varten on jokaisen moduuliin kuitenkin hyvä määrittää soveltuva print-metodi/funktio, jonka avulla päästään helposti selvyyteen moduulin sen hetkisestä tilasta esim. tietorakenteiden sisällöt ja muut oleelliset datat. Tämän oman print-metodin kutsuminen on kuitenkin kielletty muualta kuin testikoodista.

    Palvelimen päässä virheilmoitukset tulee antaa synapsi.Log luokalle. Clientin päässä vastaavia tehtäviä hoitaa funktio nc_handle_error() tiedostossa "nc_error_win32.c".

    Virheilmoitusta tehdessä tulee virheen raportoijan ilmoittaa pakkaus, luokka ja metodi, missä virhe syntyi. Tämän lisäksi tulee ilmoittaa virheen vakavuus, sekä oma selventävä vapaamuotoinen kommentti virhetapauksesta. Esim. palvelimen Log-luokan dokumentoinnista voi katsoa aihetta tarkemmin.

    Virheilmoitukset tulostetaan tällä hetkellä suoraan konsoliruudulle. Jatkossa on tarkoitus, että virheilmoitukset menevät sopivaan tiedostoon levylle, mistä niitä on helppo jälkikäteen arvioida. Virheet voidaan myös laittaa omiin tiedostoihinsa virhetyyppien perusteella.

    Virheet luokitellaan neljään ryhmään:

    Virheilmoitustekstit luodaan virheilmoituksen vastaanottavassa metodissa/funktiossa, ja ne kuvastavat ulkoasultaan virheen vakavuutta. Esimerkiksi minor-virheessä minor-sana kirjoitetaan "minor" ja fatal virheessä taas fatal-sana "FATAL".

    Toiminta epänormaaleissa tilanteissa

    Virtakatkokset - Virran palautumisen ja käyttöjärjestelmän uudelleen käynnistymisen jälkeen ohjelma jatkaa suoritustaan siitä tilanteesta, minkä ohjelma on viimeksi tallentanut levylle. Mikäli tallennustiedostot ovat korruptoituneet ilmoitetaan siitä käyttäjälle ja ohjelma käynnistyy kuten ensimmäisen käynnistyksen yhteydessä.

    Verkkoyhteyden katkeaminen - Palvelin ilmoittaa käyttäjälle yhteyden katkeamisesta, mutta muuten ohjelman suoritus jatkuu normaalisti. Client ilmoitta yhteyden katkeamisesta ainoastaan, mikäli se oli juuri lataamassa uutta päivitystiedostoa.

    Viitteet

    gui_maarittely.html
    testaus_suunnitelma.html
    toiminnallinen_maarittely.html
    Vaatimukset.html