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;
public class CdiConstructorInjector implements ConstructorInjector
{
private BeanManager manager;
private Type type;
public CdiConstructorInjector(final Type type, final BeanManager manager)
{
this.type = type;
this.manager = manager;
}
@Override
public Object construct(boolean unwrapAsync)
{
Set<Bean<?>> beans = manager.getBeans(type);
if (beans.size() > 1)
{
Set<Bean<?>> modifiableBeans = new HashSet<Bean<?>>();
modifiableBeans.addAll(beans);
for (Iterator<Bean<?>> iterator = modifiableBeans.iterator(); iterator.hasNext();)
{
Bean<?> bean = iterator.next();
if (!bean.getBeanClass().equals(type) && !bean.isAlternative())
{
iterator.remove();
}
}
beans = modifiableBeans;
}
if (LogMessages.LOGGER.isDebugEnabled())
{
LogMessages.LOGGER.debug(Messages.MESSAGES.beansFound(type, beans));
}
Bean<?> bean = manager.resolve(beans);
CreationalContext<?> context = manager.createCreationalContext(bean);
return manager.getReference(bean, type, context);
}
@Override
public Object construct(HttpRequest request, HttpResponse response, boolean unwrapAsync) throws Failure, WebApplicationException, ApplicationException
{
return construct(unwrapAsync);
}
@Override
public Object injectableArguments(boolean unwrapAsync)
{
return null;
}
@Override
public Object injectableArguments(HttpRequest request, HttpResponse response, boolean unwrapAsync) throws Failure
{
return injectableArguments(unwrapAsync);
}
}