[omniORB] omniORB2 / Java ORB interoperability study

Arnault Bonafos abonafos@tumbleweed.com
Mon, 17 May 1999 16:48:37 -0700


This is a multi-part message in MIME format.
--------------736A6A57AE87E39D6AF90210
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

Here is a study I've made about interoperability between omniORB2 and
some other Java ORB, the goal was to find a suitable Java ORB for
developping some extensions to our omniORB2 C++ product.

This is yet a draft.

Any comment welcomed.

--------------736A6A57AE87E39D6AF90210
Content-Type: text/html; charset=us-ascii;
 name="Study.html"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="Study.html"

<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
<html>
<head>
   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
   <meta name="Author" content="Arnault Bonafos">
   <meta name="GENERATOR" content="Mozilla/4.51 [en] (X11; U; SunOS 5.6 sun4u) [Netscape]">
</head>
<body text="#000000" bgcolor="#FFFFFF" link="#0000EE" vlink="#551A8B" alink="#FF0000">

<center>
<h2>
Interoperability survey for omniORB2</h2></center>

<p><br>The objective of this paper is to study ORB with Java language binding,
in order to be able to select one which would be interoperable with omniORB2,
as client and as server.
<h4>
Commercial informations</h4>
&nbsp;
<table BORDER COLS=5 WIDTH="100%" NOSAVE >
<tr>
<td><i>ORB product name</i></td>

<td><i>Company</i></td>

<td><i>Require</i></td>

<td><i>Source files available</i></td>

<td><i>Free</i></td>
</tr>

<tr>
<td>JavaSoft ORB</td>

<td>Sun</td>

<td>jdk 1.2</td>

<td>Yes</td>

<td>Yes</td>
</tr>

<tr>
<td>OrbixWeb</td>

<td>IONA</td>

<td>jdk1.1</td>

<td>No</td>

<td>No</td>
</tr>

<tr>
<td>OAK ORB</td>

<td>Paragon Software</td>

<td>jdk 1.1</td>

<td>No</td>

<td>No</td>
</tr>

<tr>
<td>VisiBroker</td>

<td>Inprise / Visigenic</td>

<td>jdk 1.1</td>

<td>No</td>

<td>No</td>
</tr>

<tr>
<td>Voyager&nbsp;</td>

<td>Object Space</td>

<td>jdk 1.1</td>

<td>No</td>

<td>Yes (internal use)</td>
</tr>

<tr>
<td>JavaORB</td>

<td></td>

<td>jdk 1.1</td>

<td>Yes</td>

<td>Yes</td>
</tr>

<tr>
<td>JBroker</td>

<td>ObjectEra</td>

<td>jdk 1.1</td>

<td>No</td>

<td>No</td>
</tr>

<tr>
<td>jorba</td>

<td>Roland Turner (GPL)</td>

<td>jdk 1.1</td>

<td>Yes</td>

<td>Yes</td>
</tr>

<tr>
<td>JacOrb</td>

<td>Gerald Brose (GPL)</td>

<td>jdk 1.1</td>

<td>Yes</td>

<td>Yes</td>
</tr>

<tr>
<td>ORBacus</td>

<td>OOC, inc</td>

<td>jdk 1.1</td>

<td>Yes</td>

<td>Yes / <a href="http://www.ooc.com/pricing.html">No</a> (commercial
use)</td>
</tr>
</table>

<h4>
Technical information</h4>
Here is a summary of the technical informations.
<br>&nbsp;
<table BORDER COLS=6 WIDTH="100%" NOSAVE >
<tr NOSAVE>
<td><i>ORB product name</i></td>

<td VALIGN=TOP NOSAVE><i>Compiler</i></td>

<td VALIGN=TOP NOSAVE><i>Naming Service</i></td>

<td VALIGN=TOP NOSAVE><i>Threads</i></td>

<td VALIGN=TOP NOSAVE><i>Repository</i></td>

<td VALIGN=TOP NOSAVE><i>Details</i></td>
</tr>

<tr>
<td>JavaSoft</td>

<td>Yes</td>

<td>Yes</td>

<td>Yes</td>

<td>No</td>

<td>&nbsp;</td>
</tr>

