Arkkitehtuuri. Ylätason sovellusarkkitehtuuri

Samankaltaiset tiedostot
Ohjelmistojen mallintamisen ja tietokantojen perusteiden yhteys


Action Request System

Järjestelmäarkkitehtuuri (TK081702)

812341A Olio-ohjelmointi, IX Olioiden välisistä yhteyksistä

in condition monitoring

Koodistoeditorin toteutuksen lähtökohtia: KaPA-koodistopalvelu ja REST-rajapinnat

Tietokantasovellus (4 op) - Web-sovellukset ja niiden toteutus

Ohjelmistotuotanto. Luento

812341A Olio-ohjelmointi Peruskäsitteet jatkoa

Paikkatiedon infrastruktuurin hyödyntäminen

17. Javan omat luokat 17.1

Ohjelmistojen mallintaminen, arkkitehtuuria ja rajapintoja

14. Poikkeukset 14.1

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

AJAX-konsepti AJAX. Asynkronisuus. Nykyisten web-ohjelmien ongelmia. Asynchronous JavaScript And XML

private TreeMap<String, Opiskelija> nimella; private TreeMap<String, Opiskelija> numerolla;

Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä

Verkkopalvelut ja portaalitryhmän

HY:n alustava ehdotus käyttäjähallintotuotteesta

Tiedonhallinnan perusteet. Viikko 1 Jukka Lähetkangas

Ohjelmistojen mallinnus Ohjelmistoarkkitehtuuri Harri Laine 1

Ilmonet ja rajapinnat Pääkaupunkiseudun kansalais- ja työväenopistojen kurssit

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

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

15. Ohjelmoinnin tekniikkaa 15.1

17. Javan omat luokat 17.1

2. Olio-ohjelmoinista lyhyesti 2.1

Interaktiivisten järjestelmien arkkitehtuuriratkaisu, jolla käyttöliittymä erotetaan sovelluslogiikasta.

T Henkilökohtainen harjoitus: FASTAXON

Alkuraportti. LAPPEENRANNAN TEKNILLINEN YLIOPISTO TIETOJENKÄSITTELYN LAITOS CT10A Kandidaatintyö ja seminaari

VYPEdit verkkosivualusta SVY-toimijoille

REST an idealistic model or a realistic solution?

KANSALLINEN MAASTOTIETOKANTA

A TIETORAKENTEET JA ALGORITMIT

HOJ Haja-aiheita. Ville Leppänen. HOJ, c Ville Leppänen, IT, Turun yliopisto, 2012 p.1/10

Pätevyyttä haettava oikeustulkkirekisterilautakunnalta. Edellytyksenä (lakiesityksestä lainaus):

Ylläpitodokumentti NJC2. Helsinki Ohjelmistotuotantoprojekti HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos

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

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. VII Suunnittelumallit Adapter ja Composite

HY:n alustava ehdotus käyttäjähallintotuotteesta

Joskus yleistäminen voi tapahtua monen ominaisuuden pohjalta. Myös tällöin voi tulla moniperintätilanteita.

Tietokannanhoitaja DBA (Database Administrator) ja tietokannan hallinta

Yhteentoimivuusalusta: Miten saadaan ihmiset ja koneet ymmärtämään toisiaan paremmin?

16. Javan omat luokat 16.1

Peppi - Koulutuksen suunnittelijan ja opettajan palvelut. Tekninen vaatimusmäärittely

Tiedonsiirto- ja rajapintastandardit

JWT 2016 luento 11. to klo Aulikki Hyrskykari. PinniB Aulikki Hyrskykari

KADA (Drupal 7) migraatio uuteen (versioon) webiin

20. Javan omat luokat 20.1

Sisällys. 20. Javan omat luokat. Java API. Pakkaukset. java\lang

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

Arkkitehtuurikuvaus. Ratkaisu ohjelmistotuotelinjan monikielisyyden hallintaan Innofactor Oy. Ryhmä 14

Ohjelmistojen mallintaminen Tietovuokaaviot Harri Laine 1

Paikkatietorajapinnat IT arkkitehtuurin näkökulmasta

14. Poikkeukset 14.1

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

Ohjelmoinnin jatkokurssi, kurssikoe

Tentissä ratkaistaan neljä ohjelmointitehtävää Javalla. Tehdään sähköisesti mikroluokan Windows-koneilla.

9 Edistynyt PHP-ohjelmointi

Osittavat arkkitehtuurityylit. Palveluihin perustuvat arkkitehtuurityylit. Erikoisarkkitehtuurityylit

