Go to the previous, next section.

# Using ILU with Java

## Introduction

This document is for the Java programmer who wishes to use ILU. The following sections will show how ILU is mapped into Java constructs and how both Java clients and servers are generated and built.

### ILU and CORBA

ILU for Java is CORBA compatible. Compatibility is a word from the english language; in case of ILU we mean mainly two things:

1) Ilu can interoperate with other corba compatible orbs.

2) Applications which are written to use only corba compatible features can switch between ilu and other orbs without changing source code.

Sadly ILU for Java's compatibility is not perfect. Not all CORBA functions are implemented. More noticable is however the fact that we do only try to achieve source compatibility; there is no binary compatibility available.

Compatibility requires the programmers help: Not all programs will be compatible, but it is possible to write compatible programs.

javasoft's interpretation of the standard mapping: (may or may not be accurate): http://java.sun.com/products/jdk/idl/docs/idl-java.html

The standard mapping is available from OMG as PDF document: ftp://ftp.omg.org/pub/docs/orbos/97-03-01.pdf or a newer version ftp://www.omg.org/pub/docs/formal/98-02-29.pdf or in other formats http://www.omg.org/corba/cichpter.htm#mijav

## The ISL Mapping to Java

### Names

If ILU for Java is used in standard mapping mode, its naming scheme matches the CORBA standard. Even resolution of naming conflicts is mostly CORBA compatible. However for some conflicts there might be slight differences, and, Ilu considers certain names to be conflicting which have not been mentioned in the corba standard.

In particular ILU considers methods names used by the java.lang.Object class to be "reserved" and causing conflicts. Not doing so would generate confusing errors if a generated method would conflict with a standard method by using identical arguments.

### Interface

See the CORBA standard for modules.

An ISL `interface` is mapped to a Java package with the same name.

There is a stubber option to put a prefix to the Java package, to make it a nested package.

Avoid IDL features which are not in the scope of a idl module (= ISL Interface).

### Basic Types

See the corba standard.

The "new" extended IDL types fixed is not yet supported.

128 bit floating point values are carried around as "xerox.ilu.types.float128" but no operations are available.

In case of "byte", ILU carries the bit pattern, not the numerical value.

#### Constant

See the corba standard.

### Strings

See the corba standard.

### Pickles and Typecodes

See the corba standard for ANY and Typecodes.

### Constructed Types

#### Enumeration

See the corba standard.

#### Array

See the corba standard.

#### Sequence

See the corba standard.

#### Record

See the corba standard.

#### Union

See the corba standard.

#### Optional

ISL Optionals have no corresponding corba type. If the base type of the optional maps into a Java primitive type we will represent the optional with the corresponding Java wrapper or container class. (Boolean, Character, Double, Float, Integer, Short, Byte, or Long). The null value represents absence of the parameter.

If the base type of the optional maps into a Java object type, the optional is mapped as if it weren't optional. The null value represents absence of the parameter.

In the case of Java Strings the difference between a null String and an empty string serves this distinction perfectly.

### Object Types

See the CORBA standard for "corba interfaces".

#### Surrogate and True Object Types

To request creation of an object the ``createTrueObject`` method is called. The implementation of ``createTrueObject`` is expected to call ``super.returnTrueObject`` to register the created object.

True object have to implement all the interfaces required by their type.

Unlinke, CORBA, this is all which is absolutely necessary. However, unless there is a need to do otherwise we strongly recommend extending the base class xerox.ilu.IluObjectBase or the class org.omg.CORBA.portable.ObjectImpl. This will take care automatically of a long list of problems (See the section about garbage collection). But, if you can't use one of those base classes, in ilu you do have alternatives.

#### Methods, Parameters, and Exceptions

#### Java Garbage Collection, Distributed Garbage Collection, and/or COLLECTIBLE

The Garbage Collection features in Ilu look much more difficult then they are. The difficulties arise in supporting various important cases in wild combinations. Most likely your application will not use the whole span of complexities.

For Ilu COLLECTIBLE objects (see generic Ilu documentation) do not hang onto objects longer then you need. That is true for both surrogate and true objects.

Non COLLECTIBLE objects are alive until deleted. If you are providing a true object implemementation, it is your responsibility to prevent this object from being garbage collected; Ilu does not necessarily do so. If the program lets a true object being garbage collected that means Ilu will eventually stop serving it.

There are several means to have Ilu help keeping an object alive:

If possible, true objects should extend IluObjectBase. This would take care of all the complexities following.

Most direct, the xerox.Ilu.registerTrueObject method provides a lifetime argument. This should be a lifetime value as is provided by the xerox.ilu.IluLifetimeArgs class. However since many registrations happen implicitely or in places which do not provide that argument there are other means to specify lifetime.

There are two marker interfaces xerox.Ilu.IluLifetimeForget and xerox.Ilu.IluLifetimeRemember which can be implemented by true objects. Doing so guides Ilu's behaviour if xerox.Ilu.registerTrueObject does not specify an explicit method or xerox.Ilu.registerTrueObject is not explicitely used at all.

Of course the application could simply manage the lifetime itself, but see the note below.

Note that there is a big difference in whether a true object is extending IluObjectBase or not. Ilu goes to tremedous troubles to not require applications to extend a predefined base class. However if this service is not needed we recommend applications to simply extend IluObjectBase for true object types. By doing so, Ilu can take advantage of inherited code which helps it handle lifetime. If Ilu can finds no hint at all that the application is doing something about the lifetime, Ilu's behaviour might become more conservative then the programmer likes. (For CORBA users: ilu's version of org.omg.CORBA.portable.ObjectImpl.java simply extends xerox.ilu.IluObjectBase)

