package org.jboss.resteasy.cdi;
import org.jboss.resteasy.cdi.i18n.LogMessages;
import org.jboss.resteasy.cdi.i18n.Messages;
import org.jboss.resteasy.spi.ApplicationException;
import org.jboss.resteasy.spi.ConstructorInjector;
import org.jboss.resteasy.spi.Failure;
import org.jboss.resteasy.spi.HttpRequest;
import org.jboss.resteasy.spi.HttpResponse;
import javax.enterprise.context.spi.CreationalContext;
import javax.enterprise.inject.spi.Bean;
import javax.enterprise.inject.spi.BeanManager;
import javax.ws.rs.WebApplicationException;
import java.lang.reflect.Type;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
/**
* This ConstructorInjector implementation uses CDI's BeanManager to obtain
* a contextual instance of a bean.
*
* @author Jozef Hartinger
*
*/
public class CdiConstructorInjector implements ConstructorInjector
{
private BeanManager manager;
private Type type;
public CdiConstructorInjector(Type type, BeanManager manager)
{
this.type = type;
this.manager = manager;
}
public Object construct()
{
Set<Bean<?>> beans = manager.getBeans(type);
if (beans.size() > 1)
{
Set<Bean<?>> modifiableBeans = new HashSet<Bean<?>>();
modifiableBeans.addAll(beans);
// Ambiguous dependency may occur if a resource has subclasses
// Therefore we remove those beans
for (Iterator<Bean<?>> iterator = modifiableBeans.iterator(); iterator.hasNext();)
{
Bean<?> bean = iterator.next();
if (!bean.getBeanClass().equals(type) && !bean.isAlternative())
{
// remove Beans that have clazz in their type closure but not as a base class
iterator.remove();
}
}
beans = modifiableBeans;
}
LogMessages.LOGGER.debug(Messages.MESSAGES.beansFound(type, beans));
Bean<?> bean = manager.resolve(beans);
CreationalContext<?> context = manager.createCreationalContext(bean);
return manager.getReference(bean, type, context);
}
public Object construct(HttpRequest request, HttpResponse response) throws Failure, WebApplicationException, ApplicationException
{
return construct();
}
public Object[] injectableArguments()
{
return new Object[0];
}
public Object[] injectableArguments(HttpRequest request, HttpResponse response) throws Failure
{
return injectableArguments();
}
}