You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicemix.apache.org by cc...@apache.org on 2009/10/19 20:13:26 UTC

svn commit: r826743 - in /servicemix/smx4/nmr/trunk/naming/src/main/java/org/apache/servicemix/naming: GlobalInitialContextFactoryBuilder.java OSGiInitialContextFactoryBuilder.java

Author: ccustine
Date: Mon Oct 19 18:13:25 2009
New Revision: 826743

URL: http://svn.apache.org/viewvc?rev=826743&view=rev
Log:
SMX4NMR-164 - JBI deployments can't use JNDI context class from embedded jar

Modified:
    servicemix/smx4/nmr/trunk/naming/src/main/java/org/apache/servicemix/naming/GlobalInitialContextFactoryBuilder.java
    servicemix/smx4/nmr/trunk/naming/src/main/java/org/apache/servicemix/naming/OSGiInitialContextFactoryBuilder.java

Modified: servicemix/smx4/nmr/trunk/naming/src/main/java/org/apache/servicemix/naming/GlobalInitialContextFactoryBuilder.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/naming/src/main/java/org/apache/servicemix/naming/GlobalInitialContextFactoryBuilder.java?rev=826743&r1=826742&r2=826743&view=diff
==============================================================================
--- servicemix/smx4/nmr/trunk/naming/src/main/java/org/apache/servicemix/naming/GlobalInitialContextFactoryBuilder.java (original)
+++ servicemix/smx4/nmr/trunk/naming/src/main/java/org/apache/servicemix/naming/GlobalInitialContextFactoryBuilder.java Mon Oct 19 18:13:25 2009
@@ -18,6 +18,7 @@
 
 import java.util.Hashtable;
 
+import javax.naming.Context;
 import javax.naming.NamingException;
 import javax.naming.spi.InitialContextFactory;
 import javax.naming.spi.InitialContextFactoryBuilder;
@@ -33,6 +34,9 @@
     }
 
     public InitialContextFactory createInitialContextFactory(Hashtable<?, ?> environment) throws NamingException {
+        if (environment != null && environment.get(Context.INITIAL_CONTEXT_FACTORY) !=null) {
+            return null;
+        }
         return new GlobalContextManager();
     }
 

Modified: servicemix/smx4/nmr/trunk/naming/src/main/java/org/apache/servicemix/naming/OSGiInitialContextFactoryBuilder.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/nmr/trunk/naming/src/main/java/org/apache/servicemix/naming/OSGiInitialContextFactoryBuilder.java?rev=826743&r1=826742&r2=826743&view=diff
==============================================================================
--- servicemix/smx4/nmr/trunk/naming/src/main/java/org/apache/servicemix/naming/OSGiInitialContextFactoryBuilder.java (original)
+++ servicemix/smx4/nmr/trunk/naming/src/main/java/org/apache/servicemix/naming/OSGiInitialContextFactoryBuilder.java Mon Oct 19 18:13:25 2009
@@ -27,13 +27,15 @@
 import javax.naming.spi.NamingManager;
 
 import org.osgi.framework.BundleContext;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
 import org.osgi.util.tracker.ServiceTracker;
 
 /**
  * An InitialContextFactoryBuilder which delegates to any InitialContextFactoryBuilder found
  * in the OSGi registry.
  */
-public class OSGiInitialContextFactoryBuilder extends ServiceTracker implements InitialContextFactoryBuilder {
+public class OSGiInitialContextFactoryBuilder extends ServiceTracker implements InitialContextFactoryBuilder, InitialContextFactory {
 
     private Context osgiContext;
 
@@ -63,33 +65,129 @@
         }
     }
 
