blob: a28bc3d0990d8887a2a14754002fdf6a1f068ea0 [file] [log] [blame]
<html><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Deployment IDs</title><link href="default.css" rel="stylesheet"><link href="/images/favicon.ico" rel="SHORTCUT ICON"></head><body marginwidth="0" marginheight="0" leftmargin="0" bottommargin="0" topmargin="0" vlink="#6763a9" link="#6763a9" bgcolor="#ffffff"><a name="top"></a><table height="400" width="712" cellspacing="0" cellpadding="0" border="0"><tr><td bgcolor="#7270c2" align="left" valign="top" width="20"><img border="0" height="1" width="1" src="images/dotTrans.gif"></td><td bgcolor="#7270c2" align="left" valign="top" width="95"><img border="0" height="1" width="1" src="images/dotTrans.gif"></td><td align="left" valign="top" width="7"><img height="1" width="1" border="0" src="images/dotTrans.gif"></td><td align="left" valign="top" width="40"><img border="0" height="6" width="40" src="images/dotTrans.gif"></td><td bgcolor="#5A5CB8" align="left" valign="top" width="430"><img border="0" height="6" width="430" src="images/top_2.gif"></td><td bgcolor="#E24717" align="left" valign="top" width="120"><img src="images/top_3.gif" width="120" height="6" border="0"></td></tr><tr><td align="left" valign="top" bgcolor="#7270c2" width="20"><img height="1" width="1" border="0" src="images/dotTrans.gif"></td><td align="left" valign="top" bgcolor="#7270c2" width="95"><img height="1" width="1" border="0" src="images/dotTrans.gif"></td><td align="left" valign="top" bgcolor="#ffffff" width="7"></td><td align="left" valign="top" width="40"><img border="0" height="1" width="1" src="images/dotTrans.gif"></td><td align="left" valign="middle" width="430"><a href="faq.html"><span class="menuTopOff">[ f a q ]</span></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://wiki.codehaus.org/openejb"><span class="menuTopOff">[ w i k i ]</span></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://archive.openejb.codehaus.org/user/"><span class="menuTopOff">[ l i s t s ]</span></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://cvs.openejb.org/"><span class="menuTopOff">[ c v s ]</span></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://jira.codehaus.org/secure/BrowseProject.jspa?id=10401"><span class="menuTopOff">[ b u g s ]</span></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img border="0" height="2" width="1" src="images/dotTrans.gif"></td><td align="left" valign="top" height="20" width="120">&nbsp;</td></tr><tr><td align="left" valign="top" bgcolor="#7270c2" width="20"><img border="0" height="3" width="20" src="images/dotTrans.gif"></td><td align="left" valign="top" bgcolor="#7270c2" width="95"><img border="0" height="3" width="105" src="images/line_sm.gif"></td><td align="left" valign="top" bgcolor="#a9a5de" width="7"><img border="0" height="3" width="7" src="images/line_sm.gif"></td><td align="left" valign="top" width="40"><img border="0" height="3" width="40" src="images/line_light.gif"></td><td align="left" valign="top" width="430"><img border="0" height="3" width="430" src="images/line_light.gif"></td><td align="left" valign="top" width="120"><img height="1" width="1" border="0" src="images/dotTrans.gif"></td></tr><tr><td align="left" valign="top" bgcolor="#7270c2"><img border="0" height="10" width="20" src="images/dotTrans.gif"></td><td align="left" valign="top" bgcolor="#7270c2" width="95"><img border="0" height="2" width="1" src="images/dotTrans.gif"><br><table cellspacing="0" cellpadding="0" border="0"><tr><td align="left" valign="top"><span class="subMenuOn">Main</span></td></tr><tr><td align="left" valign="top"><a href="index.html"><span class="subMenuOff">&nbsp;&nbsp;&nbsp;
Welcome!</span></a></td></tr><tr><td align="left" valign="top"><a href="download.html"><span class="subMenuOff">&nbsp;&nbsp;&nbsp;
Download</span></a></td></tr><tr><td align="left" valign="top"><a href="lists.html"><span class="subMenuOff">&nbsp;&nbsp;&nbsp;
Mailing Lists</span></a></td></tr><tr><td align="left" valign="top"><a href="cvs.html"><span class="subMenuOff">&nbsp;&nbsp;&nbsp;
Source Code</span></a></td></tr><tr><td align="left" valign="top"><a href="contributors.html"><span class="subMenuOff">&nbsp;&nbsp;&nbsp;
The Team</span></a></td></tr><tr><td align="left" valign="top"><a href="status.html"><span class="subMenuOff">&nbsp;&nbsp;&nbsp;
Status</span></a></td></tr></table><table cellspacing="0" cellpadding="0" border="0"><tr><td align="left" valign="top"><span class="subMenuOn">Users</span></td></tr><tr><td align="left" valign="top"><a href="quickstart.html"><span class="subMenuOff">&nbsp;&nbsp;&nbsp;
Quickstart</span></a></td></tr><tr><td align="left" valign="top"><a href="hello-world.html"><span class="subMenuOff">&nbsp;&nbsp;&nbsp;
Hello World!</span></a></td></tr><tr><td align="left" valign="top"><a href="cmp_entity_postgresql.html"><span class="subMenuOff">&nbsp;&nbsp;&nbsp;
CMP Example</span></a></td></tr><tr><td align="left" valign="top"><a href="cmp_guide.html"><span class="subMenuOff">&nbsp;&nbsp;&nbsp;
CMP Guide</span></a></td></tr><tr><td align="left" valign="top"><a href="deploy.html"><span class="subMenuOff">&nbsp;&nbsp;&nbsp;
Deploy</span></a></td></tr><tr><td align="left" valign="top"><a href="start-command.html"><span class="subMenuOff">&nbsp;&nbsp;&nbsp;
Startup</span></a></td></tr><tr><td align="left" valign="top"><a href="validate.html"><span class="subMenuOff">&nbsp;&nbsp;&nbsp;
Validation</span></a></td></tr><tr><td align="left" valign="top"><a href="config_containers.html"><span class="subMenuOff">&nbsp;&nbsp;&nbsp;
Configuration</span></a></td></tr><tr><td align="left" valign="top"><a href="properties.html"><span class="subMenuOff">&nbsp;&nbsp;&nbsp;
Properties</span></a></td></tr></table><table cellspacing="0" cellpadding="0" border="0"><tr><td align="left" valign="top"><span class="subMenuOn">Servers</span></td></tr><tr><td align="left" valign="top"><a href="embedded.html"><span class="subMenuOff">&nbsp;&nbsp;&nbsp;
Local Server</span></a></td></tr><tr><td align="left" valign="top"><a href="remote-server.html"><span class="subMenuOff">&nbsp;&nbsp;&nbsp;
Remote Server</span></a></td></tr><tr><td align="left" valign="top"><a href="tomcat.html"><span class="subMenuOff">&nbsp;&nbsp;&nbsp;
Tomcat</span></a></td></tr><tr><td align="left" valign="top"><a href="geronimo.html"><span class="subMenuOff">&nbsp;&nbsp;&nbsp;
Geronimo</span></a></td></tr></table><table cellspacing="0" cellpadding="0" border="0"><tr><td align="left" valign="top"><span class="subMenuOn">Integrators</span></td></tr><tr><td align="left" valign="top"><a href="whyopenejb.html"><span class="subMenuOff">&nbsp;&nbsp;&nbsp;
Why OpenEJB</span></a></td></tr><tr><td align="left" valign="top"><a href="containersystem.html"><span class="subMenuOff">&nbsp;&nbsp;&nbsp;
Overview</span></a></td></tr><tr><td align="left" valign="top"><a href="design_openejb.html"><span class="subMenuOff">&nbsp;&nbsp;&nbsp;
Design</span></a></td></tr><tr><td align="left" valign="top"><a href="OpenEJB_presentaion.ppt"><span class="subMenuOff">&nbsp;&nbsp;&nbsp;
Presentation</span></a></td></tr></table><img border="0" height="15" width="1" src="images/dotTrans.gif"><br><img border="0" height="3" width="105" src="images/line_sm.gif"><br><A href="http://codehaus.org"><IMG alt="The Codehaus" border="0" height="17" width="88" src="http://www.openejb.org/codehaus-smaller.png"></A></td><td align="left" valign="top" bgcolor="#a9a5de" width="7">&nbsp;</td><td align="left" valign="top" width="40">&nbsp;</td><td valign="top" width="430" rowspan="4"><table width="430" cellspacing="0" cellpadding="0" border="0" rows="2" cols="1"><tr><td align="left" valign="top"><br><img width="200" vspace="0" src="./images/logo_ejb2.gif" hspace="0" height="55" border="0"><br><img src="images/dotTrans.gif" hspace="0" height="7" border="0"><br><span class="pageTitle">Deployment IDs</span><br><img src="images/dotTrans.gif" hspace="0" height="1" border="0"></td></tr></table><p></p><p></p><br><span class="toc"><a href="#definition">What is a Deployment ID?</a><br></span><span class="toc"><a href="#usage">How is it used?</a><br></span><span class="toc"><img border="0" height="1" width="15" src="images/dotTrans.gif"><a href="#usage.containersystem">In the container system</a><br></span><span class="toc"><img border="0" height="1" width="15" src="images/dotTrans.gif"><a href="#usage.local.server">In the Local Server</a><br></span><span class="toc"><img border="0" height="1" width="15" src="images/dotTrans.gif"><a href="#usage.remote.server">In the Remote Server</a><br></span><span class="toc"><img border="0" height="1" width="15" src="images/dotTrans.gif"><a href="#usage.corba.adapter">In the CORBA Adapter</a><br></span><span class="toc"><a href="#duplicates">What happens if there is a duplicate deployment ID?</a><br></span><br><a name="definition"><h2>What is a Deployment ID?</h2></a>
<p><span class="bodyBlack">
Every bean deployed in OpenEJB has a unique deployment-id that identifies it
within the scope of the entire container system. The server and container system
refer beans at run-time using the bean's deployment id.
</span></p>
<p><span class="bodyBlack">
This deployment id is much like the &lt;ejb-name&gt; element of the ejb-jar.xml
, with one very important difference. The &lt;ejb-name&gt; is only required to be
unique within the scope of the ejb-jar.xml in the bean's jar. The deployment id is
required to be unique across all beans and jars in OpenEJB. This is a subtle, but
important, distinction.
</span></p>
<p><span class="bodyBlack">
Remember that the EJB specification was designed so that enterprise beans could be
create, packaged, and sold by vendors (EJB Providers). Furthermore, users should be able
to buy a packaged set of beans (a jar with an ejb-jar.xml in it) and deploy it into an
EJB Container without modification.
</span></p>
<p><span class="bodyBlack">
Let's consider this, what happens if two vendors each sell a package (jar)
that contains a bean with the &lt;ejb-name&gt; PurchaseOrder? Both are completely different
in terms functionality and are different beans in every other respect. The EJB spec says, this
is fine, ejb-names only have to unique within the jar and that jar's ejb-jar.xml file. It's
redictulous to excpect EJB Providers to call each other up and ask, "Are you already using the
name 'PurchaseOrder' in your jar?" Remember that the EJB specification was designed so that enterprise beans could be
create, packaged, and sold by vendors (EJB Providers). Furthermore, users should be able
to buy a packaged set of beans (a jar with an ejb-jar.xml in it) and deploy it into an
EJB Container without modification. This is all fine and dandy, but it still leaves it up
to the EJB Container/Server providers to settle the difference.
</span></p>
<p><span class="bodyBlack">
OpenEJB solves this with the OpenEJB-specific deployment id. By requiring that
each bean deployed into OpenEJB has a unique name, we can guarantee that we are always
refering to the right bean at all times. Futhermore, it allows you to deploy
different versions of the same package several times in the same container system, each
time giving the beans new deployment ids.
</span></p>
<p><span class="bodyBlack">
If you're lazy --as any truly great programmer should be-- and don't want to type
a deployment id for each bean every time you deploy a jar, you can use the
<a href="deploy.html#usage.-D">-D option</a> of the Deploy Tool. This will throw caution
to the wind, and automatically assign the bean's ejb-name as the value of the bean's
OpenEJB deployment id. This leaves up to you to guarantee that bean's ejb-name will be
unique across all beans and jars in the container system. In other words, be very careful
with the -D option!
</span></p>
<a name="usage"><h2>How is it used?</h2></a>
<a name="usage.containersystem"><h3>In the container system</h3></a>
<p><span class="bodyBlack">
In the container system, the deployment id is used to undex the bean in a system-wide
registry. This registry is refered to on every call made in the container system. Being
able to safely hash and cache bean information by id is a must. This stresses the importance
of unique ids for every bean deployed in OpenEJB.
</span></p>
<a name="usage.local.server"><h3>In the Local Server</h3></a>
<p><span class="bodyBlack">
The <a href="spec.html#intravm.server">Local (IntraVM) Server</a> is an integral part of
the container system and the two are, in many ways, inseparable. The Local Server takes
care of all bean to bean and client to bean invocations made inside the virtual machine.
For this reason, it often refered to as the IntraVM Server.
</span></p>
<p><span class="bodyBlack">
For bean to bean communications, the Local Server must create a JNDI namespace (JNDI ENC)
for each bean as defined by the bean's &lt;env-entry&gt;, &lt;ejb-ref&gt;, and &lt;resource-ref&gt; elements
of the bean's ejb-jar.xml file. Every bean litterally gets its very own JNDI namespace.
When a bean makes a JNDI call, the Local Server intercepts this call and uses the
deployment id of the calling bean to retreive that bean's private JNDI namespace from the
container system's index. The Local Server then carries out the lookup on that bean's
namespace.
</span></p>
<p><span class="bodyBlack">
All non-bean clients share one big global namespace. Since non-bean clients are not
deployed and do not have a deployment descriptor like an ejb-jar.xml, the Local Server is
unable to taylor a namespace for each non-bean client as it can for bean clients. The Local
server cannot identify non-bean clients as they have no deployment id. All JNDI calls made
by clients that the Local Server cannot identify go to the public, global namespace. The
public, global JNDI namespace contains all beans and resources in the container system.
name.
</span></p>
<p><span class="bodyBlack">
Each bean is added to the public, global namespace using it's deployment id as its JNDI
lookup. For example, if a bean had a deployment-id of "/my/bean/foo", a non-bean
client could lookup that bean as follows.
</span></p>
<p><span class="bodyBlack">
<table width="440" cellspacing="0" cellpadding="0" border="0"><tr><td bgcolor="#c0c0c0"><i><span class="code-title">c:\my\app\MyAppClient.java</span></i></td></tr><tr><td bgcolor="#e0e0e0"><span class="code-block"><pre>
...
Object bean = initialContext.lookup("/my/bean/Foo");
...
</pre></span></td></tr></table>
</span></p>
<p><span class="bodyBlack">
If a bean in the container system made the above JNDI call, the Local Server would see
the bean's identity (deployment id) hidden in the Thread, go get the bean's private JNDI
namespace and finish the lookup on that. Since all names in bean's JNDI namespace are
required start with "java:comp/env", the lookup would fail and the bean would receive a
javax.naming.NameNotFoundException.
</span></p>
<p><span class="bodyBlack">
In short...
</span></p>
<p><span class="bodyBlack">
For beans:
<table cellspacing="2" cellpadding="2" border="0"><tr><td height="5" colspan="2"></td></tr><span class="bodyGrey">
<tr><td width="10" valign="top" align="left"><img src="images/grayDot.gif"></td><td valign="top" align="left"><span class="bodyBlack">Each bean has it's own private, personalized JNDI namespace</span></td></tr>
<tr><td width="10" valign="top" align="left"><img src="images/grayDot.gif"></td><td valign="top" align="left"><span class="bodyBlack">The names in it are the same names it uses in its ejb-jar.xml</span></td></tr>
<tr><td width="10" valign="top" align="left"><img src="images/grayDot.gif"></td><td valign="top" align="left"><span class="bodyBlack">Beans can only access their private namespace, period</span></td></tr>
</span></table>
</span></p>
<p><span class="bodyBlack">
For non-beans (everyone else):
<table cellspacing="2" cellpadding="2" border="0"><tr><td height="5" colspan="2"></td></tr><span class="bodyGrey">
<tr><td width="10" valign="top" align="left"><img src="images/grayDot.gif"></td><td valign="top" align="left"><span class="bodyBlack">Non-bean clients share the public, global JNDI namespace</span></td></tr>
<tr><td width="10" valign="top" align="left"><img src="images/grayDot.gif"></td><td valign="top" align="left"><span class="bodyBlack">The names in it are the deployment ids of all the beans</span></td></tr>
<tr><td width="10" valign="top" align="left"><img src="images/grayDot.gif"></td><td valign="top" align="left"><span class="bodyBlack">Non-bean clients can only access the one global namespace</span></td></tr>
</span></table>
</span></p>
<a name="usage.remote.server"><h3>In the Remote Server</h3></a>
<p><span class="bodyBlack">
The Remote Server has a public, global namespace just as the Local Server does. The
difference being that the Remote Server only serves clients outside the container system
and outside the virtual machine. So, all clients from the perspective of the Remote Server
are non-bean clients. As a result, the Remote Server only has the one public, global
JNDI namespace. Just as in the Local Server, the names in this namespacse consist of the
deployment ids of the beans in the container system.
</span></p>
<p><span class="bodyBlack">
Just as before, clients can lookup beans from the Remote Server using the bean's
deployment id. For example, if a bean had a deployment-id of "/my/bean/foo", a
client could lookup that bean as follows.
</span></p>
<p><span class="bodyBlack">
<table width="440" cellspacing="0" cellpadding="0" border="0"><tr><td bgcolor="#c0c0c0"><i><span class="code-title">c:\my\app\MyAppClient.java</span></i></td></tr><tr><td bgcolor="#e0e0e0"><span class="code-block"><pre>
...
Object bean = initialContext.lookup("/my/bean/Foo");
...
</pre></span></td></tr></table>
</span></p>
<a name="usage.corba.adapter"><h3>In the CORBA Adapter</h3></a>
<p><span class="bodyBlack">
The CORBA Adapter is separate than the Remote Server. It adapts the OpenEJB
Container System and the Local Server into <a href="http://openorb.sf.net">OpenORB</a>
as an embedded library. It provides users of <a href="http://openorb.sf.net">OpenORB</a>
the ability to lookup and execute beans (EJBs) via the RMI-IIOP protocol. All the
EJBHome and EJBObject interfaces of beans in OpenEJB are implemented by OpenORB as CORBA
stubs and ties.
</span></p>
<p><span class="bodyBlack">
The beans are exported into OpenORB's naming service by deployment id. So, just as with the
Local Server and Remote Server, clients can lookup beans using the bean's deployment id.
OpenORB has a JNDI implementation of their naming service, so lookups can be done just as
before.
</span></p>
<p><span class="bodyBlack">
<table width="440" cellspacing="0" cellpadding="0" border="0"><tr><td bgcolor="#c0c0c0"><i><span class="code-title">c:\my\app\MyAppClient.java</span></i></td></tr><tr><td bgcolor="#e0e0e0"><span class="code-block"><pre>
...
Object bean = initialContext.lookup("/my/bean/Foo");
...
</pre></span></td></tr></table>
</span></p>
<p><span class="bodyBlack">
CORBA clients can also access beans in OpenEJB as CORBA objects. These can be
looked up from OpenORB's naming service (CosNaming) as follows.
</span></p>
<p><span class="bodyBlack">
<table width="440" cellspacing="0" cellpadding="0" border="0"><tr><td bgcolor="#c0c0c0"><i><span class="code-title">c:\my\app\MyCorbaAppClient.java</span></i></td></tr><tr><td bgcolor="#e0e0e0"><span class="code-block"><pre>
...
String[] args = ...
<span class="code-comment">// The ORB and Object</span>
org.omg.CORBA.ORB orb = null;
org.omg.CORBA.Object bean = null.
<span class="code-comment">// The Naming Service and Object Name</span>
org.omg.CosNaming.NamingContext context = null;
org.omg.CosNaming.NameComponent[] name = null;
<span class="code-comment">// Get the ORB</span>
orb = org.omg.CORBA.ORB.init( args, null );
<span class="code-comment">// Get the Naming Service </span>
org.omg.CORBA.Object ref = null;
ref = orb.resolve_initial_references("NameService");
context = org.omg.CosNaming.NamingContextHelper.narrow( ref );
<span class="code-comment">// Get the Name as a component
// Note: the string is the bean's deployment id </span>
name = new org.omg.CosNaming.NameComponent[ 1 ];
name[0] = new org.omg.CosNaming.NameComponent("/my/bean/foo","");
<span class="code-comment">// Finally, get the bean as a CORBA object
// Equvalent to an InitialContext.lookup("/my/bean/foo");</span>
bean = context.resolve( name );
...
</pre></span></td></tr></table>
</span></p>
<a name="duplicates"><h2>What happens if there is a duplicate deployment ID?</h2></a>
<p><span class="bodyBlack">
The deployment ID uniquely identifies the bean in the
OpenEJB container system. Therefore, no two beans can share the same
deployment ID.
</span></p>
<p><span class="bodyBlack">
If a bean attempts to use a deployment ID that is already in
use by another bean, the second bean and all beans in it's jar
will not be loaded. In addition, the system will log a warning
like the following one asking you to redeploy the jar and choose
an different deployment ID for the bean.
</span></p>
<p><span class="bodyBlack">
<table width="440" cellspacing="0" cellpadding="0" border="0"><tr><td bgcolor="#c0c0c0"><i><span class="code-title">c:\openejb\openejb.log</span></i></td></tr><tr><td bgcolor="#e0e0e0"><span class="code-block"><pre>
WARN : Jar C:\openejb\beans\fooEjbs.jar cannot be loaded. The
Deployment ID "/my/bean/foo" is already in use. Please redeploy
this jar and assign a different deployment ID to the bean with
the ejb-name "FooBean".
</pre></span></td></tr></table>
</span></p>
<p><span class="bodyBlack">
For example, the acmeEjbs.jar contains a bean with the ejb-name
"DaffyDuckBean". The disneyEjbs.jar contains contains a bean with
the ejb-name "DonaldDuckBean".
</span></p>
<p><span class="bodyBlack">
We deploy the acmeEjbs.jar and give the "DaffyDuckBean" the
deployment ID of "/my/favorite/duck". Sometime afterwards,
we deploy the disneyEjbs.jar and assign the "DonaldDuckBean"
the deployment ID "/my/favorite/duck", having forgotten that
we already gave that unique ID to the "DaffyDuckBean" in the
acmeEjbs.jar.
</span></p>
<p><span class="bodyBlack">
When the container system is started, the system will begin
loading all the beans one jar at a time. It will first load the
acmeEjbs.jar and index each bean by deployment ID. But, when the
system reaches the disneyEjbs.jar, it will discover that it cannot
index the "DonaldDuckBean" using the deployment ID "/my/favorite/duck"
because that index is already taken.
</span></p>
<p><span class="bodyBlack">
The system cannot load the "DonaldDuckBean" and must also ignore
the rest of the beans in the disneyEjbs.jar as they may need the
"DonaldDuckBean" bean to function properly. The disneyEjbs.jar
is skipped and the following warning is logged.
</span></p>
<p><span class="bodyBlack">
<table width="440" cellspacing="0" cellpadding="0" border="0"><tr><td bgcolor="#c0c0c0"><i><span class="code-title">c:\openejb\openejb.log</span></i></td></tr><tr><td bgcolor="#e0e0e0"><span class="code-block"><pre>
WARN : Jar C:\openejb\beans\disneyEjbs.jar cannot be loaded. The
Deployment ID "/my/favorite/duck" is already in use. Please redeploy
this jar and assign a different deployment ID to the bean with
the ejb-name "DonaldDuckBean".
</pre></span></td></tr></table>
</span></p>
</td><td align="left" valign="top" height="5" width="120">
&nbsp;
</td></tr><tr height="5"><td align="left" valign="top" bgcolor="#7270c2" height="5" width="20">&nbsp;</td><td valign="top" bgcolor="#7270c2" height="5" width="95">&nbsp;</td><td align="left" valign="top" bgcolor="#a9a5de" height="5" width="7">&nbsp;</td><td align="left" valign="top" height="5" width="40">&nbsp;</td><td align="left" valign="top" height="5" width="120">&nbsp;</td></tr><tr><td align="left" valign="top" bgcolor="#7270c2" height="5" width="20">&nbsp;</td><td align="left" valign="top" bgcolor="#7270c2" width="95">&nbsp;</td><td align="left" valign="top" bgcolor="#a9a5de" width="7"><img border="0" height="25" width="1" src="images/dotTrans.gif"></td><td align="left" valign="top" width="40"><img border="0" height="25" width="1" src="images/dotTrans.gif"></td><td align="left" valign="top" width="120">&nbsp;</td></tr><tr height="5"><td align="left" valign="bottom" bgcolor="#7270c2" height="100%" rowspan="2" width="20"><img border="0" height="125" width="20" src="images/stripes1.gif"></td><td align="left" valign="bottom" bgcolor="#7270c2" height="100%" rowspan="2" width="95"><img border="0" height="125" width="105" src="images/stripe105.gif"></td><td align="left" valign="top" bgcolor="#a9a5de" height="100%" rowspan="2" width="7">&nbsp;</td><td align="left" valign="top" height="100%" width="40">&nbsp;</td><td align="left" valign="top" height="100%" width="120">&nbsp;</td></tr><tr height="5"><td align="left" valign="top" height="25" width="40">&nbsp;</td><td align="left" valign="bottom" height="25" width="430"><br><br><img height="3" width="430" border="0" src="images/line_light.gif"><br><p></p><span class="bodyGrey"><small><notice>
OpenEJB is a trademark of the OpenEJB Group.
Java, EJB, JDBC, JNDI, JTA, Sun, Sun Microsystems are trademarks or registered
trademarks of Sun Microsystems, Inc. in the United States and in other
countries. XML, XML Schema, XSLT and related standards are trademarks or registered
trademarks of MIT, INRIA, Keio or others, and a product of the World Wide Web
Consortium. All other product names mentioned herein are trademarks of their respective
owners.
</notice><br>&nbsp;<br></small></span><p></p>
&nbsp;
</td><td align="left" valign="top" height="25" width="120">&nbsp;</td></tr></table></body></html>