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());
             }
         }
 


Reply via email to