Objektorienteret Netværkskommunikation CORBA Introduction Slide 1 Outline • CORBA Introduction & Background • Architecture • Session & Presentation layer • GIOP / IIOP / CDR • • • • • CORBA Interface Definition Language – IDL Language mappings CORBA development steps Code Examples in Java / C++ Alignment Slide 2 Who is the OMG? • OMG: Object Management Group • http://www.omg.org • Non-profit organization in the US • Founded April 1989 • More than 800 members • Dedicated to creating and popularizing object-oriented industry standards for application integration, e.g. • CORBA 1.0 (1995) –> CORBA 3.0.3 (2006) • UML 1.1 nov. 97. -> 2.1 (2006) Slide 3 Goal of CORBA • CORBA: Common Object Request Broker Architecture • Support distributed and heterogeneous object request in a way transparent to users and application programmers • Facilitate the integration of new components with legacy components • Open standard that can be used free of charge • Based on wide industry consensus • But not much Microsoft support • Problem with CORBA • Considered too complex by many Slide 4 The Specifications • CORBA is a collection of specifications • http://www.omg.org/technology/documents/corba_spec_catal og.htm • Common Object Request Broker Architecture (CORBA/IIOP) (3.0.3) • CORBA Component Model (CCM) (3.0) • Light Weight CCM • CORBA/e (replaces Minimum CORBA) • Minimum CORBA (1.0) • Real-Time CORBA (Dynamic Scheduling) (2.0) • Real-Time CORBA (Static Scheduling) (1.1) • Others Slide 5 Families of specifications: • • • • • • CORBAservices Specifications CORBAfacilities Specifications OMG Domain Specifications IDL / Language Mapping Specifications Many others Realted to UML • UML Profile for CORBA (1.0) Slide 6 Object Management Architecture (OMA) Application Objects Domain Interfaces CORBA Facilities Object Request Broker CORBA Services (mandatory) Slide 7 CORBA Architecture1 • • • • • • • Many different vendors and ORB types Many of which do not interoperate Must check specification OrbBacus from IONA produces both C++ and Java Sun J2SE SDK has only Java-based ORB C++ ORB from IONA will work with SUN ORB as specified Many others • MicoORB, Middcor, TAO, openORB, VisiBroker Slide 8 CORBA Architecture 2 Object Implementation Client Dynamic Invocation Client Stubs ORB Interface Implementation Skeletons Object Adapter ORB Core One standardised interface One interface per object operation One interface per object adapter ORB-dependent interface Slide 9 Interoperability Protocols Applications Environment Specific .. CORBA 2.0 ESIOP GIOP IIOP DOETalk ........ DCE-CIOP ........ Mandatory: provides "out of the box" interoperability IIOP: Internet Inter-ORB Protocol is the primary CORBA transport protocol Slide 10 General Inter-ORB Protocol • GIOP: Handles the session & presentation layer • Defines seven message primitives: • Request, Reply, Locate Request, Locate Reply, Cancel request, Close Connection, Message Error • Binary formatted • More simple than JRMP for Java RMI • Internet Inter-ORB Protocol (IIOP) • • • • Maps GIOP to TCP/IP Provides operations to open and close TCP/IP connections Is required from ORBs for CORBA compliance But intra vendor ORB com is not restricted to this More on the IIOP in TIOOMI if wanted Slide 11 Common Data Representation (CDR) • Defined as part of GIOP • Presentation layer implementation to support heterogeneity • Mapping of IDL data types to transport byte stream • Encodings of • primitive types • constructed types • interoperable object references Slide 12 Recap - motivation for an IDL • IDL: Interface Definition Language • Components of distributed systems are written in different programming languages • Programming languages may or may not have their own object model • Object models largely vary • Differences need to be overcome in order to facilitate integration Slide 13 Heterogeneous OO Network “Object Wrapping of non OO application” CORBA Cobol Database Server CORBA Java Client App.1 CORBA C# Client App.2 TCP/IP Network CORBA C++ Client App.3 DB Different ORB’s from different vendors, on different operating systems – and written in different languages = Heterogenity Slide 14 CORBA IDL & Mappings PL1 PL2 PL1 PL2 Avoid multiple mappings PL6 PL3 PL5 PL6 PL4 IDL PL5 Slide 15 PL3 PL4 CORBA Programming Language Bindings Smalltalk C++ Ada-95 IDL Common Object Model Java C .NET Cobol Janeva / Middcor (C#) / .NET REMoting Slide 16 Interface Definition Language • Akronym: IDL • Language for expressing all concepts of the middleware’s object model • Should be • programming-language independent • not computationally complete • Bindings to different programming languages are needed • language bindings are specified by CORBA Slide 17 Example UML to IDL mapping Organization #name:string uses Club -noOfMembers:int 1 -location:Address +transfer(p:Player) 1..* works for Trainer -name:string +train() 1..* 1..* Team -name:string +bookGoalies() Slide 18 Player plays in -name:string 1 11..16 -Number:int +book() CORBA Object Model: Types typedef struct Address { string street; string postcode; Atomic Constructed string city; types types }; typedef sequence<Address> AddressList; interface Team { ... }; Object type Slide 19 CORBA Object Model: Modules Soccer::Address module Soccer { typedef struct Address { string street; string postcode; string city; Modules = namespaces }; People::Address }; module People { typedef struct Address { string flat_number; string street; string postcode; string city; string country; }; Slide 20 }; CORBA Object Model: Attributes interface Player; typedef sequence<Player> PlayerList; interface Trainer; typedef sequence<Trainer> TrainerList; interface Team { Clients cannot readonly attribute string name; change value attribute TrainerList coached_by; attribute Club belongs_to; changeable attribute PlayerList players; ... }; Attribute type Slide 21 Attribute name CORBA Object Model: Operations Parameter kind Parameter list Return types interface Team { ... void bookGoalies(in Date d); string print(); }; Parameter type Parameter name Operation name used in requests Slide 22 CORBA Object Model: Exceptions • Generic Exceptions (e.g. network down, invalid object reference, out of memory) • Type-specific Exceptions Exception name Exception data exception PlayerBooked{sequence<Date> free;}; interface Team { void bookGoalies(in Date d) raises(PlayerBooked); }; Operations declare exceptions they raise Slide 23 CORBA Object Model: Subtypes Implicit supertype: Object Inherited by Club interface Organization { readonly attribute string name; Supertype }; interface Club : Organization { exception NotInClub{}; readonly attribute short noOfMembers; readonly attribute Address location; attribute TeamList teams; attribute TrainerList trainers; void transfer(in Player p) raises NotInClub; }; This has only been a minimal presentation of the IDL Slide 24 Legal Values in CORBA (Types) Slide 25 Development Steps – CORBA vs RMI & SOAP CORBA AXIS SOAP Design J2SE JDK Java2WSDL Start with Server Interface Coding: JAVA Server Stub Generation Interface Definition CORBA: IDL SOAP: WSDL RMI: JAVA interface WSDL2JAVA CORBA: IDL Client Stub Generation RMI: rmic C++, Java … Server Coding Server Registration Client Coding ORB rmiregistry Slide 26 RMI: JAVA C++, Java … CORBA Client and Server Implementation Team.idl Client.cc Server.cc IDL-Compiler Teamcl.hh Teamsv.hh Teamcl.cc C++ Compiler, Linker Client Teamsv.cc C++ Compiler, Linker included in generates reads Server Next we will look into a simple CORBA Slide 27 programming example Who’s doing what? • Some code will get generated by the IDL compiler • Some code we will need to implement ourselves • Staring with the IDL file Slide 28 IDL Interface of Hello Servant module HelloApp interface Hello { string sayHello(); }; Slide 29 IDL Compiler Example Java Hello.java (Both Client & Server) contains the Java version of the IDL interface. HelloOperations.java Hello.idl file Generates contains the methods – here only sayHello(). All the operations in the IDL interface are placed in the operations file. _HelloStub.java Input Java IDL Compiler IDLJ is the client stub. HelloPOA.java is the skeleton class you should extend from. It implements dynamic invocation functions. HelloHelper.java (Both Client & Server) What gets generated provides auxiliary functionality, notably the narrow() method required to cast CORBA object references to their proper types. by the IDL Compiler HelloHolder.java Whenever the IDL type is an out or an inout parameter, the Holder class is used. Slide 30 Extract from _HelloStub.java What are we looking at? Slide 31 Extract from HelloHelper.java Slide 32 Extract from HelloPOA Slide 33 // HelloServer.java, stringified object reference version // Stefan Wagner, 2003 import org.omg.CosNaming.*; import org.omg.CosNaming.NamingContextPackage.*; import org.omg.CORBA.*; HelloServant The server object (Part 1) import org.omg.PortableServer.*; import org.omg.PortableServer.POA; import HelloApp.*; //This is the servant - implementing the methods from the IDL class HelloServant extends HelloPOA By extending from HelloPOA we may communicate with ORB { private ORB orb; public HelloServant(ORB orb) { this.orb = orb; Constructor taking ORB as a parameter (from HelloPOA) } public String sayHello() The CORBA operation implemented { return "\nHello world !!\n"; } Implemented manually } Slide 34 //This is the HelloServer - the server running the HelloServant - Servant public class HelloServer { HelloServant The server object (Part 2) public static void main(String args[]) { try{ // create and initialize the ORB org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args, null); // create servant and register it with the ORB Init ORB and register servant with ORB HelloServant helloRef = new HelloServant(orb); // get reference to rootpoa and activate the POAManager POA rootpoa = POAHelper.narrow(orb.resolve_initial_references("RootPOA")); rootpoa.the_POAManager().activate(); Activate rootPOA // get object reference from the servant org.omg.CORBA.Object ref = rootpoa.servant_to_reference(helloRef); Hello href = HelloHelper.narrow(ref); The POA produces the reference Narrow the call (CORBA type cast + IDL type check) // stringify the helloRef and dump it in a file String oir = orb.object_to_string(href); java.io.PrintWriter out = new java.io.PrintWriter(new java.io.FileOutputStream("object.ref")); out.println(oir); out.close(); // wait for invocations from clients Start the orb server process orb.run(); } catch (Exception e) { System.err.println("ERROR: " + e); e.printStackTrace(System.out); } } } Slide 35 Object reference ”stringified” and Sent to file object.ref // HelloClientSOR.java, stringified object reference version import java.io.*; import org.omg.CORBA.*; import HelloApp.HelloHelper; import HelloApp.*; public class HelloClientSOR HelloClientSOR The Client program { public static void main(String args[]) { try { // create and initialize the ORB org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args, null); Init ORB // Get the stringified object reference and destringify it. java.io.BufferedReader in = new java.io.BufferedReader(new java.io.FileReader("object.ref")); String ref = in.readLine(); Object reference Read from file org.omg.CORBA.Object obj = orb.string_to_object(ref) ; Hello helloRef = HelloHelper.narrow(obj); Narrow the call (CORBA type cast + IDL type check) // call the Hello server object and print results String Hello = helloRef.sayHello(); System.out.println(Hello); Call via Proxy } catch (Exception e) { System.out.println("ERROR : " + e) ; e.printStackTrace(System.out); } } } Slide 36 Implemented manually What is this object.ref file? • • • • • • IOR: Interoperable Object Reference • Includes info on: Repository ID (standard), Endpoint Info (standard) - including IP and port number, Object Key (proprietary) Can be written into a file Not really nice with a file-based reference – or what? May employ a naming service instead • This we shall look at later File-based may be necessary due to firewall problems Possible to use a HTTP or FTP server for distributing the references Slide 37 IOR:000000000000001749444c3 a48656c6c6f4170702f48656c6c6 f3a312e30000000000001000000 000000006c000102000000000e 3139322e3136382e312e313030 0011b600000021afabcb0000000 020a80a2503000000010000000 00000000000000004000000000 a0000000000000100000001000 00020000000000001000100000 00205010001000100200001010 90000000100010100 #include <OB/CORBA.h> #include <Hello.h> #include <fstream.h> int run(CORBA::ORB_ptr); int main(int argc, char* argv[]) { int status = EXIT_SUCCESS; CORBA::ORB_var orb; try { Init ORB orb = CORBA::ORB_init(argc, argv); HelloCorba C++ Client Part 1 Call run method (see next slide) status = run(orb); } catch (const CORBA::Exception&) { status = EXIT_FAILURE; } if(!CORBA::is_nil(orb)) { try { Destroy ORB orb -> destroy(); } catch(const CORBA::Exception&) { status = EXIT_FAILURE; } } return status; } Slide 38 Implemented manually … int run(CORBA::ORB_ptr orb) { HelloCorba C++ Client Part 2 const char* refFile = "object.ref"; ifstream in(refFile); char s[2048]; in >> s; CORBA::Object_var obj = orb -> string_to_object(s); HelloApp::Hello_var smartpointer type Generated by IDL compiler + Hello HelloApp::Hello_var hello = HelloApp::Hello::_narrow(obj); cout << hello->sayHello() << endl; Object reference Read from file Narrow the call (CORBA type cast) to the Hello_var smartpointer (helper + memory management) Call method via Proxy and print result return 0; } Slide 39 Alignment med læringsmål Når kurset er færdigt forventes den studerende at kunne: • redegøre for de grundlæggende principper og teknikker omkring interproceskommunikation over såvel lokalnetværk som Internettet • redegøre for teknikker for distribuerede objektorienterede løsninger, herunder serialisering, marshalling, stub/skeleton, proxy, brug af Hvornår vælge hvilken teknolog, forskellige Interface Definition Language sprog som udviklingskontrakt der skal vælges • redegøre for principperne omkring transparens og heterogenitet (platforms og programmeringssprogs uafhængighed) • redegøre for anvendelsen af Java RMI, XML/SOAP (Webservices), herunder forskelle/ligheder, fordele/ulemper teknologierne imellem. Samt på overordnet niveau have kendskab til forskelle og ligheder med CORBA og .NET Remoting teknologierne • anvende socket programmering til at lave et mindre distribueret system baseret på objektorienterede principper • anvende objektorienterede teknikker og arkitekturer til at designe og Forstå at CORBA er binært, bruger programmere netværksforbindelser ved brug af middleware, og bevise dette ved at konstruere og dokumentere to distribuerede systemer der IDL, IIOP, er heterogent har en ”pæn” objekt gør brug af ovenstående teknologier struktur. Også bruger stubs. Kunne genkende på koden at det er CORBA. Men ikke forstå koden i detaljer Slide 40