Skip to content

Commit 8f84bb3

Browse files
committed
Merge branch '1036-call-encoding' into 3.x
2 parents 76bc57f + 1b71f75 commit 8f84bb3

File tree

39 files changed

+487
-252
lines changed

39 files changed

+487
-252
lines changed

cloudfoundry-client-reactor/src/main/java/org/cloudfoundry/reactor/client/QueryBuilder.java

Lines changed: 24 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -18,74 +18,45 @@
1818

1919
import org.cloudfoundry.QueryParameter;
2020
import org.cloudfoundry.reactor.util.AnnotationUtils;
21-
import org.springframework.web.util.UriComponentsBuilder;
22-
import reactor.core.Exceptions;
21+
import org.cloudfoundry.reactor.util.AnnotationUtils.AnnotatedValue;
22+
import org.cloudfoundry.reactor.util.UriQueryParameter;
23+
import org.cloudfoundry.reactor.util.UriQueryParameterBuilder;
2324

24-
import java.lang.reflect.InvocationTargetException;
25-
import java.lang.reflect.Method;
26-
import java.util.Arrays;
2725
import java.util.Collection;
28-
import java.util.Optional;
29-
import java.util.function.Consumer;
26+
import java.util.Objects;
3027
import java.util.stream.Collectors;
28+
import java.util.stream.Stream;
3129