-    public InitialContextFactory createInitialContextFactory(Hashtable<?, ?> env) throws NamingException {
-        InitialContextFactory factory = null;
-        InitialContextFactoryBuilder factoryBuilder = (InitialContextFactoryBuilder) getService();
-        if (factoryBuilder != null) {
-            factory = factoryBuilder.createInitialContextFactory(env);
-        }
-        if (factory == null && env != null) {
-            String className = (String) env.get(Context.INITIAL_CONTEXT_FACTORY);
-            if (className != null) {
-                try {
-                    factory = (InitialContextFactory) Class.forName(className).newInstance();
-                } catch (Exception e) {
-                    NoInitialContextException ne = new NoInitialContextException("Cannot instantiate class: " + className);
-                    ne.setRootCause(e);
-                    throw ne;
+    public InitialContextFactory createInitialContextFactory(Hashtable<?, ?> environment)
+        throws NamingException {
+        return this;
+    }
+
+    public Context getInitialContext(Hashtable<?, ?> environment) throws NamingException {
+        Context toReturn = null;
+
+        ServiceReference ref = context.getServiceReference(InitialContextFactoryWrapper.class.getName());
+
+        if (ref != null) {
+          try {
+              InitialContextFactoryWrapper icf = (InitialContextFactoryWrapper) context.getService(ref);
+
+              if (icf != null) {
+                  toReturn = icf.getInitialContext(environment);
+              }
+          }
+          finally {
+            context.ungetService(ref);
+          }
+        }
+
+        if (toReturn == null) {
+            toReturn  = new InitialContextWrapper(createContext(environment), osgiContext, environment);
+        }
+
+      return toReturn;
+    }
+
+    /**
+     * This method was borrowed from Aries.  Will eventually be replaced by Aries impl.
+     * @param env
+     * @return
+     * @throws NamingException
+     */
+    public Context createContext (Hashtable<?,?> env) throws NamingException {
+
+        InitialContextFactory icf = null;
+        ServiceReference ref = null;
+
+        String icfFactory = (String) env.get(Context.INITIAL_CONTEXT_FACTORY);
+
+        boolean icfFactorySet = true;
+
+        if (icfFactory == null) {
+            icfFactory = InitialContextFactory.class.getName();
+            icfFactorySet = false;
+        }
+
+        try {
+            ServiceReference[] refs = context.getAllServiceReferences(icfFactory, null);
+            if (refs != null) {
+                ref = refs[0];
+                icf = (InitialContextFactory) context.getService(ref);
+            }
+        } catch (InvalidSyntaxException e) {
+            NamingException e4 = new NamingException("Argh this should never happen :)");
+            e4.initCause(e);
+
+            throw e4;
+        }
+
+        if (icf == null) {
+            try {
+                ServiceReference[] refs = context.getAllServiceReferences(InitialContextFactoryBuilder.class.getName(), null);
+
+                if (refs != null) {
+                    for (ServiceReference icfbRef : refs) {
+                        InitialContextFactoryBuilder builder = (InitialContextFactoryBuilder) context.getService(icfbRef);
+
+                        icf = builder.createInitialContextFactory(env);
+
+                        context.ungetService(icfbRef);
+                        if (icf != null) {
+                            break;
+                        }
+                    }
                 }
+            } catch (InvalidSyntaxException e) {
+                NamingException e4 = new NamingException("Argh this should never happen :)");
+                e4.initCause(e);
+                throw e4;
             }
         }
-        if (factory == null) {
-            NoInitialContextException ne = new NoInitialContextException(
-                    "Need to specify class name in environment or system " +
-                            "property, or as an applet parameter, or in an " +
-                            "application resource file:  " +
-                            Context.INITIAL_CONTEXT_FACTORY);
-            throw ne;
+
+        if (icf == null && icfFactorySet) {
+            try {
+                Class<?> clazz = Class.forName(icfFactory, true, Thread.currentThread().getContextClassLoader());
+                icf = (InitialContextFactory) clazz.newInstance();
+            } catch (ClassNotFoundException e11) {
+                NamingException e = new NamingException("Argh this should never happen :)");
+                e.initCause(e11);
+                throw e;
+            } catch (InstantiationException e2) {
+                NamingException e4 = new NamingException("Argh this should never happen :)");
+                e4.initCause(e2);
+                throw e4;
+            } catch (IllegalAccessException e1) {
+                NamingException e4 = new NamingException("Argh this should never happen :)");
+                e4.initCause(e1);
+                throw e4;
+            }
+        }
+
+        if (icf == null) {
+            NamingException e3 = new NoInitialContextException("We could not find an InitialContextFactory to use");
+
+            throw e3;
+        }
+
+        Context ctx = icf.getInitialContext(env);
+
+        if (ref != null) context.ungetService(ref);
+
+        if (ctx == null) {
+          NamingException e = new NamingException("The ICF returned a null context");
+          throw e;
         }
-        return new InitialContextFactoryWrapper(factory, osgiContext);
+
+        return ctx;
+
     }
 
+
 }