}
catch ( Exception initialException ) {
// We had problems doing a simple bind operation.
if ( name.size() == 1 ) {
// if the jndi name had only 1 component there is nothing more we can do...
throw new JndiException( "Error performing bind [" + name + "]", initialException );
}
// Otherwise, there is a good chance this may have been caused by missing intermediate contexts. So we
// attempt to create those missing intermediate contexts and bind again
Context intermediateContextBase = context;
while ( name.size() > 1 ) {
final String intermediateContextName = name.get( 0 );
Context intermediateContext = null;
try {
LOG.tracev( "Intermediate lookup: {0}", intermediateContextName );
intermediateContext = (Context) intermediateContextBase.lookup( intermediateContextName );
}
catch ( NameNotFoundException handledBelow ) {
// ok as we will create it below if not found
}
catch ( NamingException e ) {
throw new JndiException( "Unanticipated error doing intermediate lookup", e );
}
if ( intermediateContext != null ) {
LOG.tracev( "Found intermediate context: {0}", intermediateContextName );
}
else {
LOG.tracev( "Creating sub-context: {0}", intermediateContextName );
try {
intermediateContext = intermediateContextBase.createSubcontext( intermediateContextName );
}
catch ( NamingException e ) {
throw new JndiException( "Error creating intermediate context [" + intermediateContextName + "]", e );
}
}
intermediateContextBase = intermediateContext;
name = name.getSuffix( 1 );
}
LOG.tracev( "Binding : {0}", name );
try {
intermediateContextBase.rebind( name, value );
}
catch ( NamingException e ) {
throw new JndiException( "Error performing intermediate bind [" + name + "]", e );
}
}
LOG.debugf( "Bound name: %s", name );
}