3230
/**
3331
* A builder for Cloud Foundry queries
3432
*/
35-
public final class QueryBuilder {
33+
public final class QueryBuilder implements UriQueryParameterBuilder {
3634

37-
private QueryBuilder() {
35+
public Stream<UriQueryParameter> build(Object instance) {
36+
return AnnotationUtils.streamAnnotatedValues(instance, QueryParameter.class)
37+
.map(QueryBuilder::processValue)
38+
.filter(Objects::nonNull);
3839
}
3940

40-
/**
41-
* Augments a {@link UriComponentsBuilder} with queries based on the methods annotated with {@link QueryParameter}
42-
*
43-
* @param builder the builder to augment
44-
* @param instance the instance to inspect and invoke
45-
*/
46-
public static void augment(UriComponentsBuilder builder, Object instance) {
47-
Arrays.stream(instance.getClass().getMethods())
48-
.sorted(MethodNameComparator.INSTANCE)
49-
.forEach(processMethod(builder, instance));
41+
private static UriQueryParameter processCollection(QueryParameter queryParameter, Object value) {
42+
return processValue(queryParameter.value(), ((Collection<?>) value).stream()
43+
.map(Object::toString)
44+
.map(String::trim)
45+
.collect(Collectors.joining(queryParameter.delimiter())));
5046
}
5147

52-
private static Optional<Object> getValue(Method method, Object instance) {
53-
try {
54-
return Optional.ofNullable(method.invoke(instance));
55-
} catch (IllegalAccessException | InvocationTargetException e) {
56-
throw Exceptions.propagate(e);
48+
private static UriQueryParameter processValue(AnnotatedValue<QueryParameter> annotatedValue) {
49+
QueryParameter queryParameter = annotatedValue.getAnnotation();
50+
Object value = annotatedValue.getValue();
51+
if (value instanceof Collection) {
52+
return processCollection(queryParameter, value);
53+
} else {
54+
return processValue(queryParameter.value(), value.toString());
5755
}
5856
}
5957

60-
private static Consumer<QueryParameter> processAnnotation(UriComponentsBuilder builder, Method method, Object instance) {
61-
return queryParameter -> getValue(method, instance)
62-
.ifPresent(processValue(builder, queryParameter));
63-
}
64-
65-
private static void processCollection(UriComponentsBuilder builder, QueryParameter queryParameter, Object value) {
66-
processValue(builder, queryParameter.value(),
67-
((Collection<?>) value).stream()
68-
.map(o -> o.toString().trim())
69-
.collect(Collectors.joining(queryParameter.delimiter())));
70-
}
71-
72-
private static Consumer<Method> processMethod(UriComponentsBuilder builder, Object instance) {
73-
return method -> AnnotationUtils.findAnnotation(method, QueryParameter.class)
74-
.ifPresent(processAnnotation(builder, method, instance));
75-
}
76-
77-
private static void processValue(UriComponentsBuilder builder, String name, String value) {
78-
builder.queryParam(name, value);
79-
}
80-
81-
private static Consumer<Object> processValue(UriComponentsBuilder builder, QueryParameter queryParameter) {
82-
return value -> {
83-
if (value instanceof Collection) {
84-
processCollection(builder, queryParameter, value);
85-
} else {
86-
processValue(builder, queryParameter.value(), value.toString());
87-
}
88-
};
58+
private static UriQueryParameter processValue(String name, String value) {
59+
return UriQueryParameter.of(name, value);
8960
}
9061

9162
}

cloudfoundry-client-reactor/src/main/java/org/cloudfoundry/reactor/client/v2/AbstractClientV2Operations.java

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,13 @@
2020
import org.cloudfoundry.reactor.TokenProvider;
2121
import org.cloudfoundry.reactor.client.QueryBuilder;
2222
import org.cloudfoundry.reactor.util.AbstractReactorOperations;
23+
import org.cloudfoundry.reactor.util.DelegatingUriQueryParameterBuilder;
2324
import org.cloudfoundry.reactor.util.ErrorPayloadMappers;
2425
import org.cloudfoundry.reactor.util.MultipartHttpClientRequest;
2526
import org.cloudfoundry.reactor.util.Operator;
27+
import org.cloudfoundry.reactor.util.UriQueryParameter;
28+
import org.cloudfoundry.reactor.util.UriQueryParameterBuilder;
29+
import org.cloudfoundry.reactor.util.UriQueryParameters;
2630
import org.springframework.web.util.UriComponentsBuilder;
2731
import reactor.core.publisher.Flux;
2832
import reactor.core.publisher.Mono;
@@ -34,6 +38,7 @@
3438
import java.util.function.BiConsumer;
3539
import java.util.function.Consumer;
3640
import java.util.function.Function;
41+
import java.util.stream.Stream;
3742

3843
public abstract class AbstractClientV2Operations extends AbstractReactorOperations {
3944

@@ -101,14 +106,6 @@ protected final <T> Mono<T> put(Object requestPayload, Class<T> responseType, Fu
101106
.parseBody(responseType));
102107
}
103108

104-
private static Function<UriComponentsBuilder, UriComponentsBuilder> queryTransformer(Object requestPayload) {
105-
return builder -> {
106-
FilterBuilder.augment(builder, requestPayload);
107-
QueryBuilder.augment(builder, requestPayload);
108-
return builder;
109-
};
110-
}
111-
112109
private Operator attachErrorPayloadMapper(Operator operator) {
113110
return operator.withErrorPayloadMapper(ErrorPayloadMappers.clientV2(this.connectionContext.getObjectMapper()));
114111
}
@@ -117,11 +114,23 @@ private MultipartHttpClientRequest createMultipartRequest(HttpClientRequest requ
117114
return new MultipartHttpClientRequest(this.connectionContext.getObjectMapper(), request, form);
118115
}
119116

117+
private UriQueryParameterBuilder getUriQueryParameterBuilder() {
118+
return DelegatingUriQueryParameterBuilder.builder().builders(new FilterBuilder(), new QueryBuilder()).build();
119+
}
120+
120121
private BiConsumer<HttpClientRequest, HttpClientForm> multipartRequest(Consumer<MultipartHttpClientRequest> requestTransformer) {
121122
return (request, form) -> {
122123
MultipartHttpClientRequest multipartRequest = createMultipartRequest(request, form);
123124
requestTransformer.accept(multipartRequest);
124125
};
125126
}
126127

128+
private Function<UriComponentsBuilder, UriComponentsBuilder> queryTransformer(Object requestPayload) {
129+
return builder -> {
130+
Stream<UriQueryParameter> parameters = getUriQueryParameterBuilder().build(requestPayload);
131+
UriQueryParameters.set(builder, parameters);
132+
return builder;
133+
};
134+
}
135+
127136
}

cloudfoundry-client-reactor/src/main/java/org/cloudfoundry/reactor/client/v2/FilterBuilder.java

Lines changed: 31 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -17,89 +17,64 @@
1717
package org.cloudfoundry.reactor.client.v2;
1818

1919
import org.cloudfoundry.client.v2.FilterParameter;
20-
import org.cloudfoundry.reactor.client.MethodNameComparator;
2120
import org.cloudfoundry.reactor.util.AnnotationUtils;
22-
import org.springframework.web.util.UriComponentsBuilder;
23-
import reactor.core.Exceptions;
21+
import org.cloudfoundry.reactor.util.AnnotationUtils.AnnotatedValue;
22+
import org.cloudfoundry.reactor.util.UriQueryParameter;
23+
import org.cloudfoundry.reactor.util.UriQueryParameterBuilder;
2424

25-
import java.lang.reflect.InvocationTargetException;
26-
import java.lang.reflect.Method;
27-
import java.util.Arrays;
2825
import java.util.Collection;
2926
import java.util.List;
30-
import java.util.Optional;
31-
import java.util.function.Consumer;
27+
import java.util.Objects;
3228
import java.util.stream.Collectors;
29+
import java.util.stream.Stream;
3330

3431
/**
3532
* A builder for Cloud Foundry V2 filters
3633
*/
37-
final class FilterBuilder {
34+
final class FilterBuilder implements UriQueryParameterBuilder {
3835

39-
private FilterBuilder() {
36+
public Stream<UriQueryParameter> build(Object instance) {
37+
return AnnotationUtils.streamAnnotatedValues(instance, FilterParameter.class)
38+
.map(FilterBuilder::processValue)
39+
.filter(Objects::nonNull);
4040
}
4141

42-
/**
43-
* Augments a {@link UriComponentsBuilder} with queries based on the methods annotated with {@link FilterParameter}
44-
*
45-
* @param builder the builder to augment
46-
* @param instance the instance to inspect and invoke
47-
*/
48-
public static void augment(UriComponentsBuilder builder, Object instance) {
49-
Arrays.stream(instance.getClass().getMethods())
50-
.sorted(MethodNameComparator.INSTANCE)
51-
.forEach(processMethod(builder, instance));
52-
}
53-
54-
private static Optional<Object> getValue(Method method, Object instance) {
55-
try {
56-
return Optional.ofNullable(method.invoke(instance));
57-
} catch (IllegalAccessException | InvocationTargetException e) {
58-
throw Exceptions.propagate(e);
59-
}
60-
}
61-
62-
private static Consumer<FilterParameter> processAnnotation(UriComponentsBuilder builder, Method method, Object instance) {
63-
return filterParameter -> getValue(method, instance)
64-
.ifPresent(processValue(builder, filterParameter));
65-
}
66-
67-
private static void processCollection(UriComponentsBuilder builder, FilterParameter filterParameter, Object value) {
42+
private static UriQueryParameter processCollection(FilterParameter filterParameter, Object value) {
6843
List<String> collection = ((Collection<?>) value).stream()
69-
.map(o -> o.toString().trim())
44+
.map(Object::toString)
45+
.map(String::trim)
7046
.collect(Collectors.toList());
7147

7248
if (collection.size() == 1) {
73-
processValue(builder, filterParameter.value(), filterParameter.operation(), collection.get(0));
49+
return processValue(filterParameter.value(), filterParameter.operation(), collection.get(0));
7450
} else if (collection.size() > 1) {
75-
processValue(builder, filterParameter.value(), filterParameter.collectionOperation(), collection);
51+
return processValue(filterParameter.value(), filterParameter.collectionOperation(), collection);
52+
} else {
53+
return null;
7654
}
7755
}
7856

79-
private static Consumer<Method> processMethod(UriComponentsBuilder builder, Object instance) {
80-
return method -> AnnotationUtils.findAnnotation(method, FilterParameter.class)
81-
.ifPresent(processAnnotation(builder, method, instance));
82-
}
83-
84-
private static Consumer<Object> processValue(UriComponentsBuilder builder, FilterParameter filterParameter) {
85-
return value -> {
86-
if (value instanceof Collection) {
87-
processCollection(builder, filterParameter, value);
88-
} else {
89-
processValue(builder, filterParameter.value(), filterParameter.operation(), value.toString().trim());
90-
}
91-
};
57+
private static UriQueryParameter processValue(AnnotatedValue<FilterParameter> annotatedValue) {
58+
FilterParameter filterParameter = annotatedValue.getAnnotation();
59+
Object value = annotatedValue.getValue();
60+
if (value instanceof Collection) {
61+
return processCollection(filterParameter, value);
62+
} else {
63+
return processValue(filterParameter.value(), filterParameter.operation(), value.toString()
64+
.trim());
65+
}
9266
}
9367

94-
private static void processValue(UriComponentsBuilder builder, String name, FilterParameter.Operation operation, Collection<String> collection) {
68+
private static UriQueryParameter processValue(String name, FilterParameter.Operation operation, Collection<String> collection) {
9569
String value = String.join(",", collection);
9670
if (!value.isEmpty()) {
97-
processValue(builder, name, operation, value);
71+
return processValue(name, operation, value);
9872
}
73+
return null;
9974
}
10075

101-
private static void processValue(UriComponentsBuilder builder, String name, FilterParameter.Operation operation, String value) {
102-
builder.queryParam("q", String.format("%s%s%s", name, operation, value));
76+
private static UriQueryParameter processValue(String name, FilterParameter.Operation operation, String value) {
77+
return UriQueryParameter.of("q", String.format("%s%s%s", name, operation, value));
10378
}
10479

10580
}

cloudfoundry-client-reactor/src/main/java/org/cloudfoundry/reactor/client/v3/AbstractClientV3Operations.java

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,13 @@
2121
import org.cloudfoundry.reactor.TokenProvider;
2222
import org.cloudfoundry.reactor.client.QueryBuilder;
2323
import org.cloudfoundry.reactor.util.AbstractReactorOperations;
24+
import org.cloudfoundry.reactor.util.DelegatingUriQueryParameterBuilder;
2425
import org.cloudfoundry.reactor.util.ErrorPayloadMappers;
2526
import org.cloudfoundry.reactor.util.MultipartHttpClientRequest;
2627
import org.cloudfoundry.reactor.util.Operator;
28+
import org.cloudfoundry.reactor.util.UriQueryParameter;
29+
import org.cloudfoundry.reactor.util.UriQueryParameterBuilder;
30+
import org.cloudfoundry.reactor.util.UriQueryParameters;
2731
import org.springframework.web.util.UriComponentsBuilder;
2832
import reactor.core.publisher.Flux;
2933
import reactor.core.publisher.Mono;
@@ -37,6 +41,7 @@
3741
import java.util.function.BiConsumer;
3842
import java.util.function.Consumer;
3943
import java.util.function.Function;
44+
import java.util.stream.Stream;
4045

4146
public abstract class AbstractClientV3Operations extends AbstractReactorOperations {
4247

@@ -129,15 +134,18 @@ private static String extractJobId(HttpClientResponse response) {
129134
return pathSegments.get(pathSegments.size() - 1);
130135
}
131136

132-
private static Function<UriComponentsBuilder, UriComponentsBuilder> queryTransformer(Object requestPayload) {
137+
private Function<UriComponentsBuilder, UriComponentsBuilder> queryTransformer(Object requestPayload) {
133138
return builder -> {
134-
FilterBuilder.augment(builder, requestPayload);
135-
QueryBuilder.augment(builder, requestPayload);
136-
139+
Stream<UriQueryParameter> parameters = getUriQueryParameterBuilder().build(requestPayload);
140+
UriQueryParameters.set(builder, parameters);
137141
return builder;
138142
};
139143
}
140144

145+
private UriQueryParameterBuilder getUriQueryParameterBuilder() {
146+
return DelegatingUriQueryParameterBuilder.builder().builders(new FilterBuilder(), new QueryBuilder()).build();
147+
}
148+
141149
private Operator attachErrorPayloadMapper(Operator operator) {
142150
return operator.withErrorPayloadMapper(ErrorPayloadMappers.clientV3(this.connectionContext.getObjectMapper()));
143151
}

0 commit comments

Comments
 (0)