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 f6c2a5a6..cf40c907 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,51 @@ 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) { + 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() { + 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 3c8d2c72..e47da130 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 @@ -26,18 +26,11 @@ class ControllerWriter extends BaseControllerWriter { 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("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"); 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 340b702e..c9a7f132 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 @@ -26,16 +26,10 @@ class ControllerWriter extends BaseControllerWriter { 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(); - } + final var detectJsonB = JsonBUtil.detect(jsonb, reader); + this.useJsonB = detectJsonB.useJsonB(); + this.jsonTypes = detectJsonB.jsonTypes(); + reader.addImportType("io.javalin.plugin.Plugin"); if (javalin6) { reader.addImportType("io.javalin.config.JavalinConfig"); 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 da470c8b..0138d8f9 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 @@ -20,7 +20,9 @@ class ControllerWriter extends BaseControllerWriter { 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,15 +42,6 @@ class ControllerWriter extends BaseControllerWriter { reader.addImportType("io.avaje.jex.htmx.TemplateContentCache"); } } - 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(); - } } void write() {