<tr>
<td><a href="http://www.iona.com/info/products/orbixweb/index.html">OrbixWeb</a></td>

<td>Yes</td>

<td>Yes</td>

<td>Yes</td>

<td>Yes</td>

<td><a href="#OrbixWeb">here</a></td>
</tr>

<tr>
<td><a href="http://www.paragon-software.com/products/oak/index.html">OAK
ORB</a></td>

<td>Yes</td>

<td>Yes</td>

<td>Yes</td>

<td>-</td>

<td><a href="#OAK ORB">here</a></td>
</tr>

<tr>
<td><a href="http://www.inprise.com/techpubs/visibroker/">VisiBroker</a></td>

<td>Yes</td>

<td>Yes</td>

<td>Yes</td>

<td>Yes</td>

<td><a href="#VisiBroker">here</a></td>
</tr>

<tr>
<td><a href="http://www.objectspace.com/Products/voyager1.htm">Voyager</a></td>

<td>Yes</td>

<td>No</td>

<td>Yes</td>

<td>-</td>

<td><a href="#Voyager">here</a></td>
</tr>

<tr>
<td><a href="http://www.multimania.com/dogweb/VersionAnglaise/Projects/JavaORB/javaorb.html">JavaORB</a></td>

<td>Yes</td>

<td>Yes</td>

<td>-</td>

<td>-</td>

<td><a href="#JavaORB">here</a></td>
</tr>

<tr>
<td><a href="http://www.objectera.com/jbroker/jbroker.html">JBroker</a></td>

<td>Yes</td>

<td>Yes</td>

<td>-</td>

<td>-</td>

<td><a href="#JBroker">here</a></td>
</tr>

<tr>
<td><a href="http://jorba.castle.net.au/">jorba</a></td>

<td>Yes</td>

<td>No</td>

<td>No</td>

<td>Yes</td>

<td><a href="#jorbaspec">here</a></td>
</tr>

<tr>
<td><a href="http://www.inf.fu-berlin.de/~brose/jacorb/">JacOrb</a></td>

<td>Yes</td>

<td>Yes</td>

<td>Yes</td>

<td>Yes</td>

<td><a href="#JacORB">here</a></td>
</tr>

<tr>
<td><a href="http://www.ooc.com/ob/">ORBacus</a></td>

<td>Yes</td>

<td>Yes</td>

<td>Yes</td>

<td>&nbsp;</td>

<td><a href="#ORBacus">here</a></td>
</tr>
</table>

<h4>
Tests</h4>
Some tests have been run in order to check interoperability compliance
with the omniORB2 ORB.
<br>The first one consists in compilng about 50 idl files issuing most
of the possibilities allowed by the IDL language.
<br>The second one consists in writing four functions for each CORBA object
:
<ol>
<li>
string echo</li>

<li>
float echo</li>

<li>
interger addition echo</li>

<li>
power function echo</li>

<li>
exception support</li>
</ol>
These function are defined in an IDL file, and they are implemented as
client and server in both ORB (the Java ORB tested and omniORB2).
<br>The test has been run considering several cases :
<ul>
<li>
Java ORB is client / omniORB2 is server</li>

<li>
Java ORB is server / omniORB2 is client</li>

<li>
the client runs on little endian machine / the server runs on big endian
machine</li>

<li>
the client runs on big endian machine / the server runs on little endian
machine</li>
</ul>
The third test consist in the&nbsp; Java ORB ability to share the omniORB2
Naming Service. This consist essentially in using the <i>string_to_object</i>,
<i>narrow</i>
and <i>resolve</i> operations of the involved Java ORB
<p>Here are the results.
<br>&nbsp;
<table BORDER COLS=4 WIDTH="100%" NOSAVE >
<tr>
<td>&nbsp;</td>

<td><i>Compiling bunch of idl files</i></td>

<td><i>Client / Server test</i></td>

<td><i>Share omniORB</i>
<br><i>Naming Service</i></td>
</tr>

<tr>
<td>JavaSoft</td>

<td>No</td>

<td>Yes / No</td>

<td>-</td>
</tr>

<tr>
<td>OrbixWeb</td>

