Skip to content

Commit 1ab215f

Browse files
committed
APT: Add JAXRS annotations
1 parent a2c8b66 commit 1ab215f

7 files changed

Lines changed: 126 additions & 34 deletions

File tree

examples/src/main/java/examples/HelloApp.java

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

88
import io.jooby.Jooby;
99
import io.jooby.RouterOptions;
10+
import io.jooby.annotations.QueryParam;
1011

1112
import java.util.stream.Stream;
1213

modules/jooby-apt/pom.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,12 @@
3232
<optional>true</optional>
3333
</dependency>
3434

35+
<!-- JAXRS -->
36+
<dependency>
37+
<groupId>jakarta.ws.rs</groupId>
38+
<artifactId>jakarta.ws.rs-api</artifactId>
39+
</dependency>
40+
3541
<dependency>
3642
<groupId>com.google.testing.compile</groupId>
3743
<artifactId>compile-testing</artifactId>

modules/jooby-apt/src/main/java/io/jooby/compiler/Annotations.java

Lines changed: 75 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,30 @@
55
*/
66
package io.jooby.compiler;
77

8+
import io.jooby.Router;
9+
import io.jooby.annotations.CONNECT;
10+
import io.jooby.annotations.Consumes;
11+
import io.jooby.annotations.CookieParam;
12+
import io.jooby.annotations.DELETE;
13+
import io.jooby.annotations.FlashParam;
14+
import io.jooby.annotations.FormParam;
15+
import io.jooby.annotations.GET;
16+
import io.jooby.annotations.HEAD;
17+
import io.jooby.annotations.HeaderParam;
18+
import io.jooby.annotations.OPTIONS;
19+
import io.jooby.annotations.PATCH;
20+
import io.jooby.annotations.POST;
21+
import io.jooby.annotations.PUT;
22+
import io.jooby.annotations.Path;
23+
import io.jooby.annotations.PathParam;
24+
import io.jooby.annotations.Produces;
25+
import io.jooby.annotations.QueryParam;
26+
import io.jooby.annotations.TRACE;
27+
828
import javax.lang.model.element.AnnotationMirror;
929
import javax.lang.model.element.AnnotationValue;
1030
import javax.lang.model.element.ExecutableElement;
31+
import java.util.Arrays;
1132
import java.util.Collections;
1233
import java.util.LinkedHashSet;
1334
import java.util.List;
@@ -21,48 +42,79 @@
2142
import static java.util.Collections.unmodifiableSet;
2243

