1 / 17

Objektorienteret Middleware (OOMI)

Objektorienteret Middleware (OOMI). CORBA Programming: Presentation of a simple “Hello World” CORBA client and server application. Outline. CORBA programming Code examples We will make a very small CORBA application with a Java server, Java Client & C++ client application In Java (SUN ORB)

red
Download Presentation

Objektorienteret Middleware (OOMI)

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Objektorienteret Middleware (OOMI) CORBA Programming:Presentation of a simple“Hello World”CORBA client and server application

  2. Outline • CORBA programming • Code examples • We will make a very small CORBA application with a Java server, Java Client & C++ client application • In Java (SUN ORB) • What gets generated? • What files do we need to write (client + server)? • In Orbacus C++ ORB • We make a client Only small steps in CORBA programming – much complexity

  3. Server returns“Hello World !“ User activa- tes client CORBA Java / C++ Hello World Client CORBA Java Hello World Server TCP/IP Network “Hello World” CORBA Example with file IOR Development PC Clientapp. Serverapp.

  4. Who’s doing what? • Some code will get generated by the IDL compiler • Some code we will need to implement ourselves • Starting with the IDL file

  5. IDL Interface of Hello Servant module HelloApp interface Hello{string sayHello();};

  6. Java IDLCompiler -IDLJ IDL Compiler Example Java Hello.java (Both Client & Server) contains the Java version of the IDL interface. HelloOperations.java contains the methods – here only sayHello(). All the operations in the IDL interface are placed in the operations file. _HelloStub.java is the client stub. HelloPOA.java is the skeleton class you should extend from. It implements dynamic invocation functions. HelloHelper.java (Both Client & Server) provides auxiliary functionality, notably the narrow() method required to cast CORBA object references to their proper types. HelloHolder.java Whenever the IDL type is an out or an inout parameter, the Holder class is used. Hello.idlfile Generates Input What gets generated by the IDL Compiler

  7. Extract from _HelloStub.java What are we looking at?

  8. Extract from HelloHelper.java Discuss with your neighbor 2 min. what is this? what is it used for?

  9. Extract from HelloPOA More on this later Discuss with your neighbor 2 min. what is this? what is used for?

  10. // HelloServer.java, stringified object reference version // Stefan Wagner, 2003 import org.omg.CosNaming.*; import org.omg.CosNaming.NamingContextPackage.*; import org.omg.CORBA.*; 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 { private ORB orb; public HelloServant(ORB orb) { this.orb = orb; } public String sayHello() { return "\nHello world !!\n"; } } HelloServant The server object (Part 1) Implemented manually By extending from HelloPOA we may communicate with ORB Constructor taking ORB as a parameter (from HelloPOA) The CORBA operation implemented

  11. //This is the HelloServer - the server running the HelloServant - Servant public class HelloServer { 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 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(); // get object reference from the servant org.omg.CORBA.Object ref = rootpoa.servant_to_reference(helloRef); Hello href = HelloHelper.narrow(ref); // 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 orb.run(); } catch (Exception e) { System.err.println("ERROR: " + e); e.printStackTrace(System.out); } } } HelloServant The server object (Part 2) Init ORB and register servant with ORB Implemented manually Activate rootPOA The POA produces the reference Narrow the call (CORBA type cast + IDL type check) Object reference ”stringified” and Sent to file object.ref Start the orb server process

  12. // HelloClientSOR.java, stringified object reference version import java.io.*; import org.omg.CORBA.*; import HelloApp.HelloHelper; import HelloApp.*; public class HelloClientSOR { public static void main(String args[]) { try { // create and initialize the ORB org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args, null); // 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(); org.omg.CORBA.Object obj = orb.string_to_object(ref) ; Hello helloRef = HelloHelper.narrow(obj); // call the Hello server object and print results String Hello = helloRef.sayHello(); System.out.println(Hello); } catch (Exception e) { System.out.println("ERROR : " + e) ; e.printStackTrace(System.out); } } } HelloClientSOR The Client program Implemented manually Init ORB Object reference Read from file Narrow the call (CORBA type cast + IDL type check) Call via Proxy Discuss with your neighbor 2 min. what happens after sayHello()

  13. What is this object.ref file? IOR:000000000000001749444c3a48656c6c6f4170702f48656c6c6f3a312e30000000000001000000000000006c000102000000000e3139322e3136382e312e3130300011b600000021afabcb0000000020a80a250300000001000000000000000000000004000000000a0000000000000100000001000000200000000000010001000000020501000100010020000101090000000100010100 • 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

  14. Parsed IOR _IIOP_ParseCDR: byte order BigEndian, repository id <IDL:HelloApp/Hello:1.0>, 1 profile _IIOP_ParseCDR: profile 1 is 138 bytes, tag 0 (INTERNET), BigEndian byte order (iiop.c:parse_IIOP_Profile): bo=BigEndian, version=1.2, hostname=172.20.186.138, port=1658, object_key=<....... ..s.................RootPOA..............> (iiop.c:parse_IIOP_Profile): encoded object key is <%AF%AB%CB%00%00%00%00%20%E8%DCs%BE%00%00%00%01%00%00%00%00%00%00%00%01%00%00%00%08RootPOA%00%00%00%00%08%00%00%00%01%00%00%00%00%14> (iiop.c:parse_IIOP_Profile): non-native cinfo is <iiop_1_2_1_%25AF%25AB%25CB%2500%2500%2500%2500%2520%25E8%25DCs%25BE%2500%2500%2500%2501%2500%2500%2500%2500%2500%2500%2500%2501%2500%2500%2500%2508RootPOA%2500%2500%2500%2500%2508%2500%2500%2500%2501%2500%2500%2500%2500%2514@tcp_172.20.186.138_1658> object key is <#AF#AB#CB#00#00#00#00 #E8#DCs#BE#00#00#00#01#00#00#00#00#00#00#00#01#00#00#00#08RootPOA#00#00#00#00#08#00#00#00#01#00#00#00#00#14>; no trustworthy most-specific-type info; unrecognized ORB type; reachable with IIOP 1.2 at host "172.20.186.138", port 1658 For the translation of IORs http://www2.parc.com/istl/projects/ILU/parseIOR/

  15. #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 { orb = CORBA::ORB_init(argc, argv); status = run(orb); } catch (const CORBA::Exception&) { status = EXIT_FAILURE; } if(!CORBA::is_nil(orb)) { try { orb -> destroy(); } catch(const CORBA::Exception&) { status = EXIT_FAILURE; } } return status; } HelloCorba C++ Client Part 1 Implemented manually Init ORB Call run method (see next slide) Destroy ORB

  16. int run(CORBA::ORB_ptr orb) { 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 hello = HelloApp::Hello::_narrow(obj); cout << hello->sayHello() << endl; return 0; } HelloCorba C++ Client Part 2 Object reference Read from file HelloApp::Hello_var smartpointer type Generated by IDL compiler + Hello Narrow the call (CORBA type cast) to the Hello_var smartpointer (helper + memory management) Call method via Proxy and print result Read more on Smartpointer types in OOMI-1 chapter 4

  17. Læringsmål Alignment I kan nu definere og beskrive Grundlæggende CORBA kodearkitektur og kode Når kurset er færdigt forventes den studerende at kunne: • Definere, beskrive og sammenligneforskellige typer af objektorienterede middleware frameworks til apparater og computere, med primær fokus på CORBA og sekundært ICE teknologierne, herunder fordele og ulemper forbundet med de forskellige teknologier • Definere og beskrive principper omkring transparens og heterogenitet i relation til middlewareteknologier • Definere og beskrive gængse teorier, metoder og retningslinier indenfor det objektorienterede middleware paradigme og anvende disse til at designe effektive distribuerede systemer • Designe og konstruere et distribueret system der gør brug af CORBA og ICE teknologierne med tilhørende værktøjssupport Kode til stubbe, proxy, IDL, Retningslinier, transp., hetero. IDL Compiler, referencer Grundlæggende forståelse For hvad der skal til af Java og C++ Kode til et CORBA system MANGLER: praktisk erfaring: kommer med øvelser og opgave

More Related