FileDocCategorySizeDatePackage
JndiProxyObjectFactory.javaAPI DocGlassfish v2 API6438Fri May 04 22:35:14 BST 2007com.sun.enterprise.resource

JndiProxyObjectFactory

public class JndiProxyObjectFactory extends Object implements ObjectFactory
A proxy object factory for an external JNDI factory

Fields Summary
private static Hashtable
contextMap
Constructors Summary
Methods Summary
public java.lang.ObjectgetObjectInstance(java.lang.Object obj, javax.naming.Name name, javax.naming.Context nameCtx, java.util.Hashtable environment)
create the object instance from the factory


        // name to lookup in the external factory
        String jndiLookupName = "";
        String jndiFactoryClass = null;
 	    String bindName = null;

        // get the target initial naming context and the lookup name
        Reference ref = (Reference) obj;
        Enumeration addrs = ref.getAll();
        while (addrs.hasMoreElements()) {
            RefAddr addr = (RefAddr) addrs.nextElement();

            String prop = addr.getType();
            if (prop.equals("jndiName")) {
                bindName = (String)addr.getContent();
            }
            else if (prop.equals("jndiLookupName")) {
                jndiLookupName = (String) addr.getContent();
            }
            else if (prop.equals("jndiFactoryClass")) {
                jndiFactoryClass = (String) addr.getContent();
            }
        }

        if (bindName == null) {
		    throw new NamingException("JndiProxyObjectFactory: no bindName context info");
	    }

	    ProxyRefAddr contextAddr = (ProxyRefAddr)ref.get(bindName);
	    Hashtable env = null;
	    if (contextAddr == null || 
            jndiFactoryClass == null ||
	        (env = (Hashtable)(contextAddr.getContent())) == null) {
		    throw new NamingException("JndiProxyObjectFactory: no info in the reference about the target context; contextAddr = " + contextAddr + " env = " + env + " factoryClass = " + jndiFactoryClass);
	}

        // Context of the external naming factory
        Context context = (Context)contextMap.get(bindName);
        if (context == null) {
            synchronized (contextMap) {
                context = (Context)contextMap.get(bindName);
                if (context == null) {
                    context = loadInitialContext(jndiFactoryClass, env);
                    contextMap.put(bindName, context);
                }
            }
        }

        if (context == null)
            throw new NamingException("JndiProxyObjectFactory no InitialContext" + jndiFactoryClass);

        // use the name to lookup in the external JNDI naming context
        try {
            return context.lookup(jndiLookupName);
        } catch (NameNotFoundException e) {
            throw new ExternalNameNotFoundException(e);
        }
    
private javax.naming.ContextloadInitialContext(java.lang.String factoryClass, java.util.Hashtable env)
load the context factory

	Object factory = ResourceInstaller.loadObject(factoryClass);
        if (factory == null) {
        	System.err.println("Cannot load external-jndi-resource " +
                                   "factory-class '" + factoryClass + "'");
                return null;
        } else if (! (factory instanceof
                            javax.naming.spi.InitialContextFactory)) {

                System.err.println("external-jndi-resource factory-class '"
                                  + factoryClass + "' must be of type "
                                  + "javax.naming.spi.InitialContextFactory");
                return null;
        }

        Context context = null;
        try {
        	context = ((InitialContextFactory)factory).getInitialContext(env);
        } catch (NamingException ne) {
          	System.err.println("Exception thrown creating initial context " +
                                   "for external JNDI factory '" +
                                   factoryClass + "' " + ne.getMessage());
        }

	return context;
    
protected static javax.naming.ContextremoveInitialContext(java.lang.String jndiName)


         
        return (Context) contextMap.remove(jndiName);