Note to the curious why the internal complexity is necessary: Ilu is implementing weak refs, even on jdk version which have no support for it.

ILU Java reads the `ILU_COLLECTABLE_CINFO` environment variable for setting up ports for the special object used to guide collectible objecs.

### How to make your idl Java friendly

Note that you don't have to do this. Ilu will mangle your names if necessary.

However, if you keep your names Java friendly, your stubs will be easier to read and debug by people used to popular java coding standards or the CORBA standard mapping. If you avoid name conflicts no esoteric name mangling needs to happen and your ilu stubs are more likely to match the CORBA standard correctly.

1. Avoid Java keywords. (e.g. boolean, int, class, for, ...)
2. Avoid names of Java standard classes (in the java.lang package). (e.g. String, Integer, RuntimeException)
3. Avoid suffixes which are used by CORBA standard for your type and class names. (e.g. Stubs, Operations, Helper, Holder, ImplBase)
4. Avoid prefixes which are used by CORBA standard for your type and class names. (e.g. POA_)
5. Avoid suffixes which are generated by ILU for your type and class names. (e.g. _exh_)
6. Avoid gratuidous typedefs. (But it is ok to use typedefs for functional reasons)
7. Avoid using the same name for the interface and a type.
8. As a courtesy, try to also avoid names which cause problems for other programming languages.
9. Start your types, classes and exceptions with capital letters.
10. Start your methods and enumeration values with small letters

## Access to standard ILU features

### Servers and Ports

#### True Servers

Each object exported by an implementation must belong to a true server, an instance of the Java type `IluServer` which is implemented by the ``xerox.ilu.IluServer`` class.

An `IluServer` instance can be created by calling the function ``ilu.createServer([serverID])``, which returns a value of type `IluServer`. If serverID is a string, it specifies the server ID; if it is the Java value `None`, a server ID will be invented automatically.

Other methods allow the specification of a daemon flags or ports for different transports or protocols, or an object table, which allows specification of a callback function for creating true instances on demand.

The first time a true server is created, it becomes the default server. The default server is used for an exported object if a server is not otherwise specified or when it is explicitly requested with the ``defaultServer`` method. If an object is exported before any servers have been created, one will be created automatically using default parameters and possibly a message to that effect will be written to ``System.err``.

An object of type ``IluServer`` has an accessor method ``serverId()`` that returns its server ID.

Look at the Java classes IluServer and IluPort for details. In general servers may be omitted and a default server is used. IluPort as well may be ommited.

ILU for Java reads the `ILU_DEFAULT_CINFO` environment variable for setting up default ports.

See the section Java Garbage Collection, Distributed Garbage Collection, and/or COLLECTIBLE for how to setting up the port used for implementing COLLECTIBLE objects.

#### Object Tables

Object tables are defined in the class IluObjectTable. To define an object table one subclasses ``IluObjectTable`` and attached the subclasses to an ``IluServer`` when the server is created. An ``IluObjectTable`` can only be attched to one ``IluServer``.

Because the Object Tables calls are made with internal ILU locks held, it must not do recursive calls into ILU.

### Threading and Event Loops

ILU uses Java threads. There is no event loop option.

It is possible to change thread priorities by setting properties at start up of the application. This is however not recommended.

A few arguments can be passed by setting "properties" on the thread. This is motivated by the java standard mapping which has no place to pass extra arguments.

However Java threads, if not subclassed do not support "properties". To set thread properties, calls need be performed from an xerox.ilu.IluServiceThread

### Custom Records

Record types can be subclassed. The subclass can register itself with the original (stub) class.

"Custom Records" class assign their own class to a (protected) java.lang.Class variable of the original stub class for the record. Whenever ILU needs to allocate an instance of such a record it will allocate a an instance of the subclass instead.

### Custom Surrogates

Surrogate creation can be intercepted. To do so one registers either a Java class, or, a factory object with the stub class implementing a object type. See the methods ``IluClassRep.setSurrClass`` or ``IluClassRep.setSurrFactory`` for details.

### String Binding Handle Formation

The class ``xerox.ilu.IluSBH`` provides methods for both scanning and composing string binding handles.

### Simple Binding

An object may be published using the simple binding service by calling the method
``xerox.ilu.IluSimpleBinding.publish()``.

An object may be unpublished by calling the method `xerox.ilu.IluSimpleBinding.withdraw()`.

A published ILU object may be obtained by calling ``xerox.ilu.IluSimpleBinding.lookup(sid, ih, cl)``, where sid is object's server's server ID, ih is the object's instance handle, and cl is its class.

As alternative to IluSimpleBinding, the ``resolve_initial_references`` method from org.omg.CORBA.ORB could be used.

### Principal Identities and Passports

Passport are represented in the class `IluPassport`. Identities are represented by the class `IluIdentity`. The class `IluIdentityType` represents the type of an identity. A passport can carry at most one IluIdentity of each `IluIdentityType`.

Client generated passports are mutable and stay alive until garbage collected. Clients tell ILU about their passports via the current thread which must be a subclass of IluServiceThread. The methods `IluServiceThread.setMyStubPassport` and `IluServiceThread.setStubPassport` can be used to set passports. For security reasons passports of other threads can not be set. (We need to rethink the possible threats). However it is possible to clear the passport of any thread (as this is only a denial of service attack).

ILU generated passports are immutable and can be used only while the call for which it has been constructed is ongoing. If used afterwards, an exception will be raised. For a client to access an Ilu generated passports, the method `IluPassport.getSkeletonPassport` is used.

These passport features are carried around fully, but since the api to create identities and identity type features are still missing, usefullness of passports is grossly limited.

## Building ILU for Java Applications

