package org.jboss.seam.rest.client;
import java.util.Iterator;
import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.inject.Instance;
import javax.enterprise.inject.Produces;
import javax.enterprise.inject.spi.BeanManager;
import javax.enterprise.inject.spi.InjectionPoint;
import javax.inject.Inject;
import org.jboss.solder.logging.Logger;
import org.jboss.resteasy.client.ClientExecutor;
import org.jboss.resteasy.client.ClientRequest;
import org.jboss.resteasy.client.ProxyFactory;
import org.jboss.resteasy.client.core.ClientErrorInterceptor;
import org.jboss.resteasy.spi.ResteasyProviderFactory;
import org.jboss.solder.el.Expressions;
import org.jboss.solder.reflection.AnnotationInspector;
/**
* Produces REST Clients
* <ul>
* <li>proxied JAX-RS interface</li>
* <li>ClientRequest</li>
* </ul>
* <p/>
* <code>
*
* @author <a href="http://community.jboss.org/people/jharting">Jozef Hartinger</a>
* @Inject @RestClient private TaskService tasks;
* @Inject @RestCLient private ClientRequest request; </code>
*/
@ApplicationScoped
public class RestClientProducer {
private static final Logger log = Logger.getLogger(RestClientProducer.class);
@Inject
private Expressions expressions;
@Inject
private BeanManager manager;
@Inject
public void initClientSupport(Instance<ClientErrorInterceptor> interceptors) {
/*
* Automatically Register ClientErrors
*/
Iterator<ClientErrorInterceptor> iterator = interceptors.iterator();
while (iterator.hasNext()) {
ClientErrorInterceptor interceptor = iterator.next();
ResteasyProviderFactory.getInstance().addClientErrorInterceptor(interceptor);
log.infov("Registered ClientErrorInterceptor {0}", interceptor.getClass());
}
}
/**
* Producer method for proxied JAX-RS interfaces - REST Clients This method is not registered as a producer method by
* default. It is registered by {@link RestClientExtension} only if there is an appropriate injection point.
*/
public Object produceRestClient(InjectionPoint ip, ClientExecutor executor) {
RestClient qualifier = AnnotationInspector.getAnnotation(ip.getAnnotated(), RestClient.class, manager);
if (qualifier == null || !(ip.getType() instanceof Class<?>)) {
// this should never happen
throw new IllegalStateException("@RestClient injection point " + ip.getMember() + " is not valid.");
}
Class<?> clazz = (Class<?>) ip.getType();
String url = expressions.evaluateValueExpression(qualifier.value(), String.class);
return ProxyFactory.create(clazz, url, executor);
}
/**
* Produces ClientRequest instances.
*/
@Produces
@RestClient("")
public ClientRequest produceClientRequest(InjectionPoint ip, ClientExecutor executor) {
RestClient qualifier = AnnotationInspector.getAnnotation(ip.getAnnotated(), RestClient.class, manager);
if (qualifier == null) {
// this should never happen
throw new IllegalStateException("@RestClient injection point " + ip.getMember() + " is not valid.");
}
String url = expressions.evaluateValueExpression(qualifier.value(), String.class);
return new ClientRequest(url, executor);
}
}