Skip to content

Commit 58ca8d1

Browse files
committed
Resolve issue with enum values and environment annotation metadata
1 parent fc1c7b3 commit 58ca8d1

File tree

4 files changed

+55
-114
lines changed

4 files changed

+55
-114
lines changed

core/src/main/java/io/micronaut/core/annotation/AnnotationValue.java

+2
Original file line numberDiff line numberDiff line change
@@ -931,6 +931,8 @@ public static <T extends Annotation> AnnotationValueBuilder<T> builder(Class<T>
931931
}
932932
} else if (enumType.isAssignableFrom(rawValue.getClass())) {
933933
list.add((E) rawValue);
934+
} else {
935+
convertToEnum(enumType, rawValue).ifPresent(list::add);
934936
}
935937
return list.toArray((E[]) Array.newInstance(enumType, 0));
936938
}

http-client/src/main/java/io/micronaut/http/client/filter/HttpClientFilterResolver.java

+5-7
Original file line numberDiff line numberDiff line change
@@ -77,10 +77,10 @@ public HttpClientFilterResolver(
7777
AnnotationMetadata annotationMetadata;
7878
annotationMetadata = finalAnnotationMetadataResolver.resolveMetadata(httpClientFilter);
7979
HttpMethod[] methods = annotationMetadata.enumValues(Filter.class, "methods", HttpMethod.class);
80-
final List<HttpMethod> httpMethods = Arrays.asList(methods);
81-
if (annotationValue != null) {
80+
final List<HttpMethod> httpMethods = new ArrayList<>(Arrays.asList(methods));
81+
if (annotationMetadata.hasStereotype(FilterMatcher.class)) {
8282
httpMethods.addAll(
83-
Arrays.asList(annotationValue.enumValues("methods", HttpMethod.class))
83+
Arrays.asList(annotationMetadata.enumValues(FilterMatcher.class, "methods", HttpMethod.class))
8484
);
8585
}
8686

@@ -91,12 +91,10 @@ public HttpClientFilterResolver(
9191
annotationMetadata.stringValues(Filter.class)
9292
);
9393
}).filter(entry -> {
94-
boolean matches;
9594
AnnotationMetadata annotationMetadata = entry.annotationMetadata;
96-
if (annotationValue != null) {
95+
boolean matches = !annotationMetadata.hasStereotype(FilterMatcher.class);
96+
if (annotationValue != null && !matches) {
9797
matches = annotationMetadata.hasAnnotation(annotationValue.getAnnotationName());
98-
} else {
99-
matches = !annotationMetadata.hasStereotype(FilterMatcher.class);
10098
}
10199

102100
if (matches) {

http-client/src/test/groovy/io/micronaut/http/client/filter/ClientFilterStereotypeSpec.groovy

+46-16
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import io.micronaut.http.HttpRequest
2222
import io.micronaut.http.HttpResponse
2323
import io.micronaut.http.MutableHttpRequest
2424
import io.micronaut.http.annotation.Controller
25+
import io.micronaut.http.annotation.Filter
2526
import io.micronaut.http.annotation.Get
2627
import io.micronaut.http.annotation.Header
2728
import io.micronaut.http.annotation.Post
@@ -48,28 +49,26 @@ class ClientFilterStereotypeSpec extends Specification {
4849
void "test declarative client matching"() {
4950
when:
5051
MarkedClient markedClient = ctx.getBean(MarkedClient)
51-
HttpResponse<String> echo = markedClient.echo()
5252

5353
then:
54-
echo.body() == "Intercepted"
55-
!echo.getHeaders().contains("X-Intercepted")
56-
markedClient.echoPost().header("X-Intercepted") == "Post"
54+
markedClient.echo() == "echo Intercepted URL"
55+
markedClient.echoPost() == "echo Intercepted Post URL"
5756

5857
when:
5958
UnmarkedClient unmarkedClient = ctx.getBean(UnmarkedClient)
6059

6160
then:
62-
unmarkedClient.echo() == "echo"
61+
unmarkedClient.echo() == "echo URL" // not intercepted by
6362
}
6463

6564
void "low-level client filter matching"() {
6665
given:
6766
ClientBeans clientBeans = ctx.getBean(ClientBeans)
6867

6968
expect:
70-
clientBeans.annotatedClient.toBlocking().retrieve('/') == "Intercepted"
71-
clientBeans.client.toBlocking().retrieve('/') == "echo"
72-
clientBeans.annotatedClient.toBlocking().exchange(HttpRequest.POST('/', '')).header("X-Intercepted") == "Post"
69+
clientBeans.annotatedClient.toBlocking().retrieve('/') == "echo Intercepted URL"
70+
clientBeans.client.toBlocking().retrieve('/') == "echo URL"
71+
clientBeans.annotatedClient.toBlocking().retrieve(HttpRequest.POST('/', '')) == "echo Intercepted Post URL"
7372
}
7473

7574
@Singleton
@@ -90,10 +89,10 @@ class ClientFilterStereotypeSpec extends Specification {
9089
@MarkerStereotypeAnnotation
9190
static interface MarkedClient {
9291
@Get("/")
93-
HttpResponse<String> echo()
92+
String echo()
9493

9594
@Post("/")
96-
HttpResponse<String> echoPost()
95+
String echoPost()
9796
}
9897

9998
@Client("/filters/marked")
@@ -111,31 +110,62 @@ class ClientFilterStereotypeSpec extends Specification {
111110
}
112111

113112
@Post('/marked')
114-
HttpResponse<String> post(@Header("X-Intercepted") String header) {
115-
return HttpResponse.ok("echo").header("X-Intercepted", header)
113+
String post() {
114+
return "echo"
116115
}
117116
}
118117

119118
@MarkerStereotypeAnnotation
120119
@Singleton
121120
static class MarkerFilter implements HttpClientFilter {
122121

122+
@Override
123+
int getOrder() {
124+
0
125+
}
126+
123127
@Override
124128
Publisher<? extends HttpResponse<?>> doFilter(MutableHttpRequest<?> request, ClientFilterChain chain) {
125-
return Single.fromPublisher(chain.proceed(request))
129+
return Flowable.fromPublisher(chain.proceed(request))
126130
.map({ HttpResponse response ->
127-
HttpResponse.ok("Intercepted").headers(response.getHeaders().asMap(CharSequence, CharSequence))
128-
}).toFlowable()
131+
HttpResponse.ok(response.body().toString() + " Intercepted")
132+
})
129133
}
130134
}
131135

132136
@MarkerStereotypeAnnotation(methods = HttpMethod.POST)
133137
@Singleton
134138
static class MarkerPostFilter implements HttpClientFilter {
135139

140+
@Override
141+
int getOrder() {
142+
1
143+
}
144+
145+
@Override
146+
Publisher<? extends HttpResponse<?>> doFilter(MutableHttpRequest<?> request, ClientFilterChain chain) {
147+
return Flowable.fromPublisher(chain.proceed(request))
148+
.map({ HttpResponse response ->
149+
HttpResponse.ok(response.body().toString() + " Post")
150+
})
151+
}
152+
}
153+
154+
@Singleton
155+
@Filter("/filters/marked")
156+
static class UrlFilter implements HttpClientFilter {
157+
158+
@Override
159+
int getOrder() {
160+
2
161+
}
162+
136163
@Override
137164
Publisher<? extends HttpResponse<?>> doFilter(MutableHttpRequest<?> request, ClientFilterChain chain) {
138-
return chain.proceed(request.header("X-Intercepted", "Post"))
165+
return Flowable.fromPublisher(chain.proceed(request))
166+
.map({ HttpResponse response ->
167+
HttpResponse.ok(response.body().toString() + " URL")
168+
})
139169
}
140170
}
141171

inject/src/main/java/io/micronaut/inject/annotation/AbstractEnvironmentAnnotationMetadata.java

+2-91
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
* @since 1.0
4040
*/
4141
@Internal
42-
public abstract class AbstractEnvironmentAnnotationMetadata implements AnnotationMetadata {
42+
public abstract class AbstractEnvironmentAnnotationMetadata implements AnnotationMetadataDelegate {
4343

4444
private final EnvironmentAnnotationMetadata environmentAnnotationMetadata;
4545

@@ -59,22 +59,11 @@ protected AbstractEnvironmentAnnotationMetadata(AnnotationMetadata targetMetadat
5959
/**
6060
* @return The backing annotation metadata
6161
*/
62+
@Override
6263
public AnnotationMetadata getAnnotationMetadata() {
6364
return environmentAnnotationMetadata;
6465
}
6566

66-
@Nullable
67-
@Override
68-
public <T extends Annotation> T synthesize(@Nonnull Class<T> annotationClass) {
69-
return environmentAnnotationMetadata.synthesize(annotationClass);
70-
}
71-
72-
@Nullable
73-
@Override
74-
public <T extends Annotation> T synthesizeDeclared(@Nonnull Class<T> annotationClass) {
75-
return environmentAnnotationMetadata.synthesizeDeclared(annotationClass);
76-
}
77-
7867
@Override
7968
public <T> Optional<T> getValue(@Nonnull String annotation, @Nonnull String member, @Nonnull Argument<T> requiredType) {
8069
Environment environment = getEnvironment();
@@ -102,16 +91,6 @@ public <T> Optional<T> getValue(@Nonnull String annotation, @Nonnull String memb
10291
}
10392
}
10493

105-
@Override
106-
public <T> Class<T>[] classValues(@Nonnull String annotation, @Nonnull String member) {
107-
return environmentAnnotationMetadata.classValues(annotation, member);
108-
}
109-
110-
@Override
111-
public <T> Class<T>[] classValues(@Nonnull Class<? extends Annotation> annotation, @Nonnull String member) {
112-
return environmentAnnotationMetadata.classValues(annotation, member);
113-
}
114-
11594
@Override
11695
public boolean isTrue(@Nonnull String annotation, @Nonnull String member) {
11796
Environment environment = getEnvironment();
@@ -148,18 +127,6 @@ public boolean isFalse(@Nonnull String annotation, @Nonnull String member) {
148127
}
149128
}
150129

151-
@Nonnull
152-
@Override
153-
public Optional<Class<? extends Annotation>> getAnnotationTypeByStereotype(@Nonnull Class<? extends Annotation> stereotype) {
154-
return environmentAnnotationMetadata.getAnnotationTypeByStereotype(stereotype);
155-
}
156-
157-
@Nonnull
158-
@Override
159-
public Optional<Class<? extends Annotation>> getAnnotationTypeByStereotype(@Nullable String stereotype) {
160-
return environmentAnnotationMetadata.getAnnotationTypeByStereotype(stereotype);
161-
}
162-
163130
@Nonnull
164131
@Override
165132
public Optional<Class> classValue(@Nonnull String annotation, @Nonnull String member) {
@@ -300,12 +267,6 @@ public boolean isFalse(@Nonnull Class<? extends Annotation> annotation, @Nonnull
300267
return !environmentAnnotationMetadata.isTrue(annotation, member, valueMapper);
301268
}
302269

303-
@Override
304-
public @Nonnull Optional<Class<? extends Annotation>> getAnnotationType(@Nonnull String name) {
305-
ArgumentUtils.requireNonNull("name", name);
306-
return environmentAnnotationMetadata.getAnnotationType(name);
307-
}
308-
309270
@Override
310271
public @Nonnull <T extends Annotation> List<AnnotationValue<T>> getAnnotationValuesByType(@Nonnull Class<T> annotationType) {
311272
ArgumentUtils.requireNonNull("annotationType", annotationType);
@@ -365,46 +326,6 @@ public boolean isFalse(@Nonnull Class<? extends Annotation> annotation, @Nonnull
365326
}
366327
}
367328

368-
@Override
369-
public boolean hasDeclaredAnnotation(@Nullable String annotation) {
370-
return environmentAnnotationMetadata.hasDeclaredAnnotation(annotation);
371-
}
372-
373-
@Override
374-
public boolean hasAnnotation(@Nullable String annotation) {
375-
return environmentAnnotationMetadata.hasAnnotation(annotation);
376-
}
377-
378-
@Override
379-
public boolean hasStereotype(@Nullable String annotation) {
380-
return environmentAnnotationMetadata.hasStereotype(annotation);
381-
}
382-
383-
@Override
384-
public boolean hasDeclaredStereotype(@Nullable String annotation) {
385-
return environmentAnnotationMetadata.hasDeclaredStereotype(annotation);
386-
}
387-
388-
@Override
389-
public @Nonnull List<String> getAnnotationNamesByStereotype(String stereotype) {
390-
return environmentAnnotationMetadata.getAnnotationNamesByStereotype(stereotype);
391-
}
392-
393-
@Override
394-
public @Nonnull Set<String> getAnnotationNames() {
395-
return environmentAnnotationMetadata.getAnnotationNames();
396-
}
397-
398-
@Override
399-
public @Nonnull Set<String> getDeclaredAnnotationNames() {
400-
return environmentAnnotationMetadata.getDeclaredAnnotationNames();
401-
}
402-
403-
@Override
404-
public @Nonnull List<String> getDeclaredAnnotationNamesByStereotype(String stereotype) {
405-
return environmentAnnotationMetadata.getDeclaredAnnotationNamesByStereotype(stereotype);
406-
}
407-
408329
@Override
409330
public @Nonnull <T extends Annotation> Optional<AnnotationValue<T>> findAnnotation(@Nonnull String annotation) {
410331
ArgumentUtils.requireNonNull("annotation", annotation);
@@ -458,16 +379,6 @@ public boolean hasDeclaredStereotype(@Nullable String annotation) {
458379
return OptionalValues.empty();
459380
}
460381

461-
@Override
462-
public @Nonnull <T> Optional<T> getDefaultValue(@Nonnull String annotation, @Nonnull String member, @Nonnull Class<T> requiredType) {
463-
return environmentAnnotationMetadata.getDefaultValue(annotation, member, requiredType);
464-
}
465-
466-
@Override
467-
public @Nonnull <T> Optional<T> getDefaultValue(@Nonnull String annotation, @Nonnull String member, @Nonnull Argument<T> requiredType) {
468-
return environmentAnnotationMetadata.getDefaultValue(annotation, member, requiredType);
469-
}
470-
471382
/**
472383
* Resolves the {@link Environment} for this metadata.
473384
*

0 commit comments

Comments
 (0)