<td>Yes</td>

<td>Yes</td>

<td>-</td>
</tr>

<tr>
<td>OAK ORB</td>

<td>Yes</td>

<td>Yes / No (across platform)</td>

<td>-</td>
</tr>

<tr>
<td>VisiBroker</td>

<td>Yes</td>

<td>Yes</td>

<td>Yes</td>
</tr>

<tr>
<td>Voyager 3.0</td>

<td>Yes / No</td>

<td>-</td>

<td>-</td>
</tr>

<tr>
<td>JavaORB</td>

<td>No</td>

<td>-</td>

<td>-</td>
</tr>

<tr>
<td>JBroker</td>

<td>No</td>

<td>-</td>

<td>-</td>
</tr>

<tr>
<td>jorba</td>

<td>No</td>

<td>-</td>

<td>-</td>
</tr>

<tr>
<td>JacORB</td>

<td>No</td>

<td>-</td>

<td>-</td>
</tr>

<tr>
<td>ORBacus</td>

<td>Yes</td>

<td>Yes</td>

<td>Yes</td>
</tr>
</table>

<p>More technical details about products :
<ul>
<li>
<a NAME="OrbixWeb"></a><b>OrbixWeb</b> :</li>

<ul>
<li>
installation uses 55 Mo disk space</li>

<li>
medium documentation, the full step process to write an application is
spare into multiple files</li>

<li>
support three activation modes (shared server / unshared server / server
per method )</li>

<li>
idl compiler explains nothing when it encounters an error</li>

<li>
idl compiler cannot manage too deep inclusion of files</li>

<li>
provides different GUI interface :</li>

<ul>
<li>
to configure the product</li>

<li>
to browse Naming Service (professional edition)</li>

<li>
to browse Interface Repository (professional edition)</li>
</ul>

<li>
<a href="http://www.isbiel.ch/~hrm/CORBA/OrbixWeb/e.html">here</a> is an
other evaluation of OrbixWeb</li>
</ul>

<li>
<a NAME="OAK ORB"></a><b>OAK ORB</b> :</li>

<ul>
<li>
idl compiler is fast</li>

<li>
html documentation is medium, but is not up to date about their product</li>

<li>
provides <a href="#Interceptor">interceptor</a> facility</li>

<li>
enable observer of connection</li>

<li>
provides a manager for persistent objects</li>

<li>
three activation models : single threaded / thread pool / thread per request</li>
</ul>

<li>
<a NAME="VisiBroker"></a><b>VisiBroker</b> :</li>

<ul>
<li>
thread pool policy or thread per-session policy</li>

<li>
good documentation</li>

<li>
need three jar files to run</li>

<li>
servants work through BOA : shared server / unshared server / server per
method (see <a href="#NoteJava">Note</a> for Java2 )</li>

<li>
provides an Agent service (locate the specified implementation)</li>

<li>
provides a Location service which is an interface to the Agent service</li>

<li>
provides <a href="#Interceptor">interceptor</a> utility</li>

<li>
provides ORB debugging based on interceptors</li>

<li>
encapsulates IOR through an optional URL Naming Service</li>

<li>
GateKeeper product allow IIOP over HTTP tunneling</li>

<li>
provides IIOP over SSL in SSL pack</li>
</ul>

<li>
<a NAME="Voyager"></a><b>Voyager</b> :</li>

<ul>
<li>
CORBA functionality is totaly encapsulated by Voyager API</li>

<ul>
<li>
no stub generator or helper class are required</li>

<li>
said to be able to speak with other CORBA object</li>

<li>
require more invetigation to learn how to use</li>
</ul>

<li>
idl compiler cannot parse "#comment" inside a C comment in idl files, but
generates files instead</li>

<li>
provides an Agent System functionality (autonomous mobile agents)</li>

<li>
servants are activated with a thread pooling</li>

<li>
can plug custom socket connection such as SSL sockets</li>

<li>
uses <a href="#JNDI">JNDI</a> (professional version only)</li>

<li>
can be used as an NT service on a NT machine</li>

<li>
plan to support <a href="#SOCKS">SOCKS</a> technology (Voyager Security
Service)</li>
</ul>