Please read the introductory section on "Java Administrativia Without ILU" first.

### Java Administrivia Without ILU

This section will be required knowledge when we explain how to do Java administrativia WITH ILU later.

The first time you see any of the standard Java tree structures you are bound to be overwhelmed. However, it is not that bad if you know some of the reasoning. If you have a good understanding of the Java system building concepts without ILU, you will tolerate Java with ILU much better.

The Java compiler takes Java sources and creates binaries, typically called class files. (Never mind, that the word "class" has as a meaning in the source domain as well).

The Java compiler conceptually copes with 4 file hierarchies.

1. Where it takes its source input from.
2. Where it takes its takes binaries of pre-compiled imported sources.
3. Where it stores compiled binaries.
4. Where it loads itself from.

Sad to say, Sun's documentation is not conceptually clean. The functionality is different when directories are specified as command line options or with environment variables. It feels to us as if Sun changes the behaviour with every Java release.

1. Java sources can be thought of as tree structured in the package domain. You may or may not assume that sources are stored in a similar directory nesting as the package nesting. This is not an important issue because the Java compiler lets users specify source files explicitly. (Unless you are working with very explicit `make` files, I recommend compiling multiple sources with one single compile command and letting the Java compiler worry about dependencies.)
2. Precompiled binaries or jar files can be found using the `-classpath` command line switch or the `CLASSPATH` environment variable. The semantics are different! The `-classpath` command line switch must be complete (including system binaries), but if the `CLASSPATH` environment variable is used, the standard binaries are automatically accessed. You can work either way, if you know the difference.

   Sadly to say with jdk1.2beta3 (but not jdk1.2beta2) using the `CLASSPATH`: classes defined by Sun are found before user defined classes, even if the CLASSPATH names the user defined class first. Using the `-classpath` command line switch however finds the classes in proper order (but you need to add the system classes to the path).

   In jdk1.2beta4 it is no more possible to replace "bootstrap" classes using `CLASSPATH` or `-classpath`. However a new `-Xbootclasspath` command line option allows (and is required) to treat ilu classes like "bootstrap" classes. This doesn't work right out the box; more later.

   Some experiments suggest that the compiler may also on the fly generate binaries when needed... We don't rely on this.

3. The most important `monkey wrench' to know about is where the compiled binaries are stored. The `-d` option allows one to specify a directory. In the absence of the `-d` option the compiler uses the working directory. With the `-d` option binaries are stored hierarchically in the destination directory, according to their package structure. Without the `-d` option binaries are stored directly in the curent working directory. Recommendation: Always use the `-d` option. If the `-d` option is not used some Java tools will not find the binaries... Don't get confused that "Hello World" programs can be compiled without `-d` option; real programs can't.
4. The compiler itself loads its own binaries from the `CLASSPATH` environment variable. Be warned, that is the same environment variable used to locate pre-compiled input sources.

To make matters worse:

- Compiling native methods needs a tool also called a stub generator. These "stubs" of course have nothing to do with what ILU calls "stubs".
- Does the javadoc tool read binaries or sources? I believe it uses the classpath terminology used to access sources. Note the difference to 2).
- The compiler generates more binary files than it takes input files!

#### Packages

What package to use ? Java ILU is deeply committed to give the choice to the application. (That is why the prefix package is optional).

An application programmer will face the decision whether the implementation for true object should be in the package designated for stubs, or in a package of its own. Both choices do make sense; ILU will work either way and doesn't make that decision for you. In general we expect most applications to prefer working in one single package. However we can imagine scenarios where for security reasons a stub could be trusted but a server object might not be trusted, or they'd be signed independently by different entities.

But please: Don't ever write Java code which is not in a package at all. You will end up putting it in a package later anyway. It will be much more work to do that later than to, at the very beginning, set up all your commands and files to work with a package.

#### Summary

We recommend a compiler usage by which the input, independent of its structure, is compiled into a hierarchical file structure depending from a directory called ``./classes'`.

We also recommend putting the ``./classes'` directory into the `CLASSPATH` so that the Java loader finds the compiled binaries. The ILU runtime is in the Java package ``xerox.ilu``. The primary interface is the class ``Ilu``.

With jdk1.2beta3 don't use `CLASSPATH` for output but use the `-classpath` command line argument. The problem is the same for both the "java" and the "javac" command.

With jdk1.2beta4 "bootclasses" can not be overwritten with the `CLASSPATH` environment variable or the `-classpath` command line argument. However, the standard "bootclasses" DO contain INCOMPATIBLE org.omg packages. You will have to use the new `-Xbootclasspath` option to treat ilu classes as "bootclasses".

This doesn't exactly work: There is a bug in jdk1.2beta4 which makes the loader for native code miss Ilu when Ilu is on the bootclass path; (The bootclass loader ignores LD_LIBRARY_PATH)

Two possible work arounds:

1) In a FUTURE jdk (NOT jdk1.2beta4) there might be a sun.boot.library.path property. This property need to include the ilu native binaries (in addition to the jre binaries) to make java find them, if Ilu is loaded with the bootclass loader.

Example:

java -Xbootclasspath:${ILUHOME}/lib/ilu.jar:${java-s-home}/jre/lib/rt.jar -Dsun.boot.library.path=${ILUHOME}/lib:${java-s-home}/jre/lib/sparc YourApplication

2) If your license allows this: Simply remove Suns version of the org.omg classes from the rt.jar file. Ilu then can be loaded with the standard class loader; this will completely avoid that bootclass loader bug.

### Stub Generation

To generate Java stubs from an ISL file, use the program `java-stubber`. Since the stubber creates a surprisingly large number of Java files, these files must be directed to a designated stub directory. For the same reason a file with a list of generated Java files is generated.

