You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aries.apache.org by no...@apache.org on 2010/09/22 08:29:08 UTC

svn commit: r999773 - in /incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi: ./ startup/

Author: not
Date: Wed Sep 22 06:29:07 2010
New Revision: 999773

URL: http://svn.apache.org/viewvc?rev=999773&view=rev
Log:
ARIES-417 Three things in one commit, probably bad.

1. Update to use generics
2. Common up the mechanism for finding URL ObjectFactories.
3. Call URLObjectFactoryFinder services to find more URL Context providers.

Added:
    incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ServicePair.java
Modified:
    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/JREInitialContextFactoryBuilder.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/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/Utils.java
    incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/startup/Activator.java

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=999773&r1=999772&r2=999773&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 Wed Sep 22 06:29:07 2010
@@ -20,6 +20,7 @@ package org.apache.aries.jndi;
 
 import java.security.PrivilegedExceptionAction;
 import java.util.Arrays;
+import java.util.Comparator;
 import java.util.Hashtable;
 
 import javax.naming.Context;
@@ -29,6 +30,7 @@ import javax.naming.spi.InitialContextFa
 import javax.naming.spi.InitialContextFactoryBuilder;
 import javax.naming.spi.ObjectFactory;
 
+import org.apache.aries.jndi.urls.URLObjectFactoryFinder;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.framework.ServiceReference;
@@ -67,38 +69,79 @@ public final class ContextHelper {
      */
     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.trim() + ")");
