11package io .avaje .http .generator .jex ;
22
33import java .util .List ;
4+ import java .util .stream .Collectors ;
45
56import io .avaje .http .generator .core .Append ;
67import io .avaje .http .generator .core .Constants ;
910import io .avaje .http .generator .core .PlatformAdapter ;
1011import io .avaje .http .generator .core .ProcessingContext ;
1112import io .avaje .http .generator .core .UType ;
13+ import io .avaje .http .generator .core .Util ;
1214
1315class JexAdapter implements PlatformAdapter {
1416
@@ -31,19 +33,59 @@ public boolean isBodyMethodParam() {
3133
3234 @ Override
3335 public String bodyAsClass (UType type ) {
34-
3536 if ("java.io.InputStream" .equals (type .full ())) {
3637 return "ctx.bodyAsInputStream()" ;
3738 } else if ("java.lang.String" .equals (type .full ())) {
3839 return "ctx.body()" ;
3940 } else if ("byte[]" .equals (type .full ())) {
4041 return "ctx.bodyAsBytes()" ;
42+ } else if (type .isGeneric () && ProcessingContext .useJsonb ()) {
43+ return "ctx.<%s>bodyAsType(%s)" .formatted (type .shortType (), writeJsonbType (type ));
4144 } else if (ProcessingContext .useJsonb ()) {
42- return type . shortName () + "JsonType.fromJson(ctx.bodyAsInputStream ())" ;
45+ return "ctx.bodyAsClass(%s.class)" . formatted ( type . shortType ());
4346 }
4447 return "ctx.bodyAsClass(" + type .mainType () + ".class)" ;
4548 }
4649
50+ public static String writeJsonbType (UType type ) {
51+ var writer = new StringBuilder ();
52+
53+ switch (type .mainType ()) {
54+ case "java.util.List" :
55+ writeType (type .paramRaw (), writer );
56+ writer .append (".list()" );
57+ break ;
58+ case "java.util.Set" :
59+ writeType (type .paramRaw (), writer );
60+ writer .append (".set()" );
61+ break ;
62+ case "java.util.Map" :
63+ writeType (type .paramRaw (), writer );
64+ writer .append (".map()" );
65+ break ;
66+ default : {
67+ if (type .mainType ().contains ("java.util" )) {
68+ throw new UnsupportedOperationException (
69+ "Only java.util Map, Set and List are supported JsonB Controller Collection Types" );
70+ }
71+ writeType (type , writer );
72+ }
73+ }
74+ return writer .toString ();
75+ }
76+
77+ static void writeType (UType type , StringBuilder writer ) {
78+ final var params =
79+ type .params ().stream ()
80+ .map (Util ::shortName )
81+ .map (s -> "?" .equals (s ) ? "Object" : s )
82+ .collect (Collectors .joining (".class, " ));
83+
84+ writer .append (
85+ "Types.newParameterizedType(%s.class, %s.class)"
86+ .formatted (Util .shortName (type .mainType ()), params ));
87+ }
88+
4789 @ Override
4890 public String indent () {
4991 return " " ;
0 commit comments