Projektinhallintaa paikkatiedon avulla

Olio-ohjelmointi Javalla

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

Interaktiivisten järjestelmien arkkitehtuuriratkaisu, jolla käyttöliittymä erotetaan sovelluslogiikasta.

Käyttäjähallintapalvelun REST-rajapinnat

Ohjelmistojen mallintaminen, olioja relaatiomallinnuksen suhteesta

Web Services tietokantaohjelmoinnin perusteet

Veronumero.fi Tarkastaja rajapinta

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

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

Avointen ohjelmistojen käyttö ohjelmistokehityksessä

2. Lisää Java-ohjelmoinnin alkeita. Muuttuja ja viittausmuuttuja (1/4) Muuttuja ja viittausmuuttuja (2/4)

9. Periytyminen Javassa 9.1

15. Ohjelmoinnin tekniikkaa 15.1

Ristiinopiskelun kehittäminen -hanke

Aurinkoenergiajärjestelmien etäseurantajärjestelmä

MS Aamubrunssi Aktiivihakemiston uutuudet

BlueJ ohjelman pitäisi löytyä Development valikon alta mikroluokkien koneista. Muissa koneissa BlueJ voi löytyä esim. omana ikonina työpöydältä

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

Ylläpitodokumentti NJC2. Helsinki Ohjelmistotuotantoprojekti HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos

Valppaan asennus- ja käyttöohje

HELIA 1 (11) Outi Virkki Tiedonhallinta

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

Tietorakenteet, laskuharjoitus 7,

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

1 Tehtävän kuvaus ja analysointi

4. Olio-ohjelmoinista lyhyesti 4.1

Ohjelmistoarkkitehtuurit. Kevät

JReleaser Yksikkötestaus ja JUnit. Mikko Mäkelä

206 Verkkosivun tuottaminen finaalitehtävät

Tietojärjestelmä tuotantoympäristössä. Sovellusohjelmat Helsingin ammattikorkeakoulu Stadia / Tekniikka ja liikenne Vesa Ollikainen

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. VIII Suunnittelumallit Observer ja State

Rajapinta (interface)

Rajapinnasta ei voida muodostaa olioita. Voidaan käyttää tunnuksen tyyppinä. Rajapinta on kuitenkin abstraktia luokkaa selvästi abstraktimpi tyyppi.

sertifikaattiratkaisu Apitamopki

HSMT Tietokannoista. Ville Leppänen. HSMT, c Ville Leppänen, IT, Turun yliopisto, 2008 p.1/32

18. Abstraktit tietotyypit 18.1

Oha-selvitys 2008 HISinOne-järjestelmän arviointi

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

Transkriptio:

Arkkitehtuuri Termieditorin käyttö vaatii kirjautumisen. Peruskäyttäjälle myönnetään erikseen aineistokohtaisia luku- ja muokkausoikeuksia. Järjestelmän ylläpitäjä (admin) saa ylläpitää kaikkia aineistoja. Järjestelmän pääkäyttäjä (superuser) saa lisäksi ylläpitää käyttäjätietoja. Termieditoria hyödynnetään web-käyttöliittymän lisäksi sovellusrajapintojen kautta muiden järjestelmien tietovarastona. Ylätason sovellusarkkitehtuuri Editori jakautuu karkeasti käyttöliittymäkomponenttiin ja taustajärjestelmään. Taustajärjestelmä hyödyntää keskeisinä resursseina relaatiotietokantaa ja kokoteksti-indeksiä.

Ydin ja rajapinnat Termed-api sisältää Termieditorin keskeisen toimintalogiikan ja tarjoaa sovellusrajapinnat tietojen käsittelyyn. Termed API vastaa tietojen oikeellisuudesta, tallennuksesta, hauista, käyttöoikeuksista jne. Tietosisältö tallennetaan relaatiotietokantaan (esim. Postgresql). Hakujen nopeuttamiseksi tiedot ineksoidaan Lucene-indeksiin. Lucene säilyttää indeksin tiedot tiedostoissa. Taustajärjestelmällä ei itsessään ole graafista käyttöliittymää vaan se on käytettävissä ainoastaan HTTP/REST-rajapintojen kautta. Rajapintaan tunnistautumismenetelmänä on HTTP-Basic. APIa voi ajaa suoraan esimerkiksi Spring Bootin sulautetulla Tomcat-palvelimella. Seuraavassa kuvassa on esitelty API-toteutuksessa käytetyt keskeiset komponentit. Service-komponentit hoitavat merkittävimmän työn. Controller-oliot vastaavat HTTP-pyyntöjen ohjaamisesta palvelukerrokselle.

