ORB CORBA 101. Palvelinolio. Asiakasolio. Yleistä. Toiminta ja arkkitehtuuri. CORBA 101 Graafisten käyttöliittymien ohjelmointi 2000

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

Metodien tekeminen Javalla

Olio-ohjelmointi Javalla

Rajapinta (interface)

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

Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen

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

Mikä yhteyssuhde on?

Java-kielen perusteet

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

16. Javan omat luokat 16.1

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

7. Näytölle tulostaminen 7.1

Tietokannat II -kurssin harjoitustyö

812341A Olio-ohjelmointi Peruskäsitteet jatkoa

17. Javan omat luokat 17.1

20. Javan omat luokat 20.1

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

7. Oliot ja viitteet 7.1

Rinnakkaisohjelmointi kurssi. Opintopiiri työskentelyn raportti

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

1. Omat operaatiot 1.1

15. Ohjelmoinnin tekniikkaa 15.1

JavaRMI 1 JAVA RMI. Rinnakkaisohjelmoinnin projekti 1 osa C Tekijät: Taru Itäpelto-Hu Jaakko Nissi Mikko Ikävalko

Vertailulauseet. Ehtolausekkeet. Vertailulauseet. Vertailulauseet. if-lauseke. if-lauseke. Javan perusteet 2004

Javan perusteita. Janne Käki

7/20: Paketti kasassa ensimmäistä kertaa

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

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

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

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

Ohjelmointi 2 / 2010 Välikoe / 26.3

19. Olio-ohjelmointia Javalla 19.1

Listarakenne (ArrayList-luokka)

15. Ohjelmoinnin tekniikkaa 15.1

17. Javan omat luokat 17.1

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

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

Taulukot. Jukka Harju, Jukka Juslin

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

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

14. Poikkeukset 14.1

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

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Taulukot & Periytyminen

Integrointi. Ohjelmistotekniikka kevät 2003

Tietueet. Tietueiden määrittely

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

Sisällys. 19. Olio-ohjelmointia Javalla. Yleistä. Olioiden esittely ja alustus

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

14. Poikkeukset 14.1

Sisällys. 11. Rajapinnat. Johdanto. Johdanto

Kertaus on opintojen äiti: OSI malli. Oliokeskeiset välikerrokset. Transmission Control Protocol (TCP) Kuljetus eli transport kerros

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

Ohjelmoinnin jatkokurssi, kurssikoe

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

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

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Tietorakenneluokkia 2: HashMap, TreeMap

9. Periytyminen Javassa 9.1

Java-API, rajapinnat, poikkeukset, UML,...

Java-kielen perusteet

1. Olio-ohjelmointi 1.1

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

Attribuutit. Copyright IT Press Tämän e-kirjan kopiointi, tulostaminen ja jakeleminen eteenpäin luvatta on kielletty.

Luokat ja oliot. Ville Sundberg

HOJ RPC = Remote Procedure Call (ja Common Object Request Broker Architecture)

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

Metodit Arvotyyppi. Metodit Arvotyyppi. Metodit Parametrit. Metodit Parametrit. Metodit Kuormittaminen. Metodit Kuormittaminen. Javan perusteet

YHTEYSSUHDE (assosiation)

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

2. Olio-ohjelmoinista lyhyesti 2.1

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

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

Java-kielen perusteita

Metodien tekeminen Javalla

1 Tehtävän kuvaus ja analysointi

Kääreluokat (oppikirjan luku 9.4) (Wrapper-classes)

Oliot viestivät metodeja kutsuen

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

13 Operaattoreiden ylimäärittelyjä

Sisältö. Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen. 6.2

9. Periytyminen Javassa 9.1

Informaatioteknologian laitos Olio-ohjelmoinnin perusteet / Salo

Verkko-ohjemointia. TCP vs. UDP Socket, ServerSocket Datagrammit RMI

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

Java-kielen perusteita

TIETORAKENTEET JA ALGORITMIT

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

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

Ohjelmoinnin peruskurssien laaja oppimäärä

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

Java kahdessa tunnissa. Jyry Suvilehto

18. Abstraktit tietotyypit 18.1

public static void main (String [] args)

Olio-ohjelmointi Virhetilanteiden käsittely

A) on käytännöllinen ohjelmointitekniikka. = laajennetaan aikaisemmin tehtyjä luokkia (uudelleenkäytettävyys)

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

Luokkamalli LUOKKAKAAVIO. Tämän osan sisältö. Luokkamalli. Luokka ja olio. Luokkakaavio (class diagram)

