3
3
import java .util .List ;
4
4
5
5
import io .avaje .http .generator .core .*;
6
+ import io .avaje .http .generator .core .openapi .MediaType ;
6
7
7
8
import javax .lang .model .type .TypeMirror ;
8
9
@@ -17,22 +18,25 @@ class ControllerMethodWriter {
17
18
private final Append writer ;
18
19
private final ControllerReader reader ;
19
20
private final WebMethod webMethod ;
21
+ private final boolean useJsonB ;
20
22
private final boolean instrumentContext ;
21
23
private final boolean isFilter ;
22
24
23
- ControllerMethodWriter (MethodReader method , Append writer , ControllerReader reader ) {
25
+ ControllerMethodWriter (
26
+ MethodReader method , Append writer , ControllerReader reader , boolean useJsonB ) {
24
27
this .method = method ;
25
28
this .writer = writer ;
26
29
this .reader = reader ;
30
+ this .useJsonB = useJsonB ;
27
31
this .webMethod = method .webMethod ();
28
32
this .instrumentContext = method .instrumentContext ();
29
33
this .isFilter = webMethod == CoreWebMethod .FILTER ;
30
34
if (isFilter ) {
31
- validateMethod ();
35
+ validateFilter ();
32
36
}
33
37
}
34
38
35
- private void validateMethod () {
39
+ private void validateFilter () {
36
40
if (method .params ().stream ().map (MethodParam ::shortType ).noneMatch ("HttpFilter.FilterChain" ::equals )) {
37
41
logError (method .element (), "Filters must contain a FilterChain parameter" );
38
42
}
@@ -128,9 +132,7 @@ private boolean isInputStream(TypeMirror type) {
128
132
}
129
133
130
134
private boolean producesJson () {
131
- return // useJsonB
132
- !disabledDirectWrites ()
133
- && !"byte[]" .equals (method .returnType ().toString ())
135
+ return !"byte[]" .equals (method .returnType ().toString ())
134
136
&& (method .produces () == null || method .produces ().toLowerCase ().contains ("json" ));
135
137
}
136
138
@@ -200,8 +202,7 @@ private void write(boolean requestScoped) {
200
202
writer .append (");" ).eol ();
201
203
writer .append (" var cacheContent = contentCache.content(key);" ).eol ();
202
204
writer .append (" if (cacheContent != null) {" ).eol ();
203
- writeContextReturn (responseMode );
204
- writer .append (" res.send(cacheContent);" ).eol ();
205
+ writeContextReturn (responseMode , "cacheContent" );
205
206
writer .append (" return;" ).eol ();
206
207
writer .append (" }" ).eol ();
207
208
}
@@ -251,27 +252,47 @@ private void write(boolean requestScoped) {
251
252
writer .append (indent ).append ("contentCache.contentPut(key, content);" ).eol ();
252
253
}
253
254
writer .append (indent );
254
- writeContextReturn (responseMode );
255
- writer .append ("content);" ).eol ();
255
+ writeContextReturn (responseMode , "content" );
256
256
} else {
257
257
writer .append (indent );
258
- writeContextReturn (responseMode );
259
- writer .append ( "result);" ). eol ();
258
+ writeContextReturn (responseMode , "result" );
259
+ writer .eol ();
260
260
}
261
261
if (includeNoContent ) {
262
262
writer .append (" }" ).eol ();
263
263
}
264
264
}
265
265
}
266
266
267
- private void writeContextReturn (ResponseMode responseMode ) {
267
+ private void writeContextReturn (ResponseMode responseMode , String resultVariable ) {
268
+ final UType type = UType .parse (method .returnType ());
269
+ if ("java.util.concurrent.CompletableFuture" .equals (type .mainType ())) {
270
+ logError (method .element (), "CompletableFuture is not a supported return type." );
271
+ writer .append ("; //ERROR" );
272
+ return ;
273
+ }
274
+
268
275
final var produces = method .produces ();
269
276
switch (responseMode ) {
270
277
case Void -> {}
271
- case Json -> writer .append ("ctx.json(" );
272
- case Text -> writer .append ("ctx.text(" );
273
- case Templating -> writer .append ("ctx.html(" );
274
- default -> writer .append ("ctx.contentType(\" %s\" ).write(" , produces );
278
+ case Json -> writeJsonReturn (produces );
279
+ case Text -> writer .append ("ctx.text(%s);" , resultVariable );
280
+ case Templating -> writer .append ("ctx.html(%s);" , resultVariable );
281
+ default -> writer .append ("ctx.contentType(\" %s\" ).write(%s);" , produces , resultVariable );
282
+ }
283
+ }
284
+
285
+ private void writeJsonReturn (String produces ) {
286
+ if (useJsonB ) {
287
+ var uType = UType .parse (method .returnType ());
288
+ if (produces == null ) {
289
+ produces = MediaType .APPLICATION_JSON .getValue ();
290
+ }
291
+ writer .append (
292
+ "%sJsonType.toJson(result, ctx.contentType(\" %s\" ).outputStream());" ,
293
+ uType .shortName (), produces );
294
+ } else {
295
+ writer .append ("ctx.json(result);" );
275
296
}
276
297
}
277
298
0 commit comments