package org.jboss.resteasy.client.jaxrs.internal;
import org.jboss.resteasy.client.jaxrs.ProxyBuilder;
import org.jboss.resteasy.client.jaxrs.ResteasyClient;
import org.jboss.resteasy.client.jaxrs.ResteasyWebTarget;
import org.jboss.resteasy.client.jaxrs.i18n.Messages;
import org.jboss.resteasy.specimpl.ResteasyUriBuilder;
import javax.ws.rs.client.Invocation;
import javax.ws.rs.core.Configuration;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.core.UriBuilder;
import java.lang.reflect.Method;
import java.net.URI;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
* @version $Revision: 1 $
*/
public class ClientWebTarget implements ResteasyWebTarget
{
protected ResteasyClient client;
protected UriBuilder uriBuilder;
protected ClientConfiguration configuration;
protected ClientWebTarget(ResteasyClient client, ClientConfiguration configuration)
{
this.configuration = new ClientConfiguration(configuration);
this.client = client;
}
public ClientWebTarget(ResteasyClient client, String uri, ClientConfiguration configuration) throws IllegalArgumentException, NullPointerException
{
this(client, configuration);
uriBuilder = uriBuilderFromUri(uri);
}
public ClientWebTarget(ResteasyClient client, URI uri, ClientConfiguration configuration) throws NullPointerException
{
this(client, configuration);
uriBuilder = uriBuilderFromUri(uri);
}
public ClientWebTarget(ResteasyClient client, UriBuilder uriBuilder, ClientConfiguration configuration) throws NullPointerException
{
this(client, configuration);
this.uriBuilder = uriBuilder.clone();
}
/**
* Get a new UriBuilder explicitly using RESTEasy implementation
* (instead of running UriBuilder.fromUri(uri) which relies on
* current registered JAX-RS implementation)
*
* @param uri
* @return
*/
private static UriBuilder uriBuilderFromUri(URI uri)
{
return new ResteasyUriBuilder().uri(uri);
}
private static UriBuilder uriBuilderFromUri(String uri)
{
return new ResteasyUriBuilder().uri(uri);
}
@Override
public ResteasyWebTarget clone()
{
client.abortIfClosed();
UriBuilder copy = uriBuilder.clone();
return new ClientWebTarget(client, copy, configuration);
}
@Override
public ResteasyClient getResteasyClient()
{
client.abortIfClosed();
return client;
}
@Override
public <T> T proxy(Class<T> proxyInterface)
{
client.abortIfClosed();
return ProxyBuilder.builder(proxyInterface, this).build();
}
@Override
public <T> ProxyBuilder<T> proxyBuilder(Class<T> proxyInterface)
{
client.abortIfClosed();
if (proxyInterface == null) throw new NullPointerException(Messages.MESSAGES.proxyInterfaceWasNull());
return ProxyBuilder.builder(proxyInterface, this);
}
@Override
public URI getUri()
{
client.abortIfClosed();
return uriBuilder.build();
}
@Override
public UriBuilder getUriBuilder()
{
client.abortIfClosed();
return uriBuilder.clone();
}
@Override
public Configuration getConfiguration()
{
client.abortIfClosed();
return configuration;
}
@Override
public ResteasyWebTarget path(String path) throws NullPointerException
{
client.abortIfClosed();
if (path == null) throw new NullPointerException(Messages.MESSAGES.pathWasNull());
UriBuilder copy = uriBuilder.clone().path(path);
return new ClientWebTarget(client, copy, configuration);
}
@Override
public ResteasyWebTarget path(Class<?> resource) throws IllegalArgumentException
{
client.abortIfClosed();
if (resource == null) throw new NullPointerException(Messages.MESSAGES.resourceWasNull());
UriBuilder copy = uriBuilder.clone().path(resource);
return new ClientWebTarget(client, copy, configuration);
}
@Override
public ResteasyWebTarget path(Method method) throws IllegalArgumentException
{
client.abortIfClosed();
if (method == null) throw new NullPointerException(Messages.MESSAGES.methodWasNull());
UriBuilder copy = uriBuilder.clone().path(method);
return new ClientWebTarget(client, copy, configuration);
}
@Override
public ResteasyWebTarget resolveTemplate(String name, Object value) throws NullPointerException
{
client.abortIfClosed();
if (name == null) throw new NullPointerException(Messages.MESSAGES.nameWasNull());
if (value == null) throw new NullPointerException(Messages.MESSAGES.valueWasNull());
String val = configuration.toString(value);
UriBuilder copy = uriBuilder.clone().resolveTemplate(name, val);
ClientWebTarget target = new ClientWebTarget(client, copy, configuration);
return target;
}
@Override
public ResteasyWebTarget resolveTemplates(Map<String, Object> templateValues) throws NullPointerException
{
client.abortIfClosed();
if (templateValues == null) throw new NullPointerException(Messages.MESSAGES.templateValuesWasNull());
if (templateValues.isEmpty()) return this;
Map vals = new HashMap<String, String>();
for (Map.Entry<String, Object> entry : templateValues.entrySet())
{
if (entry.getKey() == null || entry.getValue() == null) throw new NullPointerException(Messages.MESSAGES.templateValuesEntryWasNull());
String val = configuration.toString(entry.getValue());
vals.put(entry.getKey(), val);
}
UriBuilder copy = uriBuilder.clone().resolveTemplates(vals);
ClientWebTarget target = new ClientWebTarget(client, copy, configuration);
return target;
}
@Override
public ResteasyWebTarget resolveTemplate(String name, Object value, boolean encodeSlashInPath) throws NullPointerException
{
client.abortIfClosed();
if (name == null) throw new NullPointerException(Messages.MESSAGES.nameWasNull());
if (value == null) throw new NullPointerException(Messages.MESSAGES.valueWasNull());
String val = configuration.toString(value);
UriBuilder copy = uriBuilder.clone().resolveTemplate(name, val, encodeSlashInPath);
ClientWebTarget target = new ClientWebTarget(client, copy, configuration);
return target;
}
@Override
public ResteasyWebTarget resolveTemplateFromEncoded(String name, Object value) throws NullPointerException
{
client.abortIfClosed();
if (name == null) throw new NullPointerException(Messages.MESSAGES.nameWasNull());
if (value == null) throw new NullPointerException(Messages.MESSAGES.valueWasNull());
String val = configuration.toString(value);
UriBuilder copy = uriBuilder.clone().resolveTemplateFromEncoded(name, val);
ClientWebTarget target = new ClientWebTarget(client, copy, configuration);
return target;
}
@Override
public ResteasyWebTarget resolveTemplatesFromEncoded(Map<String, Object> templateValues) throws NullPointerException
{
client.abortIfClosed();
if (templateValues == null) throw new NullPointerException(Messages.MESSAGES.templateValuesWasNull());
if (templateValues.isEmpty()) return this;
Map vals = new HashMap<String, String>();
for (Map.Entry<String, Object> entry : templateValues.entrySet())
{
if (entry.getKey() == null || entry.getValue() == null) throw new NullPointerException(Messages.MESSAGES.templateValuesEntryWasNull());
String val = configuration.toString(entry.getValue());
vals.put(entry.getKey(), val);
}
UriBuilder copy = uriBuilder.clone().resolveTemplatesFromEncoded(vals) ;
ClientWebTarget target = new ClientWebTarget(client, copy, configuration);
return target;
}
@Override
public ResteasyWebTarget resolveTemplates(Map<String, Object> templateValues, boolean encodeSlashInPath) throws NullPointerException
{
client.abortIfClosed();
if (templateValues == null) throw new NullPointerException(Messages.MESSAGES.templateValuesWasNull());
if (templateValues.isEmpty()) return this;
Map vals = new HashMap<String, String>();
for (Map.Entry<String, Object> entry : templateValues.entrySet())
{
if (entry.getKey() == null || entry.getValue() == null) throw new NullPointerException(Messages.MESSAGES.templateValuesEntryWasNull());
String val = configuration.toString(entry.getValue());
vals.put(entry.getKey(), val);
}
UriBuilder copy = uriBuilder.clone().resolveTemplates(vals, encodeSlashInPath) ;
ClientWebTarget target = new ClientWebTarget(client, copy, configuration);
return target;
}
@Override
public ResteasyWebTarget matrixParam(String name, Object... values) throws NullPointerException
{
client.abortIfClosed();
if (name == null) throw new NullPointerException(Messages.MESSAGES.nameWasNull());
UriBuilder copy = uriBuilder.clone();
if (values.length == 1 && values[0] == null)
{
copy.replaceMatrixParam(name, null);
}
else
{
String[] stringValues = toStringValues(values);
copy.matrixParam(name, stringValues);
}
return new ClientWebTarget(client, copy, configuration);
}
private String[] toStringValues(Object[] values)
{
String[] stringValues = new String[values.length];
for (int i = 0; i < stringValues.length; i++)
{
stringValues[i] = configuration.toString(values[i]);
}
return stringValues;
}
@Override
public ResteasyWebTarget queryParam(String name, Object... values) throws NullPointerException
{
client.abortIfClosed();
if (name == null) throw new NullPointerException(Messages.MESSAGES.nameWasNull());
UriBuilder copy = uriBuilder.clone();
if (values == null || (values.length == 1 && values[0] == null))
{
copy.replaceQueryParam(name, null);
}
else
{
String[] stringValues = toStringValues(values);
copy.queryParam(name, stringValues);
}
return new ClientWebTarget(client, copy, configuration);
}
@Override
public ResteasyWebTarget queryParams(MultivaluedMap<String, Object> parameters) throws IllegalArgumentException, NullPointerException
{
client.abortIfClosed();
if (parameters == null) throw new NullPointerException(Messages.MESSAGES.parametersWasNull());
UriBuilder copy = uriBuilder.clone();
for (Map.Entry<String, List<Object>> entry : parameters.entrySet())
{
String[] stringValues = toStringValues(entry.getValue().toArray());
copy.queryParam(entry.getKey(), stringValues);
}
return new ClientWebTarget(client, copy, configuration);
}
@Override
public ResteasyWebTarget queryParamNoTemplate(String name, Object... values) throws NullPointerException
{
client.abortIfClosed();
if (name == null) throw new NullPointerException(Messages.MESSAGES.nameWasNull());
String[] stringValues = toStringValues(values);
ResteasyUriBuilder copy;
if (uriBuilder instanceof ResteasyUriBuilder) {
copy = (ResteasyUriBuilder)uriBuilder.clone();
} else {
copy = (ResteasyUriBuilder)ResteasyUriBuilder.fromTemplate(uriBuilder.toTemplate());
}
for (String obj : stringValues)
{
copy.clientQueryParam(name, obj);
}
return new ClientWebTarget(client, copy, configuration);
}
@Override
public ResteasyWebTarget queryParamsNoTemplate(MultivaluedMap<String, Object> parameters) throws IllegalArgumentException, NullPointerException
{
client.abortIfClosed();
if (parameters == null) throw new NullPointerException(Messages.MESSAGES.parametersWasNull());
ResteasyUriBuilder copy;
if (uriBuilder instanceof ResteasyUriBuilder) {
copy = (ResteasyUriBuilder)uriBuilder.clone();
} else {
copy = (ResteasyUriBuilder)ResteasyUriBuilder.fromTemplate(uriBuilder.toTemplate());
}
for (Map.Entry<String, List<Object>> entry : parameters.entrySet())
{
String[] stringValues = toStringValues(entry.getValue().toArray());
for (String val : stringValues)
{
copy.clientQueryParam(entry.getKey(), val);
}
}
return new ClientWebTarget(client, copy, configuration);
}
@Override
public Invocation.Builder request()
{
client.abortIfClosed();
return new ClientInvocationBuilder(client, uriBuilder.build(), configuration);
}
@Override
public Invocation.Builder request(String... acceptedResponseTypes)
{
client.abortIfClosed();
ClientInvocationBuilder builder = new ClientInvocationBuilder(client, uriBuilder.build(), configuration);
builder.getHeaders().accept(acceptedResponseTypes);
return builder;
}
@Override
public Invocation.Builder request(MediaType... acceptedResponseTypes)
{
client.abortIfClosed();
ClientInvocationBuilder builder = new ClientInvocationBuilder(client, uriBuilder.build(), configuration);
builder.getHeaders().accept(acceptedResponseTypes);
return builder;
}
@Override
public ResteasyWebTarget property(String name, Object value)
{
client.abortIfClosed();
if (name == null) throw new NullPointerException(Messages.MESSAGES.nameWasNull());
configuration.property(name, value);
return this;
}
@Override
public ResteasyWebTarget register(Class<?> componentClass)
{
client.abortIfClosed();
configuration.register(componentClass);
return this;
}
@Override
public ResteasyWebTarget register(Class<?> componentClass, int priority)
{
client.abortIfClosed();
configuration.register(componentClass, priority);
return this;
}
@Override
public ResteasyWebTarget register(Class<?> componentClass, Class<?>... contracts)
{
client.abortIfClosed();
configuration.register(componentClass, contracts);
return this;
}
@Override
public ResteasyWebTarget register(Class<?> componentClass, Map<Class<?>, Integer> contracts)
{
client.abortIfClosed();
configuration.register(componentClass, contracts);
return this;
}
@Override
public ResteasyWebTarget register(Object component)
{
client.abortIfClosed();
configuration.register(component);
return this;
}
@Override
public ResteasyWebTarget register(Object component, int priority)
{
client.abortIfClosed();
configuration.register(component, priority);
return this;
}
@Override
public ResteasyWebTarget register(Object component, Class<?>... contracts)
{
client.abortIfClosed();
configuration.register(component, contracts);
return this;
}
@Override
public ResteasyWebTarget register(Object component, Map<Class<?>, Integer> contracts)
{
client.abortIfClosed();
configuration.register(component, contracts);
return this;
}
}