<li>
<a NAME="JavaORB"></a><b>JavaORB</b> :</li>

<ul>
<li>
idl compiler have bunch of errors on our idl files</li>

<ul>
<li>
doesn't parse long identifiers</li>

<li>
doesn't parse external access path on typedef</li>
</ul>

<li>
provides an Interface Reposiory service</li>

<li>
two objects adaptors : B.O.A. and P.O.A (see <a href="#NoteJava">Note</a>
for Java2 )</li>

<li>
dynamic managment of Any values : DynAny,</li>

<li>
supports integration of users protocols,</li>

<li>
DII and DSI,</li>

<li>
Portable stub and skeleton,</li>

<li>
a naming service ( Cos Naming ),</li>

<li>
an event service ( CosEvent ).</li>

<li>
a transaction service ( CosTransactions )</li>
</ul>

<li>
<a NAME="JBroker"></a><b>JBroker</b> :</li>

<ul>
<li>
idl compiler cannot parse "#comment" inside a C comment in idl files, and
others which don't have been identified (fichier.idl:unknown type literals)</li>

<li>
servants work through PAO (see <a href="#NoteJava">Note</a> for Java2 )</li>
</ul>

<li>
<a NAME="jorbaspec"></a><b>jorba</b> :</li>

<ul>
<li>
(runs with an old definition of CORBA)</li>

<li>
command for idl compiler : <b><font face="Times New Roman,Times">java raz.jorba.idl2java
[-d destinationDir] file.idl...</font></b></li>

<li>
need an aditional step to setup the jorba repository (<b>r<font face="Times New Roman,Times">az.util.Environment.load())</font></b></li>

<li>
<font face="Times New Roman,Times"><b>raz.jorba.dir</b> in java.properties,</font>
points to component properties file, repository and naming directories</li>

<li>
an idl file need to be copied in repository directory for DII to operate</li>

<li>
provides implementation directly under org.omg.CORBA (see <a href="#NoteJava">Note</a>
for Java2 )</li>

<li>
the code generator in Jorba is <u>incomplete</u> (does not recognise everything)</li>

<li>
uses <a href="#JavaCup">java_cup</a> for its implementation</li>
</ul>

<li>
<a NAME="JacORB"></a><b>JacORB</b></li>

<ul>
<li>
provides <a href="#Interceptor">interceptor</a> facility</li>

<li>
GUI browser tool for the name service (requires Swing)</li>

<li>
compilation is a bit complicated in term of CLASSPATH and has bug :</li>

<ul>
<li>
doesn't parse 'const Locale DEFAULT_LOCALE = "";' (having 'typedef String
Locale;')</li>
</ul>

<li>
idl compilation can be done in two phases (a script do the stuff)</li>

<ul>
<li>
generation of Java interface (needs a c preprocessor) then compilation
of it</li>

<li>
generation of Stub / Skel from the ".class" file</li>
</ul>

<li>
ORB implementation is provided directly under <b>org.omg.CORBA</b></li>

<li>
doesn't respect CORBA recommendations for connecting objects.</li>

<li>
implementation class doesn't extend skeleton.</li>

<li>
uses <a href="#JavaCup">java_cup</a> for its implementation</li>
</ul>

<li>
<a NAME="ORBacus"></a><b>ORBacus</b></li>

<ul>
<li>
the idl to java compiler is written in C++</li>

<li>
provides an event service</li>

<li>
servants work through BOA</li>

<li>
need BOA to be initialized for servants (see <a href="#NoteJava">Note</a>
for Java2 )</li>

<li>
has a full Makefile for compilation and installation</li>

<li>
different concurency model (Blocking / Threaded / Thread per Client / Thread
per Request / Thread Pool.) It is given by a java property.</li>

<li>
open architecture to plug an other communication protocol (proprietary
API : OCI)</li>

<li>
ability to add initial well-known services</li>

<li>
furnishes small tests for their products</li>
</ul>
</ul>

<h4>
<a NAME="NoteJava"></a>Note :</h4>
As Java 2 furnishes its own implementation of CORBA for ORB and that this
one doesn't declare any object adapter, you have to use the special options
to compile and run with Java 2 :
<ul>
<li>
compiler : javac -bootclasspath /jdk-path/jre/lib/i18n.jar:/jdk-path/jre/lib/rt.jar:/orb-path/orb.jar
...</li>

