mirror of https://github.com/apache/jclouds.git
migrated from j.l.r.Method -> Invokable
This commit is contained in:
parent
c43aac2ecc
commit
69c7cd74df
|
@ -24,6 +24,7 @@ import static com.google.common.base.Preconditions.checkState;
|
||||||
import java.lang.reflect.InvocationTargetException;
|
import java.lang.reflect.InvocationTargetException;
|
||||||
import java.lang.reflect.Method;
|
import java.lang.reflect.Method;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.concurrent.ExecutionException;
|
import java.util.concurrent.ExecutionException;
|
||||||
|
@ -36,6 +37,7 @@ import javax.inject.Named;
|
||||||
import org.jclouds.internal.ClassInvokerArgs;
|
import org.jclouds.internal.ClassInvokerArgs;
|
||||||
import org.jclouds.internal.ClassInvokerArgsAndReturnVal;
|
import org.jclouds.internal.ClassInvokerArgsAndReturnVal;
|
||||||
import org.jclouds.logging.Logger;
|
import org.jclouds.logging.Logger;
|
||||||
|
import org.jclouds.reflect.AbstractInvocationHandler;
|
||||||
import org.jclouds.rest.annotations.Delegate;
|
import org.jclouds.rest.annotations.Delegate;
|
||||||
import org.jclouds.util.Optionals2;
|
import org.jclouds.util.Optionals2;
|
||||||
import org.jclouds.util.Throwables2;
|
import org.jclouds.util.Throwables2;
|
||||||
|
@ -47,7 +49,7 @@ import com.google.common.base.Throwables;
|
||||||
import com.google.common.cache.LoadingCache;
|
import com.google.common.cache.LoadingCache;
|
||||||
import com.google.common.collect.ImmutableMap;
|
import com.google.common.collect.ImmutableMap;
|
||||||
import com.google.common.collect.ImmutableSet;
|
import com.google.common.collect.ImmutableSet;
|
||||||
import com.google.common.reflect.AbstractInvocationHandler;
|
import com.google.common.reflect.Invokable;
|
||||||
import com.google.common.util.concurrent.ListenableFuture;
|
import com.google.common.util.concurrent.ListenableFuture;
|
||||||
import com.google.inject.ProvisionException;
|
import com.google.inject.ProvisionException;
|
||||||
import com.google.inject.assistedinject.Assisted;
|
import com.google.inject.assistedinject.Assisted;
|
||||||
|
@ -77,13 +79,14 @@ public final class SyncProxy extends AbstractInvocationHandler {
|
||||||
private final Function<ClassInvokerArgsAndReturnVal, Optional<Object>> optionalConverter;
|
private final Function<ClassInvokerArgsAndReturnVal, Optional<Object>> optionalConverter;
|
||||||
private final Object delegate;
|
private final Object delegate;
|
||||||
private final Class<?> declaring;
|
private final Class<?> declaring;
|
||||||
private final Map<Method, Method> methodMap;
|
private final Map<Invokable<?, ?>, Invokable<Object, ListenableFuture<?>>> methodMap;
|
||||||
private final Map<Method, Method> syncMethodMap;
|
private final Map<Invokable<?, ?>, Invokable<Object, ?>> syncMethodMap;
|
||||||
private final Map<Method, Optional<Long>> timeoutMap;
|
private final Map<Invokable<?, ?>, Optional<Long>> timeoutMap;
|
||||||
private final LoadingCache<ClassInvokerArgs, Object> delegateMap;
|
private final LoadingCache<ClassInvokerArgs, Object> delegateMap;
|
||||||
private final Map<Class<?>, Class<?>> sync2Async;
|
private final Map<Class<?>, Class<?>> sync2Async;
|
||||||
private static final Set<Method> objectMethods = ImmutableSet.copyOf(Object.class.getMethods());
|
private static final Set<Method> objectMethods = ImmutableSet.copyOf(Object.class.getMethods());
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
@Inject
|
@Inject
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
SyncProxy(Function<ClassInvokerArgsAndReturnVal, Optional<Object>> optionalConverter,
|
SyncProxy(Function<ClassInvokerArgsAndReturnVal, Optional<Object>> optionalConverter,
|
||||||
|
@ -96,8 +99,8 @@ public final class SyncProxy extends AbstractInvocationHandler {
|
||||||
this.declaring = declaring;
|
this.declaring = declaring;
|
||||||
this.sync2Async = ImmutableMap.copyOf(sync2Async);
|
this.sync2Async = ImmutableMap.copyOf(sync2Async);
|
||||||
|
|
||||||
ImmutableMap.Builder<Method, Method> methodMapBuilder = ImmutableMap.builder();
|
ImmutableMap.Builder<Invokable<?, ?>, Invokable<Object, ListenableFuture<?>>> methodMapBuilder = ImmutableMap.builder();
|
||||||
ImmutableMap.Builder<Method, Method> syncMethodMapBuilder = ImmutableMap.builder();
|
ImmutableMap.Builder<Invokable<?, ?>, Invokable<Object, ?>> syncMethodMapBuilder = ImmutableMap.builder();
|
||||||
|
|
||||||
for (Method method : declaring.getMethods()) {
|
for (Method method : declaring.getMethods()) {
|
||||||
if (!objectMethods.contains(method)) {
|
if (!objectMethods.contains(method)) {
|
||||||
|
@ -106,17 +109,17 @@ public final class SyncProxy extends AbstractInvocationHandler {
|
||||||
throw new IllegalArgumentException(String.format(
|
throw new IllegalArgumentException(String.format(
|
||||||
"method %s has different typed exceptions than delegated method %s", method, delegatedMethod));
|
"method %s has different typed exceptions than delegated method %s", method, delegatedMethod));
|
||||||
if (delegatedMethod.getReturnType().isAssignableFrom(ListenableFuture.class)) {
|
if (delegatedMethod.getReturnType().isAssignableFrom(ListenableFuture.class)) {
|
||||||
methodMapBuilder.put(method, delegatedMethod);
|
methodMapBuilder.put(Invokable.from(method), Invokable.class.cast(Invokable.from(delegatedMethod)));
|
||||||
} else {
|
} else {
|
||||||
syncMethodMapBuilder.put(method, delegatedMethod);
|
syncMethodMapBuilder.put(Invokable.from(method), Invokable.class.cast(Invokable.from(delegatedMethod)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
methodMap = methodMapBuilder.build();
|
methodMap = methodMapBuilder.build();
|
||||||
syncMethodMap = syncMethodMapBuilder.build();
|
syncMethodMap = syncMethodMapBuilder.build();
|
||||||
|
|
||||||
ImmutableMap.Builder<Method, Optional<Long>> timeoutMapBuilder = ImmutableMap.builder();
|
ImmutableMap.Builder<Invokable<?, ?>, Optional<Long>> timeoutMapBuilder = ImmutableMap.builder();
|
||||||
for (Method method : methodMap.keySet()) {
|
for (Invokable<?, ?> method : methodMap.keySet()) {
|
||||||
timeoutMapBuilder.put(method, timeoutInNanos(method, timeouts));
|
timeoutMapBuilder.put(method, timeoutInNanos(method, timeouts));
|
||||||
}
|
}
|
||||||
timeoutMap = timeoutMapBuilder.build();
|
timeoutMap = timeoutMapBuilder.build();
|
||||||
|
@ -127,7 +130,7 @@ public final class SyncProxy extends AbstractInvocationHandler {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Object handleInvocation(Object o, Method method, Object[] args) throws Exception {
|
protected Object handleInvocation(Object proxy, Invokable<?, ?> method, List<Object> args) throws Throwable {
|
||||||
if (method.isAnnotationPresent(Delegate.class)) {
|
if (method.isAnnotationPresent(Delegate.class)) {
|
||||||
Class<?> syncClass = Optionals2.returnTypeOrTypeOfOptional(method);
|
Class<?> syncClass = Optionals2.returnTypeOrTypeOfOptional(method);
|
||||||
// get the return type of the asynchronous class associated with this client
|
// get the return type of the asynchronous class associated with this client
|
||||||
|
@ -148,16 +151,16 @@ public final class SyncProxy extends AbstractInvocationHandler {
|
||||||
return returnVal;
|
return returnVal;
|
||||||
} else if (syncMethodMap.containsKey(method)) {
|
} else if (syncMethodMap.containsKey(method)) {
|
||||||
try {
|
try {
|
||||||
return syncMethodMap.get(method).invoke(delegate, args);
|
return syncMethodMap.get(method).invoke(delegate, args.toArray());
|
||||||
} catch (InvocationTargetException e) {
|
} catch (InvocationTargetException e) {
|
||||||
throw Throwables.propagate(e.getCause());
|
throw Throwables.propagate(e.getCause());
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
try {
|
try {
|
||||||
Optional<Long> timeoutNanos = timeoutMap.get(method);
|
Optional<Long> timeoutNanos = timeoutMap.get(method);
|
||||||
Method asyncMethod = methodMap.get(method);
|
Invokable<Object, ListenableFuture<?>> asyncMethod = methodMap.get(method);
|
||||||
String name = asyncMethod.getDeclaringClass().getSimpleName() + "." + asyncMethod.getName();
|
String name = asyncMethod.getDeclaringClass().getSimpleName() + "." + asyncMethod.getName();
|
||||||
ListenableFuture<?> future = ((ListenableFuture<?>) asyncMethod.invoke(delegate, args));
|
ListenableFuture<?> future = asyncMethod.invoke(delegate, args.toArray());
|
||||||
if (timeoutNanos.isPresent()) {
|
if (timeoutNanos.isPresent()) {
|
||||||
logger.debug(">> blocking on %s for %s", name, timeoutNanos);
|
logger.debug(">> blocking on %s for %s", name, timeoutNanos);
|
||||||
return future.get(timeoutNanos.get(), TimeUnit.NANOSECONDS);
|
return future.get(timeoutNanos.get(), TimeUnit.NANOSECONDS);
|
||||||
|
@ -175,7 +178,7 @@ public final class SyncProxy extends AbstractInvocationHandler {
|
||||||
}
|
}
|
||||||
|
|
||||||
// override timeout by values configured in properties(in ms)
|
// override timeout by values configured in properties(in ms)
|
||||||
private Optional<Long> timeoutInNanos(Method method, Map<String, Long> timeouts) {
|
private Optional<Long> timeoutInNanos(Invokable<?, ?> method, Map<String, Long> timeouts) {
|
||||||
String className = declaring.getSimpleName();
|
String className = declaring.getSimpleName();
|
||||||
Optional<Long> timeoutMillis = fromNullable(timeouts.get(className + "." + method.getName()))
|
Optional<Long> timeoutMillis = fromNullable(timeouts.get(className + "." + method.getName()))
|
||||||
.or(fromNullable(timeouts.get(className)))
|
.or(fromNullable(timeouts.get(className)))
|
||||||
|
|
|
@ -133,7 +133,7 @@ public class HttpCommand {
|
||||||
public String toString() {
|
public String toString() {
|
||||||
if (request instanceof GeneratedHttpRequest)
|
if (request instanceof GeneratedHttpRequest)
|
||||||
return String.format("[method=%s.%s, request=%s]", GeneratedHttpRequest.class.cast(request).getDeclaring()
|
return String.format("[method=%s.%s, request=%s]", GeneratedHttpRequest.class.cast(request).getDeclaring()
|
||||||
.getSimpleName(), GeneratedHttpRequest.class.cast(request).getJavaMethod().getName(), request
|
.getSimpleName(), GeneratedHttpRequest.class.cast(request).getInvoker().getName(), request
|
||||||
.getRequestLine());
|
.getRequestLine());
|
||||||
else
|
else
|
||||||
return "[request=" + request.getRequestLine() + "]";
|
return "[request=" + request.getRequestLine() + "]";
|
||||||
|
|
|
@ -21,13 +21,11 @@ package org.jclouds.internal;
|
||||||
import static com.google.common.base.Objects.equal;
|
import static com.google.common.base.Objects.equal;
|
||||||
import static com.google.common.base.Preconditions.checkNotNull;
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
|
|
||||||
import java.lang.reflect.Method;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import com.google.common.base.Objects;
|
import com.google.common.base.Objects;
|
||||||
import com.google.common.base.Objects.ToStringHelper;
|
import com.google.common.base.Objects.ToStringHelper;
|
||||||
import com.google.common.collect.ImmutableList;
|
import com.google.common.collect.ImmutableList;
|
||||||
import com.google.common.collect.Lists;
|
|
||||||
import com.google.common.reflect.Invokable;
|
import com.google.common.reflect.Invokable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -72,22 +70,6 @@ public class ClassInvokerArgs {
|
||||||
return self();
|
return self();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @see ClassInvokerArgs#getInvoker()
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
public B invoker(Method method) {
|
|
||||||
return invoker(Invokable.from(method));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @see ClassInvokerArgs#getArgs()
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
public B args(Object[] args) {
|
|
||||||
return args(args == null ? Lists.newArrayList(new Object[] { null }) : Lists.newArrayList(args));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see ClassInvokerArgs#getArgs()
|
* @see ClassInvokerArgs#getArgs()
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -21,12 +21,10 @@ package org.jclouds.rest;
|
||||||
import static com.google.common.base.Preconditions.checkNotNull;
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
import static com.google.common.collect.Collections2.filter;
|
import static com.google.common.collect.Collections2.filter;
|
||||||
|
|
||||||
import java.lang.reflect.Method;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
|
||||||
import org.jclouds.javax.annotation.Nullable;
|
|
||||||
import org.jclouds.predicates.Validator;
|
import org.jclouds.predicates.Validator;
|
||||||
import org.jclouds.rest.annotations.ParamValidators;
|
import org.jclouds.rest.annotations.ParamValidators;
|
||||||
|
|
||||||
|
@ -72,12 +70,6 @@ public class InputParamValidator {
|
||||||
* @throws IllegalStateException
|
* @throws IllegalStateException
|
||||||
* if validation failed
|
* if validation failed
|
||||||
*/
|
*/
|
||||||
@Deprecated
|
|
||||||
public void validateMethodParametersOrThrow(Method method, @Nullable Object... args) {
|
|
||||||
validateMethodParametersOrThrow(Invokable.from(checkNotNull(method, "method")),
|
|
||||||
Lists.newArrayList(args));
|
|
||||||
}
|
|
||||||
|
|
||||||
public void validateMethodParametersOrThrow(Invokable<?, ?> method, List<Object> args) {
|
public void validateMethodParametersOrThrow(Invokable<?, ?> method, List<Object> args) {
|
||||||
try {
|
try {
|
||||||
performMethodValidation(checkNotNull(method, "method"), args);
|
performMethodValidation(checkNotNull(method, "method"), args);
|
||||||
|
|
|
@ -44,9 +44,9 @@ public class BindMapToStringPayload implements MapBinder {
|
||||||
public <R extends HttpRequest> R bindToRequest(R request, Map<String, Object> postParams) {
|
public <R extends HttpRequest> R bindToRequest(R request, Map<String, Object> postParams) {
|
||||||
checkNotNull(postParams, "postParams");
|
checkNotNull(postParams, "postParams");
|
||||||
GeneratedHttpRequest r = GeneratedHttpRequest.class.cast(checkNotNull(request, "request"));
|
GeneratedHttpRequest r = GeneratedHttpRequest.class.cast(checkNotNull(request, "request"));
|
||||||
checkArgument(r.getJavaMethod().isAnnotationPresent(Payload.class),
|
checkArgument(r.getInvoker().isAnnotationPresent(Payload.class),
|
||||||
"method %s must have @Payload annotation to use this binder", r.getJavaMethod());
|
"method %s must have @Payload annotation to use this binder", r.getInvoker());
|
||||||
String payload = r.getJavaMethod().getAnnotation(Payload.class).value();
|
String payload = r.getInvoker().getAnnotation(Payload.class).value();
|
||||||
if (postParams.size() > 0) {
|
if (postParams.size() > 0) {
|
||||||
payload = urlDecode(expand(payload, postParams));
|
payload = urlDecode(expand(payload, postParams));
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,9 +22,6 @@ import static com.google.common.base.Functions.compose;
|
||||||
import static com.google.common.base.Throwables.propagate;
|
import static com.google.common.base.Throwables.propagate;
|
||||||
import static com.google.common.collect.Iterables.any;
|
import static com.google.common.collect.Iterables.any;
|
||||||
import static com.google.common.collect.Iterables.find;
|
import static com.google.common.collect.Iterables.find;
|
||||||
import static com.google.common.collect.Lists.newArrayList;
|
|
||||||
import static com.google.common.collect.Sets.difference;
|
|
||||||
import static com.google.common.util.concurrent.Callables.returning;
|
|
||||||
import static com.google.common.util.concurrent.Futures.immediateFailedFuture;
|
import static com.google.common.util.concurrent.Futures.immediateFailedFuture;
|
||||||
import static com.google.common.util.concurrent.Futures.transform;
|
import static com.google.common.util.concurrent.Futures.transform;
|
||||||
import static com.google.common.util.concurrent.Futures.withFallback;
|
import static com.google.common.util.concurrent.Futures.withFallback;
|
||||||
|
@ -80,6 +77,7 @@ import org.jclouds.internal.ClassInvokerArgs;
|
||||||
import org.jclouds.internal.ClassInvokerArgsAndReturnVal;
|
import org.jclouds.internal.ClassInvokerArgsAndReturnVal;
|
||||||
import org.jclouds.json.internal.GsonWrapper;
|
import org.jclouds.json.internal.GsonWrapper;
|
||||||
import org.jclouds.logging.Logger;
|
import org.jclouds.logging.Logger;
|
||||||
|
import org.jclouds.reflect.AbstractInvocationHandler;
|
||||||
import org.jclouds.rest.AuthorizationException;
|
import org.jclouds.rest.AuthorizationException;
|
||||||
import org.jclouds.rest.InvocationContext;
|
import org.jclouds.rest.InvocationContext;
|
||||||
import org.jclouds.rest.annotations.Delegate;
|
import org.jclouds.rest.annotations.Delegate;
|
||||||
|
@ -91,20 +89,21 @@ import org.jclouds.rest.annotations.SelectJson;
|
||||||
import org.jclouds.rest.annotations.Transform;
|
import org.jclouds.rest.annotations.Transform;
|
||||||
import org.jclouds.rest.annotations.Unwrap;
|
import org.jclouds.rest.annotations.Unwrap;
|
||||||
import org.jclouds.rest.annotations.XMLResponseParser;
|
import org.jclouds.rest.annotations.XMLResponseParser;
|
||||||
import org.jclouds.rest.internal.RestAnnotationProcessor.InvokerKey;
|
|
||||||
|
|
||||||
import com.google.common.annotations.VisibleForTesting;
|
import com.google.common.annotations.VisibleForTesting;
|
||||||
import com.google.common.base.Function;
|
import com.google.common.base.Function;
|
||||||
|
import com.google.common.base.Objects;
|
||||||
import com.google.common.base.Optional;
|
import com.google.common.base.Optional;
|
||||||
import com.google.common.base.Predicate;
|
import com.google.common.base.Predicate;
|
||||||
|
import com.google.common.base.Predicates;
|
||||||
import com.google.common.base.Supplier;
|
import com.google.common.base.Supplier;
|
||||||
import com.google.common.cache.Cache;
|
|
||||||
import com.google.common.cache.CacheBuilder;
|
import com.google.common.cache.CacheBuilder;
|
||||||
import com.google.common.cache.CacheLoader;
|
import com.google.common.cache.CacheLoader;
|
||||||
import com.google.common.cache.LoadingCache;
|
import com.google.common.cache.LoadingCache;
|
||||||
|
import com.google.common.collect.FluentIterable;
|
||||||
import com.google.common.collect.ImmutableList;
|
import com.google.common.collect.ImmutableList;
|
||||||
import com.google.common.collect.ImmutableSet;
|
import com.google.common.collect.ImmutableSet;
|
||||||
import com.google.common.reflect.AbstractInvocationHandler;
|
import com.google.common.collect.Maps;
|
||||||
import com.google.common.reflect.Invokable;
|
import com.google.common.reflect.Invokable;
|
||||||
import com.google.common.reflect.Parameter;
|
import com.google.common.reflect.Parameter;
|
||||||
import com.google.common.reflect.TypeToken;
|
import com.google.common.reflect.TypeToken;
|
||||||
|
@ -141,6 +140,7 @@ import com.google.inject.assistedinject.Assisted;
|
||||||
*/
|
*/
|
||||||
@Singleton
|
@Singleton
|
||||||
public abstract class AsyncRestClientProxy extends AbstractInvocationHandler {
|
public abstract class AsyncRestClientProxy extends AbstractInvocationHandler {
|
||||||
|
|
||||||
public static interface Factory {
|
public static interface Factory {
|
||||||
Declaring declaring(Class<?> declaring);
|
Declaring declaring(Class<?> declaring);
|
||||||
|
|
||||||
|
@ -181,36 +181,50 @@ public abstract class AsyncRestClientProxy extends AbstractInvocationHandler {
|
||||||
private final ParseSax.Factory parserFactory;
|
private final ParseSax.Factory parserFactory;
|
||||||
private final Class<?> declaring;
|
private final Class<?> declaring;
|
||||||
|
|
||||||
private static final LoadingCache<Class<?>, Cache<InvokerKey, Invokable<?, ?>>> delegationMapCache = CacheBuilder
|
private static final LoadingCache<Class<?>, Set<Integer>> delegationMapCache = CacheBuilder.newBuilder().build(
|
||||||
.newBuilder().build(new CacheLoader<Class<?>, Cache<InvokerKey, Invokable<?, ?>>>() {
|
new CacheLoader<Class<?>, Set<Integer>>() {
|
||||||
public Cache<InvokerKey, Invokable<?, ?>> load(Class<?> declaring) throws ExecutionException {
|
public Set<Integer> load(Class<?> declaring) throws ExecutionException {
|
||||||
Cache<InvokerKey, Invokable<?, ?>> delegationMap = CacheBuilder.newBuilder()
|
FluentIterable<Invokable<?, ?>> methodsToProcess = FluentIterable
|
||||||
.<InvokerKey, Invokable<?, ?>> build();
|
.from(ImmutableSet.copyOf(declaring.getMethods()))
|
||||||
for (Method method : difference(ImmutableSet.copyOf(declaring.getMethods()),
|
.filter(Predicates.not(Predicates.in(ImmutableSet.copyOf(Object.class.getMethods()))))
|
||||||
ImmutableSet.copyOf(Object.class.getMethods()))) {
|
.transform(new Function<Method, Invokable<?, ?>>() {
|
||||||
Invokable<?, ?> invoker = Invokable.from(method);
|
public Invokable<?, ?> apply(Method in) {
|
||||||
if (isHttpMethod(invoker) || method.isAnnotationPresent(Delegate.class)) {
|
return Invokable.from(in);
|
||||||
delegationMap.get(new InvokerKey(invoker), returning(invoker));
|
|
||||||
} else if (!method.getDeclaringClass().equals(declaring)) { // potentially overridden
|
|
||||||
} else if (method.isAnnotationPresent(Provides.class)) {
|
|
||||||
}
|
}
|
||||||
}
|
}).filter(new Predicate<Invokable<?, ?>>() {
|
||||||
return delegationMap;
|
public boolean apply(Invokable<?, ?> in) {
|
||||||
}
|
return in.isAnnotationPresent(Path.class) || tryFindHttpMethod(in).isPresent()
|
||||||
});
|
|| any(in.getParameters(), new Predicate<Parameter>(){
|
||||||
|
|
||||||
private Invokable<?, ?> getDelegateOrNull(Invokable<?, ?> in) {
|
|
||||||
return delegationMapCache.getUnchecked(declaring).getIfPresent(new InvokerKey(in));
|
|
||||||
}
|
|
||||||
|
|
||||||
private static boolean isHttpMethod(Invokable<?, ?> invoker) {
|
|
||||||
return invoker.isAnnotationPresent(Path.class) || tryFindHttpMethod(invoker).isPresent()
|
|
||||||
|| any(invoker.getParameters(), new Predicate<Parameter>() {
|
|
||||||
public boolean apply(Parameter in) {
|
public boolean apply(Parameter in) {
|
||||||
return in.getType().isAssignableFrom(HttpRequest.class);
|
return in.getType().getRawType().isAssignableFrom(HttpRequest.class);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
}).filter(new Predicate<Invokable<?, ?>>() {
|
||||||
|
public boolean apply(Invokable<?, ?> in) {
|
||||||
|
return in.getReturnType().getRawType().isAssignableFrom(ListenableFuture.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
return Maps.uniqueIndex(methodsToProcess, HashSignatureExceptReturnVal.INSTANCE).keySet();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
private static enum HashSignatureExceptReturnVal implements Function<Invokable<?, ?>, Integer> {
|
||||||
|
INSTANCE;
|
||||||
|
public Integer apply(Invokable<?, ?> in) {
|
||||||
|
int parametersTypeHashCode = hashParameterTypes(in);
|
||||||
|
return Objects.hashCode(in.getDeclaringClass(), in.getName(), parametersTypeHashCode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static int hashParameterTypes(Invokable<?, ?> in) {
|
||||||
|
int parametersTypeHashCode = 0;
|
||||||
|
for (Parameter param : in.getParameters())
|
||||||
|
parametersTypeHashCode += param.getType().hashCode();
|
||||||
|
return parametersTypeHashCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
private AsyncRestClientProxy(Injector injector,
|
private AsyncRestClientProxy(Injector injector,
|
||||||
Function<ClassInvokerArgsAndReturnVal, Optional<Object>> optionalConverter, HttpCommandExecutorService http,
|
Function<ClassInvokerArgsAndReturnVal, Optional<Object>> optionalConverter, HttpCommandExecutorService http,
|
||||||
|
@ -236,12 +250,12 @@ public abstract class AsyncRestClientProxy extends AbstractInvocationHandler {
|
||||||
};
|
};
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected Object handleInvocation(Object proxy, Method method, Object[] args) throws ExecutionException {
|
protected Object handleInvocation(Object proxy, Invokable<?, ?> method, List<Object> args) throws Throwable {
|
||||||
if (method.isAnnotationPresent(Provides.class)) {
|
if (method.isAnnotationPresent(Provides.class)) {
|
||||||
return lookupValueFromGuice(method);
|
return lookupValueFromGuice(method);
|
||||||
} else if (method.isAnnotationPresent(Delegate.class)) {
|
} else if (method.isAnnotationPresent(Delegate.class)) {
|
||||||
return propagateContextToDelegate(method, args);
|
return propagateContextToDelegate(method, args);
|
||||||
} else if (isRestCall(method)) {
|
} else if (isAsyncOrDelegate(method)) {
|
||||||
return createListenableFutureForHttpRequestMappedToMethodAndArgs(method, args);
|
return createListenableFutureForHttpRequestMappedToMethodAndArgs(method, args);
|
||||||
} else {
|
} else {
|
||||||
throw new RuntimeException(String.format("Method is not annotated as either http or provider method: %s",
|
throw new RuntimeException(String.format("Method is not annotated as either http or provider method: %s",
|
||||||
|
@ -249,12 +263,11 @@ public abstract class AsyncRestClientProxy extends AbstractInvocationHandler {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isRestCall(Method method) {
|
private boolean isAsyncOrDelegate(Invokable<?, ?> method) {
|
||||||
return getDelegateOrNull(Invokable.from(method)) != null
|
return delegationMapCache.getUnchecked(declaring).contains(HashSignatureExceptReturnVal.INSTANCE.apply(method));
|
||||||
&& ListenableFuture.class.isAssignableFrom(method.getReturnType());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private Object propagateContextToDelegate(Method method, Object[] args) throws ExecutionException {
|
private Object propagateContextToDelegate(Invokable<?, ?> method, List<Object> args) throws ExecutionException {
|
||||||
Class<?> asyncClass = returnTypeOrTypeOfOptional(method);
|
Class<?> asyncClass = returnTypeOrTypeOfOptional(method);
|
||||||
ClassInvokerArgs cma = ClassInvokerArgs.builder().clazz(asyncClass).invoker(method).args(args).build();
|
ClassInvokerArgs cma = ClassInvokerArgs.builder().clazz(asyncClass).invoker(method).args(args).build();
|
||||||
Object returnVal = delegateMap.get(cma);
|
Object returnVal = delegateMap.get(cma);
|
||||||
|
@ -266,9 +279,9 @@ public abstract class AsyncRestClientProxy extends AbstractInvocationHandler {
|
||||||
return returnVal;
|
return returnVal;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Object lookupValueFromGuice(Method method) {
|
private Object lookupValueFromGuice(Invokable<?, ?> method) {
|
||||||
try {
|
try {
|
||||||
Type genericReturnType = method.getGenericReturnType();
|
Type genericReturnType = method.getReturnType().getType();
|
||||||
try {
|
try {
|
||||||
Annotation qualifier = find(ImmutableList.copyOf(method.getAnnotations()), isQualifierPresent);
|
Annotation qualifier = find(ImmutableList.copyOf(method.getAnnotations()), isQualifierPresent);
|
||||||
return getInstanceOfTypeWithQualifier(genericReturnType, qualifier);
|
return getInstanceOfTypeWithQualifier(genericReturnType, qualifier);
|
||||||
|
@ -320,15 +333,9 @@ public abstract class AsyncRestClientProxy extends AbstractInvocationHandler {
|
||||||
return injector.getInstance(Key.get(genericReturnType, qualifier));
|
return injector.getInstance(Key.get(genericReturnType, qualifier));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Deprecated
|
|
||||||
static Function<HttpResponse, ?> createResponseParser(ParseSax.Factory parserFactory, Injector injector,
|
|
||||||
Method method, HttpRequest request) {
|
|
||||||
return createResponseParser(parserFactory, injector, Invokable.from(method), request);
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
private static Function<HttpResponse, ?> createResponseParser(ParseSax.Factory parserFactory, Injector injector,
|
static Function<HttpResponse, ?> createResponseParser(ParseSax.Factory parserFactory, Injector injector,
|
||||||
Invokable<?, ?> method, HttpRequest request) {
|
Invokable<?, ?> method, HttpRequest request) {
|
||||||
Function<HttpResponse, ?> transformer;
|
Function<HttpResponse, ?> transformer;
|
||||||
Class<? extends HandlerWithResult<?>> handler = getSaxResponseParserClassOrNull(method);
|
Class<? extends HandlerWithResult<?>> handler = getSaxResponseParserClassOrNull(method);
|
||||||
|
@ -377,14 +384,8 @@ public abstract class AsyncRestClientProxy extends AbstractInvocationHandler {
|
||||||
return transformer;
|
return transformer;
|
||||||
}
|
}
|
||||||
|
|
||||||
private ListenableFuture<?> createListenableFutureForHttpRequestMappedToMethodAndArgs(Method method, Object[] args)
|
private ListenableFuture<?> createListenableFutureForHttpRequestMappedToMethodAndArgs(Invokable<?, ?> invoker,
|
||||||
throws ExecutionException {
|
List<Object> args) {
|
||||||
return createListenableFutureForHttpRequestMappedToMethodAndArgs(method, Invokable.from(method),
|
|
||||||
args == null ? newArrayList(new Object[] { null }) : newArrayList(args));
|
|
||||||
}
|
|
||||||
|
|
||||||
private ListenableFuture<?> createListenableFutureForHttpRequestMappedToMethodAndArgs(Method method,
|
|
||||||
Invokable<?, ?> invoker, List<Object> args) throws ExecutionException {
|
|
||||||
String name = invoker.getDeclaringClass().getSimpleName() + "." + invoker.getName();
|
String name = invoker.getDeclaringClass().getSimpleName() + "." + invoker.getName();
|
||||||
logger.trace(">> converting %s", name);
|
logger.trace(">> converting %s", name);
|
||||||
FutureFallback<?> fallback = fallbacks.getUnchecked(invoker);
|
FutureFallback<?> fallback = fallbacks.getUnchecked(invoker);
|
||||||
|
@ -394,7 +395,7 @@ public abstract class AsyncRestClientProxy extends AbstractInvocationHandler {
|
||||||
}
|
}
|
||||||
ListenableFuture<?> result;
|
ListenableFuture<?> result;
|
||||||
try {
|
try {
|
||||||
GeneratedHttpRequest request = annotationProcessor.createRequest(method, invoker, newArrayList(args));
|
GeneratedHttpRequest request = annotationProcessor.createRequest(invoker, args);
|
||||||
if (fallback instanceof InvocationContext) {
|
if (fallback instanceof InvocationContext) {
|
||||||
InvocationContext.class.cast(fallback).setContext(request);
|
InvocationContext.class.cast(fallback).setContext(request);
|
||||||
}
|
}
|
||||||
|
@ -457,13 +458,9 @@ public abstract class AsyncRestClientProxy extends AbstractInvocationHandler {
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
};
|
};
|
||||||
|
|
||||||
@Deprecated
|
|
||||||
static Key<? extends Function<HttpResponse, ?>> getParserOrThrowException(Method method) {
|
|
||||||
return getParserOrThrowException(Invokable.from(method));
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
private static Key<? extends Function<HttpResponse, ?>> getParserOrThrowException(Invokable<?, ?> method) {
|
@VisibleForTesting
|
||||||
|
static Key<? extends Function<HttpResponse, ?>> getParserOrThrowException(Invokable<?, ?> method) {
|
||||||
|
|
||||||
ResponseParser annotation = method.getAnnotation(ResponseParser.class);
|
ResponseParser annotation = method.getAnnotation(ResponseParser.class);
|
||||||
if (annotation == null) {
|
if (annotation == null) {
|
||||||
|
@ -478,9 +475,9 @@ public abstract class AsyncRestClientProxy extends AbstractInvocationHandler {
|
||||||
} else if (method.getReturnType().equals(HttpResponse.class)
|
} else if (method.getReturnType().equals(HttpResponse.class)
|
||||||
|| method.getReturnType().equals(futureHttpResponseLiteral)) {
|
|| method.getReturnType().equals(futureHttpResponseLiteral)) {
|
||||||
return Key.get(Class.class.cast(IdentityFunction.class));
|
return Key.get(Class.class.cast(IdentityFunction.class));
|
||||||
} else if (RestAnnotationProcessor.getAcceptHeadersOrNull(method).contains(APPLICATION_JSON)) {
|
} else if (RestAnnotationProcessor.getAcceptHeaders(method).contains(APPLICATION_JSON)) {
|
||||||
return getJsonParserKeyForMethod(method);
|
return getJsonParserKeyForMethod(method);
|
||||||
} else if (RestAnnotationProcessor.getAcceptHeadersOrNull(method).contains(APPLICATION_XML)
|
} else if (RestAnnotationProcessor.getAcceptHeaders(method).contains(APPLICATION_XML)
|
||||||
|| method.isAnnotationPresent(JAXBResponseParser.class)) {
|
|| method.isAnnotationPresent(JAXBResponseParser.class)) {
|
||||||
return getJAXBParserKeyForMethod(method);
|
return getJAXBParserKeyForMethod(method);
|
||||||
} else if (method.getReturnType().equals(String.class) || method.getReturnType().equals(futureStringLiteral)) {
|
} else if (method.getReturnType().equals(String.class) || method.getReturnType().equals(futureStringLiteral)) {
|
||||||
|
|
|
@ -20,7 +20,6 @@ package org.jclouds.rest.internal;
|
||||||
|
|
||||||
import static com.google.common.base.Preconditions.checkNotNull;
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
|
|
||||||
import java.lang.reflect.Method;
|
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
@ -54,7 +53,6 @@ public class GeneratedHttpRequest extends HttpRequest {
|
||||||
|
|
||||||
public static class Builder extends HttpRequest.Builder<Builder> {
|
public static class Builder extends HttpRequest.Builder<Builder> {
|
||||||
protected Class<?> declaring;
|
protected Class<?> declaring;
|
||||||
protected Method javaMethod;
|
|
||||||
protected Invokable<?, ?> invoker;
|
protected Invokable<?, ?> invoker;
|
||||||
// args can be null, so cannot use immutable list
|
// args can be null, so cannot use immutable list
|
||||||
protected List<Object> args = Lists.newArrayList();
|
protected List<Object> args = Lists.newArrayList();
|
||||||
|
@ -68,16 +66,6 @@ public class GeneratedHttpRequest extends HttpRequest {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @see GeneratedHttpRequest#getJavaMethod()
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
public Builder javaMethod(Method javaMethod) {
|
|
||||||
this.javaMethod = checkNotNull(javaMethod, "javaMethod");
|
|
||||||
this.invoker(Invokable.from(javaMethod));
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see GeneratedHttpRequest#getInvoker()
|
* @see GeneratedHttpRequest#getInvoker()
|
||||||
*/
|
*/
|
||||||
|
@ -118,14 +106,13 @@ public class GeneratedHttpRequest extends HttpRequest {
|
||||||
}
|
}
|
||||||
|
|
||||||
public GeneratedHttpRequest build() {
|
public GeneratedHttpRequest build() {
|
||||||
return new GeneratedHttpRequest(method, endpoint, headers.build(), payload, declaring, javaMethod, invoker,
|
return new GeneratedHttpRequest(method, endpoint, headers.build(), payload, declaring, invoker, args,
|
||||||
args, filters.build(), caller);
|
filters.build(), caller);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Builder fromGeneratedHttpRequest(GeneratedHttpRequest in) {
|
public Builder fromGeneratedHttpRequest(GeneratedHttpRequest in) {
|
||||||
return super.fromHttpRequest(in)
|
return super.fromHttpRequest(in)
|
||||||
.declaring(in.getDeclaring())
|
.declaring(in.getDeclaring())
|
||||||
.javaMethod(in.getJavaMethod())
|
|
||||||
.invoker(in.invoker)
|
.invoker(in.invoker)
|
||||||
.args(in.getArgs())
|
.args(in.getArgs())
|
||||||
.caller(in.getCaller().orNull());
|
.caller(in.getCaller().orNull());
|
||||||
|
@ -138,20 +125,18 @@ public class GeneratedHttpRequest extends HttpRequest {
|
||||||
}
|
}
|
||||||
|
|
||||||
private final Class<?> declaring;
|
private final Class<?> declaring;
|
||||||
private final Method javaMethod;
|
|
||||||
private final Invokable<?, ?> invoker;
|
private final Invokable<?, ?> invoker;
|
||||||
private final List<Object> args;
|
private final List<Object> args;
|
||||||
private final Optional<ClassInvokerArgs> caller;
|
private final Optional<ClassInvokerArgs> caller;
|
||||||
|
|
||||||
protected GeneratedHttpRequest(String method, URI endpoint, Multimap<String, String> headers,
|
protected GeneratedHttpRequest(String method, URI endpoint, Multimap<String, String> headers,
|
||||||
@Nullable Payload payload, Class<?> declaring, Method javaMethod, Invokable<?, ?> invoker,
|
@Nullable Payload payload, Class<?> declaring, Invokable<?, ?> invoker,
|
||||||
Iterable<Object> args, Iterable<HttpRequestFilter> filters, Optional<ClassInvokerArgs> caller) {
|
List<Object> args, Iterable<HttpRequestFilter> filters, Optional<ClassInvokerArgs> caller) {
|
||||||
super(method, endpoint, headers, payload, filters);
|
super(method, endpoint, headers, payload, filters);
|
||||||
this.declaring = checkNotNull(declaring, "declaring");
|
this.declaring = checkNotNull(declaring, "declaring");
|
||||||
this.javaMethod = checkNotNull(javaMethod, "javaMethod");
|
|
||||||
this.invoker = checkNotNull(invoker, "invoker");
|
this.invoker = checkNotNull(invoker, "invoker");
|
||||||
// TODO make immutable. ImmutableList.of() doesn't accept nulls
|
// TODO make immutable. ImmutableList.of() doesn't accept nulls
|
||||||
this.args = Lists.newArrayList(checkNotNull(args, "args"));
|
this.args = Collections.unmodifiableList(checkNotNull(args, "args"));
|
||||||
this.caller = checkNotNull(caller, "caller");
|
this.caller = checkNotNull(caller, "caller");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -159,20 +144,12 @@ public class GeneratedHttpRequest extends HttpRequest {
|
||||||
return declaring;
|
return declaring;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @deprecated see {@link #getInvoker()}
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
public Method getJavaMethod() {
|
|
||||||
return javaMethod;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Invokable<?,?> getInvoker() {
|
public Invokable<?,?> getInvoker() {
|
||||||
return invoker;
|
return invoker;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<Object> getArgs() {
|
public List<Object> getArgs() {
|
||||||
return Collections.unmodifiableList(args);
|
return args;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Optional<ClassInvokerArgs> getCaller() {
|
public Optional<ClassInvokerArgs> getCaller() {
|
||||||
|
|
|
@ -18,7 +18,6 @@
|
||||||
*/
|
*/
|
||||||
package org.jclouds.rest.internal;
|
package org.jclouds.rest.internal;
|
||||||
import static com.google.common.base.Functions.toStringFunction;
|
import static com.google.common.base.Functions.toStringFunction;
|
||||||
import static com.google.common.base.Objects.equal;
|
|
||||||
import static com.google.common.base.Preconditions.checkArgument;
|
import static com.google.common.base.Preconditions.checkArgument;
|
||||||
import static com.google.common.base.Preconditions.checkNotNull;
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
import static com.google.common.base.Preconditions.checkState;
|
import static com.google.common.base.Preconditions.checkState;
|
||||||
|
@ -44,7 +43,6 @@ import static org.jclouds.util.Strings2.replaceTokens;
|
||||||
|
|
||||||
import java.lang.annotation.Annotation;
|
import java.lang.annotation.Annotation;
|
||||||
import java.lang.reflect.Array;
|
import java.lang.reflect.Array;
|
||||||
import java.lang.reflect.Method;
|
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.LinkedHashMap;
|
import java.util.LinkedHashMap;
|
||||||
|
@ -104,7 +102,6 @@ import org.jclouds.rest.binders.BindToJsonPayloadWrappedWith;
|
||||||
|
|
||||||
import com.google.common.annotations.VisibleForTesting;
|
import com.google.common.annotations.VisibleForTesting;
|
||||||
import com.google.common.base.Function;
|
import com.google.common.base.Function;
|
||||||
import com.google.common.base.Objects;
|
|
||||||
import com.google.common.base.Optional;
|
import com.google.common.base.Optional;
|
||||||
import com.google.common.base.Predicate;
|
import com.google.common.base.Predicate;
|
||||||
import com.google.common.base.Supplier;
|
import com.google.common.base.Supplier;
|
||||||
|
@ -118,7 +115,6 @@ import com.google.common.collect.ImmutableSet;
|
||||||
import com.google.common.collect.ImmutableSet.Builder;
|
import com.google.common.collect.ImmutableSet.Builder;
|
||||||
import com.google.common.collect.LinkedHashMultimap;
|
import com.google.common.collect.LinkedHashMultimap;
|
||||||
import com.google.common.collect.LinkedListMultimap;
|
import com.google.common.collect.LinkedListMultimap;
|
||||||
import com.google.common.collect.Lists;
|
|
||||||
import com.google.common.collect.Maps;
|
import com.google.common.collect.Maps;
|
||||||
import com.google.common.collect.Multimap;
|
import com.google.common.collect.Multimap;
|
||||||
import com.google.common.primitives.Chars;
|
import com.google.common.primitives.Chars;
|
||||||
|
@ -194,15 +190,6 @@ public abstract class RestAnnotationProcessor {
|
||||||
@Resource
|
@Resource
|
||||||
protected Logger logger = Logger.NULL;
|
protected Logger logger = Logger.NULL;
|
||||||
|
|
||||||
static final LoadingCache<Method, Invokable<?, ?>> methods = CacheBuilder.newBuilder().build(
|
|
||||||
new CacheLoader<Method, Invokable<?, ?>>() {
|
|
||||||
@Override
|
|
||||||
public Invokable<?, ?> load(Method method) {
|
|
||||||
return Invokable.from(method);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
private static final Function<? super Entry<String, Object>, ? extends Part> ENTRY_TO_PART = new Function<Entry<String, Object>, Part>() {
|
private static final Function<? super Entry<String, Object>, ? extends Part> ENTRY_TO_PART = new Function<Entry<String, Object>, Part>() {
|
||||||
@Override
|
@Override
|
||||||
public Part apply(Entry<String, Object> from) {
|
public Part apply(Entry<String, Object> from) {
|
||||||
|
@ -230,44 +217,7 @@ public abstract class RestAnnotationProcessor {
|
||||||
this.declaring = declaring;
|
this.declaring = declaring;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class InvokerKey {
|
public GeneratedHttpRequest createRequest(Invokable<?, ?> invoker, List<Object> args) {
|
||||||
private final String name;
|
|
||||||
private final int parametersTypeHashCode;
|
|
||||||
private final Class<?> declaringClass;
|
|
||||||
|
|
||||||
public InvokerKey(Invokable<?, ?> invoker) {
|
|
||||||
this.name = invoker.getName();
|
|
||||||
this.declaringClass = invoker.getDeclaringClass();
|
|
||||||
int parametersTypeHashCode = 0;
|
|
||||||
for (Parameter param : invoker.getParameters())
|
|
||||||
parametersTypeHashCode += param.getType().hashCode();
|
|
||||||
this.parametersTypeHashCode = parametersTypeHashCode;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int hashCode() {
|
|
||||||
return Objects.hashCode(declaringClass, name, parametersTypeHashCode);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean equals(Object obj) {
|
|
||||||
if (this == obj) return true;
|
|
||||||
if (obj == null || getClass() != obj.getClass()) return false;
|
|
||||||
InvokerKey that = InvokerKey.class.cast(obj);
|
|
||||||
return equal(this.declaringClass, that.declaringClass)
|
|
||||||
&& equal(this.name, that.name)
|
|
||||||
&& equal(this.parametersTypeHashCode, that.parametersTypeHashCode);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Deprecated
|
|
||||||
public GeneratedHttpRequest createRequest(Method method, @Nullable Object... args) {
|
|
||||||
List<Object> list = args == null ? Lists.newArrayList(new Object[] { null }) : Lists.newArrayList(args);
|
|
||||||
return createRequest(method, methods.getUnchecked(method), list);
|
|
||||||
}
|
|
||||||
|
|
||||||
public GeneratedHttpRequest createRequest(Method method, Invokable<?, ?> invoker, List<Object> args) {
|
|
||||||
checkNotNull(method, "method");
|
|
||||||
checkNotNull(invoker, "invoker");
|
checkNotNull(invoker, "invoker");
|
||||||
checkNotNull(args, "args");
|
checkNotNull(args, "args");
|
||||||
inputParamValidator.validateMethodParametersOrThrow(invoker, args);
|
inputParamValidator.validateMethodParametersOrThrow(invoker, args);
|
||||||
|
@ -293,7 +243,6 @@ public abstract class RestAnnotationProcessor {
|
||||||
}
|
}
|
||||||
|
|
||||||
requestBuilder.declaring(declaring)
|
requestBuilder.declaring(declaring)
|
||||||
.javaMethod(method)
|
|
||||||
.invoker(invoker)
|
.invoker(invoker)
|
||||||
.args(args)
|
.args(args)
|
||||||
.filters(getFiltersIfAnnotated(invoker));
|
.filters(getFiltersIfAnnotated(invoker));
|
||||||
|
@ -550,13 +499,8 @@ public abstract class RestAnnotationProcessor {
|
||||||
return filters;
|
return filters;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Deprecated
|
@VisibleForTesting
|
||||||
public static URI getEndpointInParametersOrNull(Method method, @Deprecated Object[] args, Injector injector) {
|
static URI getEndpointInParametersOrNull(Invokable<?,?> method, List<Object> args, Injector injector) {
|
||||||
return getEndpointInParametersOrNull(methods.getUnchecked(method), args != null ? Lists.newArrayList(args)
|
|
||||||
: ImmutableList.of(), injector);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static URI getEndpointInParametersOrNull(Invokable<?,?> method, List<Object> args, Injector injector) {
|
|
||||||
Collection<Parameter> endpointParams = parametersWithAnnotation(method, EndpointParam.class);
|
Collection<Parameter> endpointParams = parametersWithAnnotation(method, EndpointParam.class);
|
||||||
if (endpointParams.isEmpty())
|
if (endpointParams.isEmpty())
|
||||||
return null;
|
return null;
|
||||||
|
@ -603,7 +547,6 @@ public abstract class RestAnnotationProcessor {
|
||||||
}
|
}
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
@Deprecated
|
|
||||||
static URI addHostIfMissing(URI original, URI withHost) {
|
static URI addHostIfMissing(URI original, URI withHost) {
|
||||||
checkNotNull(withHost, "URI withHost cannot be null");
|
checkNotNull(withHost, "URI withHost cannot be null");
|
||||||
checkArgument(withHost.getHost() != null, "URI withHost must have host:" + withHost);
|
checkArgument(withHost.getHost() != null, "URI withHost must have host:" + withHost);
|
||||||
|
@ -740,12 +683,6 @@ public abstract class RestAnnotationProcessor {
|
||||||
return result.build();
|
return result.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Deprecated
|
|
||||||
public Multimap<String, String> buildHeaders(Multimap<String, ?> tokenValues, Method method, Object... args) {
|
|
||||||
return buildHeaders(tokenValues, methods.getUnchecked(method), args != null ? Lists.newArrayList(args)
|
|
||||||
: ImmutableList.of());
|
|
||||||
}
|
|
||||||
|
|
||||||
private Multimap<String, String> buildHeaders(Multimap<String, ?> tokenValues, Invokable<?, ?> method,
|
private Multimap<String, String> buildHeaders(Multimap<String, ?> tokenValues, Invokable<?, ?> method,
|
||||||
List<Object> args) {
|
List<Object> args) {
|
||||||
Multimap<String, String> headers = LinkedHashMultimap.create();
|
Multimap<String, String> headers = LinkedHashMultimap.create();
|
||||||
|
@ -762,24 +699,16 @@ public abstract class RestAnnotationProcessor {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addConsumesIfPresentOnTypeOrMethod(Multimap<String, String> headers, Invokable<?,?> method) {
|
private void addConsumesIfPresentOnTypeOrMethod(Multimap<String, String> headers, Invokable<?,?> method) {
|
||||||
List<String> accept = getAcceptHeadersOrNull(method);
|
Set<String> accept = getAcceptHeaders(method);
|
||||||
if (accept.size() > 0)
|
if (!accept.isEmpty())
|
||||||
headers.replaceValues(ACCEPT, accept);
|
headers.replaceValues(ACCEPT, accept);
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: refactor this out
|
// TODO: refactor this out
|
||||||
@VisibleForTesting
|
static Set<String> getAcceptHeaders(Invokable<?, ?> method) {
|
||||||
static List<String> getAcceptHeadersOrNull(Invokable<?,?> method) {
|
Optional<Consumes> accept = Optional.fromNullable(method.getAnnotation(Consumes.class)).or(
|
||||||
List<String> accept = ImmutableList.of();
|
Optional.fromNullable(method.getDeclaringClass().getAnnotation(Consumes.class)));
|
||||||
if (method.getDeclaringClass().isAnnotationPresent(Consumes.class)) {
|
return (accept.isPresent()) ? ImmutableSet.copyOf(accept.get().value()) : ImmutableSet.<String> of();
|
||||||
Consumes header = method.getDeclaringClass().getAnnotation(Consumes.class);
|
|
||||||
accept = asList(header.value());
|
|
||||||
}
|
|
||||||
if (method.isAnnotationPresent(Consumes.class)) {
|
|
||||||
Consumes header = method.getAnnotation(Consumes.class);
|
|
||||||
accept = asList(header.value());
|
|
||||||
}
|
|
||||||
return accept;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addProducesIfPresentOnTypeOrMethod(Multimap<String, String> headers, Invokable<?,?> method) {
|
private void addProducesIfPresentOnTypeOrMethod(Multimap<String, String> headers, Invokable<?,?> method) {
|
||||||
|
|
|
@ -18,7 +18,6 @@
|
||||||
*/
|
*/
|
||||||
package org.jclouds.util;
|
package org.jclouds.util;
|
||||||
|
|
||||||
import java.lang.reflect.Method;
|
|
||||||
import java.lang.reflect.ParameterizedType;
|
import java.lang.reflect.ParameterizedType;
|
||||||
import java.lang.reflect.Type;
|
import java.lang.reflect.Type;
|
||||||
import java.lang.reflect.WildcardType;
|
import java.lang.reflect.WildcardType;
|
||||||
|
@ -37,12 +36,6 @@ public class Optionals2 {
|
||||||
return returnTypeOrTypeOfOptional(type.getRawType(), type.getType());
|
return returnTypeOrTypeOfOptional(type.getRawType(), type.getType());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Class<?> returnTypeOrTypeOfOptional(Method method) {
|
|
||||||
Class<?> syncClass = method.getReturnType();
|
|
||||||
Type genericType = method.getGenericReturnType();
|
|
||||||
return returnTypeOrTypeOfOptional(syncClass, genericType);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Class<?> returnTypeOrTypeOfOptional(Class<?> syncClass, Type genericType) {
|
private static Class<?> returnTypeOrTypeOfOptional(Class<?> syncClass, Type genericType) {
|
||||||
if (syncClass.isAssignableFrom(Optional.class)) {
|
if (syncClass.isAssignableFrom(Optional.class)) {
|
||||||
ParameterizedType futureType = ParameterizedType.class.cast(genericType);
|
ParameterizedType futureType = ParameterizedType.class.cast(genericType);
|
||||||
|
@ -57,8 +50,7 @@ public class Optionals2 {
|
||||||
return syncClass;
|
return syncClass;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isReturnTypeOptional(Method method) {
|
public static boolean isReturnTypeOptional(Invokable<?, ?> method) {
|
||||||
return method.getReturnType().isAssignableFrom(Optional.class);
|
return method.getReturnType().getRawType().isAssignableFrom(Optional.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,6 +34,7 @@ import org.jclouds.rest.ResourceNotFoundException;
|
||||||
import com.google.common.annotations.VisibleForTesting;
|
import com.google.common.annotations.VisibleForTesting;
|
||||||
import com.google.common.base.Predicate;
|
import com.google.common.base.Predicate;
|
||||||
import com.google.common.base.Throwables;
|
import com.google.common.base.Throwables;
|
||||||
|
import com.google.common.reflect.TypeToken;
|
||||||
import com.google.inject.CreationException;
|
import com.google.inject.CreationException;
|
||||||
import com.google.inject.ProvisionException;
|
import com.google.inject.ProvisionException;
|
||||||
import com.google.inject.spi.Message;
|
import com.google.inject.spi.Message;
|
||||||
|
@ -120,10 +121,10 @@ public class Throwables2 {
|
||||||
|
|
||||||
// Note this needs to be kept up-to-date with all top-level exceptions jclouds works against
|
// Note this needs to be kept up-to-date with all top-level exceptions jclouds works against
|
||||||
@SuppressWarnings( { "unchecked", "rawtypes" })
|
@SuppressWarnings( { "unchecked", "rawtypes" })
|
||||||
public static Exception returnFirstExceptionIfInListOrThrowStandardExceptionOrCause(Class[] exceptionTypes,
|
public static Exception returnFirstExceptionIfInListOrThrowStandardExceptionOrCause(Iterable<TypeToken<? extends Throwable>> throwables,
|
||||||
Exception exception) throws Exception {
|
Exception exception) throws Exception {
|
||||||
for (Class type : exceptionTypes) {
|
for (TypeToken<? extends Throwable> type : throwables) {
|
||||||
Throwable throwable = getFirstThrowableOfType(exception, type);
|
Throwable throwable = getFirstThrowableOfType(exception, (Class<Throwable>) type.getRawType());
|
||||||
if (throwable != null) {
|
if (throwable != null) {
|
||||||
return (Exception) throwable;
|
return (Exception) throwable;
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,7 +23,6 @@ import static org.testng.Assert.assertTrue;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.lang.reflect.Method;
|
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
import java.util.concurrent.ExecutorService;
|
import java.util.concurrent.ExecutorService;
|
||||||
import java.util.concurrent.Executors;
|
import java.util.concurrent.Executors;
|
||||||
|
@ -50,6 +49,8 @@ import org.testng.annotations.BeforeTest;
|
||||||
import org.testng.annotations.Test;
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
import com.google.common.base.Supplier;
|
import com.google.common.base.Supplier;
|
||||||
|
import com.google.common.collect.ImmutableList;
|
||||||
|
import com.google.common.reflect.Invokable;
|
||||||
|
|
||||||
@Test(groups = "unit", testName = "BackoffLimitedRetryHandlerTest")
|
@Test(groups = "unit", testName = "BackoffLimitedRetryHandlerTest")
|
||||||
public class BackoffLimitedRetryHandlerTest {
|
public class BackoffLimitedRetryHandlerTest {
|
||||||
|
@ -169,9 +170,9 @@ public class BackoffLimitedRetryHandlerTest {
|
||||||
.getInstance(RestAnnotationProcessor.Factory.class).declaring(IntegrationTestAsyncClient.class);
|
.getInstance(RestAnnotationProcessor.Factory.class).declaring(IntegrationTestAsyncClient.class);
|
||||||
|
|
||||||
private HttpCommand createCommand() throws SecurityException, NoSuchMethodException {
|
private HttpCommand createCommand() throws SecurityException, NoSuchMethodException {
|
||||||
Method method = IntegrationTestAsyncClient.class.getMethod("download", String.class);
|
Invokable<?, Object> method = Invokable.from(IntegrationTestAsyncClient.class.getMethod("download", String.class));
|
||||||
|
|
||||||
return new HttpCommand(processor.createRequest(method, "1"));
|
return new HttpCommand(processor.createRequest(method, ImmutableList.<Object> of("1")));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
|
@ -18,7 +18,6 @@
|
||||||
*/
|
*/
|
||||||
package org.jclouds.http.internal;
|
package org.jclouds.http.internal;
|
||||||
|
|
||||||
import java.lang.reflect.Method;
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.concurrent.ExecutorService;
|
import java.util.concurrent.ExecutorService;
|
||||||
|
@ -42,6 +41,7 @@ import org.jclouds.rest.internal.GeneratedHttpRequest;
|
||||||
|
|
||||||
import com.google.common.base.Supplier;
|
import com.google.common.base.Supplier;
|
||||||
import com.google.common.collect.Iterables;
|
import com.google.common.collect.Iterables;
|
||||||
|
import com.google.common.reflect.Invokable;
|
||||||
import com.google.inject.AbstractModule;
|
import com.google.inject.AbstractModule;
|
||||||
import com.google.inject.Module;
|
import com.google.inject.Module;
|
||||||
import com.google.inject.TypeLiteral;
|
import com.google.inject.TypeLiteral;
|
||||||
|
@ -73,16 +73,15 @@ public class TrackingJavaUrlHttpCommandExecutorService extends JavaUrlHttpComman
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Method getJavaMethodForRequestAtIndex(final Collection<HttpCommand> commandsInvoked, int index) {
|
public static Invokable<?, ?> getInvokerOfRequestAtIndex(final Collection<HttpCommand> commandsInvoked, int index) {
|
||||||
return getJavaMethodForRequest(Iterables.get(commandsInvoked, index));
|
return getInvokerOfRequest(Iterables.get(commandsInvoked, index));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Method getJavaMethodForRequest(HttpCommand commandInvoked) {
|
public static Invokable<?, ?> getInvokerOfRequest(HttpCommand commandInvoked) {
|
||||||
return GeneratedHttpRequest.class.cast(commandInvoked.getCurrentRequest()).getJavaMethod();
|
return GeneratedHttpRequest.class.cast(commandInvoked.getCurrentRequest()).getInvoker();
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
public static List<Object> getArgsForRequestAtIndex(final Collection<HttpCommand> commandsInvoked, int index) {
|
||||||
public static List<Object> getJavaArgsForRequestAtIndex(final Collection<HttpCommand> commandsInvoked, int index) {
|
|
||||||
return GeneratedHttpRequest.class.cast(Iterables.get(commandsInvoked, index).getCurrentRequest()).getArgs();
|
return GeneratedHttpRequest.class.cast(Iterables.get(commandsInvoked, index).getCurrentRequest()).getArgs();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -18,8 +18,6 @@
|
||||||
*/
|
*/
|
||||||
package org.jclouds.rest;
|
package org.jclouds.rest;
|
||||||
|
|
||||||
import java.lang.reflect.Method;
|
|
||||||
|
|
||||||
import javax.ws.rs.POST;
|
import javax.ws.rs.POST;
|
||||||
import javax.ws.rs.PathParam;
|
import javax.ws.rs.PathParam;
|
||||||
|
|
||||||
|
@ -34,6 +32,8 @@ import org.testng.TestException;
|
||||||
import org.testng.annotations.BeforeClass;
|
import org.testng.annotations.BeforeClass;
|
||||||
import org.testng.annotations.Test;
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
|
import com.google.common.collect.ImmutableList;
|
||||||
|
import com.google.common.reflect.Invokable;
|
||||||
import com.google.inject.Injector;
|
import com.google.inject.Injector;
|
||||||
|
|
||||||
@Test(groups = "unit")
|
@Test(groups = "unit")
|
||||||
|
@ -58,26 +58,26 @@ public class InputParamValidatorTest {
|
||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
public void testInputParamsValidation() throws Exception {
|
public void testInputParamsValidation() throws Exception {
|
||||||
Method allParamsValidatedMethod = InputParamValidatorForm.class.getMethod("allParamsValidated", String.class,
|
Invokable<?, ?> allParamsValidatedMethod = Invokable.from(InputParamValidatorForm.class.getMethod(
|
||||||
String.class);
|
"allParamsValidated", String.class, String.class));
|
||||||
Method oneParamValidatedMethod = InputParamValidatorForm.class.getMethod("oneParamValidated", String.class,
|
Invokable<?, ?> oneParamValidatedMethod = Invokable.from(InputParamValidatorForm.class.getMethod(
|
||||||
String.class);
|
"oneParamValidated", String.class, String.class));
|
||||||
RestAnnotationProcessor restAnnotationProcessor = factory(InputParamValidatorForm.class);
|
RestAnnotationProcessor restAnnotationProcessor = factory(InputParamValidatorForm.class);
|
||||||
restAnnotationProcessor.createRequest(allParamsValidatedMethod, "blah", "blah");
|
restAnnotationProcessor.createRequest(allParamsValidatedMethod, ImmutableList.<Object> of("blah", "blah"));
|
||||||
restAnnotationProcessor.createRequest(oneParamValidatedMethod, "blah", "blah");
|
restAnnotationProcessor.createRequest(oneParamValidatedMethod, ImmutableList.<Object> of("blah", "blah"));
|
||||||
|
|
||||||
try {
|
try {
|
||||||
restAnnotationProcessor.createRequest(allParamsValidatedMethod, "BLAH", "blah");
|
restAnnotationProcessor.createRequest(allParamsValidatedMethod, ImmutableList.<Object> of("BLAH", "blah"));
|
||||||
throw new TestException(
|
throw new TestException(
|
||||||
"AllLowerCaseValidator shouldn't have passed 'BLAH' as a parameter because it's uppercase.");
|
"AllLowerCaseValidator shouldn't have passed 'BLAH' as a parameter because it's uppercase.");
|
||||||
} catch (IllegalArgumentException e) {
|
} catch (IllegalArgumentException e) {
|
||||||
// supposed to happen - continue
|
// supposed to happen - continue
|
||||||
}
|
}
|
||||||
|
|
||||||
restAnnotationProcessor.createRequest(oneParamValidatedMethod, "BLAH", "blah");
|
restAnnotationProcessor.createRequest(oneParamValidatedMethod, ImmutableList.<Object> of("BLAH", "blah"));
|
||||||
|
|
||||||
try {
|
try {
|
||||||
restAnnotationProcessor.createRequest(oneParamValidatedMethod, "blah", "BLAH");
|
restAnnotationProcessor.createRequest(oneParamValidatedMethod, ImmutableList.<Object> of("blah", "BLAH"));
|
||||||
throw new TestException(
|
throw new TestException(
|
||||||
"AllLowerCaseValidator shouldn't have passed 'BLAH' as the second parameter because it's uppercase.");
|
"AllLowerCaseValidator shouldn't have passed 'BLAH' as the second parameter because it's uppercase.");
|
||||||
} catch (IllegalArgumentException e) {
|
} catch (IllegalArgumentException e) {
|
||||||
|
@ -98,8 +98,8 @@ public class InputParamValidatorTest {
|
||||||
|
|
||||||
@Test(expectedExceptions = ClassCastException.class)
|
@Test(expectedExceptions = ClassCastException.class)
|
||||||
public void testWrongPredicateTypeLiteral() throws Exception {
|
public void testWrongPredicateTypeLiteral() throws Exception {
|
||||||
Method method = WrongValidator.class.getMethod("method", Integer.class);
|
Invokable<?, ?> method = Invokable.from(WrongValidator.class.getMethod("method", Integer.class));
|
||||||
new InputParamValidator(injector).validateMethodParametersOrThrow(method, 55);
|
new InputParamValidator(injector).validateMethodParametersOrThrow(method, ImmutableList.<Object> of(55));
|
||||||
}
|
}
|
||||||
|
|
||||||
private RestAnnotationProcessor factory(Class<?> clazz) {
|
private RestAnnotationProcessor factory(Class<?> clazz) {
|
||||||
|
|
|
@ -21,7 +21,6 @@ package org.jclouds.rest.binders;
|
||||||
import static org.testng.Assert.assertEquals;
|
import static org.testng.Assert.assertEquals;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.lang.reflect.Method;
|
|
||||||
|
|
||||||
import javax.ws.rs.PathParam;
|
import javax.ws.rs.PathParam;
|
||||||
|
|
||||||
|
@ -33,6 +32,7 @@ import org.testng.annotations.Test;
|
||||||
|
|
||||||
import com.google.common.collect.ImmutableList;
|
import com.google.common.collect.ImmutableList;
|
||||||
import com.google.common.collect.ImmutableMap;
|
import com.google.common.collect.ImmutableMap;
|
||||||
|
import com.google.common.reflect.Invokable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tests behavior of {@code BindMapToStringPayload}
|
* Tests behavior of {@code BindMapToStringPayload}
|
||||||
|
@ -53,9 +53,9 @@ public class BindMapToStringPayloadTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testCorrect() throws SecurityException, NoSuchMethodException {
|
public void testCorrect() throws SecurityException, NoSuchMethodException {
|
||||||
Method testPayload = TestPayload.class.getMethod("testPayload", String.class);
|
Invokable<?, Object> testPayload = Invokable.from(TestPayload.class.getMethod("testPayload", String.class));
|
||||||
GeneratedHttpRequest request = GeneratedHttpRequest.builder()
|
GeneratedHttpRequest request = GeneratedHttpRequest.builder()
|
||||||
.declaring(TestPayload.class).javaMethod(testPayload).args(ImmutableList.<Object> of("robot"))
|
.declaring(TestPayload.class).invoker(testPayload).args(ImmutableList.<Object> of("robot"))
|
||||||
.method("POST").endpoint("http://localhost").build();
|
.method("POST").endpoint("http://localhost").build();
|
||||||
|
|
||||||
GeneratedHttpRequest newRequest = binder()
|
GeneratedHttpRequest newRequest = binder()
|
||||||
|
@ -67,9 +67,9 @@ public class BindMapToStringPayloadTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testDecodes() throws SecurityException, NoSuchMethodException {
|
public void testDecodes() throws SecurityException, NoSuchMethodException {
|
||||||
Method testPayload = TestPayload.class.getMethod("changeAdminPass", String.class);
|
Invokable<?, Object> testPayload = Invokable.from(TestPayload.class.getMethod("changeAdminPass", String.class));
|
||||||
GeneratedHttpRequest request = GeneratedHttpRequest.builder()
|
GeneratedHttpRequest request = GeneratedHttpRequest.builder()
|
||||||
.declaring(TestPayload.class).javaMethod(testPayload).args(ImmutableList.<Object> of("foo"))
|
.declaring(TestPayload.class).invoker(testPayload).args(ImmutableList.<Object> of("foo"))
|
||||||
.method("POST").endpoint("http://localhost").build();
|
.method("POST").endpoint("http://localhost").build();
|
||||||
|
|
||||||
GeneratedHttpRequest newRequest = binder()
|
GeneratedHttpRequest newRequest = binder()
|
||||||
|
@ -81,9 +81,9 @@ public class BindMapToStringPayloadTest {
|
||||||
|
|
||||||
@Test(expectedExceptions = IllegalArgumentException.class)
|
@Test(expectedExceptions = IllegalArgumentException.class)
|
||||||
public void testMustHavePayloadAnnotation() throws SecurityException, NoSuchMethodException {
|
public void testMustHavePayloadAnnotation() throws SecurityException, NoSuchMethodException {
|
||||||
Method noPayload = TestPayload.class.getMethod("noPayload", String.class);
|
Invokable<?, Object> noPayload = Invokable.from(TestPayload.class.getMethod("noPayload", String.class));
|
||||||
GeneratedHttpRequest request = GeneratedHttpRequest.builder()
|
GeneratedHttpRequest request = GeneratedHttpRequest.builder()
|
||||||
.declaring(TestPayload.class).javaMethod(noPayload).args(ImmutableList.<Object> of("robot"))
|
.declaring(TestPayload.class).invoker(noPayload).args(ImmutableList.<Object> of("robot"))
|
||||||
.method("POST").endpoint("http://localhost").build();
|
.method("POST").endpoint("http://localhost").build();
|
||||||
binder().bindToRequest(request, ImmutableMap.<String,Object>of("fooble", "robot"));
|
binder().bindToRequest(request, ImmutableMap.<String,Object>of("fooble", "robot"));
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,6 +33,8 @@ import org.testng.annotations.Test;
|
||||||
|
|
||||||
import com.google.common.base.Optional;
|
import com.google.common.base.Optional;
|
||||||
import com.google.common.base.Stopwatch;
|
import com.google.common.base.Stopwatch;
|
||||||
|
import com.google.common.collect.ImmutableList;
|
||||||
|
import com.google.common.reflect.Invokable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Allows you to use simple api version comparison to determine if a feature is
|
* Allows you to use simple api version comparison to determine if a feature is
|
||||||
|
@ -163,8 +165,8 @@ public class PresentWhenApiVersionLexicographicallyAtOrAfterSinceApiVersionTest
|
||||||
ClassInvokerArgsAndReturnVal getApi(String name, Class<?> type) {
|
ClassInvokerArgsAndReturnVal getApi(String name, Class<?> type) {
|
||||||
try {
|
try {
|
||||||
return ClassInvokerArgsAndReturnVal.builder().clazz(type)
|
return ClassInvokerArgsAndReturnVal.builder().clazz(type)
|
||||||
.invoker(EC2AsyncApi.class.getDeclaredMethod("get" + name + "ApiForRegion", String.class))
|
.invoker(Invokable.from(EC2AsyncApi.class.getDeclaredMethod("get" + name + "ApiForRegion", String.class)))
|
||||||
.args(new Object[] { "region" }).returnVal("present").build();
|
.args(ImmutableList.<Object> of("region")).returnVal("present").build();
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
throw propagate(e);
|
throw propagate(e);
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,7 +26,6 @@ import static org.testng.Assert.assertEquals;
|
||||||
import static org.testng.Assert.assertNull;
|
import static org.testng.Assert.assertNull;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.lang.reflect.Method;
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.Map.Entry;
|
import java.util.Map.Entry;
|
||||||
import java.util.concurrent.ExecutorService;
|
import java.util.concurrent.ExecutorService;
|
||||||
|
@ -49,6 +48,7 @@ import org.testng.annotations.Test;
|
||||||
import com.google.common.collect.Multimap;
|
import com.google.common.collect.Multimap;
|
||||||
import com.google.common.collect.SortedSetMultimap;
|
import com.google.common.collect.SortedSetMultimap;
|
||||||
import com.google.common.collect.TreeMultimap;
|
import com.google.common.collect.TreeMultimap;
|
||||||
|
import com.google.common.reflect.Invokable;
|
||||||
import com.google.inject.AbstractModule;
|
import com.google.inject.AbstractModule;
|
||||||
import com.google.inject.Injector;
|
import com.google.inject.Injector;
|
||||||
import com.google.inject.name.Names;
|
import com.google.inject.name.Names;
|
||||||
|
@ -160,7 +160,7 @@ public abstract class BaseRestApiTest {
|
||||||
assertEquals(request.getRequestLine(), toMatch);
|
assertEquals(request.getRequestLine(), toMatch);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void assertFallbackClassEquals(Method method, @Nullable Class<?> expected) {
|
protected void assertFallbackClassEquals(Invokable<?, ?> method, @Nullable Class<?> expected) {
|
||||||
Fallback fallbackAnnotation = method.getAnnotation(Fallback.class);
|
Fallback fallbackAnnotation = method.getAnnotation(Fallback.class);
|
||||||
Class<?> assigned = fallbackAnnotation != null ? fallbackAnnotation.value() : MapHttp4xxCodesToExceptions.class;
|
Class<?> assigned = fallbackAnnotation != null ? fallbackAnnotation.value() : MapHttp4xxCodesToExceptions.class;
|
||||||
if (expected == null)
|
if (expected == null)
|
||||||
|
@ -169,13 +169,13 @@ public abstract class BaseRestApiTest {
|
||||||
assertEquals(assigned, expected);
|
assertEquals(assigned, expected);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void assertSaxResponseParserClassEquals(Method method, @Nullable Class<?> parserClass) {
|
protected void assertSaxResponseParserClassEquals(Invokable<?, ?> method, @Nullable Class<?> parserClass) {
|
||||||
XMLResponseParser annotation = method.getAnnotation(XMLResponseParser.class);
|
XMLResponseParser annotation = method.getAnnotation(XMLResponseParser.class);
|
||||||
Class<?> expected = (annotation != null) ? annotation.value() :null;
|
Class<?> expected = (annotation != null) ? annotation.value() :null;
|
||||||
assertEquals(expected, parserClass);
|
assertEquals(expected, parserClass);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void assertResponseParserClassEquals(Method method, HttpRequest request, @Nullable Class<?> parserClass) {
|
protected void assertResponseParserClassEquals(Invokable<?, ?> method, HttpRequest request, @Nullable Class<?> parserClass) {
|
||||||
assertEquals(AsyncRestClientProxy.createResponseParser(parserFactory, injector, method, request).getClass(), parserClass);
|
assertEquals(AsyncRestClientProxy.createResponseParser(parserFactory, injector, method, request).getClass(), parserClass);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -22,11 +22,10 @@ import static org.testng.Assert.assertEquals;
|
||||||
import static org.testng.Assert.assertFalse;
|
import static org.testng.Assert.assertFalse;
|
||||||
import static org.testng.Assert.assertTrue;
|
import static org.testng.Assert.assertTrue;
|
||||||
|
|
||||||
import java.lang.reflect.Method;
|
|
||||||
|
|
||||||
import org.testng.annotations.Test;
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
import com.google.common.base.Optional;
|
import com.google.common.base.Optional;
|
||||||
|
import com.google.common.reflect.Invokable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Adrian Cole
|
* @author Adrian Cole
|
||||||
|
@ -41,25 +40,25 @@ public class Optionals2Test {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testReturnTypeOrTypeOfOptionalWhenOptional() throws SecurityException, NoSuchMethodException {
|
public void testReturnTypeOrTypeOfOptionalWhenOptional() throws SecurityException, NoSuchMethodException {
|
||||||
Method method = Test.class.getMethod("getOptional");
|
Invokable<?, ?> method = Invokable.from(Test.class.getMethod("getOptional"));
|
||||||
|
|
||||||
assertEquals(Optionals2.returnTypeOrTypeOfOptional(method), String.class);
|
assertEquals(Optionals2.returnTypeOrTypeOfOptional(method), String.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testReturnTypeOrTypeOfOptionalWhenNotOptional() throws SecurityException, NoSuchMethodException {
|
public void testReturnTypeOrTypeOfOptionalWhenNotOptional() throws SecurityException, NoSuchMethodException {
|
||||||
Method method = Test.class.getMethod("getNotOptional");
|
Invokable<?, ?> method = Invokable.from(Test.class.getMethod("getNotOptional"));
|
||||||
|
|
||||||
assertEquals(Optionals2.returnTypeOrTypeOfOptional(method), String.class);
|
assertEquals(Optionals2.returnTypeOrTypeOfOptional(method), String.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testIsReturnTypeOptionalWhenOptional() throws SecurityException, NoSuchMethodException {
|
public void testIsReturnTypeOptionalWhenOptional() throws SecurityException, NoSuchMethodException {
|
||||||
Method method = Test.class.getMethod("getOptional");
|
Invokable<?, ?> method = Invokable.from(Test.class.getMethod("getOptional"));
|
||||||
|
|
||||||
assertTrue(Optionals2.isReturnTypeOptional(method));
|
assertTrue(Optionals2.isReturnTypeOptional(method));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testIsReturnTypeOptionalWhenNotOptional() throws SecurityException, NoSuchMethodException {
|
public void testIsReturnTypeOptionalWhenNotOptional() throws SecurityException, NoSuchMethodException {
|
||||||
Method method = Test.class.getMethod("getNotOptional");
|
Invokable<?, ?> method = Invokable.from(Test.class.getMethod("getNotOptional"));
|
||||||
|
|
||||||
assertFalse(Optionals2.isReturnTypeOptional(method));
|
assertFalse(Optionals2.isReturnTypeOptional(method));
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,8 +26,8 @@ import static org.testng.Assert.assertEquals;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.net.SocketException;
|
import java.net.SocketException;
|
||||||
import java.util.Map;
|
|
||||||
import java.util.concurrent.ExecutionException;
|
import java.util.concurrent.ExecutionException;
|
||||||
|
import java.util.concurrent.Future;
|
||||||
import java.util.concurrent.TimeoutException;
|
import java.util.concurrent.TimeoutException;
|
||||||
|
|
||||||
import org.jclouds.concurrent.TransformParallelException;
|
import org.jclouds.concurrent.TransformParallelException;
|
||||||
|
@ -41,6 +41,7 @@ import org.testng.annotations.Test;
|
||||||
import com.google.common.collect.ImmutableList;
|
import com.google.common.collect.ImmutableList;
|
||||||
import com.google.common.collect.ImmutableMap;
|
import com.google.common.collect.ImmutableMap;
|
||||||
import com.google.common.collect.ImmutableSet;
|
import com.google.common.collect.ImmutableSet;
|
||||||
|
import com.google.common.reflect.TypeToken;
|
||||||
import com.google.inject.CreationException;
|
import com.google.inject.CreationException;
|
||||||
import com.google.inject.ProvisionException;
|
import com.google.inject.ProvisionException;
|
||||||
import com.google.inject.spi.Message;
|
import com.google.inject.spi.Message;
|
||||||
|
@ -117,153 +118,160 @@ public class Throwables2Test {
|
||||||
assertEquals(getFirstThrowableOfType(pex, AuthorizationException.class), null);
|
assertEquals(getFirstThrowableOfType(pex, AuthorizationException.class), null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
public void testGetCauseTransformParallel() {
|
public void testGetCauseTransformParallel() {
|
||||||
Exception aex = createMock(AuthorizationException.class);
|
Exception aex = createMock(AuthorizationException.class);
|
||||||
TransformParallelException pex = new TransformParallelException((Map) ImmutableMap.of(), ImmutableMap.of("bad",
|
TransformParallelException pex = new TransformParallelException(ImmutableMap.<Object, Future<?>> of(),
|
||||||
aex), "test");
|
ImmutableMap.of("bad", aex), "test");
|
||||||
assertEquals(getFirstThrowableOfType(pex, AuthorizationException.class), aex);
|
assertEquals(getFirstThrowableOfType(pex, AuthorizationException.class), aex);
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
public void testGetFirstThrowableOfTypeInnerTransformParallel() {
|
public void testGetFirstThrowableOfTypeInnerTransformParallel() {
|
||||||
Exception aex = createMock(AuthorizationException.class);
|
Exception aex = createMock(AuthorizationException.class);
|
||||||
TransformParallelException pex = new TransformParallelException((Map) ImmutableMap.of(), ImmutableMap.of("bad",
|
TransformParallelException pex = new TransformParallelException(ImmutableMap.<Object, Future<?>> of(),
|
||||||
(Exception) new ExecutionException(aex)), "test");
|
ImmutableMap.of("bad", (Exception) new ExecutionException(aex)), "test");
|
||||||
assertEquals(getFirstThrowableOfType(pex, AuthorizationException.class), aex);
|
assertEquals(getFirstThrowableOfType(pex, AuthorizationException.class), aex);
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
public void testGetFirstThrowableOfTypeOuterTransformParallel() {
|
public void testGetFirstThrowableOfTypeOuterTransformParallel() {
|
||||||
Exception aex = createMock(AuthorizationException.class);
|
Exception aex = createMock(AuthorizationException.class);
|
||||||
TransformParallelException pex = new TransformParallelException((Map) ImmutableMap.of(), ImmutableMap.of("bad",
|
TransformParallelException pex = new TransformParallelException(ImmutableMap.<Object, Future<?>> of(),
|
||||||
(Exception) aex), "test");
|
ImmutableMap.of("bad", (Exception) aex), "test");
|
||||||
assertEquals(getFirstThrowableOfType(new ExecutionException(pex), AuthorizationException.class), aex);
|
assertEquals(getFirstThrowableOfType(new ExecutionException(pex), AuthorizationException.class), aex);
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
public void testGetFirstThrowableOfTypeFailTransformParallel() {
|
public void testGetFirstThrowableOfTypeFailTransformParallel() {
|
||||||
Exception aex = createMock(TimeoutException.class);
|
Exception aex = createMock(TimeoutException.class);
|
||||||
TransformParallelException pex = new TransformParallelException((Map) ImmutableMap.of(), ImmutableMap.of("bad",
|
TransformParallelException pex = new TransformParallelException(ImmutableMap.<Object, Future<?>> of(),
|
||||||
aex), "test");
|
ImmutableMap.of("bad", aex), "test");
|
||||||
assertEquals(getFirstThrowableOfType(pex, AuthorizationException.class), null);
|
assertEquals(getFirstThrowableOfType(pex, AuthorizationException.class), null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testReturnExceptionThatsInList() throws Exception {
|
public void testReturnExceptionThatsInList() throws Exception {
|
||||||
Exception e = new TestException();
|
Exception e = new TestException();
|
||||||
assertEquals(returnFirstExceptionIfInListOrThrowStandardExceptionOrCause(new Class[] { TestException.class }, e),
|
assertEquals(
|
||||||
e);
|
returnFirstExceptionIfInListOrThrowStandardExceptionOrCause(
|
||||||
assertEquals(returnFirstExceptionIfInListOrThrowStandardExceptionOrCause(new Class[] { TestException.class },
|
ImmutableSet.<TypeToken<? extends Throwable>> of(TypeToken.of(TestException.class)), e), e);
|
||||||
|
assertEquals(
|
||||||
|
returnFirstExceptionIfInListOrThrowStandardExceptionOrCause(
|
||||||
|
ImmutableSet.<TypeToken<? extends Throwable>> of(TypeToken.of(TestException.class)),
|
||||||
new RuntimeException(e)), e);
|
new RuntimeException(e)), e);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(expectedExceptions = TestException.class)
|
@Test(expectedExceptions = TestException.class)
|
||||||
public void testThrowExceptionNotInList() throws Exception {
|
public void testThrowExceptionNotInList() throws Exception {
|
||||||
Exception e = new TestException();
|
Exception e = new TestException();
|
||||||
returnFirstExceptionIfInListOrThrowStandardExceptionOrCause(new Class[] {}, e);
|
returnFirstExceptionIfInListOrThrowStandardExceptionOrCause(ImmutableSet.<TypeToken<? extends Throwable>> of(), e);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(expectedExceptions = IllegalStateException.class)
|
@Test(expectedExceptions = IllegalStateException.class)
|
||||||
public void testPropagateStandardExceptionIllegalStateException() throws Exception {
|
public void testPropagateStandardExceptionIllegalStateException() throws Exception {
|
||||||
Exception e = new IllegalStateException();
|
Exception e = new IllegalStateException();
|
||||||
returnFirstExceptionIfInListOrThrowStandardExceptionOrCause(new Class[] {}, new RuntimeException(e));
|
returnFirstExceptionIfInListOrThrowStandardExceptionOrCause(ImmutableSet.<TypeToken<? extends Throwable>> of(),
|
||||||
|
new RuntimeException(e));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(expectedExceptions = IllegalArgumentException.class)
|
@Test(expectedExceptions = IllegalArgumentException.class)
|
||||||
public void testPropagateStandardExceptionIllegalArgumentException() throws Exception {
|
public void testPropagateStandardExceptionIllegalArgumentException() throws Exception {
|
||||||
Exception e = new IllegalArgumentException();
|
Exception e = new IllegalArgumentException();
|
||||||
returnFirstExceptionIfInListOrThrowStandardExceptionOrCause(new Class[] {}, new RuntimeException(e));
|
returnFirstExceptionIfInListOrThrowStandardExceptionOrCause(ImmutableSet.<TypeToken<? extends Throwable>> of(),
|
||||||
|
new RuntimeException(e));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(expectedExceptions = UnsupportedOperationException.class)
|
@Test(expectedExceptions = UnsupportedOperationException.class)
|
||||||
public void testPropagateStandardExceptionUnsupportedOperationException() throws Exception {
|
public void testPropagateStandardExceptionUnsupportedOperationException() throws Exception {
|
||||||
Exception e = new UnsupportedOperationException();
|
Exception e = new UnsupportedOperationException();
|
||||||
returnFirstExceptionIfInListOrThrowStandardExceptionOrCause(new Class[] {}, new RuntimeException(e));
|
returnFirstExceptionIfInListOrThrowStandardExceptionOrCause(ImmutableSet.<TypeToken<? extends Throwable>> of(),
|
||||||
|
new RuntimeException(e));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(expectedExceptions = AssertionError.class)
|
@Test(expectedExceptions = AssertionError.class)
|
||||||
public void testPropagateStandardExceptionAssertionError() throws Exception {
|
public void testPropagateStandardExceptionAssertionError() throws Exception {
|
||||||
AssertionError e = new AssertionError();
|
AssertionError e = new AssertionError();
|
||||||
returnFirstExceptionIfInListOrThrowStandardExceptionOrCause(new Class[] {}, new RuntimeException(e));
|
returnFirstExceptionIfInListOrThrowStandardExceptionOrCause(ImmutableSet.<TypeToken<? extends Throwable>> of(),
|
||||||
|
new RuntimeException(e));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(expectedExceptions = AuthorizationException.class)
|
@Test(expectedExceptions = AuthorizationException.class)
|
||||||
public void testPropagateStandardExceptionAuthorizationException() throws Exception {
|
public void testPropagateStandardExceptionAuthorizationException() throws Exception {
|
||||||
Exception e = new AuthorizationException();
|
Exception e = new AuthorizationException();
|
||||||
returnFirstExceptionIfInListOrThrowStandardExceptionOrCause(new Class[] {}, new RuntimeException(e));
|
returnFirstExceptionIfInListOrThrowStandardExceptionOrCause(ImmutableSet.<TypeToken<? extends Throwable>> of(),
|
||||||
|
new RuntimeException(e));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(expectedExceptions = AuthorizationException.class)
|
@Test(expectedExceptions = AuthorizationException.class)
|
||||||
public void testPropagateProvisionExceptionAuthorizationException() throws Exception {
|
public void testPropagateProvisionExceptionAuthorizationException() throws Exception {
|
||||||
Exception e = new AuthorizationException();
|
Exception e = new AuthorizationException();
|
||||||
returnFirstExceptionIfInListOrThrowStandardExceptionOrCause(new Class[] {}, new ProvisionException(ImmutableSet.of(new Message(
|
returnFirstExceptionIfInListOrThrowStandardExceptionOrCause(ImmutableSet.<TypeToken<? extends Throwable>> of(),
|
||||||
ImmutableList.of(), "Error in custom provider",e))));
|
new ProvisionException(ImmutableSet.of(new Message(ImmutableList.of(), "Error in custom provider", e))));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(expectedExceptions = AuthorizationException.class)
|
@Test(expectedExceptions = AuthorizationException.class)
|
||||||
public void testPropagateCreationExceptionAuthorizationException() throws Exception {
|
public void testPropagateCreationExceptionAuthorizationException() throws Exception {
|
||||||
Exception e = new AuthorizationException();
|
Exception e = new AuthorizationException();
|
||||||
returnFirstExceptionIfInListOrThrowStandardExceptionOrCause(new Class[] {}, new CreationException(ImmutableSet.of(new Message(
|
returnFirstExceptionIfInListOrThrowStandardExceptionOrCause(ImmutableSet.<TypeToken<? extends Throwable>> of(),
|
||||||
ImmutableList.of(), "Error in custom provider",e))));
|
new CreationException(ImmutableSet.of(new Message(ImmutableList.of(), "Error in custom provider", e))));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(expectedExceptions = InsufficientResourcesException.class)
|
@Test(expectedExceptions = InsufficientResourcesException.class)
|
||||||
public void testPropagateStandardExceptionInsufficientResourcesException() throws Exception {
|
public void testPropagateStandardExceptionInsufficientResourcesException() throws Exception {
|
||||||
Exception e = new InsufficientResourcesException();
|
Exception e = new InsufficientResourcesException();
|
||||||
returnFirstExceptionIfInListOrThrowStandardExceptionOrCause(new Class[] {}, new RuntimeException(e));
|
returnFirstExceptionIfInListOrThrowStandardExceptionOrCause(ImmutableSet.<TypeToken<? extends Throwable>> of(),
|
||||||
|
new RuntimeException(e));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(expectedExceptions = ResourceNotFoundException.class)
|
@Test(expectedExceptions = ResourceNotFoundException.class)
|
||||||
public void testPropagateStandardExceptionResourceNotFoundException() throws Exception {
|
public void testPropagateStandardExceptionResourceNotFoundException() throws Exception {
|
||||||
Exception e = new ResourceNotFoundException();
|
Exception e = new ResourceNotFoundException();
|
||||||
returnFirstExceptionIfInListOrThrowStandardExceptionOrCause(new Class[] {}, new RuntimeException(e));
|
returnFirstExceptionIfInListOrThrowStandardExceptionOrCause(ImmutableSet.<TypeToken<? extends Throwable>> of(),
|
||||||
|
new RuntimeException(e));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(expectedExceptions = IllegalStateException.class)
|
@Test(expectedExceptions = IllegalStateException.class)
|
||||||
public void testPropagateStandardExceptionIllegalStateExceptionNestedInHttpResponseException() throws Exception {
|
public void testPropagateStandardExceptionIllegalStateExceptionNestedInHttpResponseException() throws Exception {
|
||||||
Exception e = new IllegalStateException();
|
Exception e = new IllegalStateException();
|
||||||
returnFirstExceptionIfInListOrThrowStandardExceptionOrCause(new Class[] {}, new HttpResponseException("goo",
|
returnFirstExceptionIfInListOrThrowStandardExceptionOrCause(ImmutableSet.<TypeToken<? extends Throwable>> of(),
|
||||||
createNiceMock(HttpCommand.class), null, e));
|
new HttpResponseException("goo", createNiceMock(HttpCommand.class), null, e));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(expectedExceptions = IllegalArgumentException.class)
|
@Test(expectedExceptions = IllegalArgumentException.class)
|
||||||
public void testPropagateStandardExceptionIllegalArgumentExceptionNestedInHttpResponseException() throws Exception {
|
public void testPropagateStandardExceptionIllegalArgumentExceptionNestedInHttpResponseException() throws Exception {
|
||||||
Exception e = new IllegalArgumentException();
|
Exception e = new IllegalArgumentException();
|
||||||
returnFirstExceptionIfInListOrThrowStandardExceptionOrCause(new Class[] {}, new HttpResponseException("goo",
|
returnFirstExceptionIfInListOrThrowStandardExceptionOrCause(ImmutableSet.<TypeToken<? extends Throwable>> of(),
|
||||||
createNiceMock(HttpCommand.class), null, e));
|
new HttpResponseException("goo", createNiceMock(HttpCommand.class), null, e));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(expectedExceptions = UnsupportedOperationException.class)
|
@Test(expectedExceptions = UnsupportedOperationException.class)
|
||||||
public void testPropagateStandardExceptionUnsupportedOperationExceptionNestedInHttpResponseException()
|
public void testPropagateStandardExceptionUnsupportedOperationExceptionNestedInHttpResponseException()
|
||||||
throws Exception {
|
throws Exception {
|
||||||
Exception e = new UnsupportedOperationException();
|
Exception e = new UnsupportedOperationException();
|
||||||
returnFirstExceptionIfInListOrThrowStandardExceptionOrCause(new Class[] {}, new HttpResponseException("goo",
|
returnFirstExceptionIfInListOrThrowStandardExceptionOrCause(ImmutableSet.<TypeToken<? extends Throwable>> of(),
|
||||||
createNiceMock(HttpCommand.class), null, e));
|
new HttpResponseException("goo", createNiceMock(HttpCommand.class), null, e));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(expectedExceptions = AuthorizationException.class)
|
@Test(expectedExceptions = AuthorizationException.class)
|
||||||
public void testPropagateStandardExceptionAuthorizationExceptionNestedInHttpResponseException() throws Exception {
|
public void testPropagateStandardExceptionAuthorizationExceptionNestedInHttpResponseException() throws Exception {
|
||||||
Exception e = new AuthorizationException();
|
Exception e = new AuthorizationException();
|
||||||
returnFirstExceptionIfInListOrThrowStandardExceptionOrCause(new Class[] {}, new HttpResponseException("goo",
|
returnFirstExceptionIfInListOrThrowStandardExceptionOrCause(ImmutableSet.<TypeToken<? extends Throwable>> of(),
|
||||||
createNiceMock(HttpCommand.class), null, e));
|
new HttpResponseException("goo", createNiceMock(HttpCommand.class), null, e));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(expectedExceptions = ResourceNotFoundException.class)
|
@Test(expectedExceptions = ResourceNotFoundException.class)
|
||||||
public void testPropagateStandardExceptionResourceNotFoundExceptionNestedInHttpResponseException() throws Exception {
|
public void testPropagateStandardExceptionResourceNotFoundExceptionNestedInHttpResponseException() throws Exception {
|
||||||
Exception e = new ResourceNotFoundException();
|
Exception e = new ResourceNotFoundException();
|
||||||
returnFirstExceptionIfInListOrThrowStandardExceptionOrCause(new Class[] {}, new HttpResponseException("goo",
|
returnFirstExceptionIfInListOrThrowStandardExceptionOrCause(ImmutableSet.<TypeToken<? extends Throwable>> of(),
|
||||||
createNiceMock(HttpCommand.class), null, e));
|
new HttpResponseException("goo", createNiceMock(HttpCommand.class), null, e));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(expectedExceptions = HttpResponseException.class)
|
@Test(expectedExceptions = HttpResponseException.class)
|
||||||
public void testPropagateStandardExceptionHttpResponseException() throws Exception {
|
public void testPropagateStandardExceptionHttpResponseException() throws Exception {
|
||||||
Exception e = new HttpResponseException("goo", createNiceMock(HttpCommand.class), null);
|
Exception e = new HttpResponseException("goo", createNiceMock(HttpCommand.class), null);
|
||||||
returnFirstExceptionIfInListOrThrowStandardExceptionOrCause(new Class[] {}, new RuntimeException(e));
|
returnFirstExceptionIfInListOrThrowStandardExceptionOrCause(ImmutableSet.<TypeToken<? extends Throwable>> of(),
|
||||||
|
new RuntimeException(e));
|
||||||
}
|
}
|
||||||
|
|
||||||
static class TestException extends Exception {
|
static class TestException extends Exception {
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue