-
1. Re: CORBA 2.0 friendly EJB
flitzie Nov 11, 2003 4:05 AM (in response to flitzie)Hello developers,
I managed to access an EJB with an CORBA 2.0 client successfully. I re-defined the IDL file for the client to marshall and demarshall the additional valuetype information.
For example:
typedef sequence Binary;
/*
// this is the original struct used in the EJB
struct TestBean {
long count;
string name;
Binary data;
};
*/
// struct for the client to unmarshall the boxed valutyped struct
struct getBoxedTestBean {
long ser;
string host;
string id;
long count;
string name;
Binary data;
};
// struct for the client to marshall a boxed valutyped struct
struct setBoxedTestBean {
long ser; // = 2147483394
string id; // = #pragma ID TestBean "RMI:ejb.corba.test.TestBean:84F24825D7BD12E9:07B7D087B58E218E"
long count;
string name;
Binary data;
};
I am not a CORBA ORB developer so I am asking me why does this work because the corba binarystream of an corba 2.0 and 2.3 client still differs? I want to understand the meaning of these additional valuetype information compared to non-valuetype. I read some CORBA Specs but I couldn't find any usefull information. It would be great if someone of you could post some links with detailed information about marshalling and demarshalling of valuetypes.
TIA
flitzie -
2. Re: CORBA 2.0 friendly EJB
reverbel Nov 13, 2003 12:28 PM (in response to flitzie)Hi,
> did anybody managed to write an CORBA-friendly EJB
> with complex types (IDL struct, sequences, ...) and
> accessed it with a CORBA 2.0 client?
The MICO distribution (www.mico.org) includes such an example, with the CORBA-friendly EJB being accessed by a C++ client.
> The problem is that IDL structs or sequences of
> CORBA-friendly EJB's are boxed as valuetypes. Is it
> possible to enforce JBoss/JacORB to use
> non-valuetyped binarystreams to communicate with
> clients?
No, as valuetype boxing is standardized behavior. The Java to IDL mapping specification defines that an IDL struct (or sequence) is mapped to a valuebox containing the IDL struct (or sequence).
The rationale for valuetype boxing is preserving the semantics of null parameters. Suppose that Foo is an IDL struct, and consider an IDL operation that takes a Foo parameter:
void myOperation(in Foo foo); // IDL
This operation must receive a Foo instance! CORBA/IDL semantics disallow you to pass some sort of null value instead of a Foo. In Java, if you try to pass the null reference when you invoke myOperation on a CORBA stub, you will get a client-side exception from the stub.
By contrast, consider a similar thing in Java. The following
method could appear in a Remote interface:
void myJavaOperation(Foo foo) throws RemoteException;
Here Foo is the Java class generated (by an IDL to Java translator) from the IDL struc Foo. The point to be noted is that that RMI semantics allow you to pass null to myJavaOperation.
So what would be the (reverse) mapping of myJavaOperation to IDL? I cannot be
void myJavaOperation(in Foo foo); // IDL
because this would rule out null as a valid paramete value.
The OMG-defined mapping is
void myJavaOperation(in ValueboxedFoo foo); // IDL
where ValueboxedFoo is a valuebox that contains a (possibly null) Foo instance. This standard mapping thus preserves the semantics of null parameters, at the expense of valueboxing complexity.
For a very good discussion of the forces that drove the Java to IDL mapping specification to its current state, see
http://www.iona.com/whitepapers/CORBA-EJB-Interoperability-WP-V00-02.pdf
Cheers,
Francisco -
3. Re: CORBA 2.0 friendly EJB
reverbel Nov 13, 2003 12:48 PM (in response to flitzie)> I managed to access an EJB with an CORBA 2.0 client
> successfully. I re-defined the IDL file for the
> client to marshall and demarshall the additional
> valuetype information.
There is no point in doing this. Just use IDL file that the rmic utility ("rmic -idl -noValueMethods") generates from the EJB interfaces and deal with the valueboxes that appear there. Dealing with these valueboxes might be a bit unpleasant, but is is better than twisting the actual IDL definitions.
In case you're doing the CORBA client in Java: Use idlj to translate to Java the IDL files with rmic-generated valuebox definitions, as JacORB's IDL compiler does not handle the "#pragma ID" directives these definitions contain. After you've generated your client-side stubs with idlj, you can (and should!) use jacorb.jar at runtime. The idlj-generated valuebox code and the JacORB library will work together with no problems.
Cheers,
Francisco -
4. Re: CORBA 2.0 friendly EJB
flitzie Nov 16, 2003 12:02 PM (in response to flitzie)Hi Reverbel
great thanks for your report about valuetypes and boxes, but this won't help me because I have a dynamic perl client and its orb doesn't support valuetypes. That's why I am looking for a solution accessing the EJB with the perl client. Due to the fact that you cannot create an CORBA-friendly EJB without valuetypes, the client has to marshall and demarshall the information transferd in a valuetyped binarystream. So I redefined the idls. But now I want to understand the meaning of additional information send in the binarystream during the orb communication. I want to find out chances and risks of this "workaround" for a product system.
TIA
flitzie