Sovelluksen kerrokset Seuraavassa on esitelty tyypillisiä sovelluksessa käytettyjä kerroksia ylhäältä alas (HTTP-pyynnöstä tietokantakyselyihin). Message converter (AbstractHttpMessageConverter<T>) Erilaisia pyyntöjen muuntajia kutsutaan automaattisesti (Spring-kehyksen toimesta) ennen kuin kutsut tulevat kontrolleri-kerroksen käsiteltäviksi. Muutajat saattavat esimerkiksi sarjallistaa JSON- tai XML-sanomat Javan domain-olioiksi. Controller (@RestController-annotaatiolla) Kontrolleri-kerroksessa käsitellään HTTP-pyynnöt ja ohjataan niiden tarvitsemat haku- ja muokkausoperaatiot palvelukerrokselle. Service (Service<K, V>) Palvelun käsite on keskeisin abstraktiotaso. Palveluiden on tarkoitus kutsua ainoastaan toisia palveluita ja kaikki muokkausoperaatiot tulisi tehdä palvelukerroksen kautta. Joissakin yhteyksissä tästä kokonaisuudesta käytetään myös komponentin nimeä. Palvelun alapuolella olevat abstraktiot on tarkoitus olla puhtaasti palvelun sisäiseen käyttöön. Palvelu voi itsessään koostua useista kerroksista (esim. validointi, autentikointi, autorisointi, lokitus jne.).

Repository (AbstractRepository<K, V>) Repositorion rajapinta on Termieditorissa sama kuin palvelun, mutta repositoriolla tässä tarkoitetaan palvelua, joka hoitaa nimenomaan olioiden tallentamisen hyödyntäen alempaa Dao-kerrosta. Jos tiedonhakuolion (dao) ajatellaan karkeasti vastaavan yhtä tietokantataulua, yhden repositorion voi ajatella vastaavan yhtä tallennettavaa kokonaisuutta, joka voi koostua useista tauluista. Dao (Dao<K, V>) Termieditorissa tällä tasolla valvotaan tietokantatauluun liittyvät käyttöoikeudet. Dao-kerroksessa voidaan toteuttaa myös esim. auditointia. Sallitut pyynnöt ohjataan alimmalle "system dao" -kerrokselle. System dao (SystemDao<K, V>) Järjestelmä-dao abstrahoi yhden tietokantataulun. Tällä tasolla voidaan toteuttaa myös välimuisteja ja lokitusta. Esimerkki Service-oliosta (NodeService) Verkon solmujen eli varsinaisen tietosisällön käsittelystä vastaa NodeService-palvelu. Palvelu koostuu useista luokista, joista tärkeimmät on kuvattu seuraavassa kaaviossa harmaalle pohjalle. Keskeinen käytetty suunnittelumalli on delegointi. Kukin kerros toteuttaa yhteisen palvelu-rajapinnan (Service<K, V>), mutta tekee vain yhden rajatun toiminnon ja ohjaa pyynnön eteenpäin.