<li>
running : java -Xbootclasspath:/jdk-path/jre/lib/i18n.jar:/jdk-path/jre/lib/rt.jar:/orb-path/orb.jar
...</li>
</ul>
The two first jar files are needed to the Java virtual machine to bootstrap.
<br>Make attention of the small difference between the two commands lines.
<br>&nbsp;
<h2>
Other ORBs</h2>

<h4>
Test of Fnorb</h4>
It has been asked to test Fnorb interoperability as this language is often
used by web administrator, so this would be suitable for internet based
applications. The python language mapping for use with CORBA is always
under process (see below.)
<p>Fnorb is a CORBA 2.0 ORB written in <a href="#Python">Python</a> , so
you need to install python package before use it.
<p>Tests
<br>&nbsp;
<table BORDER COLS=4 WIDTH="100%" NOSAVE >
<tr>
<td>&nbsp;</td>

<td><i>Compiling bunch of idl files</i></td>

<td><i>Client / Server test</i></td>

<td><i>Share omniORB</i>
<br><i>Naming Service</i></td>
</tr>

<tr>
<td>Fnorb</td>

<td>Yes</td>

<td>Yes / No (see below)</td>

<td>Yes</td>
</tr>
</table>

<p>Technical details :
<ul>
<li>
fail on float replying, an unnecessary approximation is made</li>

<li>
provides COS Naming Service</li>

<li>
provides COS Interface Repository</li>

<li>
idl compiler provides good report on eror</li>

<li>
the idl compiler doesn't generate recusively the included files</li>

<li>
Fnorb is free</li>

<li>
servants work through BOA, mode : single-threaded / pool-threaded</li>

<li>
Fnorb rely on two small C libraries for parsing and marshalling code</li>

<li>
provides Universal Object Locator Fnorb specific facility</li>

<li>
provides command line arguments for specifying Naming Service as well-known
service</li>
</ul>

<p><br>The Python language mapping used by Fnorb is based on the 'living'
document that is being prepared by members of the DO-SIG.&nbsp; One goal
of Fnorb is to allow the Python community to experiment with the mapping
before we attempt to set it in stone via the OMG standardisation process.
<p><a href="http://www.dstc.edu.au/Fnorb/">Home Page</a>
<br>&nbsp;
<h4>
ORB not tested</h4>

<ul>
<li>
<b>ILU</b> for Java from XEROX, not tested because part of his implementation
is done through Java Native Interface, so it's not portable. It is free,
and sources are available.</li>

<br>ILU for Java is mostly CORBA compatible.
<br>Ilu's compatibility requires the programmers help: Not all programs
will be compatible, but it is possible to write compatible programs.
<li>
<b>TAO</b> (The Ace ORB), C++ ORB</li>

<li>
<b>DAIS J2</b> (peelogic), a Java ORB which is not available for evaluation
for now.</li>

<ul>
<li>
provides http tunneling functionality.</li>

<li>
should work for interoperability with omniORB2</li>

<li>
servants work through POA</li>

<li>
idl compiler</li>

<li>
<a href="http://www.peerlogic.com/products/dais/f_dais.htm">home page</a></li>
</ul>

<li>
<b>DynaORB</b>, a Java ORB which provides functionality only for clients
(suitable for applets)</li>

<li>
<b>JYLU</b>, ILU traduction in 100% Java, but web site was unavailable
to connections.</li>

<li>
<b>ObjectDirector</b> (Interstage / Fujistu) an ORB CORBA 2.3 compliant
with Java language binding, it was not availlable for evaluation. <a href="http://www.interstage.com/">Home
Page</a></li>

<li>
<b>CORBAPlus</b> is an ORB with Java language binding, I got bus errors
when trying to compile idl files with the evaluation version.</li>
</ul>

<h2>
Appendix</h2>