2344
public interface Annotations {
24-
String PATH = "io.jooby.annotations.Path";
25-
26-
String GET = "io.jooby.annotations.GET";
45+
Set<String> HTTP_METHODS = unmodifiableSet(new LinkedHashSet<>(Arrays.asList(
46+
GET.class.getName(),
47+
javax.ws.rs.GET.class.getName(),
2748

28-
String POST = "io.jooby.annotations.POST";
49+
POST.class.getName(),
50+
javax.ws.rs.POST.class.getName(),
2951

30-
Set<String> HTTP_METHODS = unmodifiableSet(new LinkedHashSet<>(asList(GET, POST)));
52+
PUT.class.getName(),
53+
javax.ws.rs.PUT.class.getName(),
3154

32-
String PATH_PARAM = "io.jooby.annotations.PathParam";
55+
DELETE.class.getName(),
56+
javax.ws.rs.DELETE.class.getName(),
3357

34-
String QUERY_PARAM = "io.jooby.annotations.QueryParam";
58+
PATCH.class.getName(),
59+
javax.ws.rs.PATCH.class.getName(),
3560

36-
String COOKIE_PARAM = "io.jooby.annotations.CookieParam";
61+
HEAD.class.getName(),
62+
javax.ws.rs.HEAD.class.getName(),
3763

38-
String HEADER_PARAM = "io.jooby.annotations.HeaderParam";
64+
OPTIONS.class.getName(),
65+
javax.ws.rs.OPTIONS.class.getName(),
3966

40-
String FLASH_PARAM = "io.jooby.annotations.FlashParam";
67+
CONNECT.class.getName(),
4168

42-
String FORM_PARAM = "io.jooby.annotations.FormParam";
69+
TRACE.class.getName()
70+
)));
4371

44-
String PRODUCES_PARAM = "io.jooby.annotations.Produces";
72+
Set<String> PATH_PARAMS = unmodifiableSet(new LinkedHashSet<>(asList(PathParam.class.getName())));
4573

46-
String CONSUMES_PARAM = "io.jooby.annotations.Consumes";
74+
Set<String> QUERY_PARAMS = unmodifiableSet(new LinkedHashSet<>(asList(
75+
QueryParam.class.getName(),
76+
javax.ws.rs.QueryParam.class.getName()
77+
)));
4778

48-
Set<String> PATH_PARAMS = unmodifiableSet(new LinkedHashSet<>(asList(PATH_PARAM)));
79+
Set<String> COOKIE_PARAMS = unmodifiableSet(new LinkedHashSet<>(asList(
80+
CookieParam.class.getName(),
81+
javax.ws.rs.CookieParam.class.getName()
82+
)));
4983

50-
Set<String> QUERY_PARAMS = unmodifiableSet(new LinkedHashSet<>(asList(QUERY_PARAM)));
84+
Set<String> HEADER_PARAMS = unmodifiableSet(new LinkedHashSet<>(asList(
85+
HeaderParam.class.getName(),
86+
javax.ws.rs.HeaderParam.class.getName()
87+
)));
5188

52-
Set<String> COOKIE_PARAMS = unmodifiableSet(new LinkedHashSet<>(asList(COOKIE_PARAM)));
89+
Set<String> FLASH_PARAMS = unmodifiableSet(new LinkedHashSet<>(asList(FlashParam.class.getName())));
5390

54-
Set<String> HEADER_PARAMS = unmodifiableSet(new LinkedHashSet<>(asList(HEADER_PARAM)));
91+
Set<String> FORM_PARAMS = unmodifiableSet(new LinkedHashSet<>(asList(
92+
FormParam.class.getName(),
93+
javax.ws.rs.FormParam.class.getName()
94+
)));
5595

56-
Set<String> FLASH_PARAMS = unmodifiableSet(new LinkedHashSet<>(asList(FLASH_PARAM)));
96+
Set<String> PRODUCES_PARAMS = unmodifiableSet(new LinkedHashSet<>(asList(
97+
Produces.class.getName(),
98+
javax.ws.rs.Produces.class.getName()
99+
)));
57100

58-
Set<String> FORM_PARAMS = unmodifiableSet(new LinkedHashSet<>(asList(FORM_PARAM)));
101+
Set<String> CONSUMES_PARAMS = unmodifiableSet(new LinkedHashSet<>(asList(
102+
Consumes.class.getName(),
103+
javax.ws.rs.Consumes.class.getName()
104+
)));
59105

60-
Set<String> PRODUCES_PARAMS = unmodifiableSet(new LinkedHashSet<>(asList(PRODUCES_PARAM)));
61-
62-
Set<String> CONSUMES_PARAMS = unmodifiableSet(new LinkedHashSet<>(asList(CONSUMES_PARAM)));
106+
Set<String> PATH = unmodifiableSet(new LinkedHashSet<>(asList(
107+
Path.class.getName(),
108+
javax.ws.rs.Path.class.getName()
109+
)));
63110

64111
static List<String> attribute(AnnotationMirror mirror, String name) {
65-
Function<Object, String> cleanValue = arg -> ((AnnotationValue) arg).getValue().toString();
112+
Function<Object, String> cleanValue = arg -> {
113+
if (arg instanceof AnnotationValue) {
114+
return ((AnnotationValue) arg).getValue().toString();
115+
}
116+
return arg.toString();
117+
};
66118

67119
for (Map.Entry<? extends ExecutableElement, ? extends AnnotationValue> entry : mirror
68120
.getElementValues().entrySet()) {

modules/jooby-apt/src/main/java/io/jooby/compiler/MvcProcessor.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import javax.lang.model.element.Element;
2323
import javax.lang.model.element.ExecutableElement;
2424
import javax.lang.model.element.TypeElement;
25+
import javax.lang.model.type.TypeMirror;
2526
import java.io.ByteArrayOutputStream;
2627
import java.io.PrintWriter;
2728
import java.util.Collections;
@@ -158,7 +159,7 @@ private List<String> path(String method, List<? extends AnnotationMirror> annota
158159
.map(AnnotationMirror.class::cast)
159160
.flatMap(mirror -> {
160161
String type = mirror.getAnnotationType().toString();
161-
if (type.equals(Annotations.PATH) || type.equals(method)) {
162+
if (Annotations.PATH.contains(type) || type.equals(method)) {
162163
return Stream.concat(Annotations.attribute(mirror, "path").stream(),
163164
Annotations.attribute(mirror, "value").stream());
164165
}

modules/jooby-apt/src/test/java/io/jooby/compiler/MvcHandlerCompilerRunner.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,6 @@ public MvcHandlerCompilerRunner compile(String method, String path,
5353
public MvcHandlerCompilerRunner compile(String method, String path, boolean debug,
5454
SneakyThrows.Consumer<Route.Handler> consumer) throws Exception {
5555
String key = method.toUpperCase() + path;
56-
// key = key.replace("[B", "Lbyte[];");
5756
MvcHandlerCompiler compiler = processor.compilerFor(key);
5857
assertNotNull("Compiler not found for: " + key, compiler);
5958
if (debug) {
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package source;
2+
3+
import io.jooby.Context;
4+
5+
import javax.ws.rs.GET;
6+
import javax.ws.rs.POST;
7+
import javax.ws.rs.Path;
8+
import javax.ws.rs.QueryParam;
9+
10+
@Path("/jaxrs")
11+
public class JaxrsController {
12+
13+
@GET
14+
public String doGet(Context ctx) {
15+
return "doGet";
16+
}
17+
18+
@POST @Path("/post")
19+
public String doPost(Context ctx) {
20+
return "doPost";
21+
}
22+
23+
@GET @Path("/query")
24+
public String doGet(@QueryParam("q1") String queryParam) {
25+
return queryParam;
26+
}
27+
}

modules/jooby-apt/src/test/java/tests/HandlerCompilerTest.java

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,16 @@
11
package tests;
22

33
import io.jooby.Body;
4-
import io.jooby.Context;
54
import io.jooby.FileUpload;
6-
import io.jooby.FlashMap;
7-
import io.jooby.Formdata;
85
import io.jooby.MockContext;
96
import io.jooby.Multipart;
10-
import io.jooby.QueryString;
117
import io.jooby.Reified;
12-
import io.jooby.Session;
138
import io.jooby.StatusCode;
149
import io.jooby.compiler.MvcHandlerCompilerRunner;
1510
import org.junit.jupiter.api.Test;
1611
import source.CustomGenericType;
17-
import source.EnumParam;
1812
import source.JavaBeanParam;
13+
import source.JaxrsController;
1914
import source.Provisioning;
2015

2116
import java.io.InputStream;
@@ -25,13 +20,10 @@
2520
import java.nio.charset.Charset;
2621
import java.nio.charset.StandardCharsets;
2722
import java.nio.file.Path;
28-
import java.time.Instant;
2923
import java.util.Arrays;
3024
import java.util.HashMap;
31-
import java.util.List;
3225
import java.util.Map;
3326
import java.util.Optional;
34-
import java.util.Set;
3527
import java.util.UUID;
3628

3729
import static org.junit.Assert.assertEquals;
@@ -364,6 +356,20 @@ public void body() throws Exception {
364356
;
365357
}
366358

359+
@Test
360+
public void jarxs() throws Exception {
361+
new MvcHandlerCompilerRunner(new JaxrsController())
362+
.compile("/jaxrs/query", handler -> {
363+
assertEquals("v1", handler.apply(new MockContext().setPathString("/?q1=v1")));
364+
})
365+
.compile("/jaxrs", handler -> {
366+
assertEquals("doGet", handler.apply(new MockContext()));
367+
})
368+
.compile("POST", "/jaxrs/post", handler -> {
369+
assertEquals("doPost", handler.apply(new MockContext()));
370+
});
371+
}
372+
367373
private Map<String, String> mapOf(String... values) {
368374
Map<String, String> map = new HashMap<>();
369375
for (int i = 0; i < values.length; i += 2) {

0 commit comments

Comments
 (0)