Go to the previous, next section.
Ilu 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'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: in particular the programmer needs to leave the stubber switches appropriately (the default values generate corba compatible stubs).
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
If ILU 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.
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).
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.
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.
To request creation of an object the
method is called. The implementation of createTrueObject
is expected to
call createTrueObject
to register the created object.
super.returnTrueObject
Each object exported by an implementation must belong to a true server,
an instance of the Java type IluServer
which is
implemented by the
class.
xerox.ilu.IluServer
An IluServer
instance can be created by calling the function
,
which returns a value of type ilu.createServer([serverID])
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
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 defaultServer
.
System.err
An object of type
has an accessor method
IluServer
that returns its server ID.
serverId()
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.
Object tables are defined in the class IluObjectTable. To define an
object table one subclasses
and attached the subclasses
to an IluObjectTable
when the server is created. An IluServer
can only
be attched to one IluObjectTable
.
IluServer
Because the Object Tables calls are made with internal ILU locks held, it must not do recursive calls into ILU.
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.
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.
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
or
IluClassRep.setSurrClass
for details.
IluClassRep.setSurrFactory
The class
provides methods for both scanning and composing
string binding handles.
xerox.ilu.IluSBH
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
,
where sid is object's server's server ID, ih
is the object's instance handle, and cl is its class.
xerox.ilu.IluSimpleBinding.lookup(sid, ih, cl)
As alternative to IluSimpleBinding, the
method from org.omg.CORBA.ORB could be used.
resolve_initial_references
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.
Please read the introductory section on "Java Administrativia Without ILU" first.
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.
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.
make
files, I recommend compiling multiple sources with one single
compile command and letting the Java compiler worry about
dependencies.)
-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.
Some experiments suggest that the compiler may also on the fly generate binaries when needed... We don't rely on this.
-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.
CLASSPATH
environment
variable. Be warned, that is the same environment variable used
to locate pre-compiled input sources.
To make matters worse:
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.
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
. The primary interface is the class xerox.ilu
.
Ilu
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:
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.
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.
CLASSPATH
environment variable.
CLASSPATH
environment variable.
CLASSPATH
environment variable.
Java JDK 1.1.4 starts to garbage collect classes. 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 if it uses ILU.
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.
LD_LIBRARY_PATH
. The path must have an entry pointing into the
ILU Java runtime directory.
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.default=4). For
more specialized command line switches look at the
file.
xerox.ilu.IluDebug.java
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.
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
. As an
alternative, if the programmer is willing to specify the class, he can
also use the method I.T_stub.registerTrueObject()
directly.
xerox.ilu.Ilu.registerTrueObject
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.
xerox.basics.Environment
class 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.
A client program may obtain a reference to an ILU object in one of the following ways:
objectFromSBH()
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)
.
xerox.ilu.IluSimpleBinding.lookup(sid,
ih, cl)
which returns an instance of that class
(or raises an exception if the lookup fails).
INOUT
or OUT
parameter.
Please see the "Java" subsection of "Building ILU" in the chapter section Using ILU with Microsoft Windows.
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 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
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.
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 # build the javadoc documentation into the javadocs directory # cd ILUSOURCE/runtime/java javadoc -d javadocs xerox.basics xerox.ilu xerox.ilu.types xerox.ilu.tools org.omg.CORBA *java # copy the javadoc images into the proper place # (Substitute the source as you most likely have the images somewhere else...) cd javadocs; mkdir images; cd images; cp /project/java/jdk-1.1.3-sgi/images/* .
A means to pass a CORBA things as a reference parameter. Holder classes are mutable.
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.
The way
works:
resolve_initial_references
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). 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.
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 -Dxerox.basics.Environment.load=org.omg.CosNaming._allJavaStubs:MyApplication._allJavaStubs -DNameService=IOR:000000000000002849444C3A6F6D672E6F72672F436F734E616D696E672F4E616D696E67436F6E746578743A312E300000000001494C55000000009A0001000000000092696C753A31332E322E3131362E33322E336461342E33343663396337302E312F31332E322E3131362E33322E336461342E33343663396337302E303B49444C2533416F6D672E6F7267253246436F734E616D696E672532464E616D696E67436F6E74657874253341312E303B73756E7270634073756E727063726D3D7463705F31332E322E3131362E33325F333439373700 startMyApplication
These classes are public, but not necessarily considered part of ilu.
Remembers objects; better thenstatics as VMExtras also deals with collecting classes.
High priority thread introducing proper timeslicing into the java vm.
xerox.ilu.IluBadParameterException
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.
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.
When stubbing the custom mapping needs to be specified with an commandline option
-custom description-file-nameWe 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.
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.)
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.
Look at the ILU application program .../examples/javaserial/
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.