1
1
package io .avaje .http .generator .jex ;
2
2
3
3
import java .util .List ;
4
+ import java .util .stream .Collectors ;
4
5
5
6
import io .avaje .http .generator .core .Append ;
6
7
import io .avaje .http .generator .core .Constants ;
9
10
import io .avaje .http .generator .core .PlatformAdapter ;
10
11
import io .avaje .http .generator .core .ProcessingContext ;
11
12
import io .avaje .http .generator .core .UType ;
13
+ import io .avaje .http .generator .core .Util ;
12
14
13
15
class JexAdapter implements PlatformAdapter {
14
16
@@ -31,19 +33,59 @@ public boolean isBodyMethodParam() {
31
33
32
34
@ Override
33
35
public String bodyAsClass (UType type ) {
34
-
35
36
if ("java.io.InputStream" .equals (type .full ())) {
36
37
return "ctx.bodyAsInputStream()" ;
37
38
} else if ("java.lang.String" .equals (type .full ())) {
38
39
return "ctx.body()" ;
39
40
} else if ("byte[]" .equals (type .full ())) {
40
41
return "ctx.bodyAsBytes()" ;
42
+ } else if (type .isGeneric () && ProcessingContext .useJsonb ()) {
43
+ return "ctx.<%s>bodyAsType(%s)" .formatted (type .shortType (), writeJsonbType (type ));
41
44
} else if (ProcessingContext .useJsonb ()) {
42
- return type . shortName () + "JsonType.fromJson(ctx.bodyAsInputStream ())" ;
45
+ return "ctx.bodyAsClass(%s.class)" . formatted ( type . shortType ());
43
46
}
44
47
return "ctx.bodyAsClass(" + type .mainType () + ".class)" ;
45
48
}
46
49
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
+
47
89
@ Override
48
90
public String indent () {
49
91
return " " ;
0 commit comments