mirror of https://github.com/apache/jclouds.git
Adding multiple varargs HttpRequestOptions support
This commit is contained in:
parent
96773b8a1b
commit
76531d62e0
|
@ -472,8 +472,7 @@ public class RestAnnotationProcessor<T> {
|
||||||
}
|
}
|
||||||
|
|
||||||
Payload payload = null;
|
Payload payload = null;
|
||||||
HttpRequestOptions options = findOptionsIn(method, args);
|
for(HttpRequestOptions options : findOptionsIn(method, args)) {
|
||||||
if (options != null) {
|
|
||||||
injector.injectMembers(options);// TODO test case
|
injector.injectMembers(options);// TODO test case
|
||||||
for (Entry<String, String> header : options.buildRequestHeaders().entries()) {
|
for (Entry<String, String> header : options.buildRequestHeaders().entries()) {
|
||||||
headers.put(header.getKey(), Strings2.replaceTokens(header.getValue(), tokenValues.entries()));
|
headers.put(header.getKey(), Strings2.replaceTokens(header.getValue(), tokenValues.entries()));
|
||||||
|
@ -1051,30 +1050,26 @@ public class RestAnnotationProcessor<T> {
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO: change to LoadingCache<ClassMethodArgs, HttpRequestOptions and move this logic to the CacheLoader.
|
//TODO: change to LoadingCache<ClassMethodArgs, HttpRequestOptions and move this logic to the CacheLoader.
|
||||||
private HttpRequestOptions findOptionsIn(Method method, Object... args) throws ExecutionException {
|
private Set<HttpRequestOptions> findOptionsIn(Method method, Object... args) throws ExecutionException {
|
||||||
for (int index : methodToIndexesOfOptions.get(method)) {
|
ImmutableSet.Builder<HttpRequestOptions> result = ImmutableSet.builder();
|
||||||
|
for (int index : methodToIndexesOfOptions.get(method)) {
|
||||||
if (args.length >= index + 1) {// accomodate varargs
|
if (args.length >= index + 1) {// accomodate varargs
|
||||||
if (args[index] instanceof Object[]) {
|
if (args[index] instanceof Object[]) {
|
||||||
Object[] options = (Object[]) args[index];
|
for (Object option : (Object[]) args[index]) {
|
||||||
if (options.length == 0) {
|
if (option instanceof HttpRequestOptions) {
|
||||||
} else if (options.length == 1) {
|
result.add((HttpRequestOptions) option);
|
||||||
if (options[0] instanceof HttpRequestOptions) {
|
|
||||||
HttpRequestOptions binder = (HttpRequestOptions) options[0];
|
|
||||||
injector.injectMembers(binder);
|
|
||||||
return binder;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (options[0] instanceof HttpRequestOptions) {
|
|
||||||
throw new IllegalArgumentException("we currently do not support multiple varargs options in: "
|
|
||||||
+ method.getName());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return (HttpRequestOptions) args[index];
|
for (; index < args.length; index++) {
|
||||||
|
if (args[index] instanceof HttpRequestOptions) {
|
||||||
|
result.add((HttpRequestOptions) args[index]);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return null;
|
return result.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
public Multimap<String, String> buildHeaders(Collection<Entry<String, String>> tokenValues, Method method,
|
public Multimap<String, String> buildHeaders(Collection<Entry<String, String>> tokenValues, Method method,
|
||||||
|
|
|
@ -511,6 +511,9 @@ public class RestAnnotationProcessorTest extends BaseRestClientTest {
|
||||||
@POST
|
@POST
|
||||||
public void varargs(HttpRequestOptions... options);
|
public void varargs(HttpRequestOptions... options);
|
||||||
|
|
||||||
|
@POST
|
||||||
|
public void varargsWithReq(String required, HttpRequestOptions... options);
|
||||||
|
|
||||||
@POST
|
@POST
|
||||||
public void post(HttpRequestOptions options);
|
public void post(HttpRequestOptions options);
|
||||||
|
|
||||||
|
@ -530,6 +533,12 @@ public class RestAnnotationProcessorTest extends BaseRestClientTest {
|
||||||
assertNonPayloadHeadersEqual(request, "");
|
assertNonPayloadHeadersEqual(request, "");
|
||||||
assertPayloadEquals(request, "", "application/octet-stream", false);
|
assertPayloadEquals(request, "", "application/octet-stream", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private class TestHttpRequestOptions extends BaseHttpRequestOptions {
|
||||||
|
TestHttpRequestOptions payload(String payload) { this.payload = payload; return this; }
|
||||||
|
TestHttpRequestOptions headerParams(Multimap<String, String> headers) { this.headers.putAll(headers); return this; }
|
||||||
|
TestHttpRequestOptions queryParams(Multimap<String, String> params) { this.queryParameters.putAll(params); return this; }
|
||||||
|
}
|
||||||
|
|
||||||
public void testHttpRequestOptionsPayloadParam() throws SecurityException, NoSuchMethodException, IOException {
|
public void testHttpRequestOptionsPayloadParam() throws SecurityException, NoSuchMethodException, IOException {
|
||||||
Method method = TestPayloadParamVarargs.class.getMethod("post", Payload.class);
|
Method method = TestPayloadParamVarargs.class.getMethod("post", Payload.class);
|
||||||
|
@ -541,48 +550,51 @@ public class RestAnnotationProcessorTest extends BaseRestClientTest {
|
||||||
|
|
||||||
public void testHttpRequestWithOnlyContentType() throws SecurityException, NoSuchMethodException, IOException {
|
public void testHttpRequestWithOnlyContentType() throws SecurityException, NoSuchMethodException, IOException {
|
||||||
Method method = TestPayloadParamVarargs.class.getMethod("post", HttpRequestOptions.class);
|
Method method = TestPayloadParamVarargs.class.getMethod("post", HttpRequestOptions.class);
|
||||||
verifyTestPostOptions(method);
|
HttpRequest request = factory(TestPayloadParamVarargs.class).createRequest(method, new TestHttpRequestOptions().payload("fooya"));
|
||||||
}
|
|
||||||
|
|
||||||
public void testPayloadParamVarargs() throws SecurityException, NoSuchMethodException, IOException {
|
|
||||||
Method method = TestPayloadParamVarargs.class.getMethod("varargs", Array.newInstance(HttpRequestOptions.class, 0)
|
|
||||||
.getClass());
|
|
||||||
verifyTestPostOptions(method);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void verifyTestPostOptions(Method method) throws IOException {
|
|
||||||
HttpRequest request = factory(TestPayloadParamVarargs.class).createRequest(method, new HttpRequestOptions() {
|
|
||||||
|
|
||||||
public Multimap<String, String> buildMatrixParameters() {
|
|
||||||
return LinkedHashMultimap.create();
|
|
||||||
}
|
|
||||||
|
|
||||||
public String buildPathSuffix() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Multimap<String, String> buildQueryParameters() {
|
|
||||||
return LinkedHashMultimap.create();
|
|
||||||
}
|
|
||||||
|
|
||||||
public Multimap<String, String> buildFormParameters() {
|
|
||||||
return LinkedHashMultimap.create();
|
|
||||||
}
|
|
||||||
|
|
||||||
public Multimap<String, String> buildRequestHeaders() {
|
|
||||||
return LinkedHashMultimap.create();
|
|
||||||
}
|
|
||||||
|
|
||||||
public String buildStringPayload() {
|
|
||||||
return "fooya";
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
|
||||||
assertRequestLineEquals(request, "POST http://localhost:9999 HTTP/1.1");
|
assertRequestLineEquals(request, "POST http://localhost:9999 HTTP/1.1");
|
||||||
assertNonPayloadHeadersEqual(request, "");
|
assertNonPayloadHeadersEqual(request, "");
|
||||||
assertPayloadEquals(request, "fooya", "application/unknown", false);
|
assertPayloadEquals(request, "fooya", "application/unknown", false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testHeaderAndQueryVarargs() throws SecurityException, NoSuchMethodException, IOException {
|
||||||
|
Method method = TestPayloadParamVarargs.class.getMethod("varargs", Array.newInstance(HttpRequestOptions.class, 0)
|
||||||
|
.getClass());
|
||||||
|
HttpRequest request = factory(TestPayloadParamVarargs.class).createRequest(method,
|
||||||
|
new TestHttpRequestOptions().payload("fooya"),
|
||||||
|
new TestHttpRequestOptions().headerParams(ImmutableMultimap.of("X-header-1", "fooya")),
|
||||||
|
new TestHttpRequestOptions().queryParams(ImmutableMultimap.of("key", "value")));
|
||||||
|
assertRequestLineEquals(request, "POST http://localhost:9999?key=value HTTP/1.1");
|
||||||
|
assertNonPayloadHeadersEqual(request, "X-header-1: fooya\n");
|
||||||
|
assertPayloadEquals(request, "fooya", "application/unknown", false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testHeaderAndQueryVarargsPlusReq() throws SecurityException, NoSuchMethodException, IOException {
|
||||||
|
Method method = TestPayloadParamVarargs.class.getMethod("varargsWithReq", String.class, Array.newInstance(HttpRequestOptions.class, 0)
|
||||||
|
.getClass());
|
||||||
|
HttpRequest request = factory(TestPayloadParamVarargs.class).createRequest(method, "required param",
|
||||||
|
new Object[]{ new TestHttpRequestOptions().payload("fooya"),
|
||||||
|
new TestHttpRequestOptions().headerParams(ImmutableMultimap.of("X-header-1", "fooya")),
|
||||||
|
new TestHttpRequestOptions().queryParams(ImmutableMultimap.of("key", "value"))});
|
||||||
|
assertRequestLineEquals(request, "POST http://localhost:9999?key=value HTTP/1.1");
|
||||||
|
assertNonPayloadHeadersEqual(request, "X-header-1: fooya\n");
|
||||||
|
assertPayloadEquals(request, "fooya", "application/unknown", false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testDuplicateHeaderAndQueryVarargs() throws SecurityException, NoSuchMethodException, IOException {
|
||||||
|
Method method = TestPayloadParamVarargs.class.getMethod("varargs", Array.newInstance(HttpRequestOptions.class, 0)
|
||||||
|
.getClass());
|
||||||
|
HttpRequest request = factory(TestPayloadParamVarargs.class).createRequest(method,
|
||||||
|
new TestHttpRequestOptions().queryParams(ImmutableMultimap.of("key", "value")),
|
||||||
|
new TestHttpRequestOptions().payload("fooya"),
|
||||||
|
new TestHttpRequestOptions().headerParams(ImmutableMultimap.of("X-header-1", "fooya")),
|
||||||
|
new TestHttpRequestOptions().queryParams(ImmutableMultimap.of("key", "anothervalue")),
|
||||||
|
new TestHttpRequestOptions().headerParams(ImmutableMultimap.of("X-header-1", "fooya again!")),
|
||||||
|
new TestHttpRequestOptions().payload("last_payload_wins!"));
|
||||||
|
assertRequestLineEquals(request, "POST http://localhost:9999?key=value&key=anothervalue HTTP/1.1");
|
||||||
|
assertNonPayloadHeadersEqual(request, "X-header-1: fooya\nX-header-1: fooya again!\n");
|
||||||
|
assertPayloadEquals(request, "last_payload_wins!", "application/unknown", false);
|
||||||
|
}
|
||||||
|
|
||||||
public class TestCustomMethod {
|
public class TestCustomMethod {
|
||||||
@FOO
|
@FOO
|
||||||
public void foo() {
|
public void foo() {
|
||||||
|
|
Loading…
Reference in New Issue