package org.jboss.resteasy.client.core;
import org.jboss.resteasy.client.ProxyBuilder;
import org.jboss.resteasy.client.ProxyConfig;
import org.jboss.resteasy.client.ProxyFactory;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.net.URI;
public class SubResourceInvoker implements MethodInvoker
{
final ProxyConfig config;
final Class<?> iface;
final String base;
final String format;
public SubResourceInvoker(final URI uri, final Method method, final ProxyConfig config)
{
String base = uri.toString();
if (!base.endsWith("/"))
base = base + "/";
this.base = base;
this.iface = method.getReturnType();
this.config = config;
String path = method.getAnnotation(Path.class).value();
if (path.startsWith("/"))
path = path.substring(1);
Annotation[][] params = method.getParameterAnnotations();
int index = 1;
for (Annotation[] param : params)
{
for (Annotation a : param)
{
if (a instanceof PathParam)
{
String name = ((PathParam) a).value();
path = path.replaceFirst("\\{" + name + "(\\s)*(:.*)?\\}", "%" + index + "\\$s");
break;
}
}
index++;
}
this.format = path;
}
@Override
public Object invoke(Object[] args)
{
String path = String.format(format, args);
return ProxyBuilder.createProxy(iface, ProxyFactory.createUri(base + path), config);
}
}