You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aries.apache.org by ga...@apache.org on 2010/05/14 20:15:58 UTC

svn commit: r944370 - in /incubator/aries/trunk: jndi/jndi-bundle/ jndi/jndi-core/src/main/java/org/apache/aries/jndi/ jndi/jndi-core/src/main/java/org/apache/aries/jndi/startup/ jndi/jndi-core/src/test/java/org/apache/aries/jndi/ jndi/jndi-url/src/mai...

Author: gawor
Date: Fri May 14 18:15:57 2010
New Revision: 944370

URL: http://svn.apache.org/viewvc?rev=944370&view=rev
Log:
ARIES-311: Security updates and updates in obtaining the callers bundle context and passing it around as per spec

Added:
    incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ProviderAdminServiceFactory.java   (with props)
    incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/Utils.java   (with props)
    incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/url/OsgiURLContextServiceFactory.java   (with props)
Modified:
    incubator/aries/trunk/jndi/jndi-bundle/pom.xml
    incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ContextHelper.java
    incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ContextManagerService.java
    incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ContextManagerServiceFactory.java
    incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/DelegateContext.java
    incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/DirObjectFactoryHelper.java
    incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/OSGiInitialContextFactoryBuilder.java
    incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/OSGiObjectFactoryBuilder.java
    incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ObjectFactoryHelper.java
    incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ProviderAdminService.java
    incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/startup/Activator.java
    incubator/aries/trunk/jndi/jndi-core/src/test/java/org/apache/aries/jndi/ObjectFactoryTest.java
    incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/services/ServiceHelper.java
    incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/url/AbstractServiceRegistryContext.java
    incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/url/Activator.java
    incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/url/OsgiURLContextFactory.java
    incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/url/ServiceRegistryContext.java
    incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/url/ServiceRegistryListContext.java
    incubator/aries/trunk/jndi/jndi-url/src/test/java/org/apache/aries/jndi/url/ServiceRegistryContextTest.java
    incubator/aries/trunk/testsupport/testsupport-unit/src/main/java/org/apache/aries/mocks/BundleContextMock.java

Modified: incubator/aries/trunk/jndi/jndi-bundle/pom.xml
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jndi/jndi-bundle/pom.xml?rev=944370&r1=944369&r2=944370&view=diff
==============================================================================
--- incubator/aries/trunk/jndi/jndi-bundle/pom.xml (original)
+++ incubator/aries/trunk/jndi/jndi-bundle/pom.xml Fri May 14 18:15:57 2010
@@ -31,9 +31,9 @@
     </description>
 
     <properties>
-        <aries.osgi.export.pkg>
-            org.osgi.service.jndi
-        </aries.osgi.export.pkg>
+        <aries.osgi.export>
+            org.osgi.service.jndi;version="1.0"
+        </aries.osgi.export>
         <aries.osgi.private.pkg>
             org.apache.aries.jndi*
         </aries.osgi.private.pkg>

Modified: incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ContextHelper.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ContextHelper.java?rev=944370&r1=944369&r2=944370&view=diff
==============================================================================
--- incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ContextHelper.java (original)
+++ incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ContextHelper.java Fri May 14 18:15:57 2010
@@ -18,10 +18,9 @@
  */
 package org.apache.aries.jndi;
 
+import java.security.PrivilegedExceptionAction;
 import java.util.Arrays;
-import java.util.Comparator;
 import java.util.Hashtable;
-import java.util.Map;
 
 import javax.naming.Context;
 import javax.naming.NamingException;