12. Monimuotoisuus 12.1

Transkriptio:

GKO 16.11.2000 MIT Jyväskylän yliopisto CORBA 101 Jonne Itkonen jonne.itkonen@sonera.com Software Architectures Laboratory Mobile & Media Research Sonera (2004-8-6: Ylläoleva osoite ei enää toimi, enkä ole enää Soneran palveluksessa, vaan Jyväskylän yliopiston, joten osoite on ji@mit.jyu.fi. Lisäsin myös omniorbin linkin ja korjasin JacORBin linkin. Inprisekin on nykyään taas Borland.) Yleistä CORBA, eli Common Object Request Broker Architecture on Object Management Groupin määrittelemä kuvaus siitä, kuinka hajautettuja olio-arkkitehtuureja tulisi toteuttaa. CORBA määrittelee yhdyskäytävän olioiden väliselle viestinnälle. Tämän yhdyskäytävän tarkoituksena on välittää metodikutsut sovellukselta oliototeutukselle, tai tarvittaessa toisinpäin (sovellus voi tietysti olla, ja usein onkin, toinen olio). Yhdyskäytävää kutsutaan Object Request Brokeriksi (ORB). CORBA määrittelee myös joukon peruspalveluita, jotka tulisi aina olla saatavilla määritykset täyttävässä ORB-toteutuksessa. Näitä peruspalveluita ovat esimerkiksi nimipalvelu, viestinvälityspalvelu, olioidenvälityspalvelu ja aikapalvelu. Toiminta ja arkkitehtuuri CORBAn oliot ovat yhteydessä toisiinsa ORBin välityksellä. Asiakasolion kutsuessa palvelinolion operaatiota muunnetaan operaatiokutsu IOP:n (Inter-ORB Protocol) mukaiseksi viestiksi, jonka ORB välittää palvelinoliolle. Palvelinolion ORB taas muuntaa viestin operaatiokutsuksi palvelinoliolle. Operaatiokutsun muuntaminen IOP-viestiksi tapahtuu niinkutsutussa stubissa, joka on palvelinolion rajapinnan IDL-kuvauksesta generoitu olio tai funktiokirjasto asiakasolion ja ORBin välillä. Vastaava muunnos IOP-viestistä operaatiokutsuksi palvelinolion ja ORBin välillä tapahtuu niinikään IDLkuvauksesta generoidussa skeleton oliossa/funktiokirjastossa. Kuva selventänee asiaa: CORBAssa olioiden rajapinnat määritellään IDL:n (Interface Definition Language) avulla. Luodut määrittelyt käännetään käytettävän toteutuskielen ohjelmiksi erillisellä kääntäjäohjelmalla. OMG on Asiakasolio Palvelinolio IDL IDL Stub Skeleton ORB määritellyt, millaisia rakenteita millekin kielelle syntyy IDL:n lauseista. OMG:n hyväksymiä kielikuvauksia löytyy Adalle, C/C++:lle, COBOLille, Lispille, Javalle ja Smalltalkille, sekä lähiaikoina virallistuva kuvaus Pythonille. - 1 -

