On Sep 22, 2005, at 10:39 PM, lin sun wrote:
Thanks again for the quick response and it is very helpful! Hope I
can get it working
any day soon!:-)
So I decided to redesign my test scenario based on your
recommendations:
1) Find a J2EE client and EJB sample that would work in geronimo
environment. Luckily,
I was able to get the MagicGball ear file deployed and the
MagicGball-client running in
the J2EE client container. I'd like to use this sample and modify it
so that the J2EE
client can communicate to EJBs via IIOP.
2) Customize the EJBs and make them available through Corba
3) Customize the client so that it can use the EJB through Corba
I followed your guildance below on No. 2 and No. 3 but I could not get
much further.
Could you please help?
To make ejbs available through Corba (as servers), you need to:
1. include a tss-link for each ejb in the openejb-plan to a tss bean
that is configured somewhere, such as the j2ee-server-corba-plan.xml
2. start the j2ee-server-corba-plan. The easiest way to do this is to
include and "include" element in your openejb plan:
<include>
<uri>org/apache/geronimo/ServerCORBA</uri>
</include>
I created the openejb-jar.xml file myself, since MagicGball didn't
have one.
I could not find much example on <tss-link>...so I assume I can put a
tss bean name like
"SSLClientCert" that is specified in the j2ee-server-corba-plan.xml.
Not sure if this
is correct, all I know is that the deployer didn't complain:-)
I put the <include>..</include> before the <enterprise-beans> but when
I tried to deploy
the ear file, the deployer complained that it expected a
<enterprise-beans> tag instead.
Can I just set the parentID to "org/apache/geronimo/ServerCORBA"
to reach the same
goal?
<?xml version="1.0" encoding="UTF-8"?>
<openejb-jar xmlns="http://www.openejb.org/xml/ns/openejb-jar"
configId="MagicGBall"
parentId="org/apache/geronimo/Server">
<include>
<uri>org/apache/geronimo/ServerCORBA</uri>
</include>
<enterprise-beans>
<session>
<ejb-name>MagicGBall</ejb-name>
<tss-link>SSLClientCert</tss-link>
</session>
</enterprise-beans>
</openejb-jar>
my apologies, this should be <import> not <include> <include> means
something very different and is not appropriate for ejb-jars. I don't
think you can use o/a/g/ServerCORBA as the parentId, the openejb
classes will be missing :-)
To use an ejb from a j2ee application (such as a j2ee app client, web
app, or ejb) you need to include in the geronimo/openejb plan ejb-ref
information like this:
I read Aaron's book on J2EE client application, and I didn't see
anywhere mentions
openejb-jar.xml, so I assume you mean geronimo-client.xml here?
yes. I don't think his book covers app-clients using corba yet though.
1. where the naming server is and the name
2. a css-link to supply the security info for csiv2 negotiation with
the server. A typical element might look like this:
<ejb-ref>
<ref-name>ejb/Control</ref-name>
<ns-corbaloc>corbaloc::<target name service
host>:<name
service port>/NameService</ns-corbaloc>
<name>targetEjbName</name>
<css-link>SSLClientCert</css-link>
</ejb-ref>
(fill in the correct values for the host and port)
I tried to modify the geronimo application client xml file provided by
MagicGball as
follows, but the deployer complained the ns-corbaloc, name, css-link
elements were not
allowed when I deployed the ear file.
This is the spec deployment descriptor, which you should not modify.
What you should do is write a geronimo application plan that includes
modules including the openejb-jar and a geronimo-app-client plan.
You are going to need to add security to both the client and ejb. For
the client, you need to supply a callback handler. The simplest
approach is to hardcode the info, either user-pw or certificate. I
think it will be easier to set up server security using user-pw: you
can just use the existing properties-login.
I think something faintly resembling this might work:
<application
xmlns="http://geronimo.apache.org/xml/ns/j2ee/application"
configId="org/acme/MagicGball"
parentId="org/apache/geronimo/Server">
<module>
<java>magicGball-client.jar</java>
<application-client
xmlns="http://geronimo.apache.org/xml/ns/j2ee/application-client"
configId="client"
clientConfigId="org/acme/MagicGBall/Client"
clientParentId="org/apache/geronimo/ClientCORBA">
<ejb-ref>
<ref-name>mGBall</ref-name>
<ns-corbaloc>corbaloc::localhost:1055/NameService</ns-corbaloc>
<name>MagicGBall</name>
<css-link>SSLClientPassword</css-link>
</ejb-ref>
<realm-name>geronimo-properties-realm</realm-name>
<callback-handler>org.acme.UPCallbackHandler</callback-handler>
</application-client>
</module>
<module>
<ejb>magicGball-ejb.jar</ejb>
<openejb-jar xmlns="http://www.openejb.org/xml/ns/openejb-jar"
configId="ejb"
parentId="org/apache/geronimo/Server">
<import>
<uri>org/apache/geronimo/ServerCORBA</uri>
</import>
<enterprise-beans>
<session>
<ejb-name>MagicGBall</ejb-name>
<tss-link>SSLClientPassword</tss-link>
</session>
</enterprise-beans>
</openejb-jar>
</module>
<security xmlns="http://geronimo.apache.org/xml/ns/security">
<default-principal realm-name="geronimo-properties-realm">
<principal
class="org.apache.geronimo.security.realm.providers.GeronimoUserPrincipa
l" name="system"/>
</default-principal>
<role-mappings>
<role role-name="User">
<realm realm-name="geronimo-properties-realm">
<principal
class="org.apache.geronimo.security.realm.providers.GeronimoUserPrincipa
l" name="system"/>
</realm>
</role>
</role-mappings>
</security>
</application>
There are probably plenty of mistakes here but this might be a starting
point.
<application-client xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/applicationclient_1_4.xsd"
version="1.4">
<display-name>Magic G Ball</display-name>
<ejb-ref>
<ejb-ref-name>mGball</ejb-ref-name>
<ejb-ref-type>Session</ejb-ref-type>
<home>org.acme.MagicGBallHome</home>
<remote>org.acme.MagicGBall</remote>
<ejb-link>magicGball-ejb.jar#MagicGBall</ejb-link>
<ns-corbaloc>corbaloc::localhost:1050/NameService</ns-corbaloc>
<name>MagicGBall</name>
<css-link>SSLClientCert</css-link>
</ejb-ref>
</application-client>
Deployer error:
E:\geronimo-1.0-SNAPSHOT\geronimo-1.0-SNAPSHOT>java -jar
bin\deployer.jar --user
system --password manager deploy
\build\geronimo\applications\magicGball\target
\magicGball.ear
Error: Unable to distribute magicGball.ear: Unable to parse
application-client.xml caused by Invalid deployment descriptor:
[error: cvc-complex-type.2.4b: Element not allowed:
[EMAIL PROTECTED]://java.sun.com/xml/ns/j2ee in element
[EMAIL PROTECTED]://java.sun.com/xml/ns/j2ee, error:
cvc-complex-type.2.4b: Element not allowed:
[EMAIL PROTECTED]://java.sun.com/xml/ns/j2ee in element
[EMAIL PROTECTED]://java.sun.com/xml/ns/j2ee, error:
cvc-complex-type.2.4b: Element not allowed:
[EMAIL PROTECTED]://java.sun.com/xml/ns/j2ee in element
[EMAIL PROTECTED]://java.sun.com/xml/ns/j2ee]
If your j2ee component is running in a server (it is a web app or
ejb),
you should include the ServerCORBA configuration as a parent, just
like
for a server ejb. If your j2ee component is an app client, which runs
in a different jvm, you should include the ClientCORBA configuration.
Unfortunately the clientCORBA configuration is still incomplete: you
need some security gbeans.
I think I need to change the ask(String question) method in
MagicGBallClient.java use
Corba. I am a bit lost here on what parm would ic.lookup() take?
Since I could have
define them via the ns-corbaloc tag.
//linsun: look up MagicGBallHome in the naming context
InitialContext ic = new InitialContext();
Object mgbObj =
ic.lookup("corbaname::localhost:1050/NameService");
you should look up the string java:comp/env/mGball just like in the
original, and specify the name server location in the geronimo plan.
//linsun: perform a safe downcast
MagicGBallHome home =
(MagicGBallHome)PortableRemoteObject.narrow(mgbObj,MagicGBallHome.class
);
you need to do this.
//from the original sample
MagicGBall mGball = home.create();
String answer = mGball.ask(question);
I think this part should be OK.
Finally, to use a ejb from a non-j2ee application through CORBA you
need to set up most of the infrastructure that the gbeans set up for
you: at least the Orb, the dynamic stub classloader, and some CSS
implementation. This last part is something no one has tried yet as
far as I know.
On the other hand, if you can find someone elses example of a
standalone non-j2ee client that accesses ejbs using csiv2 security
over
CORBA you should be able to communicate with those ejbs deployed in
geronimo. However, I've never seen such an example.
Gave up this approach--don't want to run into too much surprises!:-)
:-) there will be plenty of surprises anyway!
thanks
david jencks