Skip to content

Commit 3db6ec2

Browse files
committed
jooby-apt: @param name attribute is being ignored by MVC APT code generator.
- fix #3466
1 parent 6a05201 commit 3db6ec2

File tree

7 files changed

+87
-20
lines changed

7 files changed

+87
-20
lines changed

modules/jooby-apt/src/main/java/io/jooby/internal/apt/AnnotationSupport.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
public interface AnnotationSupport {
2020
Predicate<String> VALUE = "value"::equals;
21+
Predicate<String> NAME = "name"::equals;
2122

2223
static List<String> findAnnotationValue(
2324
AnnotationMirror annotation, Predicate<String> predicate) {

modules/jooby-apt/src/main/java/io/jooby/internal/apt/MvcParameter.java

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@
55
*/
66
package io.jooby.internal.apt;
77

8-
import static io.jooby.internal.apt.AnnotationSupport.findAnnotationValue;
9-
108
import java.util.*;
119
import java.util.function.Function;
1210
import java.util.function.Predicate;
@@ -47,21 +45,11 @@ public String generateMapping(boolean kt) {
4745
: Stream.of(Map.entry(found, it.getValue()));
4846
})
4947
.findFirst();
50-
var nameProvider =
51-
strategy
52-
.filter(
53-
it ->
54-
!EnumSet.of(ParameterGenerator.BodyParam, ParameterGenerator.Lookup)
55-
.contains(it.getKey()))
56-
.map(Map.Entry::getValue)
57-
.orElse(null);
5848
var defaultParameterName = parameter.getSimpleName().toString();
5949
var parameterName =
60-
nameProvider == null
61-
? defaultParameterName
62-
: findAnnotationValue(nameProvider, AnnotationSupport.VALUE).stream()
63-
.findFirst()
64-
.orElse(defaultParameterName);
50+
strategy
51+
.map(it -> it.getKey().parameterName(it.getValue(), defaultParameterName))
52+
.orElse(defaultParameterName);
6553
var rawType = type.getRawType();
6654
var elementType =
6755
type.getArguments().isEmpty() ? rawType : type.getArguments().get(0).getRawType();

modules/jooby-apt/src/main/java/io/jooby/internal/apt/ParameterGenerator.java

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import java.time.Period;
1515
import java.time.ZoneId;
1616
import java.util.*;
17+
import java.util.function.Predicate;
1718
import java.util.stream.Stream;
1819

1920
import javax.lang.model.element.AnnotationMirror;
@@ -51,11 +52,22 @@ public String toSourceCode(
5152
FlashParam("flash", "io.jooby.annotation.FlashParam"),
5253
FormParam("form", "io.jooby.annotation.FormParam", "jakarta.ws.rs.FormParam"),
5354
HeaderParam("header", "io.jooby.annotation.HeaderParam", "jakarta.ws.rs.HeaderParam"),
54-
Lookup("lookup", "io.jooby.annotation.Param"),
55+
Lookup("lookup", "io.jooby.annotation.Param") {
56+
@Override
57+
protected Predicate<String> namePredicate() {
58+
return AnnotationSupport.NAME;
59+
}
60+
},
5561
PathParam("path", "io.jooby.annotation.PathParam", "jakarta.ws.rs.PathParam"),
5662
QueryParam("query", "io.jooby.annotation.QueryParam", "jakarta.ws.rs.QueryParam"),
5763
SessionParam("session", "io.jooby.annotation.SessionParam"),
5864
BodyParam("body") {
65+
@Override
66+
public String parameterName(AnnotationMirror annotation, String defaultParameterName) {
67+
// Body are unnamed
68+
return defaultParameterName;
69+
}
70+
5971
@Override
6072
public String toSourceCode(
6173
boolean kt,
@@ -87,6 +99,16 @@ public String toSourceCode(
8799
}
88100
};
89101

102+
public String parameterName(AnnotationMirror annotation, String defaultParameterName) {
103+
return findAnnotationValue(annotation, namePredicate()).stream()
104+
.findFirst()
105+
.orElse(defaultParameterName);
106+
}
107+
108+
protected Predicate<String> namePredicate() {
109+
return AnnotationSupport.VALUE;
110+
}
111+
90112
public String toSourceCode(
91113
boolean kt, AnnotationMirror annotation, TypeDefinition type, String name, boolean nullable) {
92114
var paramSource = source(annotation);
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/*
2+
* Jooby https://jooby.io
3+
* Apache License Version 2.0 https://jooby.io/LICENSE.txt
4+
* Copyright 2014 Edgar Espina
5+
*/
6+
package tests.i3466;
7+
8+
import java.util.Map;
9+
import java.util.UUID;
10+
11+
import io.jooby.ParamSource;
12+
import io.jooby.annotation.*;
13+
14+
@Path("/simple")
15+
public class C3466 {
16+
17+
@POST("/test")
18+
public String post(
19+
@Param(
20+
value = {ParamSource.QUERY, ParamSource.FORM},
21+
name = "client_id")
22+
UUID clientId,
23+
Map<String, Object> ignoredBodyName) {
24+
return "hello";
25+
}
26+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
/*
2+
* Jooby https://jooby.io
3+
* Apache License Version 2.0 https://jooby.io/LICENSE.txt
4+
* Copyright 2014 Edgar Espina
5+
*/
6+
package tests.i3466;
7+
8+
import static org.junit.jupiter.api.Assertions.assertFalse;
9+
import static org.junit.jupiter.api.Assertions.assertTrue;
10+
11+
import org.junit.jupiter.api.Test;
12+
13+
import io.jooby.apt.ProcessorRunner;
14+
15+
public class Issue3466 {
16+
17+
@Test
18+
public void shouldGetNameFromParamLookup() throws Exception {
19+
new ProcessorRunner(new C3466())
20+
.withRouter(
21+
(app, source) -> {
22+
assertTrue(
23+
source
24+
.toString()
25+
.contains(
26+
"ctx.lookup(\"client_id\", io.jooby.ParamSource.QUERY,"
27+
+ " io.jooby.ParamSource.FORM)"));
28+
assertFalse(source.toString().contains("ignoredBodyName"));
29+
});
30+
}
31+
}

tests/src/test/java/io/jooby/buffer/LeakAwareDataBufferFactory.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,6 @@ public void checkForLeaks(Duration timeout) {
101101
.map(LeakAwareDataBuffer::leakError)
102102
.toList();
103103

104-
errors.forEach(it -> logger.error("Leaked error: ", it));
105104
throw new AssertionError(errors.size() + " buffer leaks detected (see logs above)");
106105
}
107106
}

tests/src/test/java/io/jooby/buffer/LeakAwareDataBufferFactoryTests.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
package io.jooby.buffer;
77

88
import static io.jooby.buffer.DataBufferUtils.release;
9-
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
109

10+
import org.junit.jupiter.api.Assertions;
1111
import org.junit.jupiter.api.Test;
1212

1313
/**
@@ -17,12 +17,12 @@ class LeakAwareDataBufferFactoryTests {
1717

1818
private final LeakAwareDataBufferFactory bufferFactory = new LeakAwareDataBufferFactory();
1919

20-
@Test
20+
@Test()
2121
@SuppressWarnings("deprecation")
2222
void leak() {
2323
DataBuffer dataBuffer = this.bufferFactory.allocateBuffer();
2424
try {
25-
assertThatExceptionOfType(AssertionError.class).isThrownBy(this.bufferFactory::checkForLeaks);
25+
Assertions.assertThrows(AssertionError.class, this.bufferFactory::checkForLeaks);
2626
} finally {
2727
release(dataBuffer);
2828
}

0 commit comments

Comments
 (0)