= App Clients and JNDI
:index-group: Unrevised
:jbake-date: 2018-12-05
:jbake-type: page
:jbake-status: published

There are some slight differences between the way OpenEJB
does app clients and the way Geronimo does app clients

Neither uses the names created via the openejb.jndiname.format. So
changing that will (should) have no affect. The idea is that users
should be able to set it to be whatever they want it to be and that
should not break the App Client code. The openejb.jndiname.format is
specifically for "plain" clients and allows them to get the names as
they want them.

Internally, we bind each EJB proxy under essentially a hardcoded and
predictable format and then again using the user supplied format. So
there are at minimum two JNDI trees with every EJB proxy. It used to be
two at least. Now we have quite a few because of Java EE 6 global JNDI
and the support we added for `@LocalClient` and allowing the same
interface to be used as both `@Local` and `@Remote`.

Basically we have:

* openejb/Deployment/<hardcoded internal format>
* openejb/local/<strategy format>
* openejb/remote/<strategy format>

The 'openejb/Deployment' section is the non-changing fully qualified
name for use internally and by app clients.

The 'openejb/remote' section is for "pretty" names looked up via plain
clients using the RemoteInitialContextFactory. The protocol can tell
the difference between app clients and plain clients and knows which
area to look in.

The 'openejb/local' section is for "pretty" names looked up via the
LocalInitialContextFactory.

The "pretty" names are defined by the openejb.jndiname.format and since
the user has control of that formatting it's possible that not all
proxies can be bound. Say the bean has both a local and remote
interface and the user has just "\{deploymentId}" or "\{ejbName}" as the
format. Hence, those bind calls use the "optional" set of binding
methods.

The format of the internal names bound into openejb/Deployment is
guaranteed to be unique. It's not pretty to look at obviously, but
every possible proxy will be bound there guaranteed. For binding into
'openejb/Deployment' we don't use the "optional" set of binding methods.
If something can't be bound it's a deployment issue.

The home interface is bound, but with the name of the corresponding
business interface rather than the home interface. 

To be a little bit more clear - Both OpenEJB and Geronimo build their
own JNDI trees for the App Client. Geronimo prefers to have its own
JNDI tree for the App Client as there are other things in it that are
not EJB related. Either way the OpenEJB EJBd protocol can carry the
"id" of the App Client and both Geronimo and OpenEJB rely on that.

In Geronimo App Clients the id is set to "Deployments" and that tells
OpenEJB not to look in the "openejb/remote" section of JNDI as it
normally would. It will instead use the "openejb/Deployments" section
of JNDI were the names follow a predictable and unchanging format.

In OpenEJB App Clients the id is set to the name of the App Client, and
we instead look in "openejb/client//" where names are formatted by the
user via the application-client.xml.

When calls are made from client to server and the App Client module id
is not present, we look in openejb/remote/ where names are formatted
using the openejb.jndi.format
