package org.jboss.resteasy.cdi;
import org.jboss.resteasy.spi.ApplicationException;
import org.jboss.resteasy.spi.Failure;
import org.jboss.resteasy.spi.HttpRequest;
import org.jboss.resteasy.spi.HttpResponse;
import org.jboss.resteasy.spi.PropertyInjector;
import org.jboss.weld.proxy.WeldClientProxy;
import javax.enterprise.inject.spi.BeanManager;
import javax.ws.rs.WebApplicationException;
import java.lang.reflect.Type;
import java.util.Map;
import java.util.concurrent.CompletionStage;
public class CdiPropertyInjector implements PropertyInjector
{
private PropertyInjector delegate;
private Class<?> clazz;
private boolean injectorEnabled = true;
public CdiPropertyInjector(final PropertyInjector delegate, final Class<?> clazz, final Map<Class<?>, Type> sessionBeanInterface, final BeanManager manager)
{
this.delegate = delegate;
this.clazz = clazz;
if (sessionBeanInterface.containsKey(clazz))
{
injectorEnabled = false;
}
if (!manager.getBeans(clazz).isEmpty() && Utils.isJaxrsComponent(clazz))
{
injectorEnabled = false;
}
}
@Override
public CompletionStage<Void> inject(Object target, boolean unwrapAsync)
{
if (injectorEnabled)
{
return delegate.inject(target, unwrapAsync);
}
return null;
}
@Override
public CompletionStage<Void> inject(HttpRequest request, HttpResponse response, Object target, boolean unwrapAsync) throws Failure, WebApplicationException, ApplicationException
{
if (injectorEnabled)
{
Object actualTarget = target;
if (actualTarget instanceof WeldClientProxy)
{
actualTarget = ((WeldClientProxy) target).getMetadata().getContextualInstance();
}
return delegate.inject(request, response, actualTarget, unwrapAsync);
}
return null;
}
@Override
public String toString()
{
return "CdiPropertyInjector (enabled: " + injectorEnabled + ") for " + clazz;
}
}