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;
+
}
+
}