Kooditason esimerkki Service-oliosta (UserService) Seuraavassa esimerkissä on konfiguroitu "user service" -palvelu. Kommenteilla on kuvattu kunkin kerroksen merkitys. package fi.thl.termed.service.user; import... @Configuration public class UserServiceConfiguration { // luodaan palvelu käyttäjätietojen CRUD-operaatiolle @Bean

public Service<String, User> userservice( DataSource datasource, PlatformTransactionManager transactionmanager) { // Geneerisen SystemDao<K, V> rajapinnan toteuttava userdao koostuu: // 1) sisemmästä varsinaiset tietokantakyselyt tekevästä JdbcUserDao:sta // 2) ulommasta geneerisestä SystemDao-välimuistista SystemDao<String, User> userdao = new CachedSystemDao<>( new JdbcUserDao(dataSource)); // Vastaavalla tavalla määritellään käyttäjään liittyvien roolien tallennus // tietokantaan. SystemDao<UserGraphRole, Empty> usergraphroledao = new CachedSystemDao<>( new JdbcUserGraphRoleDao(dataSource)); // Käyttöoikeuksia valvoo PermissionEvaluator. PermissionEvaluator kohdistuu objektin // avaimeen (Dao:n ensimmäinen geneerinen parametri), joka tässä on käyttäjän nimi. // Nimeä ei kuitenkaan seuraavassa oteta huomioon sillä ainoastaan pyynnön tekevän // käyttäjän rooli tarkastetaan - sen tulee olla SUPERUSER. PermissionEvaluator<String> userpermissionevaluator = (u, o, p) -> u.getapprole() == AppRole.SUPERUSER; // Myös käyttäjään liittyvät roolit autorisoidaan siten, että roolien lukuihin ja // muutoksiin vaaditaan SUPERUSER-tason käyttäjä. PermissionEvaluator<UserGraphRole> usergraphrolepermissionevaluator = (u, o, p) -> u.getapprole() == AppRole.SUPERUSER; // Seuraavassa koostetaan UserRepository edellä määritellyistä SystemDao- ja // PermissionEvaluator-toteutuksista. Service<String, User> service = // UserRepository koordinoi käyttäjäolion lukemisen, tallennuksen ja poiston // kutsumalla kahta Dao-toteutusta. User-olio tallennetaan siis kahteen tietokanta- // tauluun ja UserRepository abstrahoi tietokannan. new UserRepository( // SystemDao kääritään geneerisen AuthorizedDao-toteutuksen taakse. // AuthorizedDao tarkistaa käyttöoikudet annetun PermissionEvaluatorin avulla. // Viimeinen THROW-parametri kertoo, että käyttöoikeuksien puuttuessa heitetään // poikkeus. new AuthorizedDao<>(userDao, userpermissionevaluator, THROW), new AuthorizedDao<>(userGraphRoleDao, usergraphrolepermissionevaluator, THROW));

// lopuksi palvelu kääritään vielä transaktiot toteuttavaan geneeriseen // Service-toteutukseen. service = new TransactionalService<>(service, transactionmanager); // Valmiin em. paloista koostetun servicen toteutus kulkee kutsujan näkökulmasta // seuraavasti: // 1) avataan transaktio (TransactionalService) // 2) ohjataan kunkin olion ja "osaolion" CRUD-operaatio oikealle Dao:lle (UserRepository) // 3) autorisoidaan pyyntö (AuthorizedDao) // 4) tarkistetaan saadaankö välimuistista lukuoperaation vastaus tai tarvitseeko // välimuistia nollata muutosoperaation seurauksena (CachedSystemDao) // 5) jos ei saatu vastausta välim., suoritetaan tarvittava tietokantakysely (Jdbc*Dao), // palataan takaisin // 6) jos suoritettiin tietokantakysely, tallennetaan tuore vastaus välimuistiin // seuraavia kyselyitä varten (CachedSystemDao, vastinpari kohdalle 4) // 7) jos suoritettiin lukuoperaatio, tarkistetaan saako haetun tuloksen palauttaa // käyttäjälle (AuthorizedDao, vastinpari kohdalle 3) // 8) jos suoritettiin lukuoperaatio, koostetaan haetut osaoliot yhdeksi // (UserRepository, vastinpari kohdalle 2) // 8) suljetaan transaktio (TransactionalService, vastinpari kohdalle 1) return service;

} } Edellisessä esimerkissä varsinaista konkreettista toteutusta on luokissa: JdbcUserDao (tekee tietokantakyselyt users-tauluun) JdbcUserGraphRoleDao (tekee tietokantakyselyt user_graph_role-tauluun) PermissionEvaluator<UserGraphRole> (toteutus yhden rivin lambdana) PermissionEvaluator<String> (toteutus niin ikään yhden rivin lambdana) UserRepository (pilkkoo ja koostaa User-oliota käyttävät pyynnöt dao-kerrokselle) Loput luokat ovat geneerisiä ja datasta riippumattomia. Em. esimerkissä niillä siis hoidettiin transaktiot, käyttöoikeuksien tarkistukset sekä välimuistitukset. Toinen tyypillinen lähestymistapa on hoitaa nämä näkökulmat Javan annotaatioiden avulla. Sovelluskehys käsittelee annotaatiot (esim. @Transactional, @PreAuthorized ja @Cacheable). Motivaationa Termieditorissa käytetyssä lähestymistavassa on selkeys, ennakoitavuus ja testattavuus sekä pysytteleminen "perus" Java-koodissa. Ei tarvita monimutkaista reflektioon pohjautuvaa tyyppitarkistukset ohittavaa annotaatioiden prosessointia, suoritusjärjestys ei ole epäselvä ja kun kerroksia tarvitaan lisää (esim. lokitus, validoinnit), niitä on helppo lisätä mallin mukaisesti.