@@ -41,21 +40,22 @@ import org.osgi.service.jndi.JNDIConstan
  */
 public final class ContextHelper {
 
-    public static final Comparator<ServiceReference> SERVICE_REFERENCE_COMPARATOR = 
-        new ServiceReferenceComparator();
-
-    /** The bundle context we use for accessing the SR */
-    private static BundleContext context;
-
     /** Ensure no one constructs us */
     private ContextHelper() {
         throw new RuntimeException();
     }
 
-    public static void setBundleContext(BundleContext ctx) {
-        context = ctx;
+    public static Context createURLContext(final BundleContext context,
+                                           final String urlScheme, 
+                                           final Hashtable<?, ?> env)
+        throws NamingException {
+        return Utils.doPrivilegedNaming(new PrivilegedExceptionAction<Context>() {
+            public Context run() throws Exception {
+                return doCreateURLContext(context, urlScheme, env);
+            }
+        });
     }
-
+    
     /**
      * This method is used to create a URL Context. It does this by looking for
      * the URL context's ObjectFactory in the service registry.
@@ -65,12 +65,12 @@ public final class ContextHelper {
      * @return a Context
      * @throws NamingException
      */
-    public static Context createURLContext(String urlScheme, Hashtable<?, ?> env)
+    private static Context doCreateURLContext(BundleContext context, String urlScheme, Hashtable<?, ?> env)
         throws NamingException {
         ServiceReference ref = null;
         try {
             ServiceReference[] services = context.getServiceReferences(ObjectFactory.class.getName(), 
-                                                                       "(" + JNDIConstants.JNDI_URLSCHEME + "=" + urlScheme + ")");
+                                                                       "(" + JNDIConstants.JNDI_URLSCHEME + "=" + urlScheme.trim() + ")");
 
             if (services != null) {
                 ref = services[0];
@@ -86,7 +86,7 @@ public final class ContextHelper {
         if (ref != null) {
             ObjectFactory factory = (ObjectFactory) context.getService(ref);
             try {
-                ctx = (Context) factory.getObjectInstance(null, null, null, env);
+                return (Context) factory.getObjectInstance(null, null, null, env);
             } catch (Exception e) {
                 NamingException e2 = new NamingException();
                 e2.initCause(e);
@@ -100,7 +100,7 @@ public final class ContextHelper {
 
         return ctx;
     }
-
+        
     public static Context getInitialContext(BundleContext context, Hashtable<?, ?> environment)
         throws NamingException {
         ContextProvider provider = getContextProvider(context, environment);
@@ -120,9 +120,19 @@ public final class ContextHelper {
         }
     }
 
-    public static ContextProvider getContextProvider(BundleContext context,
-                                                     Hashtable<?, ?> environment)
-            throws NamingException {
+    public static ContextProvider getContextProvider(final BundleContext context,
+                                                     final Hashtable<?, ?> environment)
+        throws NamingException {
+        return Utils.doPrivilegedNaming(new PrivilegedExceptionAction<ContextProvider>() {
+            public ContextProvider run() throws Exception {
+                return doGetContextProvider(context, environment);
+            }
+        });
+    }
+    
+    private static ContextProvider doGetContextProvider(BundleContext context,
+                                                        Hashtable<?, ?> environment)
+        throws NamingException {
         ContextProvider provider = null;
         String contextFactoryClass = (String) environment.get(Context.INITIAL_CONTEXT_FACTORY);
         if (contextFactoryClass == null) {
@@ -142,7 +152,7 @@ public final class ContextHelper {
                 }
                 if (references != null) {
                     Context initialContext = null;
-                    Arrays.sort(references, SERVICE_REFERENCE_COMPARATOR);
+                    Arrays.sort(references, Utils.SERVICE_REFERENCE_COMPARATOR);
                     for (ServiceReference reference : references) {
                         InitialContextFactory factory = (InitialContextFactory) context.getService(reference);
                         try {
@@ -171,7 +181,7 @@ public final class ContextHelper {
 
             if (references != null && references.length > 0) {
                 Context initialContext = null;
-                Arrays.sort(references, SERVICE_REFERENCE_COMPARATOR);
+                Arrays.sort(references, Utils.SERVICE_REFERENCE_COMPARATOR);
                 ServiceReference reference = references[0];
                 InitialContextFactory factory = (InitialContextFactory) context.getService(reference);
                 try {
@@ -201,7 +211,7 @@ public final class ContextHelper {
             ServiceReference[] refs = context.getAllServiceReferences(InitialContextFactoryBuilder.class.getName(), null);
             if (refs != null) {
                 InitialContextFactory factory = null;
-                Arrays.sort(refs, SERVICE_REFERENCE_COMPARATOR);
+                Arrays.sort(refs, Utils.SERVICE_REFERENCE_COMPARATOR);
                 for (ServiceReference ref : refs) {                    
                     InitialContextFactoryBuilder builder = (InitialContextFactoryBuilder) context.getService(ref);
                     try {
@@ -238,23 +248,5 @@ public final class ContextHelper {
             return (reference.getBundle() != null);
         }
     }
-    
-    private static class ServiceReferenceComparator implements Comparator<ServiceReference> {        
-        public int compare(ServiceReference o1, ServiceReference o2) {        
-          return o2.compareTo(o1);
-        }
-    }
-    
-    public static Hashtable toHashtable(Map map) {
-        Hashtable env;
-        if (map instanceof Hashtable) {
-            env = (Hashtable) map;
-        } else {
-            env = new Hashtable();
-            if (map != null) {
-                env.putAll(map);
-            }
-        }
-        return env;
-    }
+
 }

Modified: incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ContextManagerService.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ContextManagerService.java?rev=944370&r1=944369&r2=944370&view=diff
==============================================================================
--- incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ContextManagerService.java (original)
+++ incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ContextManagerService.java Fri May 14 18:15:57 2010
@@ -28,17 +28,18 @@ import javax.naming.Context;
 import javax.naming.NamingException;
 import javax.naming.directory.DirContext;
 
-import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
 import org.osgi.service.jndi.JNDIContextManager;
 
 public class ContextManagerService implements JNDIContextManager {
 
     private Set<Context> contexts = Collections.synchronizedSet(new HashSet<Context>());
-    private Bundle bundle;
+    private BundleContext defaultContext;
+    private BundleContext callerContext;
     
-    public ContextManagerService(Bundle bundle) { 
-        this.bundle = bundle;
+    public ContextManagerService(BundleContext defaultContext, BundleContext callerContext) {
+        this.defaultContext = defaultContext;
+        this.callerContext = callerContext;
     }
     
     public void close() {      
@@ -71,9 +72,8 @@ public class ContextManagerService imple
     }
     
     private Context getInitialContext(Map environment) throws NamingException {        
-        BundleContext bundleContext = bundle.getBundleContext();
-        Hashtable env = ContextHelper.toHashtable(environment);
-        Context context = ContextHelper.getInitialContext(bundleContext, env);
+        Hashtable env = Utils.toHashtable(environment);
+        Context context = ContextHelper.getInitialContext(callerContext, env);
         contexts.add(context);
         return context;
     }

Modified: incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ContextManagerServiceFactory.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ContextManagerServiceFactory.java?rev=944370&r1=944369&r2=944370&view=diff
==============================================================================
--- incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ContextManagerServiceFactory.java (original)
+++ incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ContextManagerServiceFactory.java Fri May 14 18:15:57 2010
@@ -19,13 +19,20 @@
 package org.apache.aries.jndi;
 
 import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
 import org.osgi.framework.ServiceFactory;
 import org.osgi.framework.ServiceRegistration;
 
 public class ContextManagerServiceFactory implements ServiceFactory {
 
+    private BundleContext defaultContext;
+    
+    public ContextManagerServiceFactory(BundleContext defaultContext) {
+        this.defaultContext = defaultContext;
+    }
+    
     public Object getService(Bundle bundle, ServiceRegistration registration) {
-        return new ContextManagerService(bundle);
+        return new ContextManagerService(defaultContext, bundle.getBundleContext());
     }
 
     public void ungetService(Bundle bundle, ServiceRegistration registration, Object service) {

Modified: incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/DelegateContext.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/DelegateContext.java?rev=944370&r1=944369&r2=944370&view=diff
==============================================================================
--- incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/DelegateContext.java (original)
+++ incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/DelegateContext.java Fri May 14 18:15:57 2010
@@ -204,7 +204,7 @@ public class DelegateContext implements 
         }
 
         if (toReturn != null) {
-            String packages = System.getProperty(Context.URL_PKG_PREFIXES, null);
+            String packages = Utils.getSystemProperty(Context.URL_PKG_PREFIXES, null);
 
             if (packages != null) {
                 toReturn.addToEnvironment(Context.URL_PKG_PREFIXES, packages);
@@ -237,7 +237,7 @@ public class DelegateContext implements 
         if (index != -1) {
             String scheme = name.substring(0, index);
 
-            ctx = ContextHelper.createURLContext(scheme, env);
+            ctx = ContextHelper.createURLContext(bundleContext, scheme, env);
         }
 
         if (ctx == null) {

Modified: incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/DirObjectFactoryHelper.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/DirObjectFactoryHelper.java?rev=944370&r1=944369&r2=944370&view=diff
==============================================================================
--- incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/DirObjectFactoryHelper.java (original)
+++ incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/DirObjectFactoryHelper.java Fri May 14 18:15:57 2010
@@ -18,6 +18,7 @@
  */
 package org.apache.aries.jndi;
 
+import java.security.PrivilegedExceptionAction;
 import java.util.Arrays;
 import java.util.Enumeration;
 import java.util.Hashtable;
@@ -34,17 +35,34 @@ import javax.naming.spi.DirObjectFactory
 import javax.naming.spi.ObjectFactory;
 import javax.naming.spi.ObjectFactoryBuilder;
 
+import org.osgi.framework.BundleContext;
 import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.framework.ServiceReference;
 import org.osgi.service.jndi.JNDIConstants;
 
 public class DirObjectFactoryHelper extends ObjectFactoryHelper implements DirObjectFactory {
 
-    public Object getObjectInstance(Object obj,
-                                    Name name,
-                                    Context nameCtx,
-                                    Hashtable<?, ?> environment,
-                                    Attributes attrs) throws Exception {
+    public DirObjectFactoryHelper(BundleContext defaultContext, BundleContext callerContext) {
+        super(defaultContext, callerContext);
+    }
+    
+    public Object getObjectInstance(final Object obj,
+                                    final Name name,
+                                    final Context nameCtx,
+                                    final Hashtable<?, ?> environment,
+                                    final Attributes attrs) throws Exception {
+        return Utils.doPrivileged(new PrivilegedExceptionAction<Object>() {
+            public Object run() throws Exception {
+                return doGetObjectInstance(obj, name, nameCtx, environment, attrs);
+            }            
+        });
+    }
+    
+    private Object doGetObjectInstance(Object obj,
+                                       Name name,
+                                       Context nameCtx,
+                                       Hashtable<?, ?> environment,
+                                       Attributes attrs) throws Exception {
 
         // Step 1
         if (obj instanceof Referenceable) {
@@ -91,16 +109,16 @@ public class DirObjectFactoryHelper exte
         throws Exception {
         Object result = null;
         try {
-            ServiceReference[] refs = context.getAllServiceReferences(DirObjectFactory.class.getName(), null);
+            ServiceReference[] refs = callerContext.getServiceReferences(DirObjectFactory.class.getName(), null);
             if (refs != null) {
-                Arrays.sort(refs, ContextHelper.SERVICE_REFERENCE_COMPARATOR);
+                Arrays.sort(refs, Utils.SERVICE_REFERENCE_COMPARATOR);
                 for (ServiceReference ref : refs) {
-                    DirObjectFactory factory = (DirObjectFactory) context.getService(ref);
+                    DirObjectFactory factory = (DirObjectFactory) callerContext.getService(ref);
 
                     try {
                         result = factory.getObjectInstance(obj, name, nameCtx, environment, attrs);
                     } finally {
-                        context.ungetService(ref);
+                        callerContext.ungetService(ref);
                     }
 
                     // if the result comes back and is not null and not the reference
@@ -138,7 +156,7 @@ public class DirObjectFactoryHelper exte
                 DirObjectFactory factory = null;
                 ServiceReference ref = null;
                 try {
-                    ServiceReference[] services = context.getServiceReferences(DirObjectFactory.class.getName(), 
+                    ServiceReference[] services = callerContext.getServiceReferences(DirObjectFactory.class.getName(), 
                             "(&(" + JNDIConstants.JNDI_URLSCHEME + "=" + urlScheme + "))");
 
                     if (services != null && services.length > 0) {
@@ -150,13 +168,13 @@ public class DirObjectFactoryHelper exte
                 }
 
                 if (ref != null) {
-                    factory = (DirObjectFactory) context.getService(ref);
+                    factory = (DirObjectFactory) callerContext.getService(ref);
                     
                     String value = (String) address.getContent();
                     try {
                         result = factory.getObjectInstance(value, name, nameCtx, environment, attrs);
                     } finally {
-                        context.ungetService(ref);
+                        callerContext.ungetService(ref);
                     }
 
                     // if the result comes back and is not null and not the reference
@@ -183,7 +201,7 @@ public class DirObjectFactoryHelper exte
         ServiceReference serviceReference = null;
 
         try {
-            ServiceReference[] refs = context.getAllServiceReferences(className, null);
+            ServiceReference[] refs = defaultContext.getServiceReferences(className, null);
             if (refs != null && refs.length > 0) {
                 serviceReference = refs[0];
             }
@@ -195,11 +213,11 @@ public class DirObjectFactoryHelper exte
         Object result = null;
         
         if (serviceReference != null) {
-            DirObjectFactory factory = (DirObjectFactory) context.getService(serviceReference);
+            DirObjectFactory factory = (DirObjectFactory) defaultContext.getService(serviceReference);
             try {
                 result = factory.getObjectInstance(reference, name, nameCtx, environment, attrs);
             } finally {
-                context.ungetService(serviceReference);
+                defaultContext.ungetService(serviceReference);
             }
         }
 
@@ -214,17 +232,17 @@ public class DirObjectFactoryHelper exte
         throws Exception {
         ObjectFactory factory = null;
         try {
-            ServiceReference[] refs = context.getServiceReferences(ObjectFactoryBuilder.class.getName(), null);
+            ServiceReference[] refs = callerContext.getServiceReferences(ObjectFactoryBuilder.class.getName(), null);
             if (refs != null) {
-                Arrays.sort(refs, ContextHelper.SERVICE_REFERENCE_COMPARATOR);
+                Arrays.sort(refs, Utils.SERVICE_REFERENCE_COMPARATOR);
                 for (ServiceReference ref : refs) {
-                    ObjectFactoryBuilder builder = (ObjectFactoryBuilder) context.getService(ref);
+                    ObjectFactoryBuilder builder = (ObjectFactoryBuilder) callerContext.getService(ref);
                     try {
                         factory = builder.createObjectFactory(obj, environment);
                     } catch (NamingException e) {
                         // TODO: log it
                     } finally {
-                        context.ungetService(ref);
+                        callerContext.ungetService(ref);
                     }
                     if (factory != null) {
                         break;

Modified: incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/OSGiInitialContextFactoryBuilder.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/OSGiInitialContextFactoryBuilder.java?rev=944370&r1=944369&r2=944370&view=diff
==============================================================================
--- incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/OSGiInitialContextFactoryBuilder.java (original)
+++ incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/OSGiInitialContextFactoryBuilder.java Fri May 14 18:15:57 2010
@@ -21,7 +21,10 @@ package org.apache.aries.jndi;
 import java.util.Hashtable;
 
 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;
 
@@ -43,9 +46,15 @@ public class OSGiInitialContextFactoryBu
 	public Context getInitialContext(Hashtable<?, ?> environment) 
 	    throws NamingException {
 	    
-	    // TODO: use caller's bundle context
-	    
-	    return ContextHelper.getInitialContext(_context, environment);
+	    BundleContext context = Utils.getBundleContext(environment, InitialContext.class.getName());	    
+	    if (context == null) {
+	        context = Utils.getBundleContext(environment, InitialDirContext.class.getName());
+	        if (context == null) {
+	            throw new NoInitialContextException("Unable to determine caller's BundleContext");
+	        }
+	    }
+	    	    
+	    return ContextHelper.getInitialContext(context, environment);
 	}
 	
 }

Modified: incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/OSGiObjectFactoryBuilder.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/OSGiObjectFactoryBuilder.java?rev=944370&r1=944369&r2=944370&view=diff
==============================================================================
--- incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/OSGiObjectFactoryBuilder.java (original)
+++ incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/OSGiObjectFactoryBuilder.java Fri May 14 18:15:57 2010
@@ -25,6 +25,8 @@ import javax.naming.Name;
 import javax.naming.NamingException;
 import javax.naming.directory.Attributes;
 import javax.naming.spi.DirObjectFactory;
+import javax.naming.spi.DirectoryManager;
+import javax.naming.spi.NamingManager;
 import javax.naming.spi.ObjectFactory;
 import javax.naming.spi.ObjectFactoryBuilder;
 
@@ -32,10 +34,10 @@ import org.osgi.framework.BundleContext;
 
 public class OSGiObjectFactoryBuilder implements ObjectFactoryBuilder, ObjectFactory, DirObjectFactory {
 
-    private static DirObjectFactoryHelper helper = new DirObjectFactoryHelper();
+    private BundleContext defaultContext;
     
-    public static void setBundleContext(BundleContext ctx) {
-        helper.setBundleContext(ctx);
+    public OSGiObjectFactoryBuilder(BundleContext ctx) {
+        defaultContext = ctx;
     }
 
     public ObjectFactory createObjectFactory(Object obj, Hashtable<?, ?> environment)
@@ -47,6 +49,11 @@ public class OSGiObjectFactoryBuilder im
                                     Name name,
                                     Context nameCtx,
                                     Hashtable<?, ?> environment) throws Exception {
+        BundleContext callerContext = getCallerBundleContext(environment);
+        if (callerContext == null) {
+            return obj;
+        }
+        DirObjectFactoryHelper helper = new DirObjectFactoryHelper(defaultContext, callerContext);
         return helper.getObjectInstance(obj, name, nameCtx, environment);
     }
 
@@ -55,7 +62,19 @@ public class OSGiObjectFactoryBuilder im
                                     Context nameCtx,
                                     Hashtable<?, ?> environment,
                                     Attributes attrs) throws Exception {
+        BundleContext callerContext = getCallerBundleContext(environment);
+        if (callerContext == null) {
+            return obj;
+        }
+        DirObjectFactoryHelper helper = new DirObjectFactoryHelper(defaultContext, callerContext);
         return helper.getObjectInstance(obj, name, nameCtx, environment, attrs);
     }
 
+    private BundleContext getCallerBundleContext(Hashtable<?, ?> environment) throws NamingException {
+        BundleContext context = Utils.getBundleContext(environment, NamingManager.class.getName());        
+        if (context == null) {
+            context = Utils.getBundleContext(environment, DirectoryManager.class.getName());
+        }
+        return context;
+    }
 }

Modified: incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ObjectFactoryHelper.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ObjectFactoryHelper.java?rev=944370&r1=944369&r2=944370&view=diff
==============================================================================
--- incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ObjectFactoryHelper.java (original)
+++ incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ObjectFactoryHelper.java Fri May 14 18:15:57 2010
@@ -18,6 +18,7 @@
  */
 package org.apache.aries.jndi;
 
+import java.security.PrivilegedExceptionAction;
 import java.util.Arrays;
 import java.util.Enumeration;
 import java.util.Hashtable;
@@ -38,17 +39,30 @@ import org.osgi.framework.ServiceReferen
 import org.osgi.service.jndi.JNDIConstants;
 
 public class ObjectFactoryHelper implements ObjectFactory {
-
-    protected BundleContext context;
-
-    public void setBundleContext(BundleContext ctx) {
-        context = ctx;
-    }
-
-    public Object getObjectInstance(Object obj,
-                                    Name name,
-                                    Context nameCtx,
-                                    Hashtable<?, ?> environment) throws Exception {
+    
+    protected BundleContext defaultContext;
+    protected BundleContext callerContext;
+
+    public ObjectFactoryHelper(BundleContext defaultContext, BundleContext callerContext) {
+        this.defaultContext = defaultContext;
+        this.callerContext = callerContext;
+    }
+
+    public Object getObjectInstance(final Object obj,
+                                    final Name name,
+                                    final Context nameCtx,
+                                    final Hashtable<?, ?> environment) throws Exception {
+        return Utils.doPrivileged(new PrivilegedExceptionAction<Object>() {
+            public Object run() throws Exception {
+                return doGetObjectInstance(obj, name, nameCtx, environment);
+            }            
+        });
+    }
+    
+    private Object doGetObjectInstance(Object obj,
+                                       Name name,
+                                       Context nameCtx,
+                                       Hashtable<?, ?> environment) throws Exception {
 
         // Step 1
         if (obj instanceof Referenceable) {
@@ -94,16 +108,16 @@ public class ObjectFactoryHelper impleme
         throws Exception {
         Object result = null;
         try {
-            ServiceReference[] refs = context.getAllServiceReferences(ObjectFactory.class.getName(), null);
+            ServiceReference[] refs = callerContext.getServiceReferences(ObjectFactory.class.getName(), null);
             if (refs != null) {
-                Arrays.sort(refs, ContextHelper.SERVICE_REFERENCE_COMPARATOR);
+                Arrays.sort(refs, Utils.SERVICE_REFERENCE_COMPARATOR);
                 for (ServiceReference ref : refs) {
-                    ObjectFactory factory = (ObjectFactory) context.getService(ref);
+                    ObjectFactory factory = (ObjectFactory) callerContext.getService(ref);
 
                     try {
                         result = factory.getObjectInstance(obj, name, nameCtx, environment);
                     } finally {
-                        context.ungetService(ref);
+                        callerContext.ungetService(ref);
                     }
 
                     // if the result comes back and is not null and not the reference
@@ -145,7 +159,7 @@ public class ObjectFactoryHelper impleme
                 ObjectFactory factory = null;
                 ServiceReference ref = null;
                 try {
-                    ServiceReference[] services = context.getServiceReferences(ObjectFactory.class.getName(), 
+                    ServiceReference[] services = callerContext.getServiceReferences(ObjectFactory.class.getName(), 
                             "(&(" + JNDIConstants.JNDI_URLSCHEME + "=" + urlScheme + "))");
 
                     if (services != null && services.length > 0) {
@@ -157,13 +171,13 @@ public class ObjectFactoryHelper impleme
                 }
 
                 if (ref != null) {
-                    factory = (ObjectFactory) context.getService(ref);
+                    factory = (ObjectFactory) callerContext.getService(ref);
                     
                     String value = (String) address.getContent();
                     try {
                         result = factory.getObjectInstance(value, name, nameCtx, environment);
                     } finally {
-                        context.ungetService(ref);
+                        callerContext.ungetService(ref);
                     }
                     
                     // if the result comes back and is not null and not the reference
@@ -189,7 +203,7 @@ public class ObjectFactoryHelper impleme
         ServiceReference serviceReference = null;
 
         try {
-            ServiceReference[] refs = context.getAllServiceReferences(className, null);
+            ServiceReference[] refs = defaultContext.getServiceReferences(className, null);
             if (refs != null && refs.length > 0) {
                 serviceReference = refs[0];
             }
@@ -201,11 +215,11 @@ public class ObjectFactoryHelper impleme
         Object result = null;
         
         if (serviceReference != null) {
-            ObjectFactory factory = (ObjectFactory) context.getService(serviceReference);
+            ObjectFactory factory = (ObjectFactory) defaultContext.getService(serviceReference);
             try {
                 result = factory.getObjectInstance(reference, name, nameCtx, environment);
             } finally {
-                context.ungetService(serviceReference);
+                defaultContext.ungetService(serviceReference);
             }
         }
 
@@ -219,17 +233,17 @@ public class ObjectFactoryHelper impleme
         throws Exception {
         ObjectFactory factory = null;
         try {
-            ServiceReference[] refs = context.getServiceReferences(ObjectFactoryBuilder.class.getName(), null);
+            ServiceReference[] refs = callerContext.getServiceReferences(ObjectFactoryBuilder.class.getName(), null);
             if (refs != null) {
-                Arrays.sort(refs, ContextHelper.SERVICE_REFERENCE_COMPARATOR);
+                Arrays.sort(refs, Utils.SERVICE_REFERENCE_COMPARATOR);
                 for (ServiceReference ref : refs) {
-                    ObjectFactoryBuilder builder = (ObjectFactoryBuilder) context.getService(ref);
+                    ObjectFactoryBuilder builder = (ObjectFactoryBuilder) callerContext.getService(ref);
                     try {
                         factory = builder.createObjectFactory(obj, environment);
                     } catch (NamingException e) {
                         // TODO: log it
                     } finally {
-                        context.ungetService(ref);
+                        callerContext.ungetService(ref);
                     }
                     if (factory != null) {
                         break;

Modified: incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ProviderAdminService.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ProviderAdminService.java?rev=944370&r1=944369&r2=944370&view=diff
==============================================================================
--- incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ProviderAdminService.java (original)
+++ incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ProviderAdminService.java Fri May 14 18:15:57 2010
@@ -32,9 +32,8 @@ public class ProviderAdminService implem
 
     private DirObjectFactoryHelper helper;
     
-    public ProviderAdminService(BundleContext context) {
-        helper = new DirObjectFactoryHelper();
-        helper.setBundleContext(context);
+    public ProviderAdminService(BundleContext defaultContext, BundleContext callerContext) {
+        helper = new DirObjectFactoryHelper(defaultContext, callerContext);
     }
     
     public Object getObjectInstance(Object obj, 
@@ -42,7 +41,7 @@ public class ProviderAdminService implem
                                     Context context, 
                                     Map environment)
         throws Exception {
-        Hashtable env = ContextHelper.toHashtable(environment);
+        Hashtable env = Utils.toHashtable(environment);
         return helper.getObjectInstance(obj, name, context, env);
     }
 
@@ -52,8 +51,10 @@ public class ProviderAdminService implem
                                     Map environment,
                                     Attributes attributes) 
         throws Exception {
-        Hashtable env = ContextHelper.toHashtable(environment);
+        Hashtable env = Utils.toHashtable(environment);
         return helper.getObjectInstance(obj, name, context, env, attributes);
     }
 
+    public void close() {        
+    }
 }

Added: incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ProviderAdminServiceFactory.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ProviderAdminServiceFactory.java?rev=944370&view=auto
==============================================================================
--- incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ProviderAdminServiceFactory.java (added)
+++ incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ProviderAdminServiceFactory.java Fri May 14 18:15:57 2010
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.aries.jndi;
+
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceFactory;
+import org.osgi.framework.ServiceRegistration;
+
+public class ProviderAdminServiceFactory implements ServiceFactory {
+
+    private BundleContext defaultContext;
+    
+    public ProviderAdminServiceFactory(BundleContext defaultContext) {
+        this.defaultContext = defaultContext;
+    }
+    
+    public Object getService(Bundle bundle, ServiceRegistration registration) {
+        return new ProviderAdminService(defaultContext, bundle.getBundleContext());
+    }
+
+    public void ungetService(Bundle bundle, ServiceRegistration registration, Object service) {
+        ((ProviderAdminService) service).close();
+    }
+
+}

Propchange: incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ProviderAdminServiceFactory.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ProviderAdminServiceFactory.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ProviderAdminServiceFactory.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/Utils.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/Utils.java?rev=944370&view=auto
==============================================================================
--- incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/Utils.java (added)
+++ incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/Utils.java Fri May 14 18:15:57 2010
@@ -0,0 +1,166 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.aries.jndi;
+
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import java.security.PrivilegedActionException;
+import java.security.PrivilegedExceptionAction;
+import java.util.Comparator;
+import java.util.Hashtable;
+import java.util.Map;
+
+import javax.naming.NamingException;
+
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleReference;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.jndi.JNDIConstants;
+
+/**
+ */
+public final class Utils {
+
+    public static final Comparator<ServiceReference> SERVICE_REFERENCE_COMPARATOR = 
+        new ServiceReferenceComparator();
+
+    /** Ensure no one constructs us */
+    private Utils() {
+        throw new RuntimeException();
+    }
+     
+    private static class StackFinder extends SecurityManager {
+        public Class<?>[] getClassContext() {
+            return super.getClassContext();
+        }
+    }
+    
+    /**
+     * @param env
+     * @return the bundle context for the caller.
+     * @throws NamingException
+     */
+    public static BundleContext getBundleContext(final Map<?, ?> env, 
+                                                 final String namingClass) {
+        return AccessController.doPrivileged(new PrivilegedAction<BundleContext>() {
+            public BundleContext run() {
+                return doGetBundleContext(env, namingClass);
+            }
+        });
+    }
+    
+    private static BundleContext doGetBundleContext(Map<?, ?> env, String namingClass) {
+        BundleContext result = null;
+
+        Object bc = (env == null) ? null : env.get(JNDIConstants.BUNDLE_CONTEXT);
+
+        if (bc != null && bc instanceof BundleContext) {
+            result = (BundleContext) bc;
+        } else {
+            ClassLoader cl = Thread.currentThread().getContextClassLoader();
+            result = getBundleContext(cl);
+        }
+
+        if (result == null) {
+            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;
+                }
+            }
+            
+            // get the caller of the constructor
+            if (indexOfConstructor >= 0 && (indexOfConstructor + 1) < classStack.length) {
+                Class callerClass = classStack[indexOfConstructor + 1];
+                result = getBundleContext(callerClass.getClassLoader());
+            }
+        }
+
+        return result;
+    }
+
+    private static BundleContext getBundleContext(ClassLoader cl2) {
+        ClassLoader cl = cl2;
+        BundleContext result = null;
+        while (result == null && cl != null) {
+            if (cl instanceof BundleReference) {
+                result = ((BundleReference) cl).getBundle().getBundleContext();
+            } else if (cl != null) {
+                cl = cl.getParent();
+            }
+        }
+
+        return result;
+    }
+    
+    private static class ServiceReferenceComparator implements Comparator<ServiceReference> {        
+        public int compare(ServiceReference o1, ServiceReference o2) {        
+          return o2.compareTo(o1);
+        }
+    }
+    
+    public static String getSystemProperty(final String key, final String defaultValue) {
+        return AccessController.doPrivileged(new PrivilegedAction<String>() {
+            public String run() {
+                return System.getProperty(key, defaultValue);
+            }            
+        });
+    }
+    
+    public static Hashtable toHashtable(Map map) {
+        Hashtable env;
+        if (map instanceof Hashtable) {
+            env = (Hashtable) map;
+        } else {
+            env = new Hashtable();
+            if (map != null) {
+                env.putAll(map);
+            }
+        }
+        return env;
+    }
+    
+    public static <T> T doPrivileged(PrivilegedExceptionAction<T> action) throws Exception {
+        try {
+            return AccessController.doPrivileged(action);
+        } catch (PrivilegedActionException e) {
+            Exception cause = e.getException();
+            throw cause;
+        }
+    }
+    
+    public static <T> T doPrivilegedNaming(PrivilegedExceptionAction<T> action) throws NamingException {
+        try {
+            return AccessController.doPrivileged(action);
+        } catch (PrivilegedActionException e) {
+            Exception cause = e.getException();
+            if (cause instanceof NamingException) {
+                throw (NamingException) cause;
+            } else {
+                NamingException ex = new NamingException(cause.getMessage());
+                ex.initCause(cause);
+                throw ex;
+            }
+        }
+    }
+}

Propchange: incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/Utils.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/Utils.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/Utils.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/startup/Activator.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/startup/Activator.java?rev=944370&r1=944369&r2=944370&view=diff
==============================================================================
--- incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/startup/Activator.java (original)
+++ incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/startup/Activator.java Fri May 14 18:15:57 2010
@@ -36,7 +36,7 @@ import org.apache.aries.jndi.ContextMana
 import org.apache.aries.jndi.JREInitialContextFactoryBuilder;
 import org.apache.aries.jndi.OSGiInitialContextFactoryBuilder;
 import org.apache.aries.jndi.OSGiObjectFactoryBuilder;
-import org.apache.aries.jndi.ProviderAdminService;
+import org.apache.aries.jndi.ProviderAdminServiceFactory;
 
 /**
  * The activator for this bundle makes sure the static classes in it are
@@ -47,23 +47,7 @@ public class Activator implements Bundle
     private List<ServiceRegistration> registrations = new ArrayList<ServiceRegistration>();
     
     public void start(BundleContext context) {
-  
-        registrations.add(context.registerService(JNDIProviderAdmin.class.getName(), 
-                                                  new ProviderAdminService(context), 
-                                                  null));
-        
-        registrations.add(context.registerService(InitialContextFactoryBuilder.class.getName(), 
-                                                 new JREInitialContextFactoryBuilder(), 
-                                                 null));
-        
-        ContextManagerServiceFactory contextManagerFactory = new ContextManagerServiceFactory();
-        registrations.add(context.registerService(JNDIContextManager.class.getName(), 
-                                                  contextManagerFactory, 
-                                                  null));
-        
-        ContextHelper.setBundleContext(context);
-        OSGiObjectFactoryBuilder.setBundleContext(context);
-  
+          
         try {
             if (!!!NamingManager.hasInitialContextFactoryBuilder()) {
                 NamingManager.setInitialContextFactoryBuilder(new OSGiInitialContextFactoryBuilder(context));
@@ -74,13 +58,25 @@ public class Activator implements Bundle
         }
     
         try {
-            NamingManager.setObjectFactoryBuilder(new OSGiObjectFactoryBuilder());
+            NamingManager.setObjectFactoryBuilder(new OSGiObjectFactoryBuilder(context));
         } catch (NamingException e) {
             // TODO Auto-generated catch block
             e.printStackTrace();
         } catch (IllegalStateException e) {
             e.printStackTrace();
         }
+        
+        registrations.add(context.registerService(JNDIProviderAdmin.class.getName(), 
+                          new ProviderAdminServiceFactory(context), 
+                          null));
+
+        registrations.add(context.registerService(InitialContextFactoryBuilder.class.getName(), 
+                          new JREInitialContextFactoryBuilder(), 
+                          null));
+
+        registrations.add(context.registerService(JNDIContextManager.class.getName(), 
+                          new ContextManagerServiceFactory(context),
+                          null));
     }
 
     public void stop(BundleContext context) {

Modified: incubator/aries/trunk/jndi/jndi-core/src/test/java/org/apache/aries/jndi/ObjectFactoryTest.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jndi/jndi-core/src/test/java/org/apache/aries/jndi/ObjectFactoryTest.java?rev=944370&r1=944369&r2=944370&view=diff
==============================================================================
--- incubator/aries/trunk/jndi/jndi-core/src/test/java/org/apache/aries/jndi/ObjectFactoryTest.java (original)
+++ incubator/aries/trunk/jndi/jndi-core/src/test/java/org/apache/aries/jndi/ObjectFactoryTest.java Fri May 14 18:15:57 2010
@@ -36,6 +36,7 @@ import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.osgi.framework.BundleContext;
+import org.osgi.service.jndi.JNDIConstants;
 
 import org.apache.aries.unittest.mocks.MethodCall;
 import org.apache.aries.unittest.mocks.Skeleton;
@@ -47,6 +48,7 @@ import org.apache.aries.mocks.BundleCont
 public class ObjectFactoryTest
 {
   private BundleContext bc;
+  private Hashtable env;
 
   /**
    * This method does the setup .
@@ -60,11 +62,9 @@ public class ObjectFactoryTest
   {
     bc =  Skeleton.newMock(new BundleContextMock(), BundleContext.class);
     new Activator().start(bc);
-    
-    Field f = ContextHelper.class.getDeclaredField("context");
-    f.setAccessible(true);
-    f.set(null, bc);
-    OSGiObjectFactoryBuilder.setBundleContext(bc);
+        
+    env = new Hashtable();
+    env.put(JNDIConstants.BUNDLE_CONTEXT, bc);
   }
 
   /**
@@ -82,7 +82,7 @@ public class ObjectFactoryTest
   {
     Reference ref = new Reference(null);
     ref.add(new StringRefAddr("URL", "wibble"));
-    Object obj = NamingManager.getObjectInstance(ref, null, null, null);
+    Object obj = NamingManager.getObjectInstance(ref, null, null, env);
 
     assertSame("The naming manager should have returned the reference object", ref, obj);
   }
@@ -101,7 +101,7 @@ public class ObjectFactoryTest
 
     Reference ref = new Reference(null);
     ref.add(new StringRefAddr("URL", "wibble"));
-    Object obj = NamingManager.getObjectInstance(ref, null, null, null);
+    Object obj = NamingManager.getObjectInstance(ref, null, null, env);
     
     assertEquals("The naming manager should have returned the test object", testObject, obj);
   }
@@ -116,7 +116,7 @@ public class ObjectFactoryTest
     bc.registerService(ObjectFactory.class.getName(), factory, null);
 
     Reference ref = new Reference(null);
-    Object obj = NamingManager.getObjectInstance(ref, null, null, null);
+    Object obj = NamingManager.getObjectInstance(ref, null, null, env);
     
     assertEquals("The naming manager should have returned the test object", testObject, obj);
   }
@@ -133,7 +133,7 @@ public class ObjectFactoryTest
     bc.registerService(new String[] {ObjectFactory.class.getName(), factory.getClass().getName()}, 
                        factory, null);
 
-    Object obj = NamingManager.getObjectInstance(ref, null, null, null);
+    Object obj = NamingManager.getObjectInstance(ref, null, null, env);
     
     assertEquals("The naming manager should have returned the test object", testObject, obj);
   }
@@ -150,7 +150,7 @@ public class ObjectFactoryTest
     bc.registerService(new String[] {ObjectFactory.class.getName(), factory.getClass().getName()}, 
                        factory, null);
 
-    Object obj = NamingManager.getObjectInstance(ref, null, null, null);
+    Object obj = NamingManager.getObjectInstance(ref, null, null, env);
 
     assertSame("The naming manager should have returned the reference object", ref, obj);
   }
@@ -160,7 +160,7 @@ public class ObjectFactoryTest
   {
     Reference ref = new Reference("dummy.class.name");
 
-    Object obj = NamingManager.getObjectInstance(ref, null, null, null);
+    Object obj = NamingManager.getObjectInstance(ref, null, null, env);
 
     assertSame("The naming manager should have returned the reference object", ref, obj);
   }

Modified: incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/services/ServiceHelper.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/services/ServiceHelper.java?rev=944370&r1=944369&r2=944370&view=diff
==============================================================================
--- incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/services/ServiceHelper.java (original)
+++ incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/services/ServiceHelper.java Fri May 14 18:15:57 2010
@@ -22,15 +22,11 @@ import java.lang.reflect.InvocationHandl
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.lang.reflect.Proxy;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Comparator;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 
 import javax.naming.NamingException;
 
@@ -38,7 +34,6 @@ import org.apache.aries.jndi.url.OsgiNam
 import org.apache.aries.util.BundleToClassLoaderAdapter;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
-import org.osgi.framework.BundleReference;
 import org.osgi.framework.Constants;
 import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.framework.ServiceException;
@@ -60,12 +55,6 @@ import org.osgi.service.jndi.JNDIConstan
  */
 public final class ServiceHelper {
     
-    public static class StackFinder extends SecurityManager {
-        public Class<?>[] getClassContext() {
-            return super.getClassContext();
-        }
-    }
-
     private static class JNDIServiceDamper implements InvocationHandler {
         private BundleContext ctx;
 
@@ -115,92 +104,8 @@ public final class ServiceHelper {
         private Object service;
     }
 
-    /**
-     * @param env
-     * @return the bundle context for the caller.
-     * @throws NamingException
-     */
-    public static BundleContext getBundleContext(Map<String, Object> env) throws NamingException {
-        BundleContext result = null;
-
-        Object bc = env.get(JNDIConstants.BUNDLE_CONTEXT);
-
-        if (bc != null && bc instanceof BundleContext) {
-            result = (BundleContext) bc;
-        } else {
-            ClassLoader cl = AccessController.doPrivileged(new PrivilegedAction<ClassLoader>() {
-                public ClassLoader run() {
-                    return Thread.currentThread().getContextClassLoader();
-                }
-            });
-
-            result = getBundleContext(cl);
-        }
-
-        if (result == null) {
-            StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
-
-            StackFinder finder = new StackFinder();
-            Class<?>[] classStack = finder.getClassContext();
-
-            boolean found = false;
-            boolean foundLookup = false;
-            int i = 0;
-            for (; i < stackTrace.length && !!!found; i++) {
-                if (!!!foundLookup
-                    && ("lookup".equals(stackTrace[i].getMethodName())
-                        || "list".equals(stackTrace[i].getMethodName()) 
-                        || "listBindings".equals(stackTrace[i].getMethodName()))) {
-                    foundLookup = true;
-                } else if (foundLookup
-                           && !!!(stackTrace[i].getClassName().startsWith("org.apache.aries.jndi") 
-                                   || stackTrace[i].getClassName().startsWith("javax.naming"))) {
-                    found = true;
-                }
-            }
-
-            if (found) {
-                i--; // we need to move back an item because the previous loop
-                     // leaves us one after where we wanted to be
-                Set<Integer> classLoadersChecked = new HashSet<Integer>();
-                for (; i < classStack.length && result == null; i++) {
-                    ClassLoader cl = classStack[i].getClassLoader();
-                    int hash = System.identityHashCode(cl);
-                    if (!!!classLoadersChecked.contains(hash)) {
-                        classLoadersChecked.add(hash);
-                        result = getBundleContext(cl);
-                    }
-                }
-                // Now we walk the stack looking for the BundleContext
-            }
-        }
-
-        if (result == null) {
-            throw new NamingException("Unable to find BundleContext");
-        }
-        
-        return result;
-    }
-
-    private static BundleContext getBundleContext(final ClassLoader cl2) {
-        return AccessController.doPrivileged(new PrivilegedAction<BundleContext>() {
-            public BundleContext run() {
-                ClassLoader cl = cl2;
-                BundleContext result = null;
-                while (result == null && cl != null) {
-                    if (cl instanceof BundleReference) {
-                        result = ((BundleReference) cl).getBundle().getBundleContext();
-                    } else if (cl != null) {
-                        cl = cl.getParent();
-                    }
-                }
-
-                return result;
-            }
-        });
-    }
-
-    public static Object getService(OsgiName lookupName,
+    public static Object getService(BundleContext ctx,
+                                    OsgiName lookupName,
                                     String id,
                                     boolean dynamicRebind,
                                     Map<String, Object> env) throws NamingException {
@@ -210,8 +115,6 @@ public final class ServiceHelper {
         String filter = lookupName.getFilter();
         String serviceName = lookupName.getServiceName();
 
-        BundleContext ctx = getBundleContext(env);
-
         if (id != null) {
             if (filter == null) {
                 filter = '(' + Constants.SERVICE_ID + '=' + id + ')';
@@ -243,23 +146,11 @@ public final class ServiceHelper {
         return result;
     }
 
-    private static Object proxy(final String interface1,
-                                final String filter,
-                                final boolean rebind,
-                                final BundleContext ctx,
-                                final ServicePair pair) {
-        return AccessController.doPrivileged(new PrivilegedAction<Object>() {
-            public Object run() {
-                return proxyPriviledged(interface1, filter, rebind, ctx, pair);
-            }
-        });
-    }
-
-    private static Object proxyPriviledged(String interface1,
-                                           String filter,
-                                           boolean dynamicRebind,
-                                           BundleContext ctx,
-                                           ServicePair pair) {
+    private static Object proxy(String interface1,
+                                String filter,
+                                boolean dynamicRebind,
+                                BundleContext ctx,
+                                ServicePair pair) {
         String[] interfaces = null;   
         if (interface1 != null) {
             interfaces = new String [] { interface1 };
@@ -358,12 +249,12 @@ public final class ServiceHelper {
         return p;
     }
 
-    public static ServiceReference[] getServiceReferences(String interface1,
+    public static ServiceReference[] getServiceReferences(BundleContext ctx,
+                                                          String interface1,
                                                           String filter,
                                                           String serviceName,
                                                           Map<String, Object> env)
             throws NamingException {
-        BundleContext ctx = getBundleContext(env);
         ServiceReference[] refs = null;
 
         try {

Modified: incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/url/AbstractServiceRegistryContext.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/url/AbstractServiceRegistryContext.java?rev=944370&r1=944369&r2=944370&view=diff
==============================================================================
--- incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/url/AbstractServiceRegistryContext.java (original)
+++ incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/url/AbstractServiceRegistryContext.java Fri May 14 18:15:57 2010
@@ -28,9 +28,12 @@ import javax.naming.NameParser;
 import javax.naming.NamingException;
 import javax.naming.OperationNotSupportedException;
 
+import org.osgi.framework.BundleContext;
+
 public abstract class AbstractServiceRegistryContext implements Context
 {
 
+  protected BundleContext callerContext;
   /** The environment for this context */
   protected Map<String, Object> env;
   /** The name parser for the service registry name space */
@@ -38,15 +41,17 @@ public abstract class AbstractServiceReg
   private static final String ARIES_SERVICES = "aries:services/";
 
   @SuppressWarnings("unchecked")
-  public AbstractServiceRegistryContext(Hashtable<?, ?> environment)
+  public AbstractServiceRegistryContext(BundleContext callerContext, Hashtable<?, ?> environment)
   {
+    this.callerContext = callerContext;
     env = new HashMap<String, Object>();
     env.putAll((Map<? extends String, ? extends Object>) environment);
   }
 
   @SuppressWarnings("unchecked")
-  public AbstractServiceRegistryContext(Map<?, ?> environment)
+  public AbstractServiceRegistryContext(BundleContext callerContext, Map<?, ?> environment)
   {
+    this.callerContext = callerContext;
     env = new HashMap<String, Object>();
     env.putAll((Map<? extends String, ? extends Object>) environment);
   }

Modified: incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/url/Activator.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/url/Activator.java?rev=944370&r1=944369&r2=944370&view=diff
==============================================================================
--- incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/url/Activator.java (original)
+++ incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/url/Activator.java Fri May 14 18:15:57 2010
@@ -29,19 +29,16 @@ import org.osgi.service.jndi.JNDIConstan
 
 public class Activator implements BundleActivator {
 
-  private ServiceRegistration reg;
-	
-  public void start(BundleContext context)
-  {
-    Hashtable<Object, Object> props = new Hashtable<Object, Object>();
-    props.put(JNDIConstants.JNDI_URLSCHEME, new String[] {"osgi", "aries"} );
-    reg = context.registerService(ObjectFactory.class.getName(), new OsgiURLContextFactory(), props);
-  }
+    private ServiceRegistration reg;
 
+    public void start(BundleContext context) {
+        Hashtable<Object, Object> props = new Hashtable<Object, Object>();
+        props.put(JNDIConstants.JNDI_URLSCHEME, new String[] { "osgi", "aries" });
+        reg = context.registerService(ObjectFactory.class.getName(), new OsgiURLContextServiceFactory(), props);
+    }
 
-  public void stop(BundleContext context)
-  {
-	reg.unregister();
-  }
+    public void stop(BundleContext context) {
+        reg.unregister();
+    }
 
 }

Modified: incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/url/OsgiURLContextFactory.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/url/OsgiURLContextFactory.java?rev=944370&r1=944369&r2=944370&view=diff
==============================================================================
--- incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/url/OsgiURLContextFactory.java (original)
+++ incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/url/OsgiURLContextFactory.java Fri May 14 18:15:57 2010
@@ -26,55 +26,58 @@ import javax.naming.Name;
 import javax.naming.NamingException;
 import javax.naming.spi.ObjectFactory;
 
+import org.osgi.framework.BundleContext;
+
 /**
  * A factory for the aries JNDI context
  */
-public class OsgiURLContextFactory implements ObjectFactory
-{
-  public Object getObjectInstance(Object obj, Name name, Context nameCtx,
-      Hashtable<?, ?> environment) throws Exception
-  {
-    if (obj == null) {
-      return new ServiceRegistryContext(environment);
-    } else if (obj instanceof String) {
-      Context ctx = null;
-      try {
-        
-        ctx = new ServiceRegistryContext(environment);
-        
-        return ctx.lookup((String)obj);
-      } finally {
-        if (ctx != null) ctx.close();
-      }
-    } else if (obj instanceof String[]) {
-      // Try each URL until either lookup succeeds or they all fail
-      String[] urls = (String[])obj;
-      if (urls.length == 0) throw new ConfigurationException("0");
-      Context context = new ServiceRegistryContext(environment);
-      try
-      {
-        NamingException ne = null;
-        for(int i=0; i< urls.length; i++)
-        {
-          try
-          {
-            return context.lookup(urls[i]);
-          }
-          catch(NamingException e)
-          {
-            ne = e;
-          }
-        }
-        throw ne;
-      }
-      finally
-      {
-        context.close();
-      }    
-      
+public class OsgiURLContextFactory implements ObjectFactory {
+    
+    private BundleContext callerContext;
+    
+    public OsgiURLContextFactory(BundleContext callerContext) {
+        this.callerContext = callerContext;
     }
+    
+    public Object getObjectInstance(Object obj,
+                                    Name name,
+                                    Context nameCtx,
+                                    Hashtable<?, ?> environment) throws Exception {
+        if (obj == null) {
+            return new ServiceRegistryContext(callerContext, environment);
+        } else if (obj instanceof String) {
+            Context ctx = null;
+            try {
+                ctx = new ServiceRegistryContext(callerContext, environment);
 
-    return null;
-  }
+                return ctx.lookup((String) obj);
+            } finally {
+                if (ctx != null)
+                    ctx.close();
+            }
+        } else if (obj instanceof String[]) {
+            // Try each URL until either lookup succeeds or they all fail
+            String[] urls = (String[]) obj;
+            if (urls.length == 0) {
+                throw new ConfigurationException("0");
+            }
+            Context context = new ServiceRegistryContext(callerContext, environment);
+            try {
+                NamingException ne = null;
+                for (int i = 0; i < urls.length; i++) {
+                    try {
+                        return context.lookup(urls[i]);
+                    } catch (NamingException e) {
+                        ne = e;
+                    }
+                }
+                throw ne;
+            } finally {
+                context.close();
+            }
+        }
+
+        return null;
+    }
 
 }

Added: incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/url/OsgiURLContextServiceFactory.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/url/OsgiURLContextServiceFactory.java?rev=944370&view=auto
==============================================================================
--- incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/url/OsgiURLContextServiceFactory.java (added)
+++ incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/url/OsgiURLContextServiceFactory.java Fri May 14 18:15:57 2010
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.aries.jndi.url;
+
+import org.osgi.framework.Bundle;
+import org.osgi.framework.ServiceFactory;
+import org.osgi.framework.ServiceRegistration;
+
+/**
+ * A factory for the aries JNDI context
+ */
+public class OsgiURLContextServiceFactory implements ServiceFactory {
+
+    public Object getService(Bundle bundle, ServiceRegistration registration) {
+        return new OsgiURLContextFactory(bundle.getBundleContext());
+    }
+
+    public void ungetService(Bundle bundle, ServiceRegistration registration, Object service) {
+    }
+
+}

Propchange: incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/url/OsgiURLContextServiceFactory.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/url/OsgiURLContextServiceFactory.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision

Propchange: incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/url/OsgiURLContextServiceFactory.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/url/ServiceRegistryContext.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/url/ServiceRegistryContext.java?rev=944370&r1=944369&r2=944370&view=diff
==============================================================================
--- incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/url/ServiceRegistryContext.java (original)
+++ incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/url/ServiceRegistryContext.java Fri May 14 18:15:57 2010
@@ -18,6 +18,8 @@
  */
 package org.apache.aries.jndi.url;
 
+import java.security.AccessControlException;
+import java.security.AccessController;
 import java.util.Hashtable;
 import java.util.Map;
 
@@ -30,112 +32,112 @@ import javax.naming.NamingEnumeration;
 import javax.naming.NamingException;
 
 import org.apache.aries.jndi.services.ServiceHelper;
+import org.osgi.framework.AdminPermission;
+import org.osgi.framework.BundleContext;
 
 /**
  * A JNDI context for looking stuff up from the service registry.
  */
-public class ServiceRegistryContext extends AbstractServiceRegistryContext implements Context
-{
-  /** The parent name, if one is provided, of this context */
-  private OsgiName parentName;
-
-  /**
-   * Why Mr Java this class does indeed take a fine copy of the provided 
-   * environment. One might imagine that it is worried that the provider is
-   * not to be trusted.
-   * 
-   * @param environment
-   */
-  public ServiceRegistryContext(Hashtable<?, ?> environment)
-  {
-    super(environment);
-  }
-
-  public ServiceRegistryContext(OsgiName validName, Map<String, Object> env) 
-  {
-    super(env);
-    parentName = validName;
-  }
-
-  public NamingEnumeration<NameClassPair> list(final Name name) throws NamingException
-  {
-    return new ServiceRegistryListContext(env, convert(name)).list("");
-  }
-
-  public NamingEnumeration<NameClassPair> list(String name) throws NamingException
-  {
-    return list(parse(name));
-  }
-
-  public NamingEnumeration<Binding> listBindings(final Name name) throws NamingException
-  {
-    return new ServiceRegistryListContext(env, convert(name)).listBindings("");
-  }
-
-  public NamingEnumeration<Binding> listBindings(String name) throws NamingException
-  {
-    return listBindings(parse(name));
-  }
-
-  public Object lookup(Name name) throws NamingException
-  {
-    Object result;
-    
-    OsgiName validName = convert(name);
-    
-    String pathFragment = validName.getSchemePath();
-    String schemeName = validName.getScheme();
-    
-    if (validName.hasInterface()) {
-      if (OsgiName.FRAMEWORK_PATH.equals(pathFragment) && "bundleContext".equals(validName.getServiceName())) {
-        result = ServiceHelper.getBundleContext(env);
-      } else if ((OsgiName.SERVICE_PATH.equals(pathFragment) && OsgiName.OSGI_SCHEME.equals(schemeName)) ||
-                 (OsgiName.SERVICES_PATH.equals(pathFragment) && OsgiName.ARIES_SCHEME.equals(schemeName))) {
-        result = ServiceHelper.getService(validName, null, true, env);
-      } else if (OsgiName.SERVICE_LIST_PATH.equals(pathFragment)) {
-        result = new ServiceRegistryListContext(env, validName);
-      } else {
-        result = null;
-      }
-    } else {
-      result = new ServiceRegistryContext(validName, env);
-    }
-    
-    if (result == null) {
-      throw new NameNotFoundException(name.toString());
-    }
-    
-    return result;
-  }
-
-  private OsgiName convert(Name name) throws NamingException
-  {
-    OsgiName result;
-    
-    if (name instanceof OsgiName) {
-      result = (OsgiName) name;
-    } else {
-      if (parentName != null) {
-        result = new OsgiName(parentName.toString() + "/" + name.toString());
-      } else {
-        result = (OsgiName)parser.parse(name.toString());
-      }
-    }
-    
-    return result;
-  }
-  
-  private Name parse(String name) throws NamingException
-  {
-    if (parentName != null) {
-        name = parentName.toString() + "/" + name;
-    }
-    
-    return parser.parse(name);
-  }
-  
-  public Object lookup(String name) throws NamingException
-  {
-    return lookup(parse(name));
-  }
+public class ServiceRegistryContext extends AbstractServiceRegistryContext implements Context {
+    /** The parent name, if one is provided, of this context */
+    private OsgiName parentName;
+
+    /**
+     * Why Mr Java this class does indeed take a fine copy of the provided
+     * environment. One might imagine that it is worried that the provider is
+     * not to be trusted.
+     * 
+     * @param environment
+     */
+    public ServiceRegistryContext(BundleContext callerContext, Hashtable<?, ?> environment) {
+        super(callerContext, environment);
+    }
+
+    public ServiceRegistryContext(BundleContext callerContext, OsgiName validName, Map<String, Object> env) {
+        super(callerContext, env);
+        parentName = validName;
+    }
+
+    public NamingEnumeration<NameClassPair> list(final Name name) throws NamingException {
+        return new ServiceRegistryListContext(callerContext, env, convert(name)).list("");
+    }
+
+    public NamingEnumeration<NameClassPair> list(String name) throws NamingException {
+        return list(parse(name));
+    }
+
+    public NamingEnumeration<Binding> listBindings(final Name name) throws NamingException {
+        return new ServiceRegistryListContext(callerContext, env, convert(name)).listBindings("");
+    }
+
+    public NamingEnumeration<Binding> listBindings(String name) throws NamingException {
+        return listBindings(parse(name));
+    }
+
+    public Object lookup(Name name) throws NamingException {
+        Object result;
+
+        OsgiName validName = convert(name);
+
+        String pathFragment = validName.getSchemePath();
+        String schemeName = validName.getScheme();
+
+        if (validName.hasInterface()) {
+            if (OsgiName.FRAMEWORK_PATH.equals(pathFragment) && "bundleContext".equals(validName.getServiceName())) {
+                AdminPermission adminPermission = 
+                    new AdminPermission(callerContext.getBundle(), AdminPermission.CONTEXT);                
+                try {
+                    AccessController.checkPermission(adminPermission);
+                    return callerContext;
+                } catch (AccessControlException accessControlException) {
+                    NamingException namingException = new NameNotFoundException("Caller does not have permissions to get BundleContext.");
+                    namingException.setRootCause(accessControlException);
+                    throw namingException;
+                }
+            } else if ((OsgiName.SERVICE_PATH.equals(pathFragment) && OsgiName.OSGI_SCHEME.equals(schemeName))
+                       || (OsgiName.SERVICES_PATH.equals(pathFragment) && OsgiName.ARIES_SCHEME.equals(schemeName))) {
+                result = ServiceHelper.getService(callerContext, validName, null, true, env);
+            } else if (OsgiName.SERVICE_LIST_PATH.equals(pathFragment)) {
+                result = new ServiceRegistryListContext(callerContext, env, validName);
+            } else {
+                result = null;
+            }
+        } else {
+            result = new ServiceRegistryContext(callerContext, validName, env);
+        }
+
+        if (result == null) {
+            throw new NameNotFoundException(name.toString());
+        }
+
+        return result;
+    }
+
+    private OsgiName convert(Name name) throws NamingException {
+        OsgiName result;
+
+        if (name instanceof OsgiName) {
+            result = (OsgiName) name;
+        } else {
+            if (parentName != null) {
+                result = new OsgiName(parentName.toString() + "/" + name.toString());
+            } else {
+                result = (OsgiName) parser.parse(name.toString());
+            }
+        }
+
+        return result;
+    }
+
+    private Name parse(String name) throws NamingException {
+        if (parentName != null) {
+            name = parentName.toString() + "/" + name;
+        }
+
+        return parser.parse(name);
+    }
+
+    public Object lookup(String name) throws NamingException {
+        return lookup(parse(name));
+    }
 }

Modified: incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/url/ServiceRegistryListContext.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/url/ServiceRegistryListContext.java?rev=944370&r1=944369&r2=944370&view=diff
==============================================================================
--- incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/url/ServiceRegistryListContext.java (original)
+++ incubator/aries/trunk/jndi/jndi-url/src/main/java/org/apache/aries/jndi/url/ServiceRegistryListContext.java Fri May 14 18:15:57 2010
@@ -94,9 +94,9 @@ public class ServiceRegistryListContext 
     
   }
   
-  public ServiceRegistryListContext(Map<String, Object> env, OsgiName validName)
+  public ServiceRegistryListContext(BundleContext callerContext, Map<String, Object> env, OsgiName validName)
   {
-    super(env);
+    super(callerContext, env);
     parentName = validName;
   }
 
@@ -109,10 +109,9 @@ public class ServiceRegistryListContext 
   {
     if (!!!"".equals(name)) throw new NameNotFoundException(name);
     
-    final BundleContext ctx = ServiceHelper.getBundleContext(env);
-    final ServiceReference[] refs = ServiceHelper.getServiceReferences(parentName.getInterface(), parentName.getFilter(), parentName.getServiceName(), env);
+    final ServiceReference[] refs = ServiceHelper.getServiceReferences(callerContext, parentName.getInterface(), parentName.getFilter(), parentName.getServiceName(), env);
     
-    return new ServiceNamingEnumeration<NameClassPair>(ctx, refs, new ThingManager<NameClassPair>() {
+    return new ServiceNamingEnumeration<NameClassPair>(callerContext, refs, new ThingManager<NameClassPair>() {
       public NameClassPair get(BundleContext ctx, ServiceReference ref)
       {
         String serviceId = String.valueOf(ref.getProperty(Constants.SERVICE_ID));
@@ -142,10 +141,9 @@ public class ServiceRegistryListContext 
   {
     if (!!!"".equals(name)) throw new NameNotFoundException(name);
     
-    final BundleContext ctx = ServiceHelper.getBundleContext(env);
-    final ServiceReference[] refs = ServiceHelper.getServiceReferences(parentName.getInterface(), parentName.getFilter(), parentName.getServiceName(), env);
+    final ServiceReference[] refs = ServiceHelper.getServiceReferences(callerContext, parentName.getInterface(), parentName.getFilter(), parentName.getServiceName(), env);
 
-    return new ServiceNamingEnumeration<Binding>(ctx, refs, new ThingManager<Binding>() {
+    return new ServiceNamingEnumeration<Binding>(callerContext, refs, new ThingManager<Binding>() {
       public Binding get(BundleContext ctx, ServiceReference ref)
       {
         String serviceId = String.valueOf(ref.getProperty(Constants.SERVICE_ID));
@@ -171,7 +169,7 @@ public class ServiceRegistryListContext 
   {
     Object result = null;
     
-    result = ServiceHelper.getService(parentName, name, false, env);
+    result = ServiceHelper.getService(callerContext, parentName, name, false, env);
     
     if (result == null) {
       throw new NameNotFoundException(name.toString());

Modified: incubator/aries/trunk/jndi/jndi-url/src/test/java/org/apache/aries/jndi/url/ServiceRegistryContextTest.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jndi/jndi-url/src/test/java/org/apache/aries/jndi/url/ServiceRegistryContextTest.java?rev=944370&r1=944369&r2=944370&view=diff
==============================================================================
--- incubator/aries/trunk/jndi/jndi-url/src/test/java/org/apache/aries/jndi/url/ServiceRegistryContextTest.java (original)
+++ incubator/aries/trunk/jndi/jndi-url/src/test/java/org/apache/aries/jndi/url/ServiceRegistryContextTest.java Fri May 14 18:15:57 2010
@@ -55,6 +55,7 @@ import org.osgi.framework.ServiceExcepti
 import org.osgi.framework.ServiceFactory;
 import org.osgi.framework.ServiceReference;
 import org.osgi.framework.ServiceRegistration;
+import org.osgi.service.jndi.JNDIConstants;
 
 /**
  * Tests for our JNDI implementation for the service registry.
@@ -80,14 +81,9 @@ public class ServiceRegistryContextTest
   public void registerService() throws NamingException, SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException 
   {
     bc =  Skeleton.newMock(new BundleContextMock(), BundleContext.class);
-    new Activator().start(bc);
     new org.apache.aries.jndi.startup.Activator().start(bc);
-    
-    Field f = ContextHelper.class.getDeclaredField("context");
-    f.setAccessible(true);
-    f.set(null, bc);
-    OSGiObjectFactoryBuilder.setBundleContext(bc);
-
+    new Activator().start(bc);
+        
     service = Skeleton.newMock(Runnable.class);
     
     registerService(service);
@@ -200,7 +196,7 @@ public class ServiceRegistryContextTest
         
     InitialContext ctx = new InitialContext(new Hashtable<Object, Object>());
     
-    BundleMock mock = new BundleMock("scooby.doo", new Properties());
+    BundleMock mock = new BundleMock("scooby.doo.1", new Properties());
     
     Thread.currentThread().setContextClassLoader(mock.getClassLoader());
     
@@ -216,7 +212,9 @@ public class ServiceRegistryContextTest
     
     skel.assertCalled(new MethodCall(BundleContext.class, "getServiceReferences", "java.lang.Runnable", null));
 
-    mock = new BundleMock("scooby.doo", new Properties());
+    ctx = new InitialContext(new Hashtable<Object, Object>());
+    
+    mock = new BundleMock("scooby.doo.2", new Properties());
     
     Thread.currentThread().setContextClassLoader(mock.getClassLoader());
 
@@ -233,7 +231,7 @@ public class ServiceRegistryContextTest
     s.run();
     
     Skeleton.getSkeleton(service).assertCalledExactNumberOfTimes(new MethodCall(Runnable.class, "run"), 2);
-
+       
     skel = Skeleton.getSkeleton(mock.getBundleContext());
     skel.assertCalled(new MethodCall(BundleContext.class, "getServiceReferences", "java.lang.Runnable", null));
   }

Modified: incubator/aries/trunk/testsupport/testsupport-unit/src/main/java/org/apache/aries/mocks/BundleContextMock.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/testsupport/testsupport-unit/src/main/java/org/apache/aries/mocks/BundleContextMock.java?rev=944370&r1=944369&r2=944370&view=diff
==============================================================================
--- incubator/aries/trunk/testsupport/testsupport-unit/src/main/java/org/apache/aries/mocks/BundleContextMock.java (original)
+++ incubator/aries/trunk/testsupport/testsupport-unit/src/main/java/org/apache/aries/mocks/BundleContextMock.java Fri May 14 18:15:57 2010
@@ -412,8 +412,7 @@ public class BundleContextMock
       e.printStackTrace();
     }
 
-    ServiceFactory factory = new MockServiceFactory(service);
-    return registerService(new String[] {interFace}, factory, properties);
+    return registerService(new String[] {interFace}, service, properties);
   }
   
   /**