package com.softwaremill.common.cdi.util;
import javax.enterprise.inject.spi.Bean;
import javax.enterprise.inject.spi.BeanManager;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import java.util.Set;
/**
* @author Adam Warski (adam at warski dot org)
*/
public class BeanInject {
@SuppressWarnings({"unchecked"})
public static <T> T lookup(BeanManager manager, Class<T> beanClass, Annotation... qualifiers) {
return (T) lookup(manager, (Type) beanClass, qualifiers);
}
@SuppressWarnings({"unchecked"})
public static Object lookup(BeanManager manager, Type beanType, Annotation... qualifiers) {
Set<?> beans = manager.getBeans(beanType, qualifiers);
if (beans.size() != 1) {
if (beans.size() == 0) {
throw new RuntimeException("No beans of class " + beanType + " found.");
} else {
throw new RuntimeException("Multiple beans of class " + beanType + " found: " + beans + ".");
}
}
Bean myBean = (Bean) beans.iterator().next();
return manager.getReference(myBean, beanType, manager.createCreationalContext(myBean));
}
@SuppressWarnings({"unchecked"})
public static <T> T lookup(Class<T> beanClass, Annotation... qualifiers) {
return (T) lookup((Type) beanClass, qualifiers);
}
@SuppressWarnings({"unchecked"})
public static Object lookup(Type beanType, Annotation... qualifiers) {
return lookup(getBeanManager(), beanType, qualifiers);
}
@SuppressWarnings({"unchecked"})
public static <T> T lookup(BeanManager manager, String name) {
Set<?> beans = manager.getBeans(name);
if (beans.size() != 1) {
if (beans.size() == 0) {
throw new RuntimeException("No beans with name " + name + " found.");
} else {
throw new RuntimeException("Multiple beans with name " + name + " found: " + beans + ".");
}
}
Bean<T> myBean = (Bean<T>) beans.iterator().next();
return (T) manager.getReference(myBean, myBean.getBeanClass(), manager.createCreationalContext(myBean));
}
@SuppressWarnings({"unchecked"})
public static <T> T lookup(String name) {
return BeanInject.<T>lookup(getBeanManager(), name);
}
private static BeanManager getBeanManager() {
try {
return (BeanManager) new InitialContext().lookup("java:comp/BeanManager");
} catch (NamingException e) {
try {
return (BeanManager) new InitialContext().lookup("java:app/BeanManager");
} catch (NamingException e1) {
throw new RuntimeException(e1);
}
}
}
}