package org.jboss.naming;
import java.util.Hashtable;
import java.util.WeakHashMap;
import java.security.PrivilegedAction;
import java.security.AccessController;
import javax.naming.Context;
import javax.naming.Name;
import javax.naming.spi.ObjectFactory;
import org.jnp.server.NamingServer;
import org.jnp.interfaces.NamingContext;
public class ENCFactory
implements ObjectFactory
{
private static WeakHashMap encs = new WeakHashMap();
private static ClassLoader topLoader;
public static void setTopClassLoader(ClassLoader topLoader)
{
ENCFactory.topLoader = topLoader;
}
public static ClassLoader getTopClassLoader()
{
return ENCFactory.topLoader;
}
public Object getObjectInstance(Object obj, Name name, Context nameCtx,
Hashtable environment)
throws Exception
{
ClassLoader ctxClassLoader = GetTCLAction.getContextClassLoader();
synchronized (encs)
{
Context compCtx = (Context) encs.get(ctxClassLoader);
if (compCtx == null)
{
ClassLoader loader = ctxClassLoader;
GetParentAction action = new GetParentAction(ctxClassLoader);
while( loader != null && loader != topLoader && compCtx == null )
{
compCtx = (Context) encs.get(loader);
loader = action.getParent();
}
if( compCtx == null )
{
NamingServer srv = new NamingServer();
compCtx = new NamingContext(environment, null, srv);
encs.put(ctxClassLoader, compCtx);
}
}
return compCtx;
}
}
private static class GetTCLAction implements PrivilegedAction
{
static PrivilegedAction ACTION = new GetTCLAction();
public Object run()
{
ClassLoader loader = Thread.currentThread().getContextClassLoader();
return loader;
}
static ClassLoader getContextClassLoader()
{
ClassLoader loader = (ClassLoader) AccessController.doPrivileged(ACTION);
return loader;
}
}
private static class GetParentAction implements PrivilegedAction
{
ClassLoader loader;
GetParentAction(ClassLoader loader)
{
this.loader = loader;
}
public Object run()
{
ClassLoader parent = null;
if( loader != null )
{
parent = loader.getParent();
loader = parent;
}
return parent;
}
ClassLoader getParent()
{
ClassLoader parent = (ClassLoader) AccessController.doPrivileged(this);
return parent;
}
}
}