From 82286bdb3ab7ae323c49d9b1731a9937ed5e5256 Mon Sep 17 00:00:00 2001 From: Josiah Noel <32279667+SentryMan@users.noreply.github.com> Date: Wed, 28 Dec 2022 00:11:26 -0500 Subject: [PATCH 01/13] support generic jsonb types --- .../avaje/http/generator/core/JsonBUtil.java | 18 ++++++++++++++++-- .../io/avaje/http/generator/core/UType.java | 16 ++++++++++++++++ .../generator/javalin/ControllerWriter.java | 12 ++++++++++-- 3 files changed, 42 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 78365b3f2..a3bc7dc38 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 @@ -1,8 +1,10 @@ package io.avaje.http.generator.core; +import java.util.Collection; import java.util.LinkedHashMap; import java.util.Map; import java.util.function.Consumer; +import java.util.stream.Collectors; public class JsonBUtil { private JsonBUtil() {} @@ -53,8 +55,20 @@ public static void writeJsonbType(UType type, Append writer) { writer.append("%s.class).map()", type.param1()); break; default: - throw new UnsupportedOperationException( - "Only java.util Map, Set and List are supported JsonB Controller Collection Types"); + { + try { + if (Collection.class.isAssignableFrom(Class.forName(type.mainType()))) + throw new UnsupportedOperationException( + "Only java.util Map, Set and List are supported JsonB Controller Collection Types"); + } catch (final ClassNotFoundException e) { + throw new UnsupportedOperationException( + "Only java.util Map, Set and List are supported JsonB Controller Collection Types"); + } + final var params = + type.allTypes().stream().skip(1).collect(Collectors.joining(".class, ")) + ".class"; + + writer.append("Types.newParameterizedType(%s.class, %s))", type.mainType(), params); + } } } writer.append(";").eol(); diff --git a/http-generator-core/src/main/java/io/avaje/http/generator/core/UType.java b/http-generator-core/src/main/java/io/avaje/http/generator/core/UType.java index dd2f2d4d6..7f0d58196 100644 --- a/http-generator-core/src/main/java/io/avaje/http/generator/core/UType.java +++ b/http-generator-core/src/main/java/io/avaje/http/generator/core/UType.java @@ -40,6 +40,12 @@ static UType parse(TypeMirror type) { default String param0() { return null; } + /** + * Return all types associated with this Utype. + */ + default List allTypes() { + return null; + } /** * Return the second generic parameter. @@ -123,6 +129,11 @@ public String shortName() { public String mainType() { return rawType; } + + @Override + public List allTypes() { + return List.of(rawType); + } } /** @@ -201,6 +212,11 @@ public String mainType() { return allTypes.isEmpty() ? null : allTypes.get(0); } + @Override + public List allTypes() { + return allTypes; + } + @Override public String param0() { return allTypes.size() < 2 ? null : allTypes.get(1); 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 7f19e1ccc..0ddae845f 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 @@ -1,10 +1,17 @@ package io.avaje.http.generator.javalin; -import io.avaje.http.generator.core.*; - import java.io.IOException; import java.util.Map; +import io.avaje.http.generator.core.BaseControllerWriter; +import io.avaje.http.generator.core.Constants; +import io.avaje.http.generator.core.ControllerReader; +import io.avaje.http.generator.core.JsonBUtil; +import io.avaje.http.generator.core.MethodReader; +import io.avaje.http.generator.core.PrimitiveUtil; +import io.avaje.http.generator.core.ProcessingContext; +import io.avaje.http.generator.core.UType; + /** * Write Javalin specific Controller WebRoute handling adapter. */ @@ -21,6 +28,7 @@ class ControllerWriter extends BaseControllerWriter { 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); } else { this.jsonTypes = Map.of(); From 47fb3efc679ad2f28d514a7f3c6167c9a502556d Mon Sep 17 00:00:00 2001 From: Josiah Noel <32279667+SentryMan@users.noreply.github.com> Date: Wed, 28 Dec 2022 02:29:39 -0500 Subject: [PATCH 02/13] add jsonb types to imports --- .../java/io/avaje/http/generator/core/JsonBUtil.java | 9 ++------- .../main/java/io/avaje/http/generator/core/UType.java | 2 +- .../avaje/http/generator/javalin/ControllerWriter.java | 10 +++++++++- .../http/generator/helidon/nima/ControllerWriter.java | 10 +++++++++- 4 files changed, 21 insertions(+), 10 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 a3bc7dc38..c28ec8977 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 @@ -1,6 +1,5 @@ package io.avaje.http.generator.core; -import java.util.Collection; import java.util.LinkedHashMap; import java.util.Map; import java.util.function.Consumer; @@ -56,14 +55,10 @@ public static void writeJsonbType(UType type, Append writer) { break; default: { - try { - if (Collection.class.isAssignableFrom(Class.forName(type.mainType()))) - throw new UnsupportedOperationException( - "Only java.util Map, Set and List are supported JsonB Controller Collection Types"); - } catch (final ClassNotFoundException e) { + if (type.mainType().contains("java.util")) throw new UnsupportedOperationException( "Only java.util Map, Set and List are supported JsonB Controller Collection Types"); - } + final var params = type.allTypes().stream().skip(1).collect(Collectors.joining(".class, ")) + ".class"; diff --git a/http-generator-core/src/main/java/io/avaje/http/generator/core/UType.java b/http-generator-core/src/main/java/io/avaje/http/generator/core/UType.java index 7f0d58196..d5fc543ab 100644 --- a/http-generator-core/src/main/java/io/avaje/http/generator/core/UType.java +++ b/http-generator-core/src/main/java/io/avaje/http/generator/core/UType.java @@ -44,7 +44,7 @@ default String param0() { * Return all types associated with this Utype. */ default List allTypes() { - return null; + return List.of(); } /** 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 0ddae845f..2ecc9a753 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 @@ -1,6 +1,7 @@ package io.avaje.http.generator.javalin; import java.io.IOException; +import java.util.List; import java.util.Map; import io.avaje.http.generator.core.BaseControllerWriter; @@ -30,6 +31,11 @@ class ControllerWriter extends BaseControllerWriter { reader.addImportType("io.avaje.jsonb.JsonType"); reader.addImportType("io.avaje.jsonb.Types"); this.jsonTypes = JsonBUtil.jsonTypes(reader); + jsonTypes.values().stream() + .map(UType::allTypes) + .flatMap(List::stream) + .filter(s -> !s.contains("java.lang")) + .forEach(reader::addImportType); } else { this.jsonTypes = Map.of(); } @@ -85,7 +91,9 @@ private void writeClassStart() { } for (final UType type : jsonTypes.values()) { - writer.append(" private final JsonType<%s> %sJsonType;", PrimitiveUtil.wrap(type.full()), type.shortName()).eol(); + final var typeString = PrimitiveUtil.wrap(type.shortType()).replace(",", ", "); + + writer.append(" private final JsonType<%s> %sJsonType;", typeString, type.shortName()).eol(); } writer.eol(); diff --git a/http-generator-nima/src/main/java/io/avaje/http/generator/helidon/nima/ControllerWriter.java b/http-generator-nima/src/main/java/io/avaje/http/generator/helidon/nima/ControllerWriter.java index 1d78d70ab..7346df625 100644 --- a/http-generator-nima/src/main/java/io/avaje/http/generator/helidon/nima/ControllerWriter.java +++ b/http-generator-nima/src/main/java/io/avaje/http/generator/helidon/nima/ControllerWriter.java @@ -21,7 +21,13 @@ class ControllerWriter extends BaseControllerWriter { 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::allTypes) + .flatMap(List::stream) + .filter(s -> !s.contains("java.lang")) + .forEach(reader::addImportType); } else { this.jsonTypes = Map.of(); } @@ -87,7 +93,9 @@ private void writeClassStart() { writer.append(" private final Validator validator;").eol(); } for (final UType type : jsonTypes.values()) { - writer.append(" private final JsonType<%s> %sJsonType;", PrimitiveUtil.wrap(type.full()), type.shortName()).eol(); + final var typeString = PrimitiveUtil.wrap(type.shortType()).replace(",", ", "); + + writer.append(" private final JsonType<%s> %sJsonType;", typeString, type.shortName()).eol(); } writer.eol(); From 328c7cbfb0e69a0683896105159120f758890c85 Mon Sep 17 00:00:00 2001 From: Josiah Noel <32279667+SentryMan@users.noreply.github.com> Date: Wed, 28 Dec 2022 15:58:27 -0500 Subject: [PATCH 03/13] I was redundant --- .../io/avaje/http/generator/core/UType.java | 17 +---------------- .../generator/javalin/ControllerWriter.java | 7 +++---- .../helidon/nima/ControllerWriter.java | 6 +++--- 3 files changed, 7 insertions(+), 23 deletions(-) diff --git a/http-generator-core/src/main/java/io/avaje/http/generator/core/UType.java b/http-generator-core/src/main/java/io/avaje/http/generator/core/UType.java index d5fc543ab..5ba2f424e 100644 --- a/http-generator-core/src/main/java/io/avaje/http/generator/core/UType.java +++ b/http-generator-core/src/main/java/io/avaje/http/generator/core/UType.java @@ -40,12 +40,6 @@ static UType parse(TypeMirror type) { default String param0() { return null; } - /** - * Return all types associated with this Utype. - */ - default List allTypes() { - return List.of(); - } /** * Return the second generic parameter. @@ -112,7 +106,7 @@ public String full() { @Override public Set importTypes() { - return Collections.singleton(rawType); + return rawType.startsWith("java.lang.") ? Set.of() : Collections.singleton(rawType); } @Override @@ -130,10 +124,6 @@ public String mainType() { return rawType; } - @Override - public List allTypes() { - return List.of(rawType); - } } /** @@ -212,11 +202,6 @@ public String mainType() { return allTypes.isEmpty() ? null : allTypes.get(0); } - @Override - public List allTypes() { - return allTypes; - } - @Override public String param0() { return allTypes.size() < 2 ? null : allTypes.get(1); 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 2ecc9a753..e388f5f20 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 @@ -1,8 +1,8 @@ package io.avaje.http.generator.javalin; import java.io.IOException; -import java.util.List; import java.util.Map; +import java.util.Set; import io.avaje.http.generator.core.BaseControllerWriter; import io.avaje.http.generator.core.Constants; @@ -32,9 +32,8 @@ class ControllerWriter extends BaseControllerWriter { reader.addImportType("io.avaje.jsonb.Types"); this.jsonTypes = JsonBUtil.jsonTypes(reader); jsonTypes.values().stream() - .map(UType::allTypes) - .flatMap(List::stream) - .filter(s -> !s.contains("java.lang")) + .map(UType::importTypes) + .flatMap(Set::stream) .forEach(reader::addImportType); } else { this.jsonTypes = Map.of(); diff --git a/http-generator-nima/src/main/java/io/avaje/http/generator/helidon/nima/ControllerWriter.java b/http-generator-nima/src/main/java/io/avaje/http/generator/helidon/nima/ControllerWriter.java index 7346df625..e67fde8a4 100644 --- a/http-generator-nima/src/main/java/io/avaje/http/generator/helidon/nima/ControllerWriter.java +++ b/http-generator-nima/src/main/java/io/avaje/http/generator/helidon/nima/ControllerWriter.java @@ -5,6 +5,7 @@ import java.io.IOException; import java.util.List; import java.util.Map; +import java.util.Set; /** * Write Helidon specific web route adapter (a Helidon Service). @@ -24,9 +25,8 @@ class ControllerWriter extends BaseControllerWriter { reader.addImportType("io.avaje.jsonb.Types"); this.jsonTypes = JsonBUtil.jsonTypes(reader); jsonTypes.values().stream() - .map(UType::allTypes) - .flatMap(List::stream) - .filter(s -> !s.contains("java.lang")) + .map(UType::importTypes) + .flatMap(Set::stream) .forEach(reader::addImportType); } else { this.jsonTypes = Map.of(); From c243fc56e0063eb8ead0d54dfec7dae82d37519c Mon Sep 17 00:00:00 2001 From: Josiah Noel <32279667+SentryMan@users.noreply.github.com> Date: Wed, 28 Dec 2022 16:12:54 -0500 Subject: [PATCH 04/13] handle array --- .../io/avaje/http/generator/client/ClientMethodWriter.java | 7 +------ .../main/java/io/avaje/http/generator/core/JsonBUtil.java | 2 +- .../src/main/java/io/avaje/http/generator/core/UType.java | 6 ++++-- .../io/avaje/http/generator/javalin/ControllerWriter.java | 3 +-- .../http/generator/helidon/nima/ControllerWriter.java | 3 +-- 5 files changed, 8 insertions(+), 13 deletions(-) diff --git a/http-generator-client/src/main/java/io/avaje/http/generator/client/ClientMethodWriter.java b/http-generator-client/src/main/java/io/avaje/http/generator/client/ClientMethodWriter.java index 5c0abe1d2..0f6b782a4 100644 --- a/http-generator-client/src/main/java/io/avaje/http/generator/client/ClientMethodWriter.java +++ b/http-generator-client/src/main/java/io/avaje/http/generator/client/ClientMethodWriter.java @@ -34,12 +34,7 @@ class ClientMethodWriter { void addImportTypes(ControllerReader reader) { reader.addImportTypes(returnType.importTypes()); for (final MethodParam param : method.params()) { - final var type = param.utype(); - final var type0 = type.param0(); - final var type1 = type.param1(); - reader.addImportType(type.mainType().replace("[]", "")); - if (type0 != null) reader.addImportType(type0.replace("[]", "")); - if (type1 != null) reader.addImportType(type1.replace("[]", "")); + reader.addImportTypes(param.utype().importTypes()); } } 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 c28ec8977..4b367a9ee 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 @@ -60,7 +60,7 @@ public static void writeJsonbType(UType type, Append writer) { "Only java.util Map, Set and List are supported JsonB Controller Collection Types"); final var params = - type.allTypes().stream().skip(1).collect(Collectors.joining(".class, ")) + ".class"; + type.importTypes().stream().skip(1).collect(Collectors.joining(".class, ")) + ".class"; writer.append("Types.newParameterizedType(%s.class, %s))", type.mainType(), params); } diff --git a/http-generator-core/src/main/java/io/avaje/http/generator/core/UType.java b/http-generator-core/src/main/java/io/avaje/http/generator/core/UType.java index 5ba2f424e..9d26e5ac8 100644 --- a/http-generator-core/src/main/java/io/avaje/http/generator/core/UType.java +++ b/http-generator-core/src/main/java/io/avaje/http/generator/core/UType.java @@ -106,7 +106,9 @@ public String full() { @Override public Set importTypes() { - return rawType.startsWith("java.lang.") ? Set.of() : Collections.singleton(rawType); + return rawType.startsWith("java.lang.") && rawType.indexOf('.') > -1 + ? Set.of() + : Collections.singleton(rawType.replace("[]", "")); } @Override @@ -164,7 +166,7 @@ public Set importTypes() { Set set = new LinkedHashSet<>(); for (String type : allTypes) { if (!type.startsWith("java.lang.") && type.indexOf('.') > -1) { - set.add(type); + set.add(type.replace("[]", "")); } } return set; 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 e388f5f20..a437c3311 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 @@ -33,8 +33,7 @@ class ControllerWriter extends BaseControllerWriter { this.jsonTypes = JsonBUtil.jsonTypes(reader); jsonTypes.values().stream() .map(UType::importTypes) - .flatMap(Set::stream) - .forEach(reader::addImportType); + .forEach(reader::addImportTypes); } else { this.jsonTypes = Map.of(); } diff --git a/http-generator-nima/src/main/java/io/avaje/http/generator/helidon/nima/ControllerWriter.java b/http-generator-nima/src/main/java/io/avaje/http/generator/helidon/nima/ControllerWriter.java index e67fde8a4..03118e01e 100644 --- a/http-generator-nima/src/main/java/io/avaje/http/generator/helidon/nima/ControllerWriter.java +++ b/http-generator-nima/src/main/java/io/avaje/http/generator/helidon/nima/ControllerWriter.java @@ -26,8 +26,7 @@ class ControllerWriter extends BaseControllerWriter { this.jsonTypes = JsonBUtil.jsonTypes(reader); jsonTypes.values().stream() .map(UType::importTypes) - .flatMap(Set::stream) - .forEach(reader::addImportType); + .forEach(reader::addImportTypes); } else { this.jsonTypes = Map.of(); } From a1550613996a8b1e412c6ebe621b2e5f284df631 Mon Sep 17 00:00:00 2001 From: Josiah Noel <32279667+SentryMan@users.noreply.github.com> Date: Wed, 28 Dec 2022 16:13:54 -0500 Subject: [PATCH 05/13] Update ControllerWriter.java --- .../java/io/avaje/http/generator/javalin/ControllerWriter.java | 1 - 1 file changed, 1 deletion(-) 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 a437c3311..957c293fb 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 @@ -2,7 +2,6 @@ import java.io.IOException; import java.util.Map; -import java.util.Set; import io.avaje.http.generator.core.BaseControllerWriter; import io.avaje.http.generator.core.Constants; From 5fa229753b63803e70d22672ee9679ee0b678474 Mon Sep 17 00:00:00 2001 From: Josiah Noel <32279667+SentryMan@users.noreply.github.com> Date: Wed, 28 Dec 2022 19:59:12 -0500 Subject: [PATCH 06/13] client processor jsonb generics --- .../generator/client/ClientMethodWriter.java | 55 +++++++++++++------ .../generator/client/ClientProcessor.java | 17 +++++- .../http/generator/client/ClientWriter.java | 7 ++- .../avaje/http/generator/core/JsonBUtil.java | 33 ++++++++--- .../io/avaje/http/generator/core/UType.java | 37 +++++++++++-- 5 files changed, 115 insertions(+), 34 deletions(-) diff --git a/http-generator-client/src/main/java/io/avaje/http/generator/client/ClientMethodWriter.java b/http-generator-client/src/main/java/io/avaje/http/generator/client/ClientMethodWriter.java index 0f6b782a4..4e48ab23c 100644 --- a/http-generator-client/src/main/java/io/avaje/http/generator/client/ClientMethodWriter.java +++ b/http-generator-client/src/main/java/io/avaje/http/generator/client/ClientMethodWriter.java @@ -4,6 +4,7 @@ import javax.lang.model.element.TypeElement; import java.util.Set; +import java.util.stream.Collectors; /** * Write code to register Web route for a given controller method. @@ -22,13 +23,15 @@ class ClientMethodWriter { private final UType returnType; private MethodParam bodyHandlerParam; private String methodGenericParams = ""; + private final boolean useJsonb; - ClientMethodWriter(MethodReader method, Append writer, ProcessingContext ctx) { + ClientMethodWriter(MethodReader method, Append writer, ProcessingContext ctx, boolean useJsonb) { this.method = method; this.writer = writer; this.webMethod = method.webMethod(); this.ctx = ctx; this.returnType = Util.parseType(method.returnType()); + this.useJsonb = useJsonb; } void addImportTypes(ControllerReader reader) { @@ -111,37 +114,55 @@ private void writeEnd() { private void writeSyncResponse() { writer.append(" "); - String type0 = returnType.mainType(); - String type1 = returnType.param0(); - writeResponse(type0, type1); + writeResponse(returnType); } private void writeAsyncResponse() { writer.append(" .async()"); - String type0 = returnType.param0(); - String type1 = returnType.param1(); - writeResponse(type0, type1); + writeResponse(UType.parse(returnType.param0())); } private void writeCallResponse() { writer.append(" .call()"); - String type0 = returnType.param0(); - String type1 = returnType.param1(); - writeResponse(type0, type1); + writeResponse(UType.parse(returnType.param0())); } - private void writeResponse(String type0, String type1) { - if (isList(type0)) { - writer.append(".list(%s.class);", Util.shortName(type1)).eol(); - } else if (isStream(type0)) { - writer.append(".stream(%s.class);", Util.shortName(type1)).eol(); - } else if (isHttpResponse(type0)){ + private void writeResponse(UType type) { + final var mainType = type.mainType(); + final var param1 = type.paramRaw(); + if (isList(mainType)) { + writer.append(".list("); + writeGeneric(UType.parse(param1)); + } else if (isStream(mainType)) { + writer.append(".stream("); + writeGeneric(UType.parse(param1)); + } else if (isHttpResponse(mainType)) { writeWithHandler(); } else { - writer.append(".bean(%s.class);", Util.shortName(type0)).eol(); + writer.append(".bean(", Util.shortName(mainType)).eol(); + writeGeneric(type); } } + void writeGeneric(UType type) { + if (useJsonb && type.isGeneric()) { + final var params = + type.importTypes().stream() + .skip(1) + .map(Util::shortName) + .collect(Collectors.joining(".class, ")) + + ".class"; + + writer.append( + "Types.newParameterizedType(%s.class, %s)", Util.shortName(type.mainType()), params); + } else { + writer.append("%s.class", Util.shortName(type.mainType())); + } + writer.append(");"); + + writer.eol(); + } + private void writeWithHandler() { if (bodyHandlerParam != null) { writer.append(".handler(%s);", bodyHandlerParam.name()).eol(); diff --git a/http-generator-client/src/main/java/io/avaje/http/generator/client/ClientProcessor.java b/http-generator-client/src/main/java/io/avaje/http/generator/client/ClientProcessor.java index 0a8b68605..14f297d03 100644 --- a/http-generator-client/src/main/java/io/avaje/http/generator/client/ClientProcessor.java +++ b/http-generator-client/src/main/java/io/avaje/http/generator/client/ClientProcessor.java @@ -27,6 +27,21 @@ public class ClientProcessor extends AbstractProcessor { protected ProcessingContext ctx; + private boolean useJsonB; + + public ClientProcessor() { + try { + Class.forName("io.avaje.jsonb.Jsonb"); + this.useJsonB = true; + } catch (final ClassNotFoundException e) { + this.useJsonB = false; + } + } + + public ClientProcessor(boolean useJsonb) { + useJsonB = useJsonb; + } + @Override public SourceVersion getSupportedSourceVersion() { return SourceVersion.latest(); @@ -107,7 +122,7 @@ private void writeClient(Element controller) { } protected String writeClientAdapter(ProcessingContext ctx, ControllerReader reader) throws IOException { - return new ClientWriter(reader, ctx).write(); + return new ClientWriter(reader, ctx,useJsonB).write(); } } diff --git a/http-generator-client/src/main/java/io/avaje/http/generator/client/ClientWriter.java b/http-generator-client/src/main/java/io/avaje/http/generator/client/ClientWriter.java index 26dd12a6a..6f465bd73 100644 --- a/http-generator-client/src/main/java/io/avaje/http/generator/client/ClientWriter.java +++ b/http-generator-client/src/main/java/io/avaje/http/generator/client/ClientWriter.java @@ -21,12 +21,15 @@ class ClientWriter extends BaseControllerWriter { private static final String SUFFIX = "HttpClient"; private final List methodList = new ArrayList<>(); + private final boolean useJsonb; - ClientWriter(ControllerReader reader, ProcessingContext ctx) throws IOException { + ClientWriter(ControllerReader reader, ProcessingContext ctx, boolean useJsonB) throws IOException { super(reader, ctx, SUFFIX); reader.addImportType(HTTP_CLIENT_CONTEXT); reader.addImportType(HTTP_API_PROVIDER); + this.useJsonb = useJsonB; readMethods(); + if (useJsonB) reader.addImportType("io.avaje.jsonb.Types"); } @Override @@ -38,7 +41,7 @@ protected String initPackageName(String originName) { private void readMethods() { for (MethodReader method : reader.methods()) { if (method.isWebMethod()) { - ClientMethodWriter methodWriter = new ClientMethodWriter(method, writer, ctx); + final var methodWriter = new ClientMethodWriter(method, writer, ctx, useJsonb); methodWriter.addImportTypes(reader); methodList.add(methodWriter); } 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 4b367a9ee..a37eb443a 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 @@ -41,31 +41,46 @@ public static void writeJsonbType(UType type, Append writer) { writer.append(" this.%sJsonType = jsonB.type(", type.shortName()); if (!type.isGeneric()) { - writer.append("%s.class)", PrimitiveUtil.wrap(type.full())); + writer.append("%s.class)", Util.shortName(PrimitiveUtil.wrap(type.full()))); } else { switch (type.mainType()) { case "java.util.List": - writer.append("%s.class).list()", type.param0()); + writeType(UType.parse(type.paramRaw()), writer); + writer.append(".list()"); break; case "java.util.Set": - writer.append("%s.class).set()", type.param0()); + writeType(UType.parse(type.paramRaw()), writer); + writer.append(".set()"); break; case "java.util.Map": - writer.append("%s.class).map()", type.param1()); + writeType(UType.parse(type.paramRaw()), writer); + writer.append(".map()"); break; default: { if (type.mainType().contains("java.util")) throw new UnsupportedOperationException( "Only java.util Map, Set and List are supported JsonB Controller Collection Types"); - - final var params = - type.importTypes().stream().skip(1).collect(Collectors.joining(".class, ")) + ".class"; - - writer.append("Types.newParameterizedType(%s.class, %s))", type.mainType(), params); + writeType(type, writer); } } } writer.append(";").eol(); } + + static void writeType(UType type, Append writer) { + if (type.isGeneric()) { + final var params = + type.importTypes().stream() + .skip(1) + .map(Util::shortName) + .collect(Collectors.joining(".class, ")) + + ".class"; + + writer.append( + "Types.newParameterizedType(%s.class, %s))", Util.shortName(type.mainType()), params); + } else { + writer.append("%s.class)", Util.shortName(type.mainType())); + } + } } diff --git a/http-generator-core/src/main/java/io/avaje/http/generator/core/UType.java b/http-generator-core/src/main/java/io/avaje/http/generator/core/UType.java index 9d26e5ac8..b2ba8b354 100644 --- a/http-generator-core/src/main/java/io/avaje/http/generator/core/UType.java +++ b/http-generator-core/src/main/java/io/avaje/http/generator/core/UType.java @@ -48,9 +48,12 @@ default String param1() { return null; } - /** - * Return the raw type. - */ + /** Return the raw generic parameter if this UType is a Collection. */ + default String paramRaw() { + return null; + } + + /** Return the raw type. */ String full(); default boolean isGeneric() { @@ -125,7 +128,6 @@ public String shortName() { public String mainType() { return rawType; } - } /** @@ -133,15 +135,35 @@ public String mainType() { */ class Generic implements UType { final String rawType; + final String rawParamType; final List allTypes; final String shortRawType; final String shortName; Generic(String rawTypeInput) { - this.rawType = rawTypeInput.replace(" ",""); // trim whitespace + this.rawType = rawTypeInput.replace(" ", ""); // trim whitespace this.allTypes = Arrays.asList(rawType.split("[<|>|,]")); this.shortRawType = shortRawType(rawType, allTypes); this.shortName = Util.name(shortRawType); + this.rawParamType = extractCollectionParam(); + } + + private String extractCollectionParam() { + + switch (mainType()) { + case "java.util.Set": + case "java.util.Stream": + case "java.util.List": + var first = rawType.indexOf("<") + 1; + var end = rawType.lastIndexOf(">"); + return rawType.substring(first, end); + case "java.util.Map": + first = rawType.indexOf(",") + 1; + end = rawType.lastIndexOf(">"); + return rawType.substring(first, end); + default: + return rawType; + } } private String shortRawType(String rawType, List allTypes) { @@ -213,5 +235,10 @@ public String param0() { public String param1() { return allTypes.size() < 3 ? null : allTypes.get(2); } + + @Override + public String paramRaw() { + return rawParamType; + } } } From c5963d3837c59f75845e6091f67cdda9dd1f56cb Mon Sep 17 00:00:00 2001 From: Josiah Noel <32279667+SentryMan@users.noreply.github.com> Date: Wed, 28 Dec 2022 20:38:29 -0500 Subject: [PATCH 07/13] directly get utype --- .../io/avaje/http/generator/core/JsonBUtil.java | 6 +++--- .../java/io/avaje/http/generator/core/UType.java | 13 ++++++++----- tests/test-client/pom.xml | 2 +- 3 files changed, 12 insertions(+), 9 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 a37eb443a..13c043a05 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 @@ -45,15 +45,15 @@ public static void writeJsonbType(UType type, Append writer) { } else { switch (type.mainType()) { case "java.util.List": - writeType(UType.parse(type.paramRaw()), writer); + writeType(type.paramRaw(), writer); writer.append(".list()"); break; case "java.util.Set": - writeType(UType.parse(type.paramRaw()), writer); + writeType(type.paramRaw(), writer); writer.append(".set()"); break; case "java.util.Map": - writeType(UType.parse(type.paramRaw()), writer); + writeType(type.paramRaw(), writer); writer.append(".map()"); break; default: diff --git a/http-generator-core/src/main/java/io/avaje/http/generator/core/UType.java b/http-generator-core/src/main/java/io/avaje/http/generator/core/UType.java index b2ba8b354..8caa66bba 100644 --- a/http-generator-core/src/main/java/io/avaje/http/generator/core/UType.java +++ b/http-generator-core/src/main/java/io/avaje/http/generator/core/UType.java @@ -135,7 +135,7 @@ public String mainType() { */ class Generic implements UType { final String rawType; - final String rawParamType; + final UType rawParamType; final List allTypes; final String shortRawType; final String shortName; @@ -145,15 +145,18 @@ class Generic implements UType { this.allTypes = Arrays.asList(rawType.split("[<|>|,]")); this.shortRawType = shortRawType(rawType, allTypes); this.shortName = Util.name(shortRawType); - this.rawParamType = extractCollectionParam(); + final var paramTypeString = extractRawParam(); + this.rawParamType = paramTypeString != null ? UType.parse(paramTypeString) : null; } - private String extractCollectionParam() { + private String extractRawParam() { switch (mainType()) { case "java.util.Set": case "java.util.Stream": case "java.util.List": + case "java.util.concurrent.CompletableFuture": + case "io.avaje.http.client.HttpCall": var first = rawType.indexOf("<") + 1; var end = rawType.lastIndexOf(">"); return rawType.substring(first, end); @@ -162,7 +165,7 @@ private String extractCollectionParam() { end = rawType.lastIndexOf(">"); return rawType.substring(first, end); default: - return rawType; + return null; } } @@ -237,7 +240,7 @@ public String param1() { } @Override - public String paramRaw() { + public UType paramRaw() { return rawParamType; } } diff --git a/tests/test-client/pom.xml b/tests/test-client/pom.xml index 8dc3b7938..9babe4139 100644 --- a/tests/test-client/pom.xml +++ b/tests/test-client/pom.xml @@ -30,7 +30,7 @@ io.avaje avaje-http-client - 1.16 + 1.20 From 9eb390d4f9df02bb93eb9fe4e5cd878e504f96db Mon Sep 17 00:00:00 2001 From: Josiah Noel <32279667+SentryMan@users.noreply.github.com> Date: Wed, 28 Dec 2022 20:39:18 -0500 Subject: [PATCH 08/13] I'll do client later --- .../generator/client/ClientMethodWriter.java | 55 ++++++------------- .../generator/client/ClientProcessor.java | 17 +----- .../http/generator/client/ClientWriter.java | 7 +-- 3 files changed, 20 insertions(+), 59 deletions(-) diff --git a/http-generator-client/src/main/java/io/avaje/http/generator/client/ClientMethodWriter.java b/http-generator-client/src/main/java/io/avaje/http/generator/client/ClientMethodWriter.java index 4e48ab23c..0f6b782a4 100644 --- a/http-generator-client/src/main/java/io/avaje/http/generator/client/ClientMethodWriter.java +++ b/http-generator-client/src/main/java/io/avaje/http/generator/client/ClientMethodWriter.java @@ -4,7 +4,6 @@ import javax.lang.model.element.TypeElement; import java.util.Set; -import java.util.stream.Collectors; /** * Write code to register Web route for a given controller method. @@ -23,15 +22,13 @@ class ClientMethodWriter { private final UType returnType; private MethodParam bodyHandlerParam; private String methodGenericParams = ""; - private final boolean useJsonb; - ClientMethodWriter(MethodReader method, Append writer, ProcessingContext ctx, boolean useJsonb) { + ClientMethodWriter(MethodReader method, Append writer, ProcessingContext ctx) { this.method = method; this.writer = writer; this.webMethod = method.webMethod(); this.ctx = ctx; this.returnType = Util.parseType(method.returnType()); - this.useJsonb = useJsonb; } void addImportTypes(ControllerReader reader) { @@ -114,55 +111,37 @@ private void writeEnd() { private void writeSyncResponse() { writer.append(" "); - writeResponse(returnType); + String type0 = returnType.mainType(); + String type1 = returnType.param0(); + writeResponse(type0, type1); } private void writeAsyncResponse() { writer.append(" .async()"); - writeResponse(UType.parse(returnType.param0())); + String type0 = returnType.param0(); + String type1 = returnType.param1(); + writeResponse(type0, type1); } private void writeCallResponse() { writer.append(" .call()"); - writeResponse(UType.parse(returnType.param0())); + String type0 = returnType.param0(); + String type1 = returnType.param1(); + writeResponse(type0, type1); } - private void writeResponse(UType type) { - final var mainType = type.mainType(); - final var param1 = type.paramRaw(); - if (isList(mainType)) { - writer.append(".list("); - writeGeneric(UType.parse(param1)); - } else if (isStream(mainType)) { - writer.append(".stream("); - writeGeneric(UType.parse(param1)); - } else if (isHttpResponse(mainType)) { + private void writeResponse(String type0, String type1) { + if (isList(type0)) { + writer.append(".list(%s.class);", Util.shortName(type1)).eol(); + } else if (isStream(type0)) { + writer.append(".stream(%s.class);", Util.shortName(type1)).eol(); + } else if (isHttpResponse(type0)){ writeWithHandler(); } else { - writer.append(".bean(", Util.shortName(mainType)).eol(); - writeGeneric(type); + writer.append(".bean(%s.class);", Util.shortName(type0)).eol(); } } - void writeGeneric(UType type) { - if (useJsonb && type.isGeneric()) { - final var params = - type.importTypes().stream() - .skip(1) - .map(Util::shortName) - .collect(Collectors.joining(".class, ")) - + ".class"; - - writer.append( - "Types.newParameterizedType(%s.class, %s)", Util.shortName(type.mainType()), params); - } else { - writer.append("%s.class", Util.shortName(type.mainType())); - } - writer.append(");"); - - writer.eol(); - } - private void writeWithHandler() { if (bodyHandlerParam != null) { writer.append(".handler(%s);", bodyHandlerParam.name()).eol(); diff --git a/http-generator-client/src/main/java/io/avaje/http/generator/client/ClientProcessor.java b/http-generator-client/src/main/java/io/avaje/http/generator/client/ClientProcessor.java index 14f297d03..0a8b68605 100644 --- a/http-generator-client/src/main/java/io/avaje/http/generator/client/ClientProcessor.java +++ b/http-generator-client/src/main/java/io/avaje/http/generator/client/ClientProcessor.java @@ -27,21 +27,6 @@ public class ClientProcessor extends AbstractProcessor { protected ProcessingContext ctx; - private boolean useJsonB; - - public ClientProcessor() { - try { - Class.forName("io.avaje.jsonb.Jsonb"); - this.useJsonB = true; - } catch (final ClassNotFoundException e) { - this.useJsonB = false; - } - } - - public ClientProcessor(boolean useJsonb) { - useJsonB = useJsonb; - } - @Override public SourceVersion getSupportedSourceVersion() { return SourceVersion.latest(); @@ -122,7 +107,7 @@ private void writeClient(Element controller) { } protected String writeClientAdapter(ProcessingContext ctx, ControllerReader reader) throws IOException { - return new ClientWriter(reader, ctx,useJsonB).write(); + return new ClientWriter(reader, ctx).write(); } } diff --git a/http-generator-client/src/main/java/io/avaje/http/generator/client/ClientWriter.java b/http-generator-client/src/main/java/io/avaje/http/generator/client/ClientWriter.java index 6f465bd73..26dd12a6a 100644 --- a/http-generator-client/src/main/java/io/avaje/http/generator/client/ClientWriter.java +++ b/http-generator-client/src/main/java/io/avaje/http/generator/client/ClientWriter.java @@ -21,15 +21,12 @@ class ClientWriter extends BaseControllerWriter { private static final String SUFFIX = "HttpClient"; private final List methodList = new ArrayList<>(); - private final boolean useJsonb; - ClientWriter(ControllerReader reader, ProcessingContext ctx, boolean useJsonB) throws IOException { + ClientWriter(ControllerReader reader, ProcessingContext ctx) throws IOException { super(reader, ctx, SUFFIX); reader.addImportType(HTTP_CLIENT_CONTEXT); reader.addImportType(HTTP_API_PROVIDER); - this.useJsonb = useJsonB; readMethods(); - if (useJsonB) reader.addImportType("io.avaje.jsonb.Types"); } @Override @@ -41,7 +38,7 @@ protected String initPackageName(String originName) { private void readMethods() { for (MethodReader method : reader.methods()) { if (method.isWebMethod()) { - final var methodWriter = new ClientMethodWriter(method, writer, ctx, useJsonb); + ClientMethodWriter methodWriter = new ClientMethodWriter(method, writer, ctx); methodWriter.addImportTypes(reader); methodList.add(methodWriter); } From 16efcd9cdfce5dc16079a34fa8ecd6c72c6fa1b7 Mon Sep 17 00:00:00 2001 From: Josiah Noel <32279667+SentryMan@users.noreply.github.com> Date: Wed, 28 Dec 2022 20:43:47 -0500 Subject: [PATCH 09/13] fix tests --- .../src/main/java/io/avaje/http/generator/core/UType.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/http-generator-core/src/main/java/io/avaje/http/generator/core/UType.java b/http-generator-core/src/main/java/io/avaje/http/generator/core/UType.java index 8caa66bba..929658194 100644 --- a/http-generator-core/src/main/java/io/avaje/http/generator/core/UType.java +++ b/http-generator-core/src/main/java/io/avaje/http/generator/core/UType.java @@ -11,6 +11,10 @@ public interface UType { static UType parse(TypeMirror type) { return Util.parseType(type); } + /** Create the UType from the given String. */ + static UType parse(String type) { + return Util.parse(type); + } UType VOID = new VoidType(); @@ -49,7 +53,7 @@ default String param1() { } /** Return the raw generic parameter if this UType is a Collection. */ - default String paramRaw() { + default UType paramRaw() { return null; } From 32cb46e63fd0950cb961fd385ec6c6b5143227d1 Mon Sep 17 00:00:00 2001 From: Josiah Noel <32279667+SentryMan@users.noreply.github.com> Date: Wed, 28 Dec 2022 22:06:17 -0500 Subject: [PATCH 10/13] Client is good now --- .../generator/client/ClientMethodWriter.java | 54 +++++++++++++------ .../generator/client/ClientProcessor.java | 17 +++++- .../http/generator/client/ClientWriter.java | 7 ++- .../avaje/http/generator/core/JsonBUtil.java | 10 ++-- .../io/avaje/http/generator/core/UType.java | 2 +- 5 files changed, 64 insertions(+), 26 deletions(-) diff --git a/http-generator-client/src/main/java/io/avaje/http/generator/client/ClientMethodWriter.java b/http-generator-client/src/main/java/io/avaje/http/generator/client/ClientMethodWriter.java index 0f6b782a4..a45c2308d 100644 --- a/http-generator-client/src/main/java/io/avaje/http/generator/client/ClientMethodWriter.java +++ b/http-generator-client/src/main/java/io/avaje/http/generator/client/ClientMethodWriter.java @@ -4,6 +4,7 @@ import javax.lang.model.element.TypeElement; import java.util.Set; +import java.util.stream.Collectors; /** * Write code to register Web route for a given controller method. @@ -22,13 +23,15 @@ class ClientMethodWriter { private final UType returnType; private MethodParam bodyHandlerParam; private String methodGenericParams = ""; + private final boolean useJsonb; - ClientMethodWriter(MethodReader method, Append writer, ProcessingContext ctx) { + ClientMethodWriter(MethodReader method, Append writer, ProcessingContext ctx, boolean useJsonb) { this.method = method; this.writer = writer; this.webMethod = method.webMethod(); this.ctx = ctx; this.returnType = Util.parseType(method.returnType()); + this.useJsonb = useJsonb; } void addImportTypes(ControllerReader reader) { @@ -111,37 +114,54 @@ private void writeEnd() { private void writeSyncResponse() { writer.append(" "); - String type0 = returnType.mainType(); - String type1 = returnType.param0(); - writeResponse(type0, type1); + writeResponse(returnType); } private void writeAsyncResponse() { writer.append(" .async()"); - String type0 = returnType.param0(); - String type1 = returnType.param1(); - writeResponse(type0, type1); + writeResponse(returnType.paramRaw()); } private void writeCallResponse() { writer.append(" .call()"); - String type0 = returnType.param0(); - String type1 = returnType.param1(); - writeResponse(type0, type1); + writeResponse(returnType.paramRaw()); } - private void writeResponse(String type0, String type1) { - if (isList(type0)) { - writer.append(".list(%s.class);", Util.shortName(type1)).eol(); - } else if (isStream(type0)) { - writer.append(".stream(%s.class);", Util.shortName(type1)).eol(); - } else if (isHttpResponse(type0)){ + private void writeResponse(UType type) { + final var mainType = type.mainType(); + final var param1 = type.paramRaw(); + if (isList(mainType)) { + writer.append(".list("); + writeGeneric(param1); + } else if (isStream(mainType)) { + writer.append(".stream("); + writeGeneric(param1); + } else if (isHttpResponse(mainType)) { writeWithHandler(); } else { - writer.append(".bean(%s.class);", Util.shortName(type0)).eol(); + writer.append(".bean(").eol(); + writeGeneric(type); } } + void writeGeneric(UType type) { + if (useJsonb && type.isGeneric()) { + final var params = + type.importTypes().stream() + .skip(1) + .map(Util::shortName) + .collect(Collectors.joining(".class, ")); + + writer.append( + "Types.newParameterizedType(%s.class, %s.class)", Util.shortName(type.mainType()), params); + } else { + writer.append("%s.class", Util.shortName(type.mainType())); + } + writer.append(");"); + + writer.eol(); + } + private void writeWithHandler() { if (bodyHandlerParam != null) { writer.append(".handler(%s);", bodyHandlerParam.name()).eol(); diff --git a/http-generator-client/src/main/java/io/avaje/http/generator/client/ClientProcessor.java b/http-generator-client/src/main/java/io/avaje/http/generator/client/ClientProcessor.java index 0a8b68605..14f297d03 100644 --- a/http-generator-client/src/main/java/io/avaje/http/generator/client/ClientProcessor.java +++ b/http-generator-client/src/main/java/io/avaje/http/generator/client/ClientProcessor.java @@ -27,6 +27,21 @@ public class ClientProcessor extends AbstractProcessor { protected ProcessingContext ctx; + private boolean useJsonB; + + public ClientProcessor() { + try { + Class.forName("io.avaje.jsonb.Jsonb"); + this.useJsonB = true; + } catch (final ClassNotFoundException e) { + this.useJsonB = false; + } + } + + public ClientProcessor(boolean useJsonb) { + useJsonB = useJsonb; + } + @Override public SourceVersion getSupportedSourceVersion() { return SourceVersion.latest(); @@ -107,7 +122,7 @@ private void writeClient(Element controller) { } protected String writeClientAdapter(ProcessingContext ctx, ControllerReader reader) throws IOException { - return new ClientWriter(reader, ctx).write(); + return new ClientWriter(reader, ctx,useJsonB).write(); } } diff --git a/http-generator-client/src/main/java/io/avaje/http/generator/client/ClientWriter.java b/http-generator-client/src/main/java/io/avaje/http/generator/client/ClientWriter.java index 26dd12a6a..6f465bd73 100644 --- a/http-generator-client/src/main/java/io/avaje/http/generator/client/ClientWriter.java +++ b/http-generator-client/src/main/java/io/avaje/http/generator/client/ClientWriter.java @@ -21,12 +21,15 @@ class ClientWriter extends BaseControllerWriter { private static final String SUFFIX = "HttpClient"; private final List methodList = new ArrayList<>(); + private final boolean useJsonb; - ClientWriter(ControllerReader reader, ProcessingContext ctx) throws IOException { + ClientWriter(ControllerReader reader, ProcessingContext ctx, boolean useJsonB) throws IOException { super(reader, ctx, SUFFIX); reader.addImportType(HTTP_CLIENT_CONTEXT); reader.addImportType(HTTP_API_PROVIDER); + this.useJsonb = useJsonB; readMethods(); + if (useJsonB) reader.addImportType("io.avaje.jsonb.Types"); } @Override @@ -38,7 +41,7 @@ protected String initPackageName(String originName) { private void readMethods() { for (MethodReader method : reader.methods()) { if (method.isWebMethod()) { - ClientMethodWriter methodWriter = new ClientMethodWriter(method, writer, ctx); + final var methodWriter = new ClientMethodWriter(method, writer, ctx, useJsonb); methodWriter.addImportTypes(reader); methodList.add(methodWriter); } 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 13c043a05..f338f69d0 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 @@ -72,13 +72,13 @@ static void writeType(UType type, Append writer) { if (type.isGeneric()) { final var params = type.importTypes().stream() - .skip(1) - .map(Util::shortName) - .collect(Collectors.joining(".class, ")) - + ".class"; + .skip(1) + .map(Util::shortName) + .collect(Collectors.joining(".class, ")); writer.append( - "Types.newParameterizedType(%s.class, %s))", Util.shortName(type.mainType()), params); + "Types.newParameterizedType(%s.class, %s.class))", + Util.shortName(type.mainType()), params); } else { writer.append("%s.class)", Util.shortName(type.mainType())); } diff --git a/http-generator-core/src/main/java/io/avaje/http/generator/core/UType.java b/http-generator-core/src/main/java/io/avaje/http/generator/core/UType.java index 929658194..e4a4bd20b 100644 --- a/http-generator-core/src/main/java/io/avaje/http/generator/core/UType.java +++ b/http-generator-core/src/main/java/io/avaje/http/generator/core/UType.java @@ -157,8 +157,8 @@ private String extractRawParam() { switch (mainType()) { case "java.util.Set": - case "java.util.Stream": case "java.util.List": + case "java.util.stream.Stream": case "java.util.concurrent.CompletableFuture": case "io.avaje.http.client.HttpCall": var first = rawType.indexOf("<") + 1; From a6f74a9cbdeaf13a51b8e028d2eb32ebc6ca309a Mon Sep 17 00:00:00 2001 From: Josiah Noel <32279667+SentryMan@users.noreply.github.com> Date: Mon, 2 Jan 2023 15:25:24 -0600 Subject: [PATCH 11/13] Update generated sources --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index c13cc5321..1f4333e94 100644 --- a/README.md +++ b/README.md @@ -231,13 +231,13 @@ If [Avaje-Jsonb](https://github.com/avaje/avaje-jsonb) is detected, http generat public class WidgetController$Route implements WebRoutes { private final WidgetController controller; - private final JsonType> listWidgetJsonType; - private final JsonType widgetJsonType; + private final JsonType> listWidgetJsonType; + private final JsonType widgetJsonType; public WidgetController$Route(WidgetController controller, Jsonb jsonB) { this.controller = controller; - this.listWidgetJsonType = jsonB.type(org.example.hello.WidgetController.Widget.class).list(); - this.widgetJsonType = jsonB.type(org.example.hello.WidgetController.Widget.class); + this.listWidgetJsonType = jsonB.type(Widget.class).list(); + this.widgetJsonType = jsonB.type(Widget.class); } @Override From ce90612d0ebec791c9fc4b83bf6f25ebc6610b45 Mon Sep 17 00:00:00 2001 From: Josiah Noel <32279667+SentryMan@users.noreply.github.com> Date: Mon, 2 Jan 2023 19:18:55 -0500 Subject: [PATCH 12/13] final jsonb --- .../avaje/http/generator/client/ClientMethodWriter.java | 2 +- .../io/avaje/http/generator/client/ClientProcessor.java | 9 +++++---- .../avaje/http/generator/javalin/JavalinProcessor.java | 7 ++++--- .../avaje/http/generator/helidon/nima/NimaProcessor.java | 7 ++++--- 4 files changed, 14 insertions(+), 11 deletions(-) diff --git a/http-generator-client/src/main/java/io/avaje/http/generator/client/ClientMethodWriter.java b/http-generator-client/src/main/java/io/avaje/http/generator/client/ClientMethodWriter.java index a45c2308d..927ad5fe7 100644 --- a/http-generator-client/src/main/java/io/avaje/http/generator/client/ClientMethodWriter.java +++ b/http-generator-client/src/main/java/io/avaje/http/generator/client/ClientMethodWriter.java @@ -139,7 +139,7 @@ private void writeResponse(UType type) { } else if (isHttpResponse(mainType)) { writeWithHandler(); } else { - writer.append(".bean(").eol(); + writer.append(".bean("); writeGeneric(type); } } diff --git a/http-generator-client/src/main/java/io/avaje/http/generator/client/ClientProcessor.java b/http-generator-client/src/main/java/io/avaje/http/generator/client/ClientProcessor.java index 14f297d03..c3f4010bf 100644 --- a/http-generator-client/src/main/java/io/avaje/http/generator/client/ClientProcessor.java +++ b/http-generator-client/src/main/java/io/avaje/http/generator/client/ClientProcessor.java @@ -27,15 +27,16 @@ public class ClientProcessor extends AbstractProcessor { protected ProcessingContext ctx; - private boolean useJsonB; + private final boolean useJsonB; public ClientProcessor() { + var jsonBOnClassPath = false; try { Class.forName("io.avaje.jsonb.Jsonb"); - this.useJsonB = true; + jsonBOnClassPath = true; } catch (final ClassNotFoundException e) { - this.useJsonB = false; } + useJsonB = jsonBOnClassPath; } public ClientProcessor(boolean useJsonb) { @@ -122,7 +123,7 @@ private void writeClient(Element controller) { } protected String writeClientAdapter(ProcessingContext ctx, ControllerReader reader) throws IOException { - return new ClientWriter(reader, ctx,useJsonB).write(); + return new ClientWriter(reader, ctx, useJsonB).write(); } } diff --git a/http-generator-javalin/src/main/java/io/avaje/http/generator/javalin/JavalinProcessor.java b/http-generator-javalin/src/main/java/io/avaje/http/generator/javalin/JavalinProcessor.java index 4d6285675..ef65ccdf9 100644 --- a/http-generator-javalin/src/main/java/io/avaje/http/generator/javalin/JavalinProcessor.java +++ b/http-generator-javalin/src/main/java/io/avaje/http/generator/javalin/JavalinProcessor.java @@ -9,15 +9,16 @@ public class JavalinProcessor extends BaseProcessor { - private boolean useJsonB; + private final boolean useJsonB; public JavalinProcessor() { + var jsonBOnClassPath = false; try { Class.forName("io.avaje.jsonb.Jsonb"); - this.useJsonB = true; + jsonBOnClassPath = true; } catch (final ClassNotFoundException e) { - this.useJsonB = false; } + useJsonB = jsonBOnClassPath; } public JavalinProcessor(boolean useJsonb) { diff --git a/http-generator-nima/src/main/java/io/avaje/http/generator/helidon/nima/NimaProcessor.java b/http-generator-nima/src/main/java/io/avaje/http/generator/helidon/nima/NimaProcessor.java index c65a83b6a..cf3464093 100644 --- a/http-generator-nima/src/main/java/io/avaje/http/generator/helidon/nima/NimaProcessor.java +++ b/http-generator-nima/src/main/java/io/avaje/http/generator/helidon/nima/NimaProcessor.java @@ -9,15 +9,16 @@ public class NimaProcessor extends BaseProcessor { - private boolean jsonB; + private final boolean jsonB; public NimaProcessor() { + var jsonBOnClassPath = false; try { Class.forName("io.avaje.jsonb.Jsonb"); - this.jsonB = true; + jsonBOnClassPath = true; } catch (final ClassNotFoundException e) { - this.jsonB = false; } + jsonB = jsonBOnClassPath; } public NimaProcessor(boolean useJsonb) { From e6069bb071cccb05535e4d373e46d4e880d02d5f Mon Sep 17 00:00:00 2001 From: Josiah Noel <32279667+SentryMan@users.noreply.github.com> Date: Thu, 5 Jan 2023 11:10:11 -0500 Subject: [PATCH 13/13] Update ControllerMethodWriter.java --- .../io/avaje/http/generator/helidon/ControllerMethodWriter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/http-generator-helidon/src/main/java/io/avaje/http/generator/helidon/ControllerMethodWriter.java b/http-generator-helidon/src/main/java/io/avaje/http/generator/helidon/ControllerMethodWriter.java index e2df2842e..a43192644 100644 --- a/http-generator-helidon/src/main/java/io/avaje/http/generator/helidon/ControllerMethodWriter.java +++ b/http-generator-helidon/src/main/java/io/avaje/http/generator/helidon/ControllerMethodWriter.java @@ -103,7 +103,7 @@ private void writeContextReturn() { } else if (MediaType.TEXT_PLAIN.equalsIgnoreCase(produces)) { writer.append(" res.writerContext().contentType(io.helidon.common.http.MediaType.TEXT_PLAIN);").eol(); } else { - writer.append( "res.writerContext().contentType(io.helidon.common.http.MediaType.parse(\"%s\"));", produces).eol(); + writer.append(" res.writerContext().contentType(io.helidon.common.http.MediaType.parse(\"%s\"));", produces).eol(); } }