Skip to content

Commit eff54cb

Browse files
authored
Merge pull request #230 from SentryMan/patch-1
(Javalin Jsonb) Add support for disableDirectWrites to NOT write directly to Jetty HttpOutput Stream
2 parents 6916939 + 46ae11e commit eff54cb

File tree

4 files changed

+21
-7
lines changed

4 files changed

+21
-7
lines changed

http-generator-core/src/main/java/io/avaje/http/generator/core/BaseProcessor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
import javax.lang.model.element.Element;
1212
import javax.lang.model.element.TypeElement;
1313

14-
@SupportedOptions({"useJavax", "useSingleton", "instrumentRequests"})
14+
@SupportedOptions({"useJavax", "useSingleton", "instrumentRequests","disableDirectWrites"})
1515
public abstract class BaseProcessor extends AbstractProcessor {
1616

1717
@Override

http-generator-core/src/main/java/io/avaje/http/generator/core/ProcessingContext.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ private static final class Ctx {
4141
private final boolean useJavax;
4242
private final String diAnnotation;
4343
private final boolean instrumentAllMethods;
44+
private final boolean disableDirectWrites;
4445

4546
Ctx(ProcessingEnvironment env, PlatformAdapter adapter, boolean generateOpenAPI) {
4647
readAdapter = adapter;
@@ -57,6 +58,7 @@ private static final class Ctx {
5758
final var options = env.getOptions();
5859
final var singletonOverride = options.get("useSingleton");
5960
this.instrumentAllMethods = Boolean.parseBoolean(options.get("instrumentRequests"));
61+
this.disableDirectWrites = Boolean.parseBoolean(options.get("disableDirectWrites"));
6062
if (singletonOverride != null) {
6163
useComponent = !Boolean.parseBoolean(singletonOverride);
6264
} else {
@@ -184,6 +186,10 @@ public static boolean instrumentAllWebMethods() {
184186
return CTX.get().instrumentAllMethods;
185187
}
186188

189+
public static boolean disabledDirectWrites() {
190+
return CTX.get().disableDirectWrites;
191+
}
192+
187193
public static Filer filer() {
188194
return CTX.get().filer;
189195
}

http-generator-javalin/src/main/java/io/avaje/http/generator/javalin/ControllerMethodWriter.java

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package io.avaje.http.generator.javalin;
22

3-
import static io.avaje.http.generator.core.ProcessingContext.platform;
3+
import static io.avaje.http.generator.core.ProcessingContext.*;
44

55
import io.avaje.http.generator.core.Append;
66
import io.avaje.http.generator.core.MethodParam;
@@ -26,7 +26,7 @@ class ControllerMethodWriter {
2626
this.method = method;
2727
this.writer = writer;
2828
this.webMethod = method.webMethod();
29-
this.useJsonB = useJsonB;
29+
this.useJsonB = useJsonB && !disabledDirectWrites();
3030
this.instrumentContext = method.instrumentContext();
3131
}
3232

@@ -134,10 +134,16 @@ private void writeContextReturn(final String resultVariableName) {
134134
if (produces == null || MediaType.APPLICATION_JSON.getValue().equalsIgnoreCase(produces)) {
135135
if (useJsonB) {
136136
var uType = UType.parse(method.returnType());
137-
if ("java.util.concurrent.CompletableFuture".equals(uType.mainType())) {
137+
final boolean isfuture = "java.util.concurrent.CompletableFuture".equals(uType.mainType());
138+
if (isfuture) {
138139
uType = uType.paramRaw();
140+
writer.append(" try {");
141+
}
142+
writer.append(" %sJsonType.toJson(%s, ctx.contentType(\"application/json\").res().getOutputStream());",
143+
uType.shortName(), resultVariableName);
144+
if (isfuture) {
145+
writer.append(" } catch (java.io.IOException e) { throw new java.io.UncheckedIOException(e); }");
139146
}
140-
writer.append(" %sJsonType.toJson(%s, ctx.contentType(\"application/json\").outputStream());", uType.shortName(), resultVariableName);
141147
} else {
142148
writer.append(" ctx.json(%s);", resultVariableName);
143149
}

http-generator-nima/src/main/java/io/avaje/http/generator/helidon/nima/ControllerMethodWriter.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package io.avaje.http.generator.helidon.nima;
22

3+
import static io.avaje.http.generator.core.ProcessingContext.disabledDirectWrites;
34
import static io.avaje.http.generator.core.ProcessingContext.platform;
45

56
import java.util.List;
@@ -140,8 +141,9 @@ void writeHandler(boolean requestScoped) {
140141

141142
private boolean producesJson() {
142143
return useJsonB
143-
&& !"byte[]".equals(method.returnType().toString())
144-
&& (method.produces() == null || method.produces().toLowerCase().contains("json"));
144+
&& !disabledDirectWrites()
145+
&& !"byte[]".equals(method.returnType().toString())
146+
&& (method.produces() == null || method.produces().toLowerCase().contains("json"));
145147
}
146148

147149
private boolean missingServerResponse(List<MethodParam> params) {

0 commit comments

Comments
 (0)