package org.togglz.cdi.spi;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Set;
import javax.enterprise.context.spi.CreationalContext;
import javax.enterprise.inject.spi.Bean;
import javax.enterprise.inject.spi.BeanManager;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.ServletContext;
import org.togglz.core.spi.BeanFinder;
public class CDIBeanFinder implements BeanFinder {
public final static String BEAN_MANAGER_JNDI = "java:comp/BeanManager";
public final static String BEAN_MANAGER_JNDI_TOMCAT = "java:comp/env/BeanManager";
public final static String SERVLET_CONTEXT_ATTR_WELD_1_1 = "org.jboss.weld.environment.servlet.javax.enterprise.inject.spi.BeanManager";
@Override
@SuppressWarnings("unchecked")
public <T> Collection<T> find(Class<T> clazz, Object context) {
List<T> result = new ArrayList<T>();
ServletContext servletContext = null;
if (context instanceof ServletContext) {
servletContext = (ServletContext) context;
}
BeanManager manager = getBeanManager(servletContext);
if (manager != null) {
Set<Bean<?>> beans = manager.getBeans(clazz);
for (Bean<?> bean : beans) {
CreationalContext<?> cc = manager.createCreationalContext(bean);
Object reference = manager.getReference(bean, clazz, cc);
result.add((T) reference);
}
}
return result;
}
private BeanManager getBeanManager(ServletContext servletContext) {
BeanManager beanManager = null;
// try to find in ServletContext first
if (servletContext != null) {
beanManager = (BeanManager) servletContext.getAttribute(BeanManager.class.getName());
}
// try Weld 1.1.x servlet context attribute
if (beanManager == null && servletContext != null) {
beanManager = (BeanManager) servletContext.getAttribute(SERVLET_CONTEXT_ATTR_WELD_1_1);
}
// try standard JNDI name
if (beanManager == null) {
beanManager = getBeanManagerFromJNDI(BEAN_MANAGER_JNDI);
}
// try special Tomcat JNDI name
if (beanManager == null) {
beanManager = getBeanManagerFromJNDI(BEAN_MANAGER_JNDI_TOMCAT);
}
return beanManager;
}
private BeanManager getBeanManagerFromJNDI(String jndiName) {
try {
InitialContext initialContext = new InitialContext();
return (BeanManager) initialContext.lookup(jndiName);
} catch (NamingException e) {
return null;
}
}
}