Useaan WWW-lähteeseen perustuva geenimerkkijonojen hakupalvelu Ohjelmistotuotantoprojekti Ohjelmistotuotantoryhmä 3, Geyser 2 http://www.cs.helsinki.fi/group/geyser2/ Eero Kaipiainen Kai Lindström Tuomas Ojamies Juha Pentikäinen Jani Saijos Jere Sanisalo Helsinki 20. heinäkuuta 2001 Suunnitteludokumentti HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos
Versiohistoria Versio Pvm Laatija Kommentti 0.0 11.6. Tuomas Ojamies Dokumentin runko 0.1 29.6. Tuomas Ojamies Alustava osajärjestelmäjako 0.2 11.7. Tuomas Ojamies Puolivalmis dokumentti 0.3 16.7. Tuomas Ojamies Lisätty kuvauksia 0.4 17.7. Tuomas Ojamies Lisätty johdatoluku sekä hiottu kuvauksia 1.0 20.7. Tuomas Ojamies Versio 1.0
Sisältö 1 Johdanto 1 1.1 Ohjelmiston kuvaus................................... 1 1.2 Tärkeimmät vaatimukset................................ 1 1.3 Suunnittelurajoitukset.................................. 1 1.4 Lähteet.......................................... 2 2 Osajärjestelmien yleiskuvaus 3 2.1 server........................................... 4 2.2 client............................................ 4 2.3 common.......................................... 4 2.4 script........................................... 4 2.5 scriptlib.......................................... 4 3 server 5 3.1 Tapahtumat........................................ 5 3.2 config........................................... 6 3.3 log............................................. 7 3.4 util............................................. 7 3.5 subsystem......................................... 7 3.5.1 clientconn..................................... 8 3.5.2 dataaccess..................................... 8 3.5.3 sequence...................................... 8 3.5.4 querysession................................... 9 3.5.5 sequenceservice.................................. 9 3.5.6 user........................................ 10 4 client 11 4.1 Käyttöliittymä...................................... 11 4.1.1 Hakutyyppipaneeli................................ 11 4.1.2 Hakuhistoriapaneeli............................... 12 4.1.3 Sekvenssin syöttöpaneeli............................. 13 4.1.4 Kuvapaneeli.................................... 13 iii
4.1.5 Toimeksiannon lähetys ja kenttien tyhjennys -paneeli............. 13 4.1.6 Tulospaneeli.................................... 13 4.2 Käyttöliittymäsovelman toteutus............................ 13 5 common 17 5.1 KAL/PA......................................... 17 5.2 Yleistä........................................... 17 5.2.1 Protokollan viestit................................ 17 5.3 Luokat........................................... 17 5.3.1 Luokka ClientUI................................. 17 5.3.2 Luokka NewClient................................ 20 5.3.3 Luokka AbsractClient.............................. 21 5.3.4 Luokka Variables................................. 22 6 script ja scriptlib 23 Liitteet 1 Määrittelydokumentin tekijät iv
Luku 1 Johdanto Tässä dokumentissa suunnitellaan ohjelmisto, joka toteutetaan Helsingin yliopiston Tietojenkäsittelytieteen laitoksen (TKTL) ohjelmistotuotantoprojektissa 28.5. - 24.8.2001. Geyser 2 -ohjelmistotuotantoprojektiryhmän jäsenet ovat Eero Kaipiainen, Kai Lindström, Tuomas Ojamies, Juha Pentikäinen, Jani Saijos ja Jere Sanisalo. 1.1 Ohjelmiston kuvaus Geyser 2 on hakupalvelinohjelmisto, joka tarjoaa käyttäjälleen käyttöliittymän, jonka kautta hän voi suorittaa kyselyjä samanaikaisesti eri geenisekvenssitietokantoihin. Ohjelmisto toteutetaan Java-ohjelmointikielellä ja se toimii sekä Windows- että Linux -käyttöjärjestelmisssä. 1.2 Tärkeimmät vaatimukset Toteutettavan järjestelmän tarkoitus on helpottaa geenitutkijoiden työtä yhdistämällä samaan käyttöliittymään eri geenisekvenssitietokantoihin kohdistuvia hakupalveluja. Projektin tavoitteena on toimiva ja laadukas ohjelmisto vähintään perustoiminnoilla toteutettuna. Ohjelmiston pitää olla vakaa ja mahdollisimman joustava, niin että hakupalvelimia, hakutyyppejä ja eri kieliä voidaan lisätä ja vanhoja muuttaa vähäisellä ohjelmakoodin muokkaamisella. Ohjelmiston vähimmäisvaatimus on, että hakuja tulee voida suorittaa kahteen eri tietokantaan. Nämä tietokannat ovat "National Center for Biotechnology Information - Advanced BLAST search"sekä "European Bioinformatics Institute, FASTA3". 1.3 Suunnittelurajoitukset Projektisuunnitelmassa [G2PS] Geyser 2 -projekti on jaettu kahteen osaan. Ensimmäisessä vaiheessa (28.5. - 6.8. 2001) suunnitellaan ja toteutetaan määrittelydokumentissa [G2MD] määritellyt 1. prioriteetin ominaisuudet ja toiminnot. Toisessa vaiheessa (6.8. - 24.8. 2001) suunnitellaan ja toteutetaan jäljellä olevan aikataulun puitteissa tärkeimpiä 2. prioriteetin ominaisuuksia ja toimintoja. Projektiryhmän päätöksellä suunnitteludokumentti rajoituu osajärjestelmien yleiskuvaukseen. Kaikki muu, kuten tieto- ja arkkitehtuurisuunnitelmat, siirretään käsiteltäväksi toteutusdokumentissa. 1
1.4 Lähteet G2MD Kaipiainen Eero, Lindström Kai, Ojamies Tuomas, et al.: Geyser 2 - määrittelydokumentti, Ohjelmistotuotantoprojekti, Tietojenkäsittelytieteen laitos, Helsingin yliopisto, 28.6.2001 G2PS Lindström Kai. Geyser 2 -projektisuunnitelma, Ohjelmistotuotantoprojekti, Tietojenkäsittelytieteen laitos, Helsingin yliopisto, 14.6.2001 2
Luku 2 Osajärjestelmien yleiskuvaus Geyser järjestelmä on ylimmällä tasolla jaettu viiteen osajärjestelmään. Kaaviossa 2.1 esitetään osajärjestelmät ja niiden keskinäiset viittaukset korkealla tasolla. Perusarkkitehtuurina Geyser järjestelmässä noudatetaan asiakasμpalvelin mallia. Ylimmän tason jako on tehty tämän mukaan palvelin ja asiakaspuoleen (client ja server pakkaukset). Lisäksi on omaan osajärjestelmään (common) on sijoitettu näiden kummankin yhteiskäyttöön tarkoitetut osat. Omiin osajärjestelmiinsä on erotettu myös script ja scriptlib, jotka muodostava yhden kokonaisuuden. Script on omassa osajärjestelmässään laajuutensa vuoksi. client common server script scriptlib Kuva 2.1: Osajärjestelmät, yleiskuva 3
2.1 server Pakkauksessa server on varsinainen palvelinohjelmisto. Pakkaus toteuttaa mm. palvelimen istunnon hallinnan, sisäänkirjautumisen ja lokitiedostot. Lisäksi pakkauksessa on varsinainen sekvenssihakupalvelu. Pakkaus tukeutuu common pakkauksen palveluihin kommunikoinnissa asiakaskäyttöliittymän kanssa sekä script pakkaukseen dokumenttien haun osalta. 2.2 client Pakkaus client toteuttaa käyttäjälle tarjottavan graafisen käyttöliittymän. Client pakkaus ei tarjoa ohjelmoitavaa rajapintaa, mutta käyttää common pakkauksen tietoliikennepalveluja. 2.3 common Pakkaus common sisältää client ja server pakkausten yhteiskäytössä olevat palvelut. Tärkein näistä palveluista on tietoliikenne protokolla KAL/PA. 2.4 script Pakkaus sisältää scriptikielen perustoiminnot, jolla mahdollistetaan uusien hakukoneiden sujuva lisääminen java ohjelmakoodia muuttamatta. Pakkaus liittyy läheisesti yhteen scriptlib pakkaukseen. 2.5 scriptlib Kokoaa monia eri valinnaisia scriptissä käytettäviä toiminnallisuuksia saman pakkauksen alle. Tämän pakkauksen kautta toteutetaan scriptikielen laajennettavuus. 4
Luku 3 server Pakkaus server sisältää Geyser palvelimen. Pakkaus on jaettu neljään alipakkaukseen, joiden lisäksi pakkaukseen kuuluu kolme luokkaa. Kuva 3.1 havainnollistaa pakkauksen sisällön. server Main PropConfig Version config Config ConfigBlock ConfigProperty subsystem Server Subsystem clientconn ClientManager ClientConnection sequence Sequence log LogBase Log ErrorLog LogWriter dataaccess QuerySessionDataAccess SequenceServiceDataAccess UserDataAccess sequenceservice SequenceService SequenceServiceDesc SequenceServiceEvent SequenceServiceListener SequenceServiceManager util EmptyEnumeration EventBase Listener querysession QuerySessionManager QuerySessionListener QuerySessionEvent QuerySessionInfo QuerySession user UserInfo Kuva 3.1: server osajärjestelmä 3.1 Tapahtumat Järjestelmän käynnistyksestä vastaa subsystem pakkauksen Server luokka, joka käynnistetään geyser pakkauksen Main luokasta. Server luokka toteuttaa Subsystem rajapinnan, jonka metodeita Main luokka käyttää. Server luo ilmentymän SequenceServiceManagerista, antaen sille SequenceServiceDataAccess olion. QuerySessionManagerille Server antaa parametreiksi QuerySessionDataAccess olion ja aikaisemmin luomansa SequenceServiceManagerin. QuerySessionManager asettaa SequenceServiceManageriin tapahtumankuuntelijan. Lopuksi Service luo ClientManagerin, jolle annetaan parametreina QuerySessionManager, johon ClientManager asettaa tapahtumankuuntelijan. Kaikki osajärjestelmät toteuttavat Subsystem rajapinnan, jossa on metodit järjestelmän alustuk- 5
clientconn querysession sequenceservice addquerysession addsequenceservice sequenceserviceevent querysessionevent Kuva 3.2: server osajärjestelmä: tapahtumat seen, käynnistykseen, pysäyttämiseen ja loppualustukseen. Myös Server luokkaa hallitaan saman rajapinnan kautta. 3.2 config <<interface>> ConfigProperty + validate ConfigBlock + ConfigBlock() + ConfigBlock(String) + add(configblock) + setitem(string,string) + setitem(string,double) + getname() + getblocks(string) + getblocks() + getblock(string) + getitem(string) + getrawblocks() + getrawitems() + fill(configproperty) + checkunset (ConfigProperty) Config + Config() + Config(String) + getroot() Kuva 3.3: server osajärjestelmä: config Config pakkaus huolehtii kootusti kaikkien järjestelmän asetustiedostojen lukemisesta. Config pakkauksen julkinen rajapinta jakaantuu kolmeen luokkaan: Config, ConfigBlock sekä ConfigProperty (kuva 3.3). Config luokan tehtävä on lukea konfiguraatio tiedosto. Konfiguraatio rakentuu ConfigBlock puuksi, 6
jonka juuri on Config luokalla. ConfigBlock luokkaa voidaan pyytää täyttämään vastaavan java luokan kentät. 3.3 log <<interface>> LogWriter + println LogBase + static createwriter + static getwriter + static setwriter + static init PrintStreamLogWriter FileLogWriter CombinedLogWriter Log + println ErrorLog + println Kuva 3.4: server osajärjestelmä: log Log pakkaukseen on koottu järjestelmän loki ominaisuudet. Log pakkauksen julkinen rajapinta jakaantuu luokkiin LogBase, Log, ErrorLog sekä rajapintaan LogWriter (kuva 3.4). Järjestelmä luo käytettävissä olevat LogWriterit LogBase luokan metodeilla. Muut järjestelmän osat käyttävät LogBase luokan aliluokkia, kuten luokkia Log tai ErrorLog, kirjoittaakseen lokimerkintöjä. 3.4 util EventBase + EventBase(Object,int) + getsource() + gettype() EmptyEnumeration + hasmoreelements() + nextelement() <<interface>> Listener Kuva 3.5: server osajärjestelmä: util Util pakkaukseen kuuluu yleisiä apuluokkia muun järjestelmän käyttöön. Esimerkiksi EmptyEnumeration, Listener ja EventBase (kuva 3.5). 3.5 subsystem Subsystem pakkaukseen on sijoitettu palvelimen alijärjestelmät omiin alipakkauksiin ryhmiteltyinä. Kaikki järjestelmän alijärjestelmät toteuttavat pakkauksessa olevan Subsystem rajapinnan, jossa on metodit alijärjestelmän käynnistämiseen ja pysäyttämiseen. Suoraan subsystemissä on myös varsinainen palvelin-luokka, joka on myös alijärjestelmä metodologian mukainen, ja kapsuloi muut alipalvelut puumaisesti sisäänsä. 7
ClientManager + ClientManaget(QuerySessionManager) + init() + start() + stop() + deinit() Kuva 3.6: server osajärjestelmä: clientconn 3.5.1 clientconn Clientconn-pakkauksen tehtävänä on hoitaa palvelimen ja clientin (tässä tapauksessa sovelma) välinen kommunikaatio, ja lisäksi jakaa clientin pyytämät palvelut muille alipalveluille. Clientconn pakkauksen ulkoinen rajapinta on keskitetty yhteen luokkaan, ClientManageriin. Client- Managerille toimitetaan konstruktorin parametrina viite QuerySessionManageriin, johon se rekisteröi tapahtumankuuntelijan (kuva 3.6). 3.5.2 dataaccess <<interface>> QuerySessionDataAccess + getuserquerysessions(userid) + getquerysession(sessionid) + removequerysession(sessionid) + updatequerysession(session) + getquerysessioninfo(sessionid) + inserquerysession(session) <<interface>> SequenceServiceDataAccess + getsequenceservices (querysessionid) + getrunninseguenceservices() + insertquerysession(seq) + updatequerysession(seq) + inserquerysession(sessionid) + removequerysession(seq) <<interface>> UserDataAccess + getuser(string) + updateuser(userinfo) Kuva 3.7: server osajärjestelmä: dataaccess Pakkauksessa dataaccess tuotetaan järjestelmän eri osille palvelu tietojen pysyväistalletukseen. Jokaista palveltavaa osaa kohden on dataaccessissa rajapinta, jonka kautta kyseinen osa palveluja hakee (kuva3.7). Pysyväistalletus on koottu, jotta mahdollinen siirtyminen tietokantapohjaiseen järjestelmään on tulevaisuudessa mahdollisimman sujuva toteuttaa. 3.5.3 sequence Sequence String: header String: answerlink String: data + Sequence() Kuva 3.8: server osajärjestelmä: sequence Sequence on yhden sekvenssivastauksen tiedot. 8
3.5.4 querysession QuerySessionManager + QuerySessionManager (QuerySessionDataAccess, SequenceServiceManager) + addlistener (QuerySessionListener) + removelistener (QuerySessionListener) + getdataaccess() + addquerysession (QuerySessionInfo) + stopquerysession (QuerySessionInfo) + removequerysession (QuerySessionInfo) + init() + start() + stop() + deinit() QuerySession + QuerySession (QuerySessionInfo) + getinfo + getsequences <<interface>> QuerySessionListener + querysessionevent (QuerySessionEvent) QuerySessionInfo String: id String: owneruserid String: name String: date String query + QuerySessionInfo() QuerySessionEvent + QuerySessionEvent (QuerySession, int) Kuva 3.9: server osajärjestelmä: querysession Querysession-pakkaus on kokoava väliporras yksittäisille hakutyypeille, jonka tehtävänä on hoitaa ja hallinnoida kokonaisia hakutoimeksiantoja. QuerySessionManager toimii yhdyskäytävänä yksittäisten hakutyyppien ja hakutoimeksiantojen välillä, kuunnellen hakutyypeissä tapahtuvia tapahtumia (kuva 3.9). QuerySessionManager kuuntelee SequenceServiceManagerin lähettämiä tapahtumia. QuerySession- Manager myös lähettää omia tapahtumia. 3.5.5 sequenceservice <<interface>> SequenceServiceListener + sequenceevent (SequenceServiceEvent) SequenceServiceEvent + SequenceServiceEvent (SequenceService,int) + getresultset() + setresultset() SequenceServiceManager + SequenceServiceManager (SequenceServiceDataAccess) + addlistener (SequenceServiceListener) + removelistener (SequenceServiceListener) + addsequenceservice (SequenceServiceDesc) + stopsequenceservice (SequenceServiceDesc) + removesequenceservice (SequenceServiceDesc) + init() + start() + stop() + deinit() <<interface>> SequenceService + getdesc() SequenceServiceDesc String: querysessionid String: seqservid String: query int: status + isrunning() Kuva 3.10:server osajärjestelmä: sequenceservice Sequenceservice-pakkaus hoitaa yksittäisiä hakutyyppejä. Hakutyypit hoitavat varsinaiset haut sekvenssitietokantoihin. Jokaista hakutyyppiä kohden on yksi SequenceService. SequenceService lähettää tapahtumia hakujen valmistuessa. 9
3.5.6 user UserInfo String: alias (id) String: password String: language + UserInfo() Kuva 3.11: server osajärjestelmä: user User pakkaus sisältää tiedon käyttäjistä. UserInfo luokan luo dataaccess-pakkaus. 10
Luku 4 client Pakkauksella client ei ole ohjelmoitavaa ulkoista rajapintaa. Sen sijaan se toteuttaa käyttäjälle tarjottavan graafisen käyttöliittymän järjestelmän palveluihin. Pakkaus ottaa yhteyttä muuhun järjestelmään common.net pakkauksessa toteutettuja menetelmiä käyttäen. Tässä luvussa esitellään Geyser 2 -järjestelmän ensimmäisen vaiheen graafinen käyttöliittymä. 4.1 Käyttöliittymä Geyser 2:n käyttöliittymän tarkoitus on tarjota järjestelmän käyttäjille mahdollisimman selkeä ja helppokäyttöinen liittymä Geyser 2 -järjestelmän ominaisuuksien tehokkaaseen hyödyntämiseen. Sisäänkirjautumisen (kuva 4.1) jälkeen käyttäjälle avautuu kuvan 4.2 mukainen käyttöliittymä, joka toimii käyttäjän henkilökohtaisena työpöytänä. Tämä työpöytä on jaettavissa kuuteen osaalueeseen eli paneeliin: hakutyyppeihin, hakuhistoriaan, sekvenssinsyöttöön, Geyser -logoon, toimeksiannon lähettämiseen ja kenttien tyhjentämiseen sekä tuloksien tarkasteluun. Yhdessä nämä osa-alueet muodostavat kokonaisuuden, joka toteuttaa kaikki käyttöliittymälle asetetut 1. tason prioriteetit. [viite mdokuun?5.3.1?] Seuraavaksi käymme näiden osa-alueiden toiminnot ja ominaisuudet tarkemmin läpi. Kuva 4.1: Sisäänkirjautuminen 4.1.1 Hakutyyppipaneeli Hakutyyppipaneelissa (kuva 4.3) käyttäjä näkee järjestelmän tarjoamat eri hakutyypit. Täältä hän voi valita ne hakutyypit, joita haluaa käyttää toimeksiannossa sekä tarkastella toimeksiannos- 11
Kuva 4.2: Geyser 2:n 1. vaiheen käyttöliittymä sa olevien hakutyyppien kulloistakin tilaa. Hakutyypin kohdalla on aina maininta siitä, onko se tarkoitettu nukleotidi vai aminohapposekvenssihakua varten. Käyttäjän omalla vastuulla on valita syöttämäänsä sekvenssiin sopivat hakutyypit. Valittujen hakutyyppien parametrit ja mahdolliset muut lisätiedot saa esille painamalla lisätietoa painiketta, joka avaa kuvassa 4.4 esitetyn kaltaisen ikkunan. 4.1.2 Hakuhistoriapaneeli Hakuhistoriapaneelissa (kuva 4.5) käyttäjä näkee lähettämänsä toimeksiannot, joita hän ei ole poistanut järjestelmästä. Toimeksiannosta näkyy hakuhistoriassa sen nimi, lähetysaika sekä tämänhetkinen tila. Käyttäjä voi valita jonkin toimeksiannon, jolloin siinä käytetty sekvenssin tulee sekvenssinsyöttökenttään, käytetyt hakutyypit tulevat valituiksi ja toimeksiannon nimi tulee toimeksiannon nimi kenttään. Jos toimeksiannon tilana oli valmis tai keskeytetty, niin saadut tulokset esitetään tulospaneelissa. Hakuhistoriapaneelista käsin käyttäjä voi myös keskeyttää suorituksessa olevan toimeksiannon sekä poistaa toimeksiantoja. 12
Kuva 4.3: Hakutyyppipaneeli 4.1.3 Sekvenssin syöttöpaneeli Sekvenssin syöttöpaneeliin (kuva 4.6) käyttäjä voi syöttää sekvenssin, jolla hän haluaa tehdä toimeksiannon. Lisäksi käyttäjä voi määritellä toimeksiannolle nimen. Jos käyttäjä ei anna toimeksiannolle nimeä, niin nimeksi tulee oletusnimi. 4.1.4 Kuvapaneeli Kuvapaneelin (kuva 4.7) varaama tila on tarkoitus käyttää projektin 2. tason prioriteettien tarvitsemiin komponentteihin. 4.1.5 Toimeksiannon lähetys ja kenttien tyhjennys -paneeli Toimeksiannon lähetys ja kenttien tyhjennys -paneeli (kuva 4.8) sisältää 1. vaiheessa vain kaksi painiketta: lähetä ja tyhjennä. Lähetä painikkeella käyttäjä voi lähettää toimeksiannon suoritettavaksi ja tyhjennä painikkeella tyhjentää sekvenssin syöttökentän, tuloslistan sekä asettaa toimeksiannon nimi kenttään oletusnimen. 4.1.6 Tulospaneeli Tulospaneelin (kuva 4.9) avulla käyttäjä voi tarkastella toimeksiannon tuottamia tuloksia, jotka ovat jaoteltuna hakutyypeittäin. Käyttäjä voi tarkastella tarkemmin saatua hakuosumaa painamalla kaksi kertaa hiiren painiketta haluamansa tulosrivin kohdalla. Tällöin käyttäjälle aukeaa kuvan 4.10 esittämä ikkuna, jossa on osuman otsikkotiedot, vertailusekvenssipätkä sekä linkit vastaussekvenssiin. 4.2 Käyttöliittymäsovelman toteutus Käyttöliittymä toteutetaan Java -sovelmana ja sitä ajetaan WWW-selaimessa. Käyttöliittymän ja palvelimen välinen kommunikointi hoidetaan KAL/PA -protokollalla. Sovelman pääluokkana toimii GeyserApplet -luokka, joka luo ilmentymät muista tarvitsemistaan luokista, jotka puolestaan luovat käyttöliittymän komponentit ja tarjoavat metodeita käyttöliittymän esittämien arvojen muuttamiseen. Käyttöliittymäsovelma pohjautuu Geyser -ryhmän tuotoksiin. 13
Kuva 4.4: Lisätietoa hakutyypeistä Kuva 4.5: Hakuhistoriapaneeli 14
Kuva 4.6: Sekvenssin syöttöpaneeli Kuva 4.7:Kuvapaneeli Kuva 4.8: Toimeksiannon lähetys ja kenttien tyhjennys -paneeli Kuva 4.9: Tulospaneeli 15
Kuva 4.10: Hakuosuma 16
Luku 5 common Tässä kappaleessa kuvataan common pakkauksen sisältö. Pakkaus sisältää server ja client pakkausten yhteiskäytössä olevat luokat. Pakkauksen ainoa sisältö on KAL/PA protokollan toteuttava tietoliikenne väylä, jota asiakas ja palvelin käyttävät kommunikointiin. 5.1 KAL/PA 5.2 Yleistä Tässä luvussa kerrotaan miten tietoliikenne on suunniteltu toteutettavaksi käyttöliittymäsovelman ja Geyser 2 -palvelimen välillä. Protokolla KAL/PA, jota käytetään tiedonvälitykseen sovelman ja palvelimen välillä on tekstipohjainen. 5.2.1 Protokollan viestit Protokolla tunnistaa seuraavat viestit (kuva 5.1). Viesti alkaa tunnisteella ja päättyy rivinvaihtomerkkiin nn. Viestien kentät erotetaan toisistaan merkillä n. Jos kyseinen merkki esiintyy kenttien sisällä, niin sen perään lisätään sama merkki. 5.3 Luokat Tässä luvussa käsitellään luokat, jotka kuuluvat rajapintaan käyttöliittymäsovelman ja palvelimen välillä. 5.3.1 Luokka ClientUI Käyttöliittymäsovelma luo tietoliikennerajapinnan palvelimelle käyttämällä luokan konstruktoria ClientUI(String host, int port). Kyseinen luokka tarjoaa käyttöliittymäsovelmalle seuraavia palveluita, joilla se voi käyttää rajapintaa. public void login( String username, String passwd ) Lähettää kirjautumistiedot palvelimelle. public void initreq() Lähettää palvelimelle alustuspyynnön. 17
SOVELMA SUUNTA PALVELIN < > login accept/reject initreq sendinit showhitreq sendhitinfo searchtypeinforeq sendsearchtypeinfo getresultsreq sendresults getsequencedatareq sendsequencedata gethiturlsreq sendhiturls pingresp pingrequest > newsearchreq (ei vastausta) removesearchreq (ei vastausta) abortsearchreq (ei vastausta) < (ei vastausta) sendsearchstates (ei vastausta) sendsearchtypestates (ei vastausta) disconnect Kuva 5.1: Protokollan viestit public void newsearchreq( boolean[] searchtypes, String searchname, String sequencedata) Lähettää palvelimelle uuden hakutoimeksiannon. Parametreina ovat käyttäjän valitsemat hakutyypit, toimeksiannon nimi ja sekvenssidata. Toimeksiannon nimi sisältää aikaleiman. public void refreshsearchreq( int index ) Pyytää palvelimelta käyttäjän valitsemaan toimeksiantoon liittyvät tiedot. Näitä ovat muun muassa kaikki valmistuneet hakutulokset, toimeksiannon tila, haettu sekvenssidata, toimeksiannossa käytetyt hakutyypit ja näiden tilat. public void removesearchreq( int index ) Pyytää palvelinta poistamaan annetun hakutoimeksiannon ja kaikki siihen liittyvät tiedot. public void abortsearchreq( int index ) Lähettää palvelimelle pyynnön keskeyttää haun ja lähettämään valmistuneet hakutulokset. public void showhitreq( int index ) Pyytää palvelimelta vertailutuloksen annetusta hakuosumasta. public void searchtypeinforeq( int index ) Lähettää palvelimelle pyynnön näyttämään lisätietoja valitusta hakutyypistä. public void getresultsreq( int index) Pyytää palvelinta lähettämään hakuosumat annetun toimeksiannon perusteella. public void getsequencedatareq( int index ) Lähettää palvelimelle pyynnön lähettää tietyn toimeksiannon sekvenssidatan. public void gethiturlsreq() Hakee palvelimelta listan URL-osoitteista, joissa on enemmän tietoa hakutuloksesta. Seuraavilla metodeilla käyttöliittymäsovelma voi hakea palvelimelta saapuneita tietoja. public boolean loginok() Palauttaa sisäänkirjautumisen onnistumisen. public String[] getresultlines() Tämä palauttaa tulosrivit. public String[] getsearchstates() 18
AbstractClient public AbstractClient (Socket socket) NewClient public NewClient() ClientUI public ClientUI() Variables Kuva 5.2: Rajapintaluokat sovelman ja palvelimen välillä Tällä metodilla haetaan hakutoimeksiantojen tilat. public String[] getsearchnames() Metodi palauttaa hakutoimeksiantojen nimet. public String[] getsearchtypes() Tämä palauttaa hakutyyppien nimet. public String[] getsearchtypestates() Tällä metodilla käyttöliittymä saa hakutyyppien tilat. Taulukon alkio on null, jos hakutyyppiä ei ole käytetty. public String gethitinfo() Tämä palauttaa tietoa tietystä hakuosumasta. public String getsequencedata() Palauttaa sekvenssidatan. public String getsearchtypeinfo( int index ) Metodi palauttaa tietystä hakutyypistä tietoa. public String gethiturls() Tällä saadaan lista URL -osoitteista, jotka sisältää lisätietoa osumasta. Prioriteetilla kaksi toteutettavat pyynnöt. public void showsequencenamesreq() Pyytää palvelinta lähettämään sekvenssihistorian sisällön public void showselectedsequencereq( int index ) Lähettää palvelimen pyynnön saada sekvenssihistoriasta valitun sekvenssin sisältö. public void savesequencereq( String name, String sequencedata ) Pyytää palvelinta tallentamaan sekvenssin. public void deletesequencereq( index ) Lähettää palvelimelle pyynnön poistaa haluttu sekvenssi. public void changehitnumberreq( int search, int number ) Tämä pyytää palvelinta lähettämään vain annettu määrä hakutuloksia. 19
public void deleteduplicatelinesreq( int search) Lähettää palvelimelle pyynnön poistaa annettuun toimeksiantoon liittyvät toisteiset hakutulokset (sama tunniste). public void deleteunmarkedlinesreq( int search ) Pyytää palvelinta hävittämään ei kiinnostavat hakutulokset saadun toimeksiannon perusteella. public void addcommentreq( int index, String comment ) Lähettää palvelimelle pyynnön liittää kommentti johonkin hakutulokseen. public void getlanguagereq( int index ) Pyytää palvelimelta uuden kielen. Käyttöliittymälle prioriteetilla kaksi tarjotut palvelut, joilla se voi lukea palvelimelta lähetettyä tietoa. public String[] getlanguage() Palauttaa kielen sanat. public String[] getsequencenames() Palauttaa sekvenssihistoriaan tallennetut sekvenssien nimet. Muut metodit, jotka näkyvät ulospäin luokasta. protected void log ( String err, boolean error ) Kirjoittaa lokiin tapahtumat ja virheet. protected void processline ( Vector words ) Tulkitsee palvelimelta saadun viestin. 5.3.2 Luokka NewClient Luokka NewClient pitää palvelimen puolelta yhteyttä yhteen käyttöliittymäsovelmaan. Luokan konstruktoria NewClient( Socket socket ) kutsutaan ClientFactorysta? Lähetyspalvelut sovelmalle päin. public void loginok() Lähettää sovelmalle tiedon sisäänkirjautumisen onnistumisesta. public void pingrequest() Tutkii, että onko yhteys käyttöliittymään kunnossa. public void sendinitresp( String[] searchtypes, String[] searchnames, String[] searchstates ) Lähettää sovelmalle vastauksen alustuspyyntöön. public void sendsearchtypeinfo( String info ) Lähettää pyydetyn hakutyypin tiedot sovelmalle public void sendresults( String[] resultlines ) Lähettää hakuosumat sovelmalle. public void sendhiturls( String[] urladdresses ) Lähettää hakuosumien URL-osoitteet. public void sendhitinfo( String info ) Lähettää vertailutuloksen sovelmalle. public void sendsequencedata( String genesequence ) Lähettää sekvenssidatan. public void sendsearchstates( String[] states ) Lähettää hakutoimeksiantojen tilat. public void sendsearchnames( String[] names ) Lähettää toimeksiannot. 20
public void sendsearchtypes( String[] names ) Lähettää hakutyypit. public void sendsearchtypestates( String[] states ) Lähettää hakutyyppien tilat Palvelin saa seuraavilla metodeilla sisällöt sovelmalta tulleista pyynnöistä. public Vector getnewsearch() Palauttaa sovelman lähettämän uuden toimeksiannon. Vektorin sisältö alkaen ensimmäisestä alkiosta: - hakutyypit : boolean[] - toimeksiannon nimi : String - sekvenssidata : String public Vector getlogin() Palauttaa sovelman lähettämän käyttäjätunnuksen ja salasanan käyttäjän tunnistamista varten. public int getsearchindex() Palauttaa päivitettävän hakutoimeksiannon indeksin. public int gethitresultindex() Palauttaa hakuosuman indeksin, josta sovelma haluaa lisätietoja. public int getsearchabortindex() Palauttaa hakutoimeksiannon indeksin, jonka sovelma haluaa keskeyttää. public int getsearchremoveindex() Palauttaa hakutoimeksiannon indeksin, jonka sovelma haluaa poistaa. public int getsearchtypeinfoindex() Palauttaa hakutyypin indeksin, josta sovelma haluaa lisätietoa. Alla ovat prioriteetilla kaksi toteutettavat lähetysmetodit. public void sendlanguage( String[] words ) Lähettää kielen sanat. public void sendsequencenames( String[] sequences ) Lähettää sekvenssihistorian sisältämät sekvenssit. Prioriteetilla kaksi toteutettavat palautusmetodit ovat seuraavana. public int getlanguage() Palauttaa sovelman haluaman kielen. public int getsequencedatahistoryindex() Palauttaa sekvenssihistoriasta valitun sekvenssin indeksin. 5.3.3 Luokka AbsractClient Kumpikin NewClient ja ClientUI perii luokan AbstractClient. AbstractClient hoitaa varsinaisen viestien lähetyksen ja vastaanottamisen. Sen konstruktoria AbstractClient( Socket socket ) kutsutaan sen aliluokista. public abstract int getmessageid() Palauttaa id:n, jonka perusteella käyttöliittymä ja palvelin osaa valita oikean metodin, jolla jomman kumman lähettämää tietoa voi lukea. public void run() Säikeen metodi, jolla luetaan pistokkeesta tulevaa tietoa. public void write( String msg ) Kirjoittaa pistokkeeseen. 21
public void write( String msg1, String msg2 ) Kirjoittaa pistokkeeseen. public void write( String msg1, String msg2, String msg3 ) Kirjoittaa pistokkeeseen. public void write( String[] msg ) Kirjoittaa pistokkeeseen. protected abstract void processline ( Vector words ) Katso vastaava kohta luokista ClientUI ja NewClient. protected abstract void log( String err, boolean error ) Kirjoittaa lokiin merkinnän tapahtumasta tai virheestä. public void intprocessline( Vector words ) Käsittelee saadun viestin yleisesti. 5.3.4 Luokka Variables KirjastoluokkaVariables sisältää staattisia muuttujia lähinnä KAL/PA- protokolla kuuluvien viestien tunnistamiseen. 22
Luku 6 script ja scriptlib VariableConv + VariableConv() + static javatoscript (Object) + static scripttojava (Variable) ParserTokenStream + ParserTokenStream (InputStream) + ParserTokenStream (Reader) + close() + match(int) + match(int,int) + matchquoted() + registerinstance + matchword() + nexttoken() + parseerror() + peektoken() + tokentostring() VariableFactory VariableFactory() + static cearteboolean (boolean) + static createlist() + static createnumber (double) + static createproxy() + static createstring(string) VariablePool + VariablePool() + contains(string) + copyfrom (VariablePool) + get(string) + set(string,variable) FunctionPool + contains(string) + compyfrom (FunctionPool) + set(string,function) + get(string) Script + Script() + Script(String) + call(string) + call(string,vector) + getsymbols() + parse() <<interface>> Variable + copy() + equals(variable) + getboolean() + getnumber() + getstring() + gettableentries() + gettableentry(string) + gettableentry (String,Variable) + gettype VariableRef + VariableRef(String) + addtableref(expression) + getid() + gettablerefs() + hastablerefs() SymbolTable + SymbolTable() + SymbolTable (SymbolTable) + getfunctions() + getvariables() + registerclass(class) + registerclass (Class,Object) + registerinstance (Object) <<interface>> Function + execute (SymbolTable,Vector) <<interface>> Expression StatementBlock + addstatement (Statement) + execute (RuntimeEnvironment) + isempty() <<interface>> Statement + execute (RuntimeEnvironment) RuntimeEnvironment + RuntimeEnvironment (SymbolTable,Hashtable) + getglobals() + getvariable(string) + maptoglobal(string) + setvariable (String,Variable) +VariableExists(String) + evaluate (RuntimeEnvironment) Kuva 6.1: server osajärjestelmä: script Näissä pakkauksissa kuvataan järjestelmään toteutettu scriptikieli. Tarkempi kuvaus scriptikielestä sisällytetään toteutusdokumenttiin. Pakkauksen script luokat huolehtivat scriptien parsimisesta ja ajosta. Pakkaukseen scriplib kootaan scriptissä käytettäviä toiminnallisuuksia. Pakkaukseen kootaan geneerisiä scripteissä käytettäviä luokkia, jotka ovat luonteeltaan sellaisia että niitä voi käyttää muissakin projekteissa. Ainoastaan Geyserin käyttöön tulevat luokat eivät tule tänne. Esimerkiksi scriplibissä toteutetaan Http-toiminnot. 23
Liite 1. Määrittelydokumentin tekijät Vastuuhenkilö: Tuomas Ojamies Kirjoittajat: johdanto: Kai Lindström osajärjestelmien yleiskuvaus: Tuomas Ojamies server: Tuomas Ojamies ja Jere Sanisalo client: Jani Saijos common: Eero Kaipiainen script: Tuomas Ojamies ja Jere Sanisalo scriptlib: Tuomas Ojamies ja Jere Sanisalo 24