-
-            if (services != null) {
-                ref = services[0];
+      
+        ServicePair<ObjectFactory> urlObjectFactory = getURLObjectFactory(context, urlScheme, env);
+        
+        if (urlObjectFactory != null) {
+            ObjectFactory factory = urlObjectFactory.get();
+            
+            if (factory != null) {
+                try {
+                    return (Context) factory.getObjectInstance(null, null, null, env);
+                } catch (Exception e) {
+                    NamingException e2 = new NamingException();
+                    e2.initCause(e);
+                    throw e2;
+                } finally {
+                    urlObjectFactory.unget();
+                }
             }
-        } catch (InvalidSyntaxException e1) {
-            NamingException e = new NamingException("Argh this should never happen :)");
-            e.initCause(e1);
-            throw e;
         }
 
-        Context ctx = null; 
-        
-        if (ref != null) {
-            ObjectFactory factory = (ObjectFactory) context.getService(ref);
-            try {
-                return (Context) factory.getObjectInstance(null, null, null, env);
-            } catch (Exception e) {
-                NamingException e2 = new NamingException();
-                e2.initCause(e);
-                throw e2;
-            } finally {
-                if (ref != null) {
-                    context.ungetService(ref);
+        // if we got here then we couldn't find a URL context factory so return null.
+        return null;
+    }
+    
+    public static final ServicePair<ObjectFactory> getURLObjectFactory(BundleContext ctx, String urlScheme, Hashtable<?, ?> environment)
+      throws NamingException
+    {
+      ServicePair<ObjectFactory> result = null;
+      try {
+          ServiceReference[] services = ctx.getServiceReferences(ObjectFactory.class.getName(), 
+                                                                     "(" + JNDIConstants.JNDI_URLSCHEME + "=" + urlScheme.trim() + ")");
+
+          if (services != null) {
+              Arrays.sort(services);
+              result = new ServicePair<ObjectFactory>(ctx, services[services.length - 1]);
+          }
+      } catch (InvalidSyntaxException e1) {
+          NamingException e = new NamingException("Argh this should never happen :)");
+          e.initCause(e1);
+          throw e;
+      }
+      
+      if (result == null) {
+        ServiceReference[] refs;
+        try {
+          refs = ctx.getServiceReferences(URLObjectFactoryFinder.class.getName(), null);
+          if (refs != null) {
+            // need a reverse sort.
+            Arrays.sort(refs, new Comparator<ServiceReference>() {
+              public int compare(ServiceReference o1, ServiceReference o2) {
+                return o2.compareTo(o1);
+              }
+            });
+            
+            for (ServiceReference finderRef : refs) {
+              URLObjectFactoryFinder finder = (URLObjectFactoryFinder) ctx.getService(finderRef);
+              if (finder != null) {
+                ObjectFactory f = finder.findFactory(urlScheme);
+                
+                if (f != null) {
+                  result = new ServicePair<ObjectFactory>(ctx, finderRef, f);
+                  break;
+                } else {
+                  ctx.ungetService(finderRef);
                 }
+              }
             }
+          }
+        } catch (InvalidSyntaxException e) {
+          // Since the filter is null this cannot happen (famous last words).
         }
-
-        return ctx;
+      }
+      
+      return result;
     }
         
     public static Context getInitialContext(BundleContext context, Hashtable<?, ?> environment)

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=999773&r1=999772&r2=999773&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 Wed Sep 22 06:29:07 2010
@@ -34,11 +34,9 @@ import org.osgi.service.jndi.JNDIContext
 public class ContextManagerService implements JNDIContextManager {
 
     private Set<Context> contexts = Collections.synchronizedSet(new HashSet<Context>());
-    private BundleContext defaultContext;
     private BundleContext callerContext;
     
-    public ContextManagerService(BundleContext defaultContext, BundleContext callerContext) {
-        this.defaultContext = defaultContext;
+    public ContextManagerService(BundleContext callerContext) {
         this.callerContext = callerContext;
     }
     
@@ -56,23 +54,23 @@ public class ContextManagerService imple
     }
     
     public Context newInitialContext() throws NamingException {
-        return newInitialContext(new Hashtable());
+        return newInitialContext(new Hashtable<Object, Object>());
     }
 
-    public Context newInitialContext(Map environment) throws NamingException {
+    public Context newInitialContext(Map<?,?> environment) throws NamingException {
         return getInitialContext(environment);
     }
 
     public DirContext newInitialDirContext() throws NamingException {
-        return newInitialDirContext(new Hashtable());
+        return newInitialDirContext(new Hashtable<Object, Object>());
     }
 
-    public DirContext newInitialDirContext(Map environment) throws NamingException {
+    public DirContext newInitialDirContext(Map<?,?> environment) throws NamingException {
         return DirContext.class.cast( getInitialContext(environment) );
     }
     
-    private Context getInitialContext(Map environment) throws NamingException {        
-        Hashtable env = Utils.toHashtable(environment);
+    private Context getInitialContext(Map<?,?> environment) throws NamingException {        
+        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=999773&r1=999772&r2=999773&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 Wed Sep 22 06:29:07 2010
@@ -19,20 +19,13 @@
 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(defaultContext, bundle.getBundleContext());
+        return new ContextManagerService(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=999773&r1=999772&r2=999773&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 Wed Sep 22 06:29:07 2010
@@ -32,6 +32,7 @@ import javax.naming.directory.Attributes
 import javax.naming.directory.DirContext;
 import javax.naming.directory.ModificationItem;
 import javax.naming.directory.SearchControls;
+import javax.naming.directory.SearchResult;
 
 import org.apache.aries.jndi.ContextHelper.ContextProvider;
 import org.osgi.framework.BundleContext;
@@ -319,48 +320,48 @@ public class DelegateContext implements 
         return ((DirContext) findContext(name)).getSchemaClassDefinition(name);
     }
 
-    public NamingEnumeration search(Name name,
+    public NamingEnumeration<SearchResult> search(Name name,
                                     Attributes matchingAttributes,
                                     String[] attributesToReturn) throws NamingException {
         return ((DirContext) findContext(name))
                 .search(name, matchingAttributes, attributesToReturn);
     }
 
-    public NamingEnumeration search(String name,
+    public NamingEnumeration<SearchResult> search(String name,
                                     Attributes matchingAttributes,
                                     String[] attributesToReturn) throws NamingException {
         return ((DirContext) findContext(name))
                 .search(name, matchingAttributes, attributesToReturn);
     }
 
-    public NamingEnumeration search(Name name, Attributes matchingAttributes)
+    public NamingEnumeration<SearchResult> search(Name name, Attributes matchingAttributes)
             throws NamingException {
         return ((DirContext) findContext(name)).search(name, matchingAttributes);
     }
 
-    public NamingEnumeration search(String name, Attributes matchingAttributes)
+    public NamingEnumeration<SearchResult> search(String name, Attributes matchingAttributes)
             throws NamingException {
         return ((DirContext) findContext(name)).search(name, matchingAttributes);
     }
 
-    public NamingEnumeration search(Name name, String filter, SearchControls cons)
+    public NamingEnumeration<SearchResult> search(Name name, String filter, SearchControls cons)
             throws NamingException {
         return ((DirContext) findContext(name)).search(name, filter, cons);
     }
 
-    public NamingEnumeration search(String name, String filter, SearchControls cons)
+    public NamingEnumeration<SearchResult> search(String name, String filter, SearchControls cons)
             throws NamingException {
         return ((DirContext) findContext(name)).search(name, filter, cons);
     }
 
-    public NamingEnumeration search(Name name,
+    public NamingEnumeration<SearchResult> search(Name name,
                                     String filterExpr,
                                     Object[] filterArgs,
                                     SearchControls cons) throws NamingException {
         return ((DirContext) findContext(name)).search(name, filterExpr, filterArgs, cons);
     }
 
-    public NamingEnumeration search(String name,
+    public NamingEnumeration<SearchResult> search(String name,
                                     String filterExpr,
                                     Object[] filterArgs,
                                     SearchControls cons) throws NamingException {

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=999773&r1=999772&r2=999773&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 Wed Sep 22 06:29:07 2010
@@ -20,16 +20,13 @@ package org.apache.aries.jndi;
 
 import java.security.PrivilegedExceptionAction;
 import java.util.Arrays;
-import java.util.Enumeration;
 import java.util.Hashtable;
 
 import javax.naming.Context;
 import javax.naming.Name;
 import javax.naming.NamingException;
-import javax.naming.RefAddr;
 import javax.naming.Reference;
 import javax.naming.Referenceable;
-import javax.naming.StringRefAddr;
 import javax.naming.directory.Attributes;
 import javax.naming.spi.DirObjectFactory;
 import javax.naming.spi.ObjectFactory;
@@ -38,7 +35,6 @@ import javax.naming.spi.ObjectFactoryBui
 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 {
 
@@ -79,18 +75,15 @@ public class DirObjectFactoryHelper exte
             if (className != null) {
                 // Step 3
                 result = getObjectInstanceUsingClassName(obj, className, obj, name, nameCtx, environment, attrs);
-            } else {
-                // Step 4
-                result = getObjectInstanceUsingRefAddress(ref.getAll(), obj, name, nameCtx, environment, attrs);
             }
         }
 
-        // Step 5
+        // Step 4
         if (result == null || result == obj) {
             result = getObjectInstanceUsingObjectFactoryBuilders(obj, name, nameCtx, environment, attrs);
         }
         
-        // Step 6
+        // Step 5
         if (result == null || result == obj) {                
             if ((obj instanceof Reference && ((Reference) obj).getFactoryClassName() == null) ||
                 !(obj instanceof Reference)) {
@@ -141,55 +134,6 @@ public class DirObjectFactoryHelper exte
         return (result == null) ? obj : result;
     }
 
-    private Object getObjectInstanceUsingRefAddress(Enumeration<RefAddr> addresses,
-                                                    Object obj,
-                                                    Name name,
-                                                    Context nameCtx,
-                                                    Hashtable<?, ?> environment,
-                                                    Attributes attrs) 
-        throws Exception {
-        Object result = null;
-        while (addresses.hasMoreElements()) {
-            RefAddr address = addresses.nextElement();
-            if (address instanceof StringRefAddr && "URL".equals(address.getType())) {
-                String urlScheme = getUrlScheme( (String) address.getContent() );
-                DirObjectFactory factory = null;
-                ServiceReference ref = null;
-                try {
-                    ServiceReference[] services = callerContext.getServiceReferences(DirObjectFactory.class.getName(), 
-                            "(&(" + JNDIConstants.JNDI_URLSCHEME + "=" + urlScheme + "))");
-
-                    if (services != null && services.length > 0) {
-                        ref = services[0];
-                    }
-                } catch (InvalidSyntaxException e) {
-                    // should not happen
-                    throw new RuntimeException("Invalid filter", e);
-                }
-
-                if (ref != null) {
-                    factory = (DirObjectFactory) callerContext.getService(ref);
-                    
-                    String value = (String) address.getContent();
-                    try {
-                        result = factory.getObjectInstance(value, name, nameCtx, environment, attrs);
-                    } finally {
-                        callerContext.ungetService(ref);
-                    }
-
-                    // if the result comes back and is not null and not the reference
-                    // object then we should return the result, so break out of the
-                    // loop we are in.
-                    if (result != null && result != obj) {
-                        break;
-                    }
-                }
-            }
-        }
-
-        return (result == null) ? obj : result;
-    }
-
     private Object getObjectInstanceUsingClassName(Object reference,
                                                    String className,
                                                    Object obj,

Modified: incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/JREInitialContextFactoryBuilder.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/JREInitialContextFactoryBuilder.java?rev=999773&r1=999772&r2=999773&view=diff
==============================================================================
--- incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/JREInitialContextFactoryBuilder.java (original)
+++ incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/JREInitialContextFactoryBuilder.java Wed Sep 22 06:29:07 2010
@@ -32,7 +32,8 @@ public class JREInitialContextFactoryBui
         String contextFactoryClass = (String) environment.get(Context.INITIAL_CONTEXT_FACTORY);
         if (contextFactoryClass != null) {
             try {
-                Class clazz = ClassLoader.getSystemClassLoader().loadClass(contextFactoryClass);
+                @SuppressWarnings("unchecked")
+                Class<? extends InitialContextFactory> clazz = (Class<? extends InitialContextFactory>) ClassLoader.getSystemClassLoader().loadClass(contextFactoryClass);
                 return InitialContextFactory.class.cast(clazz.newInstance());
             } catch (Exception e) {
                 return null;

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=999773&r1=999772&r2=999773&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 Wed Sep 22 06:29:07 2010
@@ -32,12 +32,6 @@ import org.osgi.framework.BundleContext;
 
 public class OSGiInitialContextFactoryBuilder implements InitialContextFactoryBuilder, InitialContextFactory {
 
-	private BundleContext _context;
-	
-	public OSGiInitialContextFactoryBuilder(BundleContext context) {	
-		_context = context;
-	}
-	
 	public InitialContextFactory createInitialContextFactory(Hashtable<?, ?> environment) 
 	    throws NamingException {
 	    return this;

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=999773&r1=999772&r2=999773&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 Wed Sep 22 06:29:07 2010
@@ -36,7 +36,6 @@ import javax.naming.spi.ObjectFactoryBui
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.framework.ServiceReference;
-import org.osgi.service.jndi.JNDIConstants;
 
 public class ObjectFactoryHelper implements ObjectFactory {
     
@@ -156,28 +155,17 @@ public class ObjectFactoryHelper impleme
             RefAddr address = addresses.nextElement();
             if (address instanceof StringRefAddr && "URL".equals(address.getType())) {
                 String urlScheme = getUrlScheme( (String) address.getContent() );
-                ObjectFactory factory = null;
-                ServiceReference ref = null;
-                try {
-                    ServiceReference[] services = callerContext.getServiceReferences(ObjectFactory.class.getName(), 
-                            "(&(" + JNDIConstants.JNDI_URLSCHEME + "=" + urlScheme + "))");
-
-                    if (services != null && services.length > 0) {
-                        ref = services[0];
-                    }
-                } catch (InvalidSyntaxException e) {
-                    // should not happen
-                    throw new RuntimeException("Invalid filter", e);
-                }
-
-                if (ref != null) {
-                    factory = (ObjectFactory) callerContext.getService(ref);
+                
+                ServicePair<ObjectFactory> factoryService = ContextHelper.getURLObjectFactory(callerContext, urlScheme, environment);
+                
+                if (factoryService != null) {
+                    ObjectFactory factory = factoryService.get();
                     
                     String value = (String) address.getContent();
                     try {
                         result = factory.getObjectInstance(value, name, nameCtx, environment);
                     } finally {
-                        callerContext.ungetService(ref);
+                        factoryService.unget();
                     }
                     
                     // if the result comes back and is not null and not the reference

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=999773&r1=999772&r2=999773&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 Wed Sep 22 06:29:07 2010
@@ -39,19 +39,19 @@ public class ProviderAdminService implem
     public Object getObjectInstance(Object obj, 
                                     Name name, 
                                     Context context, 
-                                    Map environment)
+                                    Map<?,?> environment)
         throws Exception {
-        Hashtable env = Utils.toHashtable(environment);
+        Hashtable<?,?> env = Utils.toHashtable(environment);
         return helper.getObjectInstance(obj, name, context, env);
     }
 
     public Object getObjectInstance(Object obj,
                                     Name name,
                                     Context context,
-                                    Map environment,
+                                    Map<?,?> environment,
                                     Attributes attributes) 
         throws Exception {
-        Hashtable env = Utils.toHashtable(environment);
+        Hashtable<?,?> env = Utils.toHashtable(environment);
         return helper.getObjectInstance(obj, name, context, env, attributes);
     }
 

Added: incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ServicePair.java
URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ServicePair.java?rev=999773&view=auto
==============================================================================
--- incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ServicePair.java (added)
+++ incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/ServicePair.java Wed Sep 22 06:29:07 2010
@@ -0,0 +1,43 @@
+package org.apache.aries.jndi;
+
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+
+// TODO need to determine if this needs to be thread safe or not
+public class ServicePair<T>
+{
+  private BundleContext ctx;
+  private ServiceReference ref;
+  private T serviceObject;
+  
+  public ServicePair(BundleContext context, ServiceReference serviceRef)
+  {
+    ctx = context;
+    ref = serviceRef;
+  }
+  
+  public ServicePair(BundleContext context, ServiceReference serviceRef, T service)
+  {
+    ctx = context;
+    ref = serviceRef;
+    serviceObject = service;
+  }
+  
+  @SuppressWarnings("unchecked")
+  public T get()
+  {
+    if (serviceObject == null && ref.getBundle() != null) {
+      serviceObject = (T) ctx.getService(ref);
+    }
+    
+    return serviceObject;
+  }
+  
+  public void unget()
+  {
+    if (serviceObject != null) {
+      ctx.ungetService(ref);
+      serviceObject = null;
+    }
+  }
+}

Modified: 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=999773&r1=999772&r2=999773&view=diff
==============================================================================
--- incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/Utils.java (original)
+++ incubator/aries/trunk/jndi/jndi-core/src/main/java/org/apache/aries/jndi/Utils.java Wed Sep 22 06:29:07 2010
@@ -91,7 +91,7 @@ public final class Utils {
             
             // get the caller of the constructor
             if (indexOfConstructor >= 0 && (indexOfConstructor + 1) < classStack.length) {
-                Class callerClass = classStack[indexOfConstructor + 1];
+                Class<?> callerClass = classStack[indexOfConstructor + 1];
                 result = getBundleContext(callerClass.getClassLoader());
             }
         }
@@ -127,15 +127,14 @@ public final class Utils {
         });
     }
     
-    public static Hashtable toHashtable(Map map) {
-        Hashtable env;
-        if (map instanceof Hashtable) {
-            env = (Hashtable) map;
+    public static Hashtable<?,?> toHashtable(Map<?,?> map) {
+        Hashtable<?,?> env;
+        if (map instanceof Hashtable<?,?>) {
+            env = (Hashtable<?,?>) map;
+        } else if (map == null) {
+            env = new Hashtable<Object,Object>();
         } else {
-            env = new Hashtable();
-            if (map != null) {
-                env.putAll(map);
-            }
+            env = new Hashtable<Object,Object>(map);
         }
         return env;
     }

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=999773&r1=999772&r2=999773&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 Wed Sep 22 06:29:07 2010
@@ -19,25 +19,21 @@
 package org.apache.aries.jndi.startup;
 
 import java.lang.reflect.Field;
-import java.util.ArrayList;
-import java.util.List;
 
 import javax.naming.NamingException;
 import javax.naming.spi.InitialContextFactoryBuilder;
 import javax.naming.spi.NamingManager;
 import javax.naming.spi.ObjectFactoryBuilder;
 
-import org.osgi.framework.BundleActivator;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.ServiceRegistration;
-import org.osgi.service.jndi.JNDIContextManager;
-import org.osgi.service.jndi.JNDIProviderAdmin;
-
 import org.apache.aries.jndi.ContextManagerServiceFactory;
 import org.apache.aries.jndi.JREInitialContextFactoryBuilder;
 import org.apache.aries.jndi.OSGiInitialContextFactoryBuilder;
 import org.apache.aries.jndi.OSGiObjectFactoryBuilder;
 import org.apache.aries.jndi.ProviderAdminServiceFactory;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.service.jndi.JNDIContextManager;
+import org.osgi.service.jndi.JNDIProviderAdmin;
 
 /**
  * The activator for this bundle makes sure the static classes in it are
@@ -45,14 +41,13 @@ import org.apache.aries.jndi.ProviderAdm
  */
 public class Activator implements BundleActivator {
     
-    private List<ServiceRegistration> registrations = new ArrayList<ServiceRegistration>();
     private OSGiInitialContextFactoryBuilder icfBuilder;
     private OSGiObjectFactoryBuilder ofBuilder;
     
     public void start(BundleContext context) {
           
         try {
-            OSGiInitialContextFactoryBuilder builder = new OSGiInitialContextFactoryBuilder(context);
+            OSGiInitialContextFactoryBuilder builder = new OSGiInitialContextFactoryBuilder();
             NamingManager.setInitialContextFactoryBuilder(builder);
             icfBuilder = builder;
         } catch (NamingException e) {
@@ -71,17 +66,17 @@ public class Activator implements Bundle
             System.err.println("Cannot set the ObjectFactoryBuilder. Another builder is already installed");
         }
         
-        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));
+        context.registerService(JNDIProviderAdmin.class.getName(), 
+                                new ProviderAdminServiceFactory(context), 
+                                null);
+
+        context.registerService(InitialContextFactoryBuilder.class.getName(), 
+                                new JREInitialContextFactoryBuilder(), 
+                                null);
+
+        context.registerService(JNDIContextManager.class.getName(), 
+                                new ContextManagerServiceFactory(),
+                                null);
     }
 
     public void stop(BundleContext context) {
@@ -95,11 +90,6 @@ public class Activator implements Bundle
         if (ofBuilder != null) {
             unsetField(ObjectFactoryBuilder.class);
         }
-        
-        for (ServiceRegistration registration : registrations) {
-            registration.unregister();
-        }
-        registrations.clear();
     }
     
     /*
@@ -110,17 +100,13 @@ public class Activator implements Bundle
         try {
             for (Field field : NamingManager.class.getDeclaredFields()) {
                 if (expectedType.equals(field.getType())) {
-                    boolean accessible = field.isAccessible();
                     field.setAccessible(true);
-                    try {
-                        field.set(null, null);
-                    } finally {
-                        field.setAccessible(accessible);
-                    }
+                    field.set(null, null);
                 }
             }
         } catch (Throwable t) {
             // Ignore
+          t.printStackTrace();
         }
     }
 }