Termiviidakko ORB Object Request Broker CORBA Common Object Request Broker Architecture IIOP Internet Inter-ORB Protocol IDL Interface Definition Language IOR Interoperable Object Reference POA Portable Object Adaptor (BOA Bad Object Adaptor formerly known as Basic Object Adaptor) Stub "Rajapinta" asiakasohjelman ja ORBin välillä, joka näkyy asiakkaalle olion rajapintana muuttaen operaatiokutsut ORBin välittämään muotoon. Skeleton "Rajapinta" olion toteutuksen ja ORBin välillä, joka muuntaa ORBilta tulevat operaatiokutsut olion toteutuksen metodien kutsuiksi. IDL syntaksi module nimi { ; Jokainen rajapinta (interface) kuuluu johonkin moduuliin. Tavallaan moduulia voidaan pitää nimiavaruutena, joka sisältää rajapintojen lisäksi tyyppi- ja poikkeutusmäärittelyjä. Tiedostossa esiteltyyn moduuliin voi myöhemmin lisätä rajapintoja jossakin toisessa tiedostossa. interface nimi { ; Tämä on rajapinnan yleisin esittelytapa. Aaltosulkeiden väliin tulee rajapinnan sisältämät operaatiot ja attribuutit. interface nimi : s 1, s 2, { ; Jos rajapinta perii toisia rajapintoja, käytetään tätä muotoa. interface nimi; Ennaltaesittely tehdään näin. attribute tyyppi nimi; Tavallisen attribuutin esittely. Attribuutille generoidaan aksessointimetodit/-funktiot kielimäärittelyn mukaan. readonly attribute tyyppi nimi; Vain luettavissa oleva attribuutti esitellään näin. tyyppi1 op_nimi(in out inout tyyppi2 nimi) raises (poikkeus1, ); Operaatiot esitellään näin, kuten C/C++:ssa. Jos operaatio ei palauta arvoa, annetaan tyyppi 1:lle arvoiksi void. onway tyyppi1 op_nimi( ) raises ( ); Operaation parametri voi myös olla yksisuuntainen, jolloin sen suoritusta ei jäädä odottamaan (asynchronous). typedef tyyppi uusityyppi; Tyypinmäärittely. exception nimi { ; Poikeutuksen esittely. Aaltosulkeissa voi tarvittaessa esitellä attribuutteja. Tavallisimmat tietotyypit ovat: short, (long) long, float, (long) double, fixed myös unsigned versiot, esimerkiksi unsigned long long char, wchar, string, wstring boolean, octet, any enum, union, struct operaation paluuarvon tyyppinä myös void taulukot tyypinmäärittelyllä, esimerkiksi typedef float Vektori[3]; sequence<tyyppi, koko> nimi; kielestä riippuen luodulle uudelle tietotyypille luodaan operaatiot sen käsittelyyn Vakiot merkitään avainsanalla const, esimerkiksi const short foo=175; Vakioiden sääntöjä ei käsitellä tarkemmin. - 2 -

Lisäksi käytettävissä on esikääntäjäkomentoja #define ja #include #pragma (toteutuskohtaisia?) Pari mielenkiintoista, mutta tämän esittelyn ulkopuolelle jäävää tyyppiä: valuetype Oliot ja muut kuin perustietotyypit välitetään CORBAssa yleensä viitteinä (object reference). Valuetypen avulla voidaan kuitenkin määritellä ja välittää olioita arvosemantiikan mukaan. native Olio toteutetaan ORBille natiivina. Portable Object Adapter (POA) Kaikkia olioita ei voi aina pitää ajossa palvelimessa. Tarvitaan järjestelmä, joka osaa automaattisesti käynnistää olion tarvittaessa. Lisäksi kaikki oliototeutukset eivät vaadi kaikkia mahdollisia palveluita alustaltaan, tai nimenomaan tarvitsevat jotain ei-oletuspalvelua. POA toimii näissä molemmissa tapauksissa välittäjänä oliototeutuksen ja sen ajoalustan välillä. Oliototeutuksesta ( serveripää ) Oliototeutuksen tärkein tehtävä on yllätys, yllätys toteuttaa IDL:llä määritelty olion rajapinta. Jos olion tila halutaan säilyttää käyttökertojen välillä (persistenttiys), saatetaan joissain tapauksissa tätä varten joutua ohjelmoimaan toimintoja olioon. Yksinkertainen rakenne tälle ohjelmalle on seuraava: 1. Luo oliototeutus. 2. Jos tarvis, lue olion tila säilöstä. 3. Liitä se ORBiin; POA tai suoraan. 4. Rekisteröi olio nimipalveluun, tallenna IOR muiden saataville tai saata olio muuten muiden saataville esimerkiksi rekisteröimällä se Trader-palvelulle. 5. Siirry odottamaan operaatiokutsuja. 6. Kun/jos oliototeutus tuhotaan, tarpeen vaatiessa tallenna olion tila säilöön. Tapana on luoda erillinen ohjelma, joka luo oliototeutuksen ja liittää sen ORBiin. Asiakasohjelma Asiakasohejelmalle jää tehtäväksi löytää viite haluamaansa olioon. Tämä tapahtuu joko muuttamalla merkkijonona oleva IOR olioviitteksi, etsimällä olion (tunnetulla) nimellä nimipalvelusta, tai olion ominaisuuksien avulla Trader-palvelusta. Mikä tahansa muukin keino on sallittu, kunhan viite vain jostain saadaan. Saatu viite joudutaan yleensä muuntamaan tarvittua olioluokkaa vastaavan tyyppiseksi. Olion IDLmäärittelystä on yleensä generoitunut apuluokka esimerkiksi luokalle Kissa sen nimi voisi olla KissaHelper josta löytyy operaation narrow() tyyppimuunnoksen suorittamiseksi. Tämän jälkeen olio käyttäytyy kuin minkä tahansa tavallinen olio. - 3 -

Esimerkkiohjelma Esimerkkiohjelmana on toteutettu yksinkertaistettu version kaikille tutusta (?) autolaskurisovelluksesta. Kääntäminen Inprisen Visibroker for Java ja JDK 1.2:lla: 1. Generoidaan java-rajapinnat ja apuluokat IDL:stä idl2java -idl_strict -no_comments -no_bind -strict Counter.idl 2. Käännetään oliototeutus vbjc Server.java 3. Käännetään asiakasohjelma vbjc Client.java 4. Käynnistetään oliototeutus vbj Server 5. Käynnistetään asiakasohjelma vbj Client Counter.idl: module gko { interface Counter { readonly attribute long value; readonly attribute string name; void add(); void reset(); ; ; - 4 -

Client.java: import java.io.*; public class Client { private static void printvalue(gko.counter counter) { System.out.println( "Counter "+counter.name() +" has the value "+counter.value()+"."); public static void main(string[] args) { try { org.omg.corba.orb orb=org.omg.corba.orb.init(args, null); LineNumberReader input= new LineNumberReader( new FileReader("carcounter.ior")); org.omg.corba.object obj= orb.string_to_object(input.readline()); gko.counter counter=gko.counterhelper.narrow(obj); printvalue(counter); System.out.println("Add ten cars..."); for (int i=0; i<10; ++i) counter.add(); printvalue(counter); System.out.println("Reset counter..."); counter.reset(); printvalue(counter); System.out.println( "Add five cars (the paranoid check ;)..."); for (int i=0; i<5; ++i) counter.add(); printvalue(counter); catch (java.io.ioexception ioe) { ioe.printstacktrace(); - 5 -

CounterImpl.java: import gko.*; public class CounterImpl extends CounterPOA { public int value() { System.out.println(name+": value is "+value); return value; public String name() { return name; public void add() { value++; System.out.println(name+": new value is "+value); public void reset() { value=0; System.out.println(name+": value reset to zero"); public CounterImpl(String name) { this(name, 0); public CounterImpl(String name, int value) { this.name=name; this.value=value; System.out.println( "Created new counter "+name +" with value "+value+"."); private int value; private String name; - 6 -

Server.java: import java.io.*; import org.omg.portableserver.*; import gko.*; public class Server { public static void main(string[] args) { try { System.out.println("Obtain ORB"); org.omg.corba.orb orb=org.omg.corba.orb.init(args, null); System.out.println("Resolve RootPOA"); POA rootpoa=poahelper.narrow( orb.resolve_initial_references("rootpoa")); System.out.println("Create own POA"); org.omg.corba.policy[] policies={ rootpoa.create_lifespan_policy( LifespanPolicyValue.PERSISTENT) ; POA mypoa=rootpoa.create_poa( "CounterPOA", rootpoa.the_poamanager(), policies); System.out.println("Instantiate object"); CounterImpl car_counter=new CounterImpl("Cars"); byte[] counter_id="carcounter".getbytes(); mypoa.activate_object_with_id(counter_id, car_counter); rootpoa.the_poamanager().activate(); System.out.println("Get object reference"); org.omg.corba.object obj= mypoa.servant_to_reference(car_counter); System.out.println("Write ior:"); String ior=orb.object_to_string(obj); FileWriter output=new FileWriter("carcounter.ior"); output.write(ior); output.close(); System.out.println(ior); System.out.println("Run..."); orb.run(); catch (Exception e) { e.printstacktrace(); - 7 -

Viitteitä OMG http://www.omg.org/ CORBA http://www.omg.org/technology/documents/formal/index.htm Kaikki mahdollinen CORBA:sta tiiviissä paketissa. Kaupallisia ORB-toteutuksia Inprise http://www.inprise.com/ Visibroker http://www.inprise.com/visibroker/ Muitakin löytyy, tuossa yksi käytössä hyväksi havaittu. Vapaita ORB-toteutuksia MICO http://www.mico.org/ JacORB http://jacorb.inf.fu-berlin.de/ omniorb http://omniorb.sourceforge.net/ Kuten kaupallisia, näitäkin löytyy enemmän kuin tarpeeksi. Yllä pari hyväksi havaittua, muita ovat esimerkiksi ACE+TAO, Orbit, FnORB. Katso myös GNOME http://www.gnome.org/ Gnome-projekti, tuttu Linuxin käyttäjille, käyttää CORBAa. Linuxille on myös useita muita ORBtoteutuksia. - 8 -