From 28a64012be4f7aac4dcdcad85f51123ee17a57d8 Mon Sep 17 00:00:00 2001 From: Josiah Noel <32279667+SentryMan@users.noreply.github.com> Date: Sun, 23 Feb 2025 23:34:04 -0500 Subject: [PATCH 1/4] remove jsonb generation if no jsontypes available --- .../helidon/nima/ControllerWriter.java | 28 ++++++++++--------- .../generator/javalin/ControllerWriter.java | 25 ++++++++++------- .../http/generator/jex/ControllerWriter.java | 8 ++++-- 3 files changed, 36 insertions(+), 25 deletions(-) diff --git a/http-generator-helidon/src/main/java/io/avaje/http/generator/helidon/nima/ControllerWriter.java b/http-generator-helidon/src/main/java/io/avaje/http/generator/helidon/nima/ControllerWriter.java index 3c8d2c726..cb99dbc22 100644 --- a/http-generator-helidon/src/main/java/io/avaje/http/generator/helidon/nima/ControllerWriter.java +++ b/http-generator-helidon/src/main/java/io/avaje/http/generator/helidon/nima/ControllerWriter.java @@ -21,24 +21,12 @@ class ControllerWriter extends BaseControllerWriter { private static final String JSON_JsonOutput = "io.avaje.json.stream.JsonOutput"; private static final String JSONB_JsonOutput = "io.avaje.jsonb.stream.JsonOutput"; - private final boolean useJsonB; + private boolean useJsonB; private final Map jsonTypes; ControllerWriter(ControllerReader reader, boolean jsonb) throws IOException { super(reader); this.useJsonB = jsonb; - if (useJsonB) { - reader.addImportType("io.avaje.jsonb.Jsonb"); - reader.addImportType("io.avaje.jsonb.JsonType"); - reader.addImportType("io.avaje.jsonb.Types"); - reader.addImportType(jsonOutputType()); - this.jsonTypes = JsonBUtil.jsonTypes(reader); - jsonTypes.values().stream() - .map(UType::importTypes) - .forEach(reader::addImportTypes); - } else { - this.jsonTypes = Map.of(); - } reader.addImportType("io.helidon.common.media.type.MediaTypes"); reader.addImportType("io.helidon.common.parameters.Parameters"); reader.addImportType("io.helidon.webserver.http.HttpRouting"); @@ -70,6 +58,20 @@ class ControllerWriter extends BaseControllerWriter { reader.addImportType("io.avaje.htmx.nima.TemplateContentCache"); } } + if (useJsonB) { + this.jsonTypes = JsonBUtil.jsonTypes(reader); + if (this.jsonTypes.isEmpty()) { + useJsonB = false; + return; + } + reader.addImportType("io.avaje.jsonb.Jsonb"); + reader.addImportType("io.avaje.jsonb.JsonType"); + reader.addImportType("io.avaje.jsonb.Types"); + reader.addImportType(jsonOutputType()); + jsonTypes.values().stream().map(UType::importTypes).forEach(reader::addImportTypes); + } else { + this.jsonTypes = Map.of(); + } } private static String jsonOutputType() { diff --git a/http-generator-javalin/src/main/java/io/avaje/http/generator/javalin/ControllerWriter.java b/http-generator-javalin/src/main/java/io/avaje/http/generator/javalin/ControllerWriter.java index 340b702e0..1fbfbbce6 100644 --- a/http-generator-javalin/src/main/java/io/avaje/http/generator/javalin/ControllerWriter.java +++ b/http-generator-javalin/src/main/java/io/avaje/http/generator/javalin/ControllerWriter.java @@ -20,22 +20,14 @@ class ControllerWriter extends BaseControllerWriter { private static final String AT_GENERATED = "@Generated(\"avaje-javalin-generator\")"; - private final boolean useJsonB; + private boolean useJsonB; private final Map jsonTypes; private final boolean javalin6 = ProcessingContext.javalin6(); ControllerWriter(ControllerReader reader, boolean jsonb) throws IOException { super(reader); this.useJsonB = jsonb; - if (useJsonB) { - reader.addImportType("io.avaje.jsonb.Jsonb"); - reader.addImportType("io.avaje.jsonb.JsonType"); - reader.addImportType("io.avaje.jsonb.Types"); - this.jsonTypes = JsonBUtil.jsonTypes(reader); - jsonTypes.values().stream().map(UType::importTypes).forEach(reader::addImportTypes); - } else { - this.jsonTypes = Map.of(); - } + reader.addImportType("io.javalin.plugin.Plugin"); if (javalin6) { reader.addImportType("io.javalin.config.JavalinConfig"); @@ -44,6 +36,19 @@ class ControllerWriter extends BaseControllerWriter { } else { reader.addImportType("io.javalin.Javalin"); } + if (useJsonB) { + this.jsonTypes = JsonBUtil.jsonTypes(reader); + if (this.jsonTypes.isEmpty()) { + useJsonB = false; + return; + } + reader.addImportType("io.avaje.jsonb.Jsonb"); + reader.addImportType("io.avaje.jsonb.JsonType"); + reader.addImportType("io.avaje.jsonb.Types"); + jsonTypes.values().stream().map(UType::importTypes).forEach(reader::addImportTypes); + } else { + this.jsonTypes = Map.of(); + } } void write() { diff --git a/http-generator-jex/src/main/java/io/avaje/http/generator/jex/ControllerWriter.java b/http-generator-jex/src/main/java/io/avaje/http/generator/jex/ControllerWriter.java index da470c8b4..dbbe51df3 100644 --- a/http-generator-jex/src/main/java/io/avaje/http/generator/jex/ControllerWriter.java +++ b/http-generator-jex/src/main/java/io/avaje/http/generator/jex/ControllerWriter.java @@ -15,7 +15,7 @@ class ControllerWriter extends BaseControllerWriter { private static final String AT_GENERATED = "@Generated(\"avaje-jex-generator\")"; private static final String API_CONTEXT = "io.avaje.jex.http.Context"; private static final String API_ROUTING = "io.avaje.jex.Routing"; - private final boolean useJsonB; + private boolean useJsonB; private final Map jsonTypes; ControllerWriter(ControllerReader reader, boolean jsonb) throws IOException { @@ -41,10 +41,14 @@ class ControllerWriter extends BaseControllerWriter { } } if (useJsonB) { + this.jsonTypes = JsonBUtil.jsonTypes(reader); + if (this.jsonTypes.isEmpty()) { + useJsonB = false; + return; + } reader.addImportType("io.avaje.jsonb.Jsonb"); reader.addImportType("io.avaje.jsonb.JsonType"); reader.addImportType("io.avaje.jsonb.Types"); - this.jsonTypes = JsonBUtil.jsonTypes(reader); jsonTypes.values().stream().map(UType::importTypes).forEach(reader::addImportTypes); } else { this.jsonTypes = Map.of(); From 05ba67db3d0a00d1fbcfee7eb9614a035f2d48d3 Mon Sep 17 00:00:00 2001 From: Rob Bygrave Date: Tue, 25 Feb 2025 17:53:44 +1300 Subject: [PATCH 2/4] Extract common JsonB detection into JsonBDetect --- .../avaje/http/generator/core/JsonBUtil.java | 37 ++++++++++++++++++- .../helidon/nima/ControllerWriter.java | 23 ++++-------- .../http/generator/jex/ControllerWriter.java | 19 ++-------- 3 files changed, 47 insertions(+), 32 deletions(-) diff --git a/http-generator-core/src/main/java/io/avaje/http/generator/core/JsonBUtil.java b/http-generator-core/src/main/java/io/avaje/http/generator/core/JsonBUtil.java index f6c2a5a67..448bb33df 100644 --- a/http-generator-core/src/main/java/io/avaje/http/generator/core/JsonBUtil.java +++ b/http-generator-core/src/main/java/io/avaje/http/generator/core/JsonBUtil.java @@ -7,14 +7,49 @@ public final class JsonBUtil { + private static final JsonBDetect NO_JSONB = new JsonBDetect(); + /** + * Detect JsonB use and handle imports as needed. + */ + public static final class JsonBDetect { + private final Map jsonTypes; + + private JsonBDetect() { + this.jsonTypes = Map.of(); + } + + private JsonBDetect(ControllerReader reader) { + this.jsonTypes = JsonBUtil.jsonTypes(reader); + addImports(reader); + } + + private void addImports(ControllerReader reader) { + reader.addImportType("io.avaje.jsonb.Jsonb"); + reader.addImportType("io.avaje.jsonb.JsonType"); + reader.addImportType("io.avaje.jsonb.Types"); + jsonTypes.values().stream().map(UType::importTypes).forEach(reader::addImportTypes); + } + + public boolean useJsonB() { + return !jsonTypes.isEmpty(); + } + + public Map jsonTypes() { + return jsonTypes; + } + } + private JsonBUtil() {} public static boolean isJsonMimeType(String producesMimeType) { return producesMimeType == null || producesMimeType.toLowerCase().contains("application/json"); } - public static Map jsonTypes(ControllerReader reader) { + public static JsonBDetect detect(boolean jsonb, ControllerReader reader) { + return !jsonb ? NO_JSONB : new JsonBDetect(reader); + } + public static Map jsonTypes(ControllerReader reader) { final Map jsonTypes = new LinkedHashMap<>(); final Consumer addToMap = uType -> jsonTypes.put(uType.full(), uType); diff --git a/http-generator-helidon/src/main/java/io/avaje/http/generator/helidon/nima/ControllerWriter.java b/http-generator-helidon/src/main/java/io/avaje/http/generator/helidon/nima/ControllerWriter.java index cb99dbc22..e47da1301 100644 --- a/http-generator-helidon/src/main/java/io/avaje/http/generator/helidon/nima/ControllerWriter.java +++ b/http-generator-helidon/src/main/java/io/avaje/http/generator/helidon/nima/ControllerWriter.java @@ -21,12 +21,17 @@ class ControllerWriter extends BaseControllerWriter { private static final String JSON_JsonOutput = "io.avaje.json.stream.JsonOutput"; private static final String JSONB_JsonOutput = "io.avaje.jsonb.stream.JsonOutput"; - private boolean useJsonB; + private final boolean useJsonB; private final Map jsonTypes; ControllerWriter(ControllerReader reader, boolean jsonb) throws IOException { super(reader); - this.useJsonB = jsonb; + final var detectJsonB = JsonBUtil.detect(jsonb, reader); + this.useJsonB = detectJsonB.useJsonB(); + this.jsonTypes = detectJsonB.jsonTypes(); + if (useJsonB) { + reader.addImportType(jsonOutputType()); + } reader.addImportType("io.helidon.common.media.type.MediaTypes"); reader.addImportType("io.helidon.common.parameters.Parameters"); reader.addImportType("io.helidon.webserver.http.HttpRouting"); @@ -58,20 +63,6 @@ class ControllerWriter extends BaseControllerWriter { reader.addImportType("io.avaje.htmx.nima.TemplateContentCache"); } } - if (useJsonB) { - this.jsonTypes = JsonBUtil.jsonTypes(reader); - if (this.jsonTypes.isEmpty()) { - useJsonB = false; - return; - } - reader.addImportType("io.avaje.jsonb.Jsonb"); - reader.addImportType("io.avaje.jsonb.JsonType"); - reader.addImportType("io.avaje.jsonb.Types"); - reader.addImportType(jsonOutputType()); - jsonTypes.values().stream().map(UType::importTypes).forEach(reader::addImportTypes); - } else { - this.jsonTypes = Map.of(); - } } private static String jsonOutputType() { diff --git a/http-generator-jex/src/main/java/io/avaje/http/generator/jex/ControllerWriter.java b/http-generator-jex/src/main/java/io/avaje/http/generator/jex/ControllerWriter.java index dbbe51df3..0138d8f9b 100644 --- a/http-generator-jex/src/main/java/io/avaje/http/generator/jex/ControllerWriter.java +++ b/http-generator-jex/src/main/java/io/avaje/http/generator/jex/ControllerWriter.java @@ -15,12 +15,14 @@ class ControllerWriter extends BaseControllerWriter { private static final String AT_GENERATED = "@Generated(\"avaje-jex-generator\")"; private static final String API_CONTEXT = "io.avaje.jex.http.Context"; private static final String API_ROUTING = "io.avaje.jex.Routing"; - private boolean useJsonB; + private final boolean useJsonB; private final Map jsonTypes; ControllerWriter(ControllerReader reader, boolean jsonb) throws IOException { super(reader); - this.useJsonB = jsonb; + final var detectJsonB = JsonBUtil.detect(jsonb, reader); + this.useJsonB = detectJsonB.useJsonB(); + this.jsonTypes = detectJsonB.jsonTypes(); reader.addImportType(API_CONTEXT); reader.addImportType(API_ROUTING); reader.addImportType("java.io.IOException"); @@ -40,19 +42,6 @@ class ControllerWriter extends BaseControllerWriter { reader.addImportType("io.avaje.jex.htmx.TemplateContentCache"); } } - if (useJsonB) { - this.jsonTypes = JsonBUtil.jsonTypes(reader); - if (this.jsonTypes.isEmpty()) { - useJsonB = false; - return; - } - reader.addImportType("io.avaje.jsonb.Jsonb"); - reader.addImportType("io.avaje.jsonb.JsonType"); - reader.addImportType("io.avaje.jsonb.Types"); - jsonTypes.values().stream().map(UType::importTypes).forEach(reader::addImportTypes); - } else { - this.jsonTypes = Map.of(); - } } void write() { From a3cabff842d2fc64bbeaecbf3b11005b322165a6 Mon Sep 17 00:00:00 2001 From: Rob Bygrave Date: Tue, 25 Feb 2025 18:00:45 +1300 Subject: [PATCH 3/4] Extract common JsonB detection into JsonBDetect, Javalin ControllerWriter --- .../generator/javalin/ControllerWriter.java | 19 ++++--------------- 1 file changed, 4 insertions(+), 15 deletions(-) diff --git a/http-generator-javalin/src/main/java/io/avaje/http/generator/javalin/ControllerWriter.java b/http-generator-javalin/src/main/java/io/avaje/http/generator/javalin/ControllerWriter.java index 1fbfbbce6..c9a7f1324 100644 --- a/http-generator-javalin/src/main/java/io/avaje/http/generator/javalin/ControllerWriter.java +++ b/http-generator-javalin/src/main/java/io/avaje/http/generator/javalin/ControllerWriter.java @@ -20,13 +20,15 @@ class ControllerWriter extends BaseControllerWriter { private static final String AT_GENERATED = "@Generated(\"avaje-javalin-generator\")"; - private boolean useJsonB; + private final boolean useJsonB; private final Map jsonTypes; private final boolean javalin6 = ProcessingContext.javalin6(); ControllerWriter(ControllerReader reader, boolean jsonb) throws IOException { super(reader); - this.useJsonB = jsonb; + final var detectJsonB = JsonBUtil.detect(jsonb, reader); + this.useJsonB = detectJsonB.useJsonB(); + this.jsonTypes = detectJsonB.jsonTypes(); reader.addImportType("io.javalin.plugin.Plugin"); if (javalin6) { @@ -36,19 +38,6 @@ class ControllerWriter extends BaseControllerWriter { } else { reader.addImportType("io.javalin.Javalin"); } - if (useJsonB) { - this.jsonTypes = JsonBUtil.jsonTypes(reader); - if (this.jsonTypes.isEmpty()) { - useJsonB = false; - return; - } - reader.addImportType("io.avaje.jsonb.Jsonb"); - reader.addImportType("io.avaje.jsonb.JsonType"); - reader.addImportType("io.avaje.jsonb.Types"); - jsonTypes.values().stream().map(UType::importTypes).forEach(reader::addImportTypes); - } else { - this.jsonTypes = Map.of(); - } } void write() { From 674b6cf2faa744bd15a08ac7b304c3c6571781de Mon Sep 17 00:00:00 2001 From: Rob Bygrave Date: Tue, 25 Feb 2025 18:10:21 +1300 Subject: [PATCH 4/4] JsonBDetect.addImports() conditional on non-empty json types found --- .../java/io/avaje/http/generator/core/JsonBUtil.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/http-generator-core/src/main/java/io/avaje/http/generator/core/JsonBUtil.java b/http-generator-core/src/main/java/io/avaje/http/generator/core/JsonBUtil.java index 448bb33df..cf40c9076 100644 --- a/http-generator-core/src/main/java/io/avaje/http/generator/core/JsonBUtil.java +++ b/http-generator-core/src/main/java/io/avaje/http/generator/core/JsonBUtil.java @@ -24,10 +24,12 @@ private JsonBDetect(ControllerReader reader) { } private void addImports(ControllerReader reader) { - reader.addImportType("io.avaje.jsonb.Jsonb"); - reader.addImportType("io.avaje.jsonb.JsonType"); - reader.addImportType("io.avaje.jsonb.Types"); - jsonTypes.values().stream().map(UType::importTypes).forEach(reader::addImportTypes); + if (useJsonB()) { + reader.addImportType("io.avaje.jsonb.Jsonb"); + reader.addImportType("io.avaje.jsonb.JsonType"); + reader.addImportType("io.avaje.jsonb.Types"); + jsonTypes.values().stream().map(UType::importTypes).forEach(reader::addImportTypes); + } } public boolean useJsonB() {