<h4>
Some Tools &amp; concepts</h4>
<a NAME="Interceptor"></a><b>Interceptor</b> is a new feature in the CORBA
2.2 specification that allow end-user applications to intercept a request
before it is passed on to network. Interceptors allow the addition of functionality
such as encryption, management, and
<br>performance measurements to the request mechanism of CORBA. It is generaly
based on the GIOP message format which describe the following kind of messages
:
<ul>
<li>
Locate</li>

<li>
message</li>

<li>
request</li>
</ul>
It is still under normalization by OMG (<a href="http://www.omg.org/techprocess/meetings/schedule/Portable_Interceptors_RFP.html">work
in progress.</a>)
<p><a NAME="JavaCup"></a><b>JavaCup</b> is a program for generating LALR
parsers from simple specifications.&nbsp; It is written in Java and and
produces parsers which are implemented in Java. Grammar syntax is not the
same as YACC, whereas functionalities are the same.
<br><a href="http://www.cs.princeton.edu/~appel/modern/java/CUP/">Home
Page</a>
<p><a NAME="JNDI"></a><b>JNDI</b>, Java Naming and Directory Interface
provides an unified interface to multiple naming and directory services
in the enterprise. It's a kind of interface to LDAP, DNS and NIS services.
<br><a href="http://java.sun.com/products/jndi/index.html">Information
Page</a>
<p><a NAME="Python"></a><b>Python</b>&nbsp; it's a mature, interpreted,
object-oriented programming language with powerful high-level datatypes.
It's a free language package under GPL.
<br><a href="http://www.python.org/">Home page.</a>
<p><a NAME="SOCKS"></a><b>SOCKS</b> is a networking proxy protocol that
enables hosts on one side of SOCKS server to gain full access to hosts
on the other side of the SOCKS server without requiring direct IP reachability.
SOCKS is commonly used as a network firewall. It seems to be a rising technology.
<p>SOCKS 5 and normalization
<br>rfc1928 - SOCKS Version 5 Protocol
<br>rfc1929 - Username/Password Authentication for SOCKS V5
<br>rfc1961 - GSSAPI authentication for SOCKS V5
<p>Next version of SOCKS will be called Secure Transport Protocol, and
will be normalized by the IETF.
<br><a href="http://www.socks5.com/">Home page</a>
<br>&nbsp;
<br>&nbsp;
<h4>
Acronyms</h4>

<p><br>JNDI : Java Naming and Directory Interface
<br>LDAP : Lightweight Directory Access Protocol
<br>IETF : Internet Engineering Task Force
<br>&nbsp;
<h4>
Class name generated with different compilers</h4>
&nbsp;
<table BORDER COLS=6 WIDTH="100%" NOSAVE >
<tr>
<td>&nbsp;</td>

<td>Class Name</td>

<td>Holder Name</td>

<td>Helper Name</td>

<td>Client StubName</td>

<td>Server Skeleton Name</td>
</tr>

<tr>
<td>OAK ORB</td>

<td>Foo</td>

<td>FooHolder</td>

<td>FooHelper</td>

<td>_FooStub</td>

<td>_FooImplBase</td>
</tr>

<tr>
<td>VisiBroker</td>

<td>Foo</td>

<td>FooHolder</td>

<td>FooHelper</td>

<td>_st_Foo</td>

<td>_FooImplBase</td>
</tr>

<tr>
<td>JavaORB</td>

<td>Foo</td>

<td>FooHolder</td>

<td>FooHelper</td>

<td>StubForFoo</td>

<td>_FooImplBase</td>
</tr>

<tr>
<td>jorba</td>

<td>Foo</td>

<td>FooHolder</td>

<td>FooHelper</td>

<td>_FooStub</td>

<td>_FooImplBase</td>
</tr>

<tr>
<td>JacORB</td>

<td>Foo</td>

<td>FooHolder</td>

<td>FooHelper</td>

<td>FooStub</td>

<td>FooSkeleton</td>
</tr>

<tr>
<td>ORBacus</td>

<td>Foo</td>

<td>FooHolder</td>

<td>FooHelper</td>

<td>StubForFoo</td>

<td>_FooImplBase</td>
</tr>
</table>

<br>&nbsp;
<br>&nbsp;
</body>
</html>

--------------736A6A57AE87E39D6AF90210--