Author: not
Date: Fri Feb 11 13:51:18 2011
New Revision: 1069799
URL: http://svn.apache.org/viewvc?rev=1069799&view=rev
Log:
ARIES-554 Updates to the way we find the caller bundle so:
1. Ensure class space consistency, but searching based on the InitialContext
class rather than class name in case their are two JNDI API providers in the
system
2. Look for the InitialContext or subclasses so we get InitialContext
InitialDirContext and InitialLdapContext and any other subclass that might exist
3. Search the whole stack, not just the InitialContext caller.
Modified:
aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/OSGiInitialContextFactoryBuilder.java
aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/OSGiObjectFactoryBuilder.java
aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/Utils.java
Modified:
aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/OSGiInitialContextFactoryBuilder.java
URL:
http://svn.apache.org/viewvc/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/OSGiInitialContextFactoryBuilder.java?rev=1069799&r1=1069798&r2=1069799&view=diff
==============================================================================
---
aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/OSGiInitialContextFactoryBuilder.java
(original)
+++
aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/OSGiInitialContextFactoryBuilder.java
Fri Feb 11 13:51:18 2011
@@ -24,7 +24,6 @@ import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.naming.NoInitialContextException;
-import javax.naming.directory.InitialDirContext;
import javax.naming.spi.InitialContextFactory;
import javax.naming.spi.InitialContextFactoryBuilder;
@@ -42,15 +41,11 @@ public class OSGiInitialContextFactoryBu
Utils.augmentEnvironment(environment);
- BundleContext context = Utils.getBundleContext(environment,
InitialContext.class.getName());
+ BundleContext context = Utils.getBundleContext(environment,
InitialContext.class);
if (context == null) {
- context = Utils.getBundleContext(environment,
InitialDirContext.class.getName());
- if (context == null) {
- throw new NoInitialContextException("Unable to determine
caller's BundleContext");
- }
+ throw new NoInitialContextException("Unable to determine caller's
BundleContext");
}
return ContextHelper.getInitialContext(context, environment);
}
-
-}
+}
\ No newline at end of file
Modified:
aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/OSGiObjectFactoryBuilder.java
URL:
http://svn.apache.org/viewvc/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/OSGiObjectFactoryBuilder.java?rev=1069799&r1=1069798&r2=1069799&view=diff
==============================================================================
---
aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/OSGiObjectFactoryBuilder.java
(original)
+++
aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/OSGiObjectFactoryBuilder.java
Fri Feb 11 13:51:18 2011
@@ -71,9 +71,9 @@ public class OSGiObjectFactoryBuilder im
}
private BundleContext getCallerBundleContext(Hashtable<?, ?> environment)
throws NamingException {
- BundleContext context = Utils.getBundleContext(environment,
NamingManager.class.getName());
+ BundleContext context = Utils.getBundleContext(environment,
NamingManager.class);
if (context == null) {
- context = Utils.getBundleContext(environment,
DirectoryManager.class.getName());
+ context = Utils.getBundleContext(environment,
DirectoryManager.class);
}
return context;
}
Modified:
aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/Utils.java
URL:
http://svn.apache.org/viewvc/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/Utils.java?rev=1069799&r1=1069798&r2=1069799&view=diff
==============================================================================
--- aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/Utils.java
(original)
+++ aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/Utils.java
Fri Feb 11 13:51:18 2011
@@ -59,7 +59,7 @@ public final class Utils {
* @throws NamingException
*/
public static BundleContext getBundleContext(final Map<?, ?> env,
- final String namingClass) {
+ final Class<?> namingClass) {
return AccessController.doPrivileged(new
PrivilegedAction<BundleContext>() {
public BundleContext run() {
return doGetBundleContext(env, namingClass);
@@ -67,7 +67,7 @@ public final class Utils {
});
}
- private static BundleContext doGetBundleContext(Map<?, ?> env, String
namingClass) {
+ private static BundleContext doGetBundleContext(Map<?, ?> env, Class<?>
namingClass) {
BundleContext result = null;
Object bc = (env == null) ? null :
env.get(JNDIConstants.BUNDLE_CONTEXT);
@@ -83,18 +83,17 @@ public final class Utils {
StackFinder finder = new StackFinder();
Class<?>[] classStack = finder.getClassContext();
- // find constructor of given naming class
- int indexOfConstructor = -1;
- for (int i = 0 ; i < classStack.length; i++) {
- if (classStack[i].getName().equals(namingClass)) {
- indexOfConstructor = i;
- }
+ // working from the root of the stack look for the first instance
in the stack of this class
+ int i = classStack.length - 1;
+ for (; i >= 0; i--) {
+ if (namingClass.isAssignableFrom(classStack[i])) {
+ break;
+ }
}
- // get the caller of the constructor
- if (indexOfConstructor >= 0 && (indexOfConstructor + 1) <
classStack.length) {
- Class<?> callerClass = classStack[indexOfConstructor + 1];
- result = getBundleContext(callerClass.getClassLoader());
+ // then go to the parent of the namingClass down the stack until
we find a BundleContext
+ for (i++; i < classStack.length && result == null; i++) {
+ result = getBundleContext(classStack[i].getClassLoader());
}
}