@@ -131,7 +131,7 @@ void writeHandler(boolean requestScoped) {
131
131
writer .append (" res.status(%s);" , lookupStatusCode (statusCode )).eol ();
132
132
}
133
133
}
134
-
134
+ boolean withFormParams = false ;
135
135
final var bodyType = method .bodyType ();
136
136
if (bodyType != null && !method .isErrorMethod () && !isFilter ) {
137
137
if ("InputStream" .equals (bodyType )) {
@@ -144,26 +144,41 @@ void writeHandler(boolean requestScoped) {
144
144
} else {
145
145
defaultHelidonBodyContent ();
146
146
}
147
- } else if (usesFormParams ()) {
148
- writer .append (" var formParams = req.content().as(Parameters.class);" ).eol ();
147
+ } else {
148
+ withFormParams = usesFormParams ();
149
+ if (withFormParams ) {
150
+ writer .append (" var formParams = req.content().as(Parameters.class);" ).eol ();
151
+ }
152
+ }
153
+ final ResponseMode responseMode = responseMode ();
154
+ final boolean withContentCache = responseMode == ResponseMode .Templating && useContentCache ();
155
+ if (withContentCache ) {
156
+ writer .append (" var key = contentCache.key(req" );
157
+ if (withFormParams ) {
158
+ writer .append (", formParams" );
159
+ }
160
+ writer .append (");" ).eol ();
161
+ writer .append (" var cacheContent = contentCache.content(key);" ).eol ();
162
+ writer .append (" if (cacheContent != null) {" ).eol ();
163
+ writeContextReturn (" " );
164
+ writer .append (" res.send(cacheContent);" ).eol ();
165
+ writer .append (" return;" ).eol ();
166
+ writer .append (" }" ).eol ();
149
167
}
150
168
151
169
final var segments = method .pathSegments ();
152
170
if (segments .fullPath ().contains ("{" )) {
153
171
writer .append (" var pathParams = req.path().pathParameters();" ).eol ();
154
172
}
155
-
156
173
for (final PathSegments .Segment matrixSegment : segments .matrixSegments ()) {
157
174
matrixSegment .writeCreateSegment (writer , platform ());
158
175
}
159
-
160
176
final var params = method .params ();
161
177
for (final MethodParam param : params ) {
162
178
if (!isExceptionOrFilterChain (param )) {
163
179
param .writeCtxGet (writer , segments );
164
180
}
165
181
}
166
-
167
182
if (method .includeValidate ()) {
168
183
for (final MethodParam param : params ) {
169
184
param .writeValidate (writer );
@@ -205,7 +220,7 @@ void writeHandler(boolean requestScoped) {
205
220
}
206
221
writer .append (");" ).eol ();
207
222
208
- if (! method . isVoid () && ! isFilter ) {
223
+ if (responseMode != ResponseMode . Void ) {
209
224
TypeMirror typeMirror = method .returnType ();
210
225
boolean includeNoContent = !typeMirror .getKind ().isPrimitive ();
211
226
if (includeNoContent ) {
@@ -214,21 +229,29 @@ void writeHandler(boolean requestScoped) {
214
229
writer .append (" } else {" ).eol ();
215
230
}
216
231
String indent = includeNoContent ? " " : " " ;
217
- writeContextReturn (indent );
218
- if (isInputStream (method .returnType ())) {
219
- final var uType = UType .parse (method .returnType ());
220
- writer .append (indent ).append ("result.transferTo(res.outputStream());" , uType .shortName ()).eol ();
221
- } else if (producesJson ()) {
222
- if (returnTypeString ()) {
223
- writer .append (indent ).append ("res.send(result); // send raw JSON" ).eol ();
224
- } else {
225
- final var uType = UType .parse (method .returnType ());
226
- writer .append (indent ).append ("%sJsonType.toJson(result, JsonOutput.of(res));" , uType .shortName ()).eol ();
232
+ if (responseMode == ResponseMode .Templating ) {
233
+ writer .append (indent ).append ("var content = renderer.render(result);" ).eol ();
234
+ if (withContentCache ) {
235
+ writer .append (indent ).append ("contentCache.contentPut(key, content);" ).eol ();
227
236
}
228
- } else if (useTemplating ()) {
229
- writer .append (indent ).append ("renderer.render(result, req, res);" ).eol ();
237
+ writeContextReturn (indent );
238
+ writer .append (indent ).append ("res.send(content);" ).eol ();
239
+
230
240
} else {
231
- writer .append (indent ).append ("res.send(result);" ).eol ();
241
+ writeContextReturn (indent );
242
+ if (responseMode == ResponseMode .InputStream ) {
243
+ final var uType = UType .parse (method .returnType ());
244
+ writer .append (indent ).append ("result.transferTo(res.outputStream());" , uType .shortName ()).eol ();
245
+ } else if (responseMode == ResponseMode .Json ) {
246
+ if (returnTypeString ()) {
247
+ writer .append (indent ).append ("res.send(result); // send raw JSON" ).eol ();
248
+ } else {
249
+ final var uType = UType .parse (method .returnType ());
250
+ writer .append (indent ).append ("%sJsonType.toJson(result, JsonOutput.of(res));" , uType .shortName ()).eol ();
251
+ }
252
+ } else {
253
+ writer .append (indent ).append ("res.send(result);" ).eol ();
254
+ }
232
255
}
233
256
if (includeNoContent ) {
234
257
writer .append (" }" ).eol ();
@@ -237,6 +260,34 @@ void writeHandler(boolean requestScoped) {
237
260
writer .append (" }" ).eol ().eol ();
238
261
}
239
262
263
+ enum ResponseMode {
264
+ Void ,
265
+ Json ,
266
+ Templating ,
267
+ InputStream ,
268
+ Other
269
+ }
270
+
271
+ ResponseMode responseMode () {
272
+ if (method .isVoid () || isFilter ) {
273
+ return ResponseMode .Void ;
274
+ }
275
+ if (isInputStream (method .returnType ())) {
276
+ return ResponseMode .InputStream ;
277
+ }
278
+ if (producesJson ()) {
279
+ return ResponseMode .Json ;
280
+ }
281
+ if (useTemplating ()) {
282
+ return ResponseMode .Templating ;
283
+ }
284
+ return ResponseMode .Other ;
285
+ }
286
+
287
+ private boolean useContentCache () {
288
+ return method .hasContentCache ();
289
+ }
290
+
240
291
private boolean useTemplating () {
241
292
return reader .html ()
242
293
&& !"byte[]" .equals (method .returnType ().toString ())
@@ -308,6 +359,7 @@ private void writeContextReturn(String indent) {
308
359
final var contentTypeString = "res.headers().contentType(MediaTypes." ;
309
360
writer .append (indent );
310
361
switch (produces ) {
362
+ case HTML_UTF8 -> writer .append ("res.headers().contentType(HTML_UTF8);" ).eol ();
311
363
case APPLICATION_JSON -> writer .append (contentTypeString ).append ("APPLICATION_JSON);" ).eol ();
312
364
case TEXT_HTML -> writer .append (contentTypeString ).append ("TEXT_HTML);" ).eol ();
313
365
case TEXT_PLAIN -> writer .append (contentTypeString ).append ("TEXT_PLAIN);" ).eol ();
0 commit comments