/*
* The Spring Framework is published under the terms
* of the Apache Software License.
*/
package org.springframework.ejb.support;
import java.util.HashMap;
import javax.naming.Binding;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.PropertiesBeanDefinitionReader;
/**
* Bean definition reader that populates a bean factory from JNDI environment
* variables available to an object running in a J2EE application server.
* Such a bean factory might be used to parameterize EJBs.
*
* <p>Only environment entries with names beginning with "beans." are included.
*
* @author Rod Johnson
*/
public class JndiEnvironmentBeanDefinitionReader {
/** Syntax is beans.name.class=Y */
public static final String BEANS_PREFIX = "beans.";
/** Delimiter for properties */
public static final String DELIMITER = ".";
protected final Log logger = LogFactory.getLog(getClass());
/**
* Creates new JNDIBeanFactory
* @param root likely to be "java:comp/env"
*/
public JndiEnvironmentBeanDefinitionReader(BeanDefinitionRegistry beanFactory, String root) throws BeansException {
// We'll take everything from the NamingContext and dump it in a
// Properties object, so that the superclass can efficiently manipulate it
// after we've closed the context.
HashMap m = new HashMap();
Context initCtx = null;
try {
initCtx = new InitialContext();
// Parameterize
NamingEnumeration bindings = initCtx.listBindings(root);
// Orion 1.5.2 doesn't seem to regard anything under a /
// as a true subcontext, so we need to search all bindings
// Not all that fast, but it doesn't matter
while (bindings.hasMore()) {
Binding binding = (Binding) bindings.next();
logger.debug("Name: " + binding.getName( ));
logger.debug("Type: " + binding.getClassName( ));
logger.debug("Value: " + binding.getObject());
m.put(binding.getName(), binding.getObject());
}
bindings.close();
PropertiesBeanDefinitionReader propReader = new PropertiesBeanDefinitionReader(beanFactory);
propReader.registerBeanDefinitions(m, BEANS_PREFIX);
}
catch (NamingException ex) {
logger.debug("----- NO PROPERTIES FOUND " + ex);
}
finally {
try {
if (initCtx != null) {
initCtx.close();
}
}
catch (NamingException ex) {
// IGNORE OR THROW RTE?
}
}
}
}