Post on 03-Jan-2016
CORBA/IDL
• Common Object Resource Broker Architecture (CORBA)
• Interface Definition Language (IDL)
• Object Management Group (OMG) (http://www.omg.org) Specification
• Java IDL (jdk1.2) use CORBA objects with Java Programming Language
Introduction• Technology for Distributed Objects
• Similar in function to Java RMI
• Not Java-centric
• Any language with IDL specification
• IDL is a language-neutral interface definition language
• Object Requst Broker (ORB) enables low-level communication between CORBA Objects
CORBA Architecture
• Client and Server Relationships common to CORBA and RMI
• Server provides remote interface
• Client calls remote interface
• Object level interaction rather than application level interaction (sockets)
• Objects can fulfill both roles
Client Side
• Client has reference to remote object
• Object reference has a stub method
• Stand-in for remote method
• Stub wired into ORB
• Call on stub invokes ORB’s low-level communication routines
• ORB forwards invocation to server
Server Side
• ORB on Server Side uses Skeleton Code to translate remote invocation into call on the local object
• Skeleton transforms results or errors and returns to ORB for delivery to client
• ORB-ORB communication with IIOP (Internet Inter-ORB Protocol)
ORB
• Different Vendors
• IIOP based on TCP/IP by OMG
• ORB Services– Look up (JDK1.2)– Object Persistence– Transactions– Messaging
Java IDL Development
• Define interface to Remote Object with IDL
• idltojava compiler generates stub and skeleton source, and code to interface with ORB
• IDL interface can be implemented in any CORBA compliant language (C, C++, Smalltalk, COBOL, Ada)
• Compile remote interface (idltojava)
• Implement the server. It should start ORB and wait on invocations from clients, as well as implement remote methods.
• Implement client. Start ORB, look up server, obtain remote reference, and call remote method
• Start applications.
Example• Hello World has single remote method that
returns a string to be displayed.
• Client invokes sayHello on Hello server
• ORB transfers invocation to servant object registered for interface
• Servant’s sayHello runs, returns String• ORB transfers String back to client
• Client Displays String
• CORBA module is name space that is a container for related interfaces and definitions.
• Like a Java Package
• module statement mapped to java package statement
• interface specifies contract object has with other objects
• interface to interface in java
• CORBA operations are behaviors that server promises to do on client’s behalf
• operation to method in java
• idltojava Hello.idl creates a HelloApp directory, and five files.
• _HelloImplBase.java: Abstract class is the server skeloton. It implements Hello.java. Server class will extend this class.
• _HelloStub.java: Client stub. Implements Hello.java
• Hello.java: Java version of IDL interface. Subclasses org.omg.CORBA.Object to provide base CORBA functionality.
• HelloHelper.java: Provides other functionality. narrow method cast CORBA object reference to proper type.
• HelloHolder.java: final class provides out and inout arguments (more later).
/* * File: ./HelloApp/Hello.java * From: Hello.idl * Date: Thu Sep 3 09:46:22 1998 * By: idltojava Java IDL 1.2 Nov 12 1997 12:23:47 */
package HelloApp;public interface Hello extends org.omg.CORBA.Object { String sayHello();}
/* * File: ./HelloApp/_HelloImplBase.java * From: Hello.idl * Date: Thu Sep 3 09:46:22 1998 * By: idltojava Java IDL 1.2 Nov 12 1997 12:23:47 */
package HelloApp;public abstract class _HelloImplBase extends org.omg.CORBA.DynamicImplementationimplements HelloApp.Hello { // Constructor public _HelloImplBase() { super(); } // Type strings for this class and its superclases private static final String _type_ids[] = { "IDL:HelloApp/Hello:1.0" };
public String[] _ids() { return (String[]) _type_ids.clone(); }
private static java.util.Dictionary _methods = new java.util.Hashtable(); static { _methods.put("sayHello", new java.lang.Integer(0)); } // DSI Dispatch call public void invoke(org.omg.CORBA.ServerRequest r) { switch (((java.lang.Integer) _methods.get(r.op_name())).intValue()) { case 0: // HelloApp.Hello.sayHello { org.omg.CORBA.NVList _list = _orb().create_list(0); r.params(_list); String ___result; ___result = this.sayHello(); org.omg.CORBA.Any __result = _orb().create_any(); __result.insert_string(___result); r.result(__result); } break; default: throw new org.omg.CORBA.BAD_OPERATION(0,org.omg.CORBA.CompletionStatus.COMPLETED_MAYBE); } }}
/* * File: ./HelloApp/_HelloStub.java * From: Hello.idl * Date: Thu Sep 3 09:46:22 1998 * By: idltojava Java IDL 1.2 Nov 12 1997 12:23:47 */
package HelloApp;public class _HelloStub
extends org.omg.CORBA.portable.ObjectImpl implements HelloApp.Hello {
public _HelloStub(org.omg.CORBA.portable.Delegate d) { super(); _set_delegate(d); }
private static final String _type_ids[] = { "IDL:HelloApp/Hello:1.0" };
public String[] _ids() { return (String[]) _type_ids.clone(); }
// IDL operations // Implementation of ::HelloApp::Hello::sayHello public String sayHello() { org.omg.CORBA.Request r = _request("sayHello");
r.set_return_type(org.omg.CORBA.ORB.init().get_primitive_tc(org.omg.CORBA.TCKind.tk_string)); r.invoke(); String __result; __result = r.return_value().extract_string(); return __result; }
};
/* * File: ./HelloApp/HelloHelper.java * From: Hello.idl * Date: Thu Sep 3 09:46:22 1998 * By: idltojava Java IDL 1.2 Nov 12 1997 12:23:47 */
package HelloApp;public class HelloHelper { // It is useless to have instances of this class private HelloHelper() { }
public static void write(org.omg.CORBA.portable.OutputStream out,HelloApp.Hello that) { out.write_Object(that); } public static HelloApp.Hello read(org.omg.CORBA.portable.InputStream in) { return HelloApp.HelloHelper.narrow(in.read_Object()); } public static HelloApp.Hello extract(org.omg.CORBA.Any a) { org.omg.CORBA.portable.InputStream in = a.create_input_stream(); return read(in); } public static void insert(org.omg.CORBA.Any a, HelloApp.Hello that) { org.omg.CORBA.portable.OutputStream out = a.create_output_stream(); write(out, that); a.read_value(out.create_input_stream(), type()); } private static org.omg.CORBA.TypeCode _tc; synchronized public static org.omg.CORBA.TypeCode type() { if (_tc == null) _tc = org.omg.CORBA.ORB.init().create_interface_tc(id(), "Hello"); return _tc; } public static String id() { return "IDL:HelloApp/Hello:1.0"; } public static HelloApp.Hello narrow(org.omg.CORBA.Object that)
throws org.omg.CORBA.BAD_PARAM { if (that == null) return null; if (that instanceof HelloApp.Hello) return (HelloApp.Hello) that;
if (!that._is_a(id())) { throw new org.omg.CORBA.BAD_PARAM();}
org.omg.CORBA.portable.Delegate dup =((org.omg.CORBA.portable.ObjectImpl)that)._get_delegate(); HelloApp.Hello result = new HelloApp._HelloStub(dup); return result; }}
/* * File: ./HelloApp/HelloHolder.java * From: Hello.idl * Date: Thu Sep 3 09:46:22 1998 * By: idltojava Java IDL 1.2 Nov 12 1997 12:23:47 */
package HelloApp;public final class HelloHolder implements org.omg.CORBA.portable.Streamable{ // instance variable public HelloApp.Hello value; // constructors public HelloHolder() {
this(null); } public HelloHolder(HelloApp.Hello __arg) {
value = __arg; }
public void _write(org.omg.CORBA.portable.OutputStream out) { HelloApp.HelloHelper.write(out, value); }
public void _read(org.omg.CORBA.portable.InputStream in) { value = HelloApp.HelloHelper.read(in); }
public org.omg.CORBA.TypeCode _type() { return HelloApp.HelloHelper.type(); }}
Client
• Needs ORB object to do marshaling and IIOP
• Instantiate ORB object and pass it information
• Asks ORB for service it needs
• Gets object reference from COS naming service provided with Java IDL
• Get reference to naming service
• All CORBA object references returned as generic CORBA object
• Must narrow it to its proper type
• NameComponent for complex names, including fully qualified paths
• resolve naming context
• narrow to proper type
• invoke method
import HelloApp.*; // The package containing our stubs.import org.omg.CosNaming.*; // HelloClient will use the naming service.import org.omg.CORBA.*; // All CORBA applications need these classes.
public class HelloClient{ public static void main(String args[]) { try{
// Create and initialize the ORB ORB orb = ORB.init(args, null);
// Get the root naming context org.omg.CORBA.Object objRef =orb.resolve_initial_references("NameService"); NamingContext ncRef = NamingContextHelper.narrow(objRef);
// Resolve the object reference in naming NameComponent nc = new NameComponent("Hello", ""); NameComponent path[] = {nc}; Hello helloRef = HelloHelper.narrow(ncRef.resolve(path));
// 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); } }}
Server
• Servant object implements the interface
• Create ORB
• COS Naming: get instance and narrow
• Register servant with name server
• WAIT
// The package containing our stubs.import HelloApp.*;
// HelloServer will use the naming service.import org.omg.CosNaming.*;
// The package containing special exceptions thrown by the name service.import org.omg.CosNaming.NamingContextPackage.*;// All CORBA applications need these classes.import org.omg.CORBA.*;public class HelloServer{ public static void main(String args[]) { try{ // Create and initialize the ORB ORB orb = ORB.init(args, null); // Create the servant and register it with the ORB HelloServant helloRef = new HelloServant(); orb.connect(helloRef); // Get the root naming context org.omg.CORBA.Object objRef =orb.resolve_initial_references("NameService"); NamingContext ncRef = NamingContextHelper.narrow(objRef); // Bind the object reference in naming NameComponent nc = new NameComponent("Hello", ""); NameComponent path[] = {nc}; ncRef.rebind(path, helloRef); // Wait for invocations from clients java.lang.Object sync = new java.lang.Object(); synchronized(sync){ sync.wait(); } } catch(Exception e) { System.err.println("ERROR: " + e); e.printStackTrace(System.out); } }}class HelloServant extends _HelloImplBase{ public String sayHello() { return "\nHello world!!\n";
}}