package org.jboss.resteasy.client.jaxrs; import org.jboss.resteasy.client.jaxrs.i18n.Messages; import org.jboss.resteasy.client.jaxrs.internal.ClientConfiguration; import org.jboss.resteasy.client.jaxrs.internal.ClientWebTarget; import org.jboss.resteasy.client.jaxrs.engines.ApacheHttpClient4Engine; import org.jboss.resteasy.spi.NotImplementedYetException; import org.jboss.resteasy.spi.ResteasyProviderFactory; import javax.net.ssl.HostnameVerifier; import javax.net.ssl.SSLContext; import javax.ws.rs.client.Client; import javax.ws.rs.client.Invocation; import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.Configuration; import javax.ws.rs.core.Link; import javax.ws.rs.core.UriBuilder; import java.net.URI; import java.util.Map; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * @author <a href="mailto:bill@burkecentral.com">Bill Burke</a> * @version $Revision: 1 $ */ public class ResteasyClient implements Client { protected volatile ClientHttpEngine httpEngine; protected volatile ExecutorService asyncInvocationExecutor; protected ClientConfiguration configuration; protected boolean closed; protected boolean cleanupExecutor; ResteasyClient(ClientHttpEngine httpEngine, ExecutorService asyncInvocationExecutor, boolean cleanupExecutor, ClientConfiguration configuration) { this.cleanupExecutor = cleanupExecutor; this.httpEngine = httpEngine; this.asyncInvocationExecutor = asyncInvocationExecutor; this.configuration = configuration; } public ClientHttpEngine httpEngine() { abortIfClosed(); return httpEngine; } public ExecutorService asyncInvocationExecutor() { return asyncInvocationExecutor; } public void abortIfClosed() { if (isClosed()) throw new IllegalStateException(Messages.MESSAGES.clientIsClosed()); } public boolean isClosed() { return closed; } @Override public void close() { closed = true; try { httpEngine.close(); if (cleanupExecutor) { asyncInvocationExecutor.shutdown(); } } catch (Exception e) { throw new RuntimeException(e); } } @Override public Configuration getConfiguration() { abortIfClosed(); return configuration; } @Override public SSLContext getSslContext() { abortIfClosed(); return httpEngine().getSslContext(); } @Override public HostnameVerifier getHostnameVerifier() { abortIfClosed(); return httpEngine().getHostnameVerifier(); } @Override public ResteasyClient property(String name, Object value) { abortIfClosed(); configuration.property(name, value); return this; } @Override public ResteasyClient register(Class<?> componentClass) { abortIfClosed(); configuration.register(componentClass); return this; } @Override public ResteasyClient register(Class<?> componentClass, int priority) { abortIfClosed(); configuration.register(componentClass, priority); return this; } @Override public ResteasyClient register(Class<?> componentClass, Class<?>... contracts) { abortIfClosed(); configuration.register(componentClass, contracts); return this; } @Override public ResteasyClient register(Class<?> componentClass, Map<Class<?>, Integer> contracts) { abortIfClosed(); configuration.register(componentClass, contracts); return this; } @Override public ResteasyClient register(Object component) { abortIfClosed(); configuration.register(component); return this; } @Override public ResteasyClient register(Object component, int priority) { abortIfClosed(); configuration.register(component, priority); return this; } @Override public ResteasyClient register(Object component, Class<?>... contracts) { abortIfClosed(); configuration.register(component, contracts); return this; } @Override public ResteasyClient register(Object component, Map<Class<?>, Integer> contracts) { abortIfClosed(); configuration.register(component, contracts); return this; } @Override public ResteasyWebTarget target(String uri) throws IllegalArgumentException, NullPointerException { abortIfClosed(); if (uri == null) throw new NullPointerException(Messages.MESSAGES.uriWasNull()); return new ClientWebTarget(this, uri, configuration); } @Override public ResteasyWebTarget target(URI uri) throws NullPointerException { abortIfClosed(); if (uri == null) throw new NullPointerException(Messages.MESSAGES.uriWasNull()); return new ClientWebTarget(this, uri, configuration); } @Override public ResteasyWebTarget target(UriBuilder uriBuilder) throws NullPointerException { abortIfClosed(); if (uriBuilder == null) throw new NullPointerException(Messages.MESSAGES.uriBuilderWasNull()); return new ClientWebTarget(this, uriBuilder, configuration); } @Override public ResteasyWebTarget target(Link link) throws NullPointerException { abortIfClosed(); if (link == null) throw new NullPointerException(Messages.MESSAGES.linkWasNull()); URI uri = link.getUri(); return new ClientWebTarget(this, uri, configuration); } @Override public Invocation.Builder invocation(Link link) throws NullPointerException, IllegalArgumentException { abortIfClosed(); if (link == null) throw new NullPointerException(Messages.MESSAGES.linkWasNull()); WebTarget target = target(link); if (link.getType() != null) return target.request(link.getType()); else return target.request(); } }