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:
- 486-prosessori 66 Mhz nopeudella
- 32 megatavua RAM-muistia.
- kiintolevytilaa 30 megatavua ennen kuin mitään
Neuroni-ohjelmiston osia tai testausosia on asennettu.
- Ethernet-verkkokortti.
Server-kone:
- 586-prosessori 166 Mhz nopeudella
- 64 megatavua RAM-muistia
- kiintolevytilaa 60 megatavua ennen JRE:n asennusta
- kiintolevytilaa 30 megatavua ennen kuin mitään
Neuroni-ohjelmiston osia tai testausosia on asennettu.
- Ethernet-verkkokortti.
2.4 Ohjelmistoympäristö
Client-kone:
- Windows NT4 + sp6
- RoamMate Client -ohjelma
>li>Ethernet-verkkoyhteys
Server-kone:
- Windows NT4 + sp6
- JRE 1.2 tai uudempi
- RoamMate Server -ohjelma
- Ethernet-verkkoyhteys
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:
- Kättely
-
Sanoma: NSHELLO x.xx
Sanoma on serverin kättely, jossa x.xx on serverin
versio. Vastaukseksi odotetaan NCHELLO-sanomaa, jonka versiosta voidaan
päätellä onko protokolla yhteensopiva.
-
Sanoma: NCHELLO x.xx
Sanoma on clientin kättelysanoma, jossa x.xx on clientin versio.
Tämä sanoma annetaan vastauksena serverin NSHELLO-sanomaan.
-
Version kysely
-
Sanoma: GETVERSION
Tällä sanomalla serveri pyytää
clienttiä ilmoittamaan Roammate-versionsa. Client vastaa VERSION-sanomalla.
-
Sanoma: VERSION x.xx
Tällä sanomalla client vastaa serverin versio kyselyyn ilmoittamalla
versionsa kohdassa x.xx.
-
Päivityksen hyväksyntä
-
Sanoma: UPDATE x.xx
Tällä sanomalla serveri kysyy haluaako
client päivityksen versioon x.xx. Vastauksena clientilta saadaan joko
YES- tai NO-sanoma.
-
Sanoma: YES
Tällä sanomalla client ilmoittaa haluavansa päivityksen.
-
Sanoma: NO
Tällä sanomalla client ilmoittaa, että päivitystä
ei haluta ottaa vastaan. Tämä on myös implisiittinen DISCONNECT
molemmilta osapuolilta ja yhteys voidaan katkaista.
-
Päivitypaketin siirto
-
Sanoma: PACKAGE filename length checksum
Päivityspaketin siirto poikkeaa muista sanomista
siinä, että sanoman jälkeen lähetetään paketti
binääridatana. Client lukee filename-kentästä serverin antaman päivityspaketin tiedostonimen.
Client lukee viestin jälkeen length-kentän ilmoittaman määrän tavuja ja laskee näistä tarkistussumma, jonka pitäisi vastata
checksum-kentän arvoa. Rajoitus: koska kentät erotetaan toisistaan välilyönneillä,
ei filename-kentässä välitettävä tiedostonimi saa sisältää välilyöntejä.
Checksum-kenttä kertoo siirrettävästä tiedostosta lasketun md5 tiivisteen. Kentässä on 32 merkkiä jotka tulkitaan 128 bittisen luvun
heksadesimaaliesitykseksi. Tämä on täsmälleen sama esitys kuin on käytössä esim. md5sum -ohjelman tulosteessa ja md5sum -ohjelman ja Neuronin laskemat tarkistussummat mille tahansa tiedostolle on oltava samat.
-
Sanoma: PACKAGEOK
Client vastaa tällä sanomalla vastaanottaneensa päivityspaketin
onnistuneesti.
-
Sanoma: PACKAGEBROKEN
Client vastaa tällä sanomalla, mikäli pakettia ei saatu
kokonaisuudessaan luettua tai tarkistussumma ei vastaa ilmoitettua. Server
voi nyt vastata joko DISCONNECT jos katsoo parhaaksi luovuttaa tai UPDATE,
jos yritetään uudestaan.
-
Yhteyden katkaisu
-
Sanoma: DISCONNECT
Yhteyttä katkaistaessa ensin server lähettää
tämän sanoman ja tämän jälkeen client vastaa samalla
sanomalla.
Protokollan viestikaavio:

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.
-
NSMain:
Välittää viestejä muiden moduulien välillä
eli on nimensä mukaisesti päätyöjuhta. Moduuli käynnistää
uudet päivitys-threadit ja pitää kirjaa päivitystä
odottavista asiakkaista.
-
NSGUI:
Neuroni-palvelimen graafinen käyttöliittymä. Tarjoaa
palvelimen ylläpitäjälle toiminnot RMC-ohjelmistojen automaattista
päivitystä varten. NSGUI ajetaan omassa säikeessään
ja se kommunikoi NSMainin ja NSDatan kanssa aina kun käyttäjä
haluaa saada jonkin toiminnon suoritetuksi.
-
NSData:
Palvelinpään tietopankki. Sisältää Java-luokat
kaiken palvelimella säilytettävän tiedon tallennukseen.
Tarjoaa palvelut NSMain:lle ja NSGUI:lle tiedon nopeaan ja luotettavaan
hakuun ja tallennukseen. Tietojen tallennus fyysisesti hoidetaan serialisoimalla
NSDatan Java-luokkahierarkia levylle.
-
NSUpdateThread:
Luokka jonka tehtävänä on käsitellä yhden
asiakkaan päivitys. Tästä moduulista luodaan yksi instanssi
asiakasta kohden. Updaten tehtävänä on tarkistaa asiakkaan
versio, päivittää versiotieto NSMain kautta NSDataa:n ja
tarvittaessa ehdottaa asiakkaalle päivityksen aloittamista sekä
hoitaa mahdollinen päivitys alusta loppuun.
-
NSPUP:
PUP-protokollan totetutus on integroitu NSUpdateThread-luokkaan.
Protokolla on toteutettu tilakoneella, joka vie päivityksen läpi
lähettämällä komentoja asiakkaalle.
-
NSConnection:
Yhteyden muodostamiseen ja ylläpitoon, kuten myös viestien
lähettämiseen ja vastaanottamiseen tarvittavat rutiinit ja data.
Moduulin tarkoituksena on piilottaa TCP:n suora käyttö NSPUP:lta
ja tarjota NSPUP:lle hyvin yksinkertainen rajapinta yhteyden luomiseen
ja katkaisemiseen, viestien lähettämiseen ja yhteyden kuunteluun
(so. viestien vastaanottoon).
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.
-
NCMain:
Tähän moduuliin kuuluu kaikki muu kuin alla kuvattu asiakaspään
toiminnallisuus. Pääasiallinen tehtävä on käynnistää
asiakaspää ja kutsua muiden NC:n moduulien funktioita NC:n toiminnallisuuden
toteuttamiseksi. NC:n päivityslogiikka on moduulissa NCStates.
-
NCStates:
Tärkeimpänä PUP -protokollan implementaatio asiakaspäässä.
Sisältää tilakoneen, jossa NC viettää kaiken aikansa
yhteyden kuuntelun aloittamisesta yhteyden katkaisuun.
-
NCGUI:
Sisältää kaksi erillistä käyttöliittymää.
Toisessa käyttöliittymässä on yksi check box, jolla
käyttäjä voi määrätä, haluaako hän
ylipäätään päivityksiä. Jos käyttäjä
on valinnut, että hän haluaa päivityksiä, niin asiakkaan
tullessa palvelimen, jolla olisi päivitys kyseistä asiakasta
varten, käyttöliittymä kysyy, päivitetäänkö.
-
NCData:
Sisältää Windowsin rekisterin käsittelyn. Rutiinit
rekisteriarvojen lukuun ja talletukseen. Tarjoaa NCMainille rajapinnan,
jolla voidaan suoraan kysyä ja tallettaa versionumeroita sekä
mahd. suoraan vertailla niitä. Lisäksi metodit asennuspaketin
kirjoittamiseen levylle, sekä mahdollisesti asennuksen käynnistämiseen
tarvittavat funktiokutsut.
-
NCConnection:
Tarjoaa samat palvelut kuin NSConnection, mutta hiukan eri rajapinnalla
koska toteutus on modulaarinen, mutta ei oliopohjainen. Tässä
pyritään taas kerran parempaan siirrettävyyteen ja siksi
on valittu C++:n sijasta ANSI-C.
(Ks. NSConnection)
-
NCUtil:
Sekalaisia apufunktioita mm. viestien tyyppien lukemiseen ja kirjoittamiseen
sekä konversioita ja tarkistussumman laskenta.
-
NCError:
Rutiini(t) NC:n virheenkäsittelyyn ja lokimerkintöjen tekemiseen/tulostamiseen.
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:
warning, "Cannot read update packet.".
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:
warning, "Sending to socket failed"
Suljetaan yhteys serveriin.
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:
-
Log - Ei virheilmoitus. Tämän tyypin virheillä on mahdollisuus
raportoida ohjelman oikeasta etenemisestä koodissa. Esim. onnistuneen
protokollan mukaisen kommunikoinnin loppumisesta voidaan ilmoittaa tällä
viestillä.
-
Minor - Pieni virhe. Tämän ei pitäisi aiheuttaa jatkossa
mitään ongelmia. Esim. parametrien tai paluuarvon tarkastuksessa
löytynyt "virheellinen" data voidaan raportoida tällä virhetyypillä.
-
Major - Iso virhe. Aiheuttaa luultavasti jonkinlaisen virheellisen tapahtuman
ohjelmassa. Esim. omasta tietorakenteesta löytynyt väärän
tyyppinen luokka, jota kyseinen koodi ei osaa käsitellä.
-
Fatal - Katastrofi. Aiheuttaa ohjelman täydellisen jumiutumisen tai
kaatumisen. Esim. ikuinen silmukka tai dead lock ohjelman kannalta tärkeässä
säikeessä.
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