package org.jboss.resteasy.client; import org.jboss.resteasy.client.core.ClientProxy; import org.jboss.resteasy.client.core.MethodInvoker; import org.jboss.resteasy.client.core.SubResourceInvoker; import org.jboss.resteasy.client.core.extractors.DefaultEntityExtractorFactory; import org.jboss.resteasy.client.core.extractors.EntityExtractorFactory; import org.jboss.resteasy.client.core.marshallers.ResteasyClientProxy; import org.jboss.resteasy.spi.ProviderFactoryDelegate; import org.jboss.resteasy.spi.ResteasyProviderFactory; import org.jboss.resteasy.util.IsHttpMethod; import javax.ws.rs.Path; import javax.ws.rs.core.MediaType; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.net.URI; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.Set; /** * * @param <T> * @deprecated The Resteasy proxy facility in the client framework in resteasy-jaxrs is replaced by the * proxy facility extension in the JAX-RS 2.0 compliant resteasy-client module. * * @see resteasy-client * @see org.jboss.resteasy.client.jaxrs.ProxyBuilder * @see org.jboss.resteasy.client.jaxrs.ResteasyWebTarget */ @Deprecated public class ProxyBuilder<T> { public static <T> ProxyBuilder<T> build(Class<T> iface, URI base) { return new ProxyBuilder<T>(iface, base); } public static <T> ProxyBuilder<T> build(Class<T> iface, String base) { return new ProxyBuilder<T>(iface, ProxyFactory.createUri(base)); } private final Class<T> iface; private final URI baseUri; private ClassLoader loader; private ClientExecutor executor; private ResteasyProviderFactory providerFactory; private EntityExtractorFactory extractorFactory; private Map<String, Object> requestAttributes; private MediaType serverConsumes; private MediaType serverProduces; private ProxyBuilder(Class<T> iface, URI base) { this.iface = iface; this.baseUri = base; this.loader = iface.getClassLoader(); } public ProxyBuilder<T> classloader(ClassLoader cl) { this.loader = cl; return this; } public ProxyBuilder<T> executor(ClientExecutor exec) { this.executor = exec; return this; } public ProxyBuilder<T> providerFactory(ResteasyProviderFactory fact) { this.providerFactory = fact; return this; } public ProxyBuilder<T> extractorFactory(EntityExtractorFactory fact) { this.extractorFactory = fact; return this; } /** shortcut for serverProduces(type).serverConsumes(type) */ public ProxyBuilder<T> serverMediaType(MediaType type) { this.serverProduces = type; this.serverConsumes = type; return this; } public ProxyBuilder<T> serverProduces(MediaType type) { this.serverProduces = type; return this; } public ProxyBuilder<T> serverConsumes(MediaType type) { this.serverConsumes = type; return this; } public ProxyBuilder<T> requestAttributes(Map<String, Object> attrs) { this.requestAttributes = attrs; return this; } private static final Class<?>[] cClassArgArray = { Class.class }; public T now() { if (providerFactory instanceof ProviderFactoryDelegate) providerFactory = ((ProviderFactoryDelegate) providerFactory).getDelegate(); if (executor == null) executor = ClientRequest.getDefaultExecutor(); if (providerFactory == null) providerFactory = ResteasyProviderFactory.getInstance(); if (extractorFactory == null) extractorFactory = new DefaultEntityExtractorFactory(); if (requestAttributes == null) requestAttributes = Collections.emptyMap(); final ProxyConfig config = new ProxyConfig(loader, executor, providerFactory, extractorFactory, requestAttributes, serverConsumes, serverProduces); return createProxy(iface, baseUri, config); } @SuppressWarnings("unchecked") public static <T> T createProxy(final Class<T> iface, URI baseUri, final ProxyConfig config) { HashMap<Method, MethodInvoker> methodMap = new HashMap<Method, MethodInvoker>(); for (Method method : iface.getMethods()) { // ignore the as method to allow declaration in client interfaces if (!("as".equals(method.getName()) && Arrays.equals(method.getParameterTypes(), cClassArgArray))) { MethodInvoker invoker; Set<String> httpMethods = IsHttpMethod.getHttpMethods(method); if ((httpMethods == null || httpMethods.size() == 0) && method.isAnnotationPresent(Path.class) && method.getReturnType().isInterface()) { invoker = new SubResourceInvoker(baseUri, method, config); } else { invoker = ProxyFactory.createClientInvoker(iface, method, baseUri, config); } methodMap.put(method, invoker); } } Class<?>[] intfs = { iface, ResteasyClientProxy.class }; ClientProxy clientProxy = new ClientProxy(methodMap, baseUri, config); // this is done so that equals and hashCode work ok. Adding the proxy to a // Collection will cause equals and hashCode to be invoked. The Spring // infrastructure had some problems without this. clientProxy.setClazz(iface); return (T) Proxy.newProxyInstance(config.getLoader(), intfs, clientProxy); } }