The stubber recognizes the following options or switches:

- -dir DIRECTORY PATH
  The stubs are generated into the directory specified by the DIRECTORY PATH argument. This command line option could direct the stubs into the working directory, but if omitted the default path is ``./javastubs'`.
- -xrx
  The Xerox PARC Java/ILU mapping is used for this interface. (See also -omg.)
- -omg
  More or less what we imagined OMG's mapping is is used for this interface. The main difference between -xrx and -omg option are the holder classes; we are working on eliminating this difference.
- -flat
  Generate all stubs into the designated stub directory directly. This is not recommended because files can be overwritten. The default behavior is to write stubs in subdirectories according to their interface names.
- -prefix PACKAGE_PREFIX
  Generates stubs into a package prefixed with the named PACKAGE_PREFIX.
- -noprefix
  Generates stubs without package prefix. Recommended for serious interfaces; NOT recommended for experimenting.
- -noserv
  Generates stubs which save a few bytes but can't be used on the true side.
- -reportfile REPORT-FILENAME
  Additional parameter for a file name. A list of generated Java files is generated. This list can be used to make makefiles, etc. -reportfile has no `suffix' version (see below).
- -noreport
  The list of generated Java files is not generated. -noreport has no `suffix' version (see below).
- -exsuffix
  Define a suffix used in the name of exceptions.

All command line options (unless if documented otherwise) have a second variant with a suffix "1". If the command line option with suffix is used, an extra argument for the name of an interface is read, and the option only affects that interface. The un-suffixed command line options affect all interfaces. Suffixed command line options override un-suffixed command line options. Option processing is from left to right.

The stubber can be run without arguments to generate a usage message.

#### Problems and Solutions

- Stubbing will create a very large number of files with the Java extension. You don't want to loose your source files among the generated stubs.
  We recommend creating a subdirectory called ``./javastubs/'`. All generated stubs should be generated into this directory. (This is the default; we do not recommend changes.) (As a safety measure) if a non-standard directory is used, the stubber does NOT create it automatically. Unlike the top level stub directory, sub directories are created automatically by the stubber.
- Stubs might have conflicting names.
  Generate stubs in a hierarchical directory structure, according to their Java package structure. (This is the default; we do not recommend changes.)
- Stubs might conflict with manually generated Java sources.
  1. Use good ILU interface names (Or OMG IDL module names). This is recommended for "production" ILU use.
  2. Direct the stubber to generate all stubs into a prefix package stubs. This is recommended for perusing non-well-known interfaces. Use the -prefix option to name a prefix.

#### Java Compilation

Unless you are using make files, we recommend stubbing into empty directories. This allows the Java compiler to compile all Java files with an asterisk syntax. Always use the -d option with the Java compiler!!!

In unix, the report file can be used to generate the list of files to be compiled. It can be used directly with a back-quote cat report-file back-quote syntax.

#### Execution

At execution time the loader needs to find

1. Your application and its regular imports (binaries; resp. classes). This is normal Java usage. Use the `CLASSPATH` environment variable.
2. Java binaries (classes) from generated stubs. There is nothing special here. Compile the stubs into whatever directory you want (e.g. ``./classes/'`) and put that directory on the `CLASSPATH` environment variable.
3. Java binaries (classes) from ILU runtime support. The classes binaries from the ILU runtime support are compiled into the jar file ``ILUHOME/lib/ilu.jar'`; put this file on your `CLASSPATH` environment variable. (Some of these files win the or.omg class conflict with corresponding implementations deliverd by Sun microsystems. Make sure Ilu's files are found first.)

   Java JDK 1.1.4 starts to garbage collect classes. (This class collection is too agressive, see below). ILU carefully stuffs data into static variables to prevent garbage collection. These two paradigms do not work nicely together. To prevent memory smashes, the -noclassgc switch is recommended whenever executing any Java program with jdk 1.1.4 and jdk 1.1.5 if it uses ILU.

   There is a known bug in JDK about collection of classes. Furthermore there is a Java language change for collection of classes planned. This language change will prevent collection of classes until their class loader is collected. ILU will become simpler once the language change is implemented.

   If your java system does not support jar files, the classes are compiled into ``ILUHOME/lib/javaclasses/'`. The reason for this non-standard place is the fact that some ILU developers believe the subdirectory ``./classes/'` should be reserved for some other purpose.

4. C binaries (object files) from ILU runtime support and kernel. The C binaries (object files) are accessed using the `LD_LIBRARY_PATH`. The path must have an entry pointing into the ILU Java runtime directory.

#### Debugging

Use of the standard ILU debugging environment variable `ILU_DEBUG` is recommended; please section Debugging ILU Programs.

Java ILU listens to a large number of Java command line switches. The simplest one is to set the -D command line option (e.g. -Dilu.debug=4). For more specialized command line switches look at the ``xerox.ilu.IluDebug.java`` file. Looking at the well documented source code is more relieble then duplicating the rather fast changing flags in the documentation.

Note that the -D option of the Java interpreter has no relationship whatsoever to the -d option of the Java compiler.

When using `dbx` or `gdb`: The standard Java binaries (classes) are found automaticly (without specification on the `CLASSPATH` environment variable) when not debugging. When debugging, those classes must be specified on the `CLASSPATH`. We don't understand this difference.

#### Debugging native ILU code

When setting break points with dbx or gdb it is necessary to make ilu wait first. Ilu supports the -Dilu.interactivewait=true property to add an extra interactive wait. For details look at the class xerox.ilu.IluInit2.

### Implementing an ILU module in Java

A Java program which wants to implement a object type T from interface `I` needs to create a class which implements the stubber-generated Java interface `I`. Objects of this class then are registered with the ILU runtime either implicitly or explicitly, or with an object table.

Explicit registration allows specification of additional parameters, like the string binding handle, the server, and more. Explicit registration done by calling the stubber generated method ``I.T_stub.registerTrueObject()``. As an alternative, if the programmer is willing to specify the class, he can also use the method ``xerox.ilu.Ilu.registerTrueObject`` directly.

Objects are implicitly registered with ILU if they are returned as a result value from a method call that returns an object type or has an object type as an INOUT or OUT parameter or if they are published using the Simple Binding mechanism.

### Hints about implicit registration

If objects are not registered but get auto-registered on use only there are two pitfalls to watch out for.

1. The ILU type must be unique. If no type is given ILU will look at the Java type and make its best possible guess about the ILU type.
2. The ILU type must be loaded. Unless the ILU type is loaded the registrar will never find that type. If there is any doubt about whether a stub implementing an ILU type is loaded or not, it might be useful to actually load the class. The ilu.load property can be used to load a class from external commands. The stubber also generates a special class whose sole purpose is to help load whatever is necessary for the registrar to not miss a class.

#### Implementation Inheritance

#### Exporting Objects

### Using an ILU module in Java

A client program may obtain a reference to an ILU object in one of the following ways:

1. True instance creation.
   The application may create an true instance of a class.
2. ``objectFromSBH()``
   Knowing the string binding handle sbh and class (or superclass) cl of an object, call ``xerox.ilu.Ilu.objectFromSBH(sbh, cl)`` which returns an instance of that class. For example, to obtain an instance of ISL type `square` from `INTERFACE shapes`, which has a string binding handle sbh, one would call ``xerox.ilu.Ilu.objectFromSBH(sbh, shapes.square)``.
3. ILU Simple Binding.
   Knowing the object ID (sid, ih) and class cl of an object that has been published using the simple binding service, call ``xerox.ilu.IluSimpleBinding.lookup(sid, ih, cl)`` which returns an instance of that class (or raises an exception if the lookup fails).
4. Return result or parameter.
   An instance may be received as a result value from a method call that returns an object type or has an object type as an `INOUT` or `OUT` parameter.

## Notes for ILU for Java in applets

Use of ILU in applets is not impossible, but it is not fully supported either. Currently, using of ILU in applets is only recommended for intranet usage but not for generic internet applications.

There are really three problems:

ILU for Java is not BINARY CORBA compatible. You can not receive arbitrary non ILU stubs and execute those onb top of Ilu. You have to set up your classpath so that ILU applications load ILU and not another orb. This is insofar problematic: If you want your browser to host refular corba applets and ilu using applets there is a class conflict problem. This conflict problem can be fixed by using (different) java-plugin, each set up with the class path appropriately.

ILU has native methods. That means Ilu must be loaded somewhere/somehow where native methods are supported. ILU has been loaded into Hotjava, java-plugin (Activator). This can be solved by loading ILU on the classpath, or by using signed signed applets. ILU also has been loaded into the regular Netscape 4.05 VM, but that needs special setup in the Ilu build process. (See Imakefile and source/runtime/java/IluMozillaExtra.java).

ILU does not support class unloading. ILU itself is quite security aware, but there are still some problems. In particular, there is a security problem if an applet loads malicious stubs and later another applet things these are correct stubs. To prevent class unloading, stubs should be in the same classloader as the ILU runtime: Either both signed and dynamic, or both on the classpath.

Very little testing of running ILU in a browser or a java-pluggin has been done. Set up your environment that stub classes will never be unloaded.

## Notes for Java on particular architectures

### Notes for Java on Windows

Please see the "Java" subsection of "Building ILU" in the chapter section Using ILU with Microsoft Windows.

### Notes for Java on Linux

Users of Linux Redhat 5.1 reported problems when Ilu was configured using the "poll" system call. The configuration option --with-java-nopoll can be used to force use of "select" instead "poll".

### Native threads versus green threads

Only unix supports green threads. Unless disabled, ilu will build both version and dynamicly tries to load whichever version works. Sadly we do not know how to determine whether java is using green threads or native threads. Sadly the native code of ilu is different in those two cases. Ilu simply tries one version, and, if it throws an exception Ilu tries the other version. (Never mind that the java vm doesn't throw exceptions bu crashes if tried in the wrong order)

### Java releases

The ilu build builds one version of binary ilu. However, the filenames for the binaries are distinct. It is possible to do one ilu build for jdk1.1 and one ilu build for jdk1.12beta... each in the same directory. This works because the by accident or design, the java classes for jdk 1.1 and jdk1.12beta are compatible. Ilu at runtime decides which version of the native libraries to load.

## ILU for Java Reference

The interface is rather large. This section will cover the most important classes but reading the standard javadoc documentation or reading the source will be more complete.

### javadoc documentation

javadoc is about the worst documentation package I have encountered sofar. Nevertheless, ILU java code contains javadoc tags. We think however that reading the source code might be easier then reading the javadoc output.

javadoc documentation: http://java.sun.com/products/jdk/javadoc/index.html

#### Bugs

The javadoc index is empty. For some reason javasoft prefers to document this bug instead of fixing it.

javadoc documents features which are not to be used by applications. This is an ILU problem as ILU declares many features public simply to make them available to stubs.

It would be nice if javadoc documentation would have links to the source code.

javadoc has problems handling files in a flat directory, but the java runtime now has been changed to use a hierarchical directory.

#### Build of the javadoc documentation

With jdk-1.1 you need to manually create an images subdirectory and copy the images. (Ask javasoft why). Since I don't know how to make the ilu build find the images, the build does not do the javadoc step automatically.

Another reason to not automatically build the javadoc documentation is that different users might want to or not include -package and -private features. The third reason for manual build is that some users might want to include standard packages into the same documentation build.

    # create a javadocs directory
    # we recommend using ILUHOME/doc/javadocs
    # (When making links, they might point to that directory)
    mkdir javadocs

    # Go to the java sources
    cd ILUSRC/runtime/java/jsrc

    # build the javadoc documentation into the javadocs directory
    javadoc -d javadocs xerox.basics xerox.ilu xerox.ilu.tools org.omg.CORBA org.omg.CORBA.portable org.omg.PortableServer

    # copy the javadoc images into the proper place (not necessary with jdk-1.2beta3)
    # (Substitute the source as you most likely have the images somewhere else...)
    cd javadocs; mkdir images; cd images; cp /project/java/jdk-1.1/docs/api/images/* .

### Description of Java classes

#### CORBA Exceptions

1. org.omg.CORBA.UserException
2. org.omg.CORBA.SystemException

1. org.omg.CORBA.BAD_CONTEXT
2. org.omg.CORBA.BAD_INV_ORDER
3. org.omg.CORBA.BAD_OPERATION
4. org.omg.CORBA.BAD_PARAM
5. org.omg.CORBA.BAD_TYPECODE
6. org.omg.CORBA.COMM_FAILURE
7. org.omg.CORBA.DATA_CONVERSION
8. org.omg.CORBA.FREE_MEM
9. org.omg.CORBA.IMP_LIMIT
10. org.omg.CORBA.INITIALIZE
11. org.omg.CORBA.INTERNAL
12. org.omg.CORBA.INTF_REPOS
13. org.omg.CORBA.INV_FLAG
14. org.omg.CORBA.INV_IDENT
15. org.omg.CORBA.INV_OBJREF
16. org.omg.CORBA.MARSHAL
17. org.omg.CORBA.NO_IMPLEMENT
18. org.omg.CORBA.NO_MEMORY
19. org.omg.CORBA.NO_PERMISSION
20. org.omg.CORBA.NO_RESOURCES
21. org.omg.CORBA.NO_RESPONSE
22. org.omg.CORBA.OBJ_ADAPTER
23. org.omg.CORBA.OBJECT_NOT_EXIST
24. org.omg.CORBA.PERSIST_STORE
25. org.omg.CORBA.TRANSACTIONREQUIRED
26. org.omg.CORBA.TRANSACTIONROLLEDBACK
27. org.omg.CORBA.TRANSIENT
28. org.omg.CORBA.UNKNOWN

#### Holder classes

A means to pass a CORBA things as a reference parameter. Holder classes are mutable.

1. org.omg.CORBA.AnyHolder
2. org.omg.CORBA.BooleanHolder
3. org.omg.CORBA.ByteHolder
4. org.omg.CORBA.CharHolder
5. org.omg.CORBA.DoubleHolder
6. org.omg.CORBA.FloatHolder
7. org.omg.CORBA.IntHolder
8. org.omg.CORBA.LongHolder
9. org.omg.CORBA.ObjectHolder
10. org.omg.CORBA.PrincipalHolder
11. org.omg.CORBA.ShortHolder
12. org.omg.CORBA.StringHolder
13. org.omg.CORBA.TypeCodeHolder

#### CORBA classes

Some of these corba classes do not completely correspond to the standard. The intend is that a the corba classes look and work like the standard classes as seen by client applications SOURCE code.

1. org.omg.CORBA.Any A skeleton class to achieve corba source compatibility

2. org.omg.CORBA.BOA I apologize, but I have no clue what a BOA is, or what it is for, or, whom it constricts. I'm implementing this to make Ilu look more compatible to CORBA...

3. org.omg.CORBA.CompletionStatus

4. org.omg.CORBA.CORBA_ObjectHelper The helper class for CORBA::Object

5. org.omg.CORBA.CORBA_ObjectStub For the implementation of CORBA::Object

6. org.omg.CORBA.portable.ObjectImpl CORBA (but not ilu) requires all true classes to inherit from this class.

7. org.omg.CORBA.Object CORBA::Object. (Not all ilu objects are corba objects!)

8. org.omg.CORBA.ORB Makes Ilu look like it were a CORBA ORB

   The way ``resolve_initial_references`` works:

   The argument is used as a key to access the ORB properties. (The ORB properties can be set either with init, or if not set default to the java system properties and, in case of applications it might read environment variables). The property is accessed; its value is supposed to be an ilu SBH. The object for this SBH is accessed and returned by resolve_initial_references.

   There is an extra twist: If the SBH string starts with "file:" that adds an extra level of indirection: Ilu will access the file and use the contents of the first line as the SBH instead.

   A typical start up using this feature coold look like this:

       org.omg.CORBA.ORB orb = ...
       org.omg.CORBA.Object objRef =
            orb.resolve_initial_references("NameService");
       org.omg.CosNaming.NamingContext ncRef = NamingContextHelper.narrow(objRef);

   When starting the application, the property can be set on the command line, for example:

   java -Dilu.load=org.omg.CosNaming._allJavaStubs:MyApplication._allJavaStubs -DNameService=IOR:000000000000002849444C3A6F6D672E6F72672F436F734E616D696E672F4E616D696E67436F6E746578743A312E300000000001494C55000000009A0001000000000092696C753A31332E322E3131362E33322E336461342E33343663396337302E312F31332E322E3131362E33322E336461342E33343663396337302E303B49444C2533416F6D672E6F7267253246436F734E616D696E672532464E616D696E67436F6E74657874253341312E303B73756E7270634073756E727063726D3D7463705F31332E322E3131362E33325F333439373700 startMyApplication

   or maybe

   java -Dilu.load=org.omg.CosNaming._allJavaStubs:MyApplication._allJavaStubs -DNameService=file:/tilde/yourName/fileName startMyApplication

   The above example loads the CosNaming stubs from the command line. The reason for this is to make sure that the stubs are actually loaded before orb.resolve_initial_references is called. Ilu requires types to be registered before an object of that type is read, otherwise the type information will be lost.

9. org.omg.CORBA.TypeCode

10. org.omg.CORBA.TCKind

#### Basic environment classes

These classes are public, but not necessarily considered part of ilu.

1. xerox.basics.Consumer0 A simple queue with a thread which consumes all elements provided. Class is public; used by ilu but not part of the ilu public api.

2. xerox.basics.Environment A simple means to access or specify the environment. Class is public; used by ilu but not part of the ilu public api.

   The command line flag interface to load additional classes looks usefull to ilu, but MUST NOT be used from ilu client applications directly. Ilu duplicates this functionality with an ilu.load property. The difference is the initialization order! The ilu.load property avoids bad initialization order loops.

3. xerox.basics.IntTab An IntTab is a hash table which associates int keys with objects.

4. xerox.basics.IntTabEnumerator For enumerating IntTab values

5. xerox.basics.Queue A simple queue class.

6. xerox.basics.NowhereStream A trivial OutputStream class

7. xerox.basics.NowhereWriter A trivial Writer class

8. xerox.basics.VMExtras

   Remembers objects; better then using static variables as VMExtras also deals with collecting classes.

   High priority thread introducing proper timeslicing into the Java vm.

#### ILU exceptions

1. xerox.ilu.IluSystemException
2. xerox.ilu.IluUserException

1. xerox.ilu.IluRuntimeError IluRuntimeError is a handy superclass of some exceptions. IluRuntimeError's do not need to be declared in the throws clause (and is actually a RuntimeException, not an error).

2. xerox.ilu.IluRuntimeException IluRuntimeException is super class of all IluRuntimeExceptions. RuntimeException's don't need catch phrases.

3. xerox.ilu.IluBadParameterException

4. xerox.ilu.IluCharacterRangeException
5. xerox.ilu.IluCustomMappingException
6. xerox.ilu.IluEnumerationRangeException
7. xerox.ilu.IluInconsistentCallException
8. xerox.ilu.IluInternalException
9. xerox.ilu.IluNoObjectException
10. xerox.ilu.IluUnexpectedException
11. xerox.ilu.IluUnionDiscriminantException

#### ILU public classes

1. xerox.ilu.types.float128 A class for 128 bit floats.

2. xerox.ilu.Ilu The top level public interface to Ilu

3. xerox.ilu.IluAny Ilu's concrete class to holdCORBA::ANY

4. xerox.ilu.IluBatcher An IluBatcher represents a batching scope. Calls made within a batching scope are batched by the ILU runtime.

5. xerox.ilu.IluClassRep This represents an ilu class

6. xerox.ilu.IluCustomMapping An ilu type which supports custom mapping needs to register an object of IluCustomMapping-type to perform the actual transformation.

7. xerox.ilu.IluDataSupport An object implementation can help ILU by remembering internal data.

8. xerox.ilu.IluDebug The api is private, but the the command line flag interface is of interest to ilu users.

9. xerox.ilu.IluEnvironment The api is private.

10. xerox.ilu.IluIdentity Representation for ilu_IdentityInfo

11. xerox.ilu.IluIdentityType Representation for ilu_IdentityType

12. xerox.ilu.IluIHProposer A true object can support this interface to help ilu in making up an instance handle if it should be registered without actual instance handle provided.

13. xerox.ilu.IluLifetimeArgs Keys to specify lifetime argumens of corba object

14. xerox.ilu.IluLifetimeForget Interface to specify lifetime argumens of ilu object

15. xerox.ilu.IluLifetimeRemember Interface to specify lifetime argumens of ilu object

16. xerox.ilu.IluObject Generic, client visible interface; super interface for all ilu objects.

17. xerox.ilu.IluObjectBase Base super class used for surrogate object implementation. Class is client visible. This might as well be used as base class for true objects, at the discretion of the programmer (of the true object's class). In fact it is HIGHLY RECOMMENDED to extend this class if possible.

18. xerox.ilu.IluObjectTable An object table gives the application the ability to create true objects upon presentation of an instance handle. This is used by the application to pass in to the creation of a true server. This must be subclassed to be useful.

19. xerox.ilu.IluPassport Representation for ilu_Passport.

20. xerox.ilu.IluPickle Representation of typed values

21. xerox.ilu.IluPort This is the Java representation of the concept ilu_Port. Server applications should create ports with the IluServer interface. However this interface provides additional methods to destroy ports.

22. xerox.ilu.IluRootObjectHelper Corba style "Helper" class for the ilu root object.

23. xerox.ilu.IluRT0 Top level class. However we recommend using xerox.ilu.Ilu for all features available in xerox.ilu.Ilu and want to keep xerox.ilu.IluRT0 easier to be changed.

24. xerox.ilu.IluSerializationContext An IluSerializationContext represents an instance of the serialization guarantee. An instance is with respect to a particular server and set of calls. The guarantee is that the server application code receives calls in the same order as the client application code makes them, except that calls made after a barrier call can start service before calls made before the same barrier call. A barrier call is one that raises a system exception whose completion status is MAYBE (in CORBA terms, which are not quite right to use here) or that raises the barrier error. The client may not issue any two of these calls concurrently. <p> The way for a client to associate an IluSerializationContext is to attach the IluSerializationContext to the thread. This works only from IluServiceThread-s.

25. xerox.ilu.IluSBH String binding handle access. Parsing or composing SBH's takes the arguments and builds and IluSBH structure. The desired information then can be accessed with accessor functions. Currently IluSBH structure are immutable, however you should not rely on this immutability: future releases may or may not make this type more lightweight, mutable, and the fields unprotected.

26. xerox.ilu.IluServantFinalizable A server object can implement this interface to request a call of iluServantFinalize on its real finalization time. Please no resurection or other fancy usage.

27. xerox.ilu.IluServer This is the Java representation of the an ilu_Server. Only true objects have their servers accessible to clients

28. xerox.ilu.IluServerRelocation Interface used for clients which need to initiate server relocates.

29. xerox.ilu.IluServiceThread Subclass for certain ILU threads. This class is used to be able to transmit extra environment or thread specific information between the ILU kernel and its application. Threads forked by ILU for serving skeleton methods do use this thread class. Applications optionally may use this thread class when requiring service from ILU. Application use is optional.

30. xerox.ilu.IluSimpleBinding Simple binding for ILU.

31. xerox.ilu.IluTransportInfo Transport information is useful to describe servers.

32. xerox.ilu.IluTypeCode For representation of types...

33. xerox.ilu.IluTypeKind For representation of types...

#### Internal or esoteric classes

No public client use allowed or expected. Either because class is private for stubs or because it is esoteric in nature. The source of these classes documents why no use is excpected.

1. xerox.ilu.tools.gnh
2. xerox.ilu.tools.japp

1. xerox.ilu.corba_ServantFinalizer
2. xerox.ilu.IluAlarmTech
3. xerox.ilu.IluCall
4. xerox.ilu.IluCallException
5. xerox.ilu.IluClassAccess
6. xerox.ilu.IluConstantValueKind
7. xerox.ilu.IluDebugHooks
8. xerox.ilu.IluDebugWriter
9. xerox.ilu.IluExceptionRep
10. xerox.ilu.IluFactory
11. xerox.ilu.IluGCClient
12. xerox.ilu.IluInit
13. xerox.ilu.IluInit2
14. xerox.ilu.IluIOFunctions
15. xerox.ilu.IluMethodArgRep
16. xerox.ilu.IluMethodRep
17. xerox.ilu.IluOInt
18. xerox.ilu.IluServerConnection
19. xerox.ilu.IluSkeleton
20. xerox.ilu.IluSystemExceptionBase
21. xerox.ilu.IluWPBase
22. xerox.ilu.IluSimpleErrors
23. xerox.ilu.IluSomeSystemException
24. xerox.ilu.IluSurrogateConnection
25. xerox.ilu.IluSurrogateObject
26. xerox.ilu.IluSystemException0
27. xerox.ilu.IluTypeRep
28. xerox.ilu.IluUnixIdentityType
29. xerox.ilu.IluUserExceptionBase

## Full Custom Mapping

Full custom mapping is the ability to externally specify how an isl type shall be mapped to java.

It is similar to custom records and custom objects, however there is no requirement for the custom mapped type to be a subtype of the regular mapping.

There is the restriction that custom mapping works only java object types; that means, the regular mapping of the ilu type needs to map into a java object type, as well as the custom mapped type must be a java object type.

Full custom mapping is used solely in one address space; communication ilu processes might not know about whether or how an ilu type is mapped in the other address space.

All stubs in one address space however must agree on the mapping of any ilu type.

Custom mapping is implemented using stubber options, however there needs to be runtime code which handles the conversion from and to the regular mapped object.

For full information, check the ILUSRC/examples/javaserial directory

#### Stubbing

When stubbing the custom mapping needs to be specified with an commandline option

    	-custom description-file-name

We are using a file to describe the custom mapping because the actual description too cumberson for command line options and must be set identical for all stubs accessing a custom mapped type.

The description file is a list of lines. Each line is either a comment, or, a custom mapping description for one type. Custom mapping description have five fields separated with white space.

1. 1) The name of the isl interface (which contains the isl type)
2. 2) The name of the isl type to be custom mapped
3. 3) The java class used to map the isl type into
4. 4) The java class which is used for holders
5. 5) If present: The name of a java class which will be loaded by the stub; this is the class which is expected to implement the transformations between wire type and custom type.

#### Runtime features

Tha java interface xerox.ilu.IluCustomMapping describes the functions necessary to implement the custom mapping.

An xerox.ilu.IluCustomMapping object must be registered with the helper class for the regularly mapped type using the static "_registerCustomMapping" method.

Custom mapped type and subclassing do interact whith each other: (Custom mapping works with what ilu calls static types.)

1. -When you receive a subclass of the static ilu-type; that subclass info gets lost
2. -Because of syntax checking you can not transmit a subclass of the static ilu-type, unless it also is a subclass of the java class. However in that case that case subclass'ness gets lost.
3. -when the static class of an argument is a superclass of something with custom mapping on receive: customness is lost and you receive the super class when transmit: syntax checking will not allow this unless custom class is also subclass of static class. (That case is already defined above: subclass'ness gets lost)

#### Transmitting arbitrary java objects

This application program defines a full custom mapping using the java type java.lang.Object. It furthermore uses java serialization to implement the runtime conversion.

The test program for the application program shows how to transmit arbitrary (though serializable) java objects.

For full information, check the ILUSRC/examples/javaserial directory

This application even transmits Java classes (byte codes) through ilu. Unlike RMI, the class itself is passed through ilu. We do not claim the simpler mechanism of RMI wouldn't be sufficient, but by specifying access of the byte codes we can better show the power of using full custom mapping.

Go to the previous, next section.