22
33import static io .avaje .http .generator .core .ParamType .RESPONSE_HANDLER ;
44
5+ import java .util .List ;
6+ import java .util .Objects ;
57import java .util .Optional ;
68
79import javax .lang .model .element .Element ;
@@ -24,15 +26,18 @@ public class ElementReader {
2426 private final boolean formMarker ;
2527 private final boolean contextType ;
2628 private final boolean useValidation ;
29+ private final boolean specialParam ;
2730
2831 private String paramName ;
2932 private ParamType paramType ;
3033 private String matrixParamName ;
3134 private boolean impliedParamType ;
32- private String paramDefault ;
35+ private List < String > paramDefault ;
3336
3437 private boolean notNullKotlin ;
35- //private boolean notNullJavax;
38+ private boolean isParamCollection ;
39+ private boolean isParamMap ;
40+ // private boolean notNullJavax;
3641
3742 ElementReader (Element element , ProcessingContext ctx , ParamType defaultType , boolean formMarker ) {
3843 this (element , null , Util .typeDef (element .asType ()), ctx , defaultType , formMarker );
@@ -46,18 +51,14 @@ public class ElementReader {
4651 this .shortType = Util .shortName (rawType );
4752 this .contextType = ctx .platform ().isContextType (rawType );
4853
49- if (type != null
50- && (defaultType == ParamType .FORMPARAM || defaultType == ParamType .QUERYPARAM )
51- && Optional .ofNullable (ctx .typeElement (type .mainType ()))
52- .map (TypeElement ::getKind )
53- .filter (ElementKind .ENUM ::equals )
54- .isPresent ()) {
54+ this .specialParam =
55+ defaultType == ParamType .FORMPARAM
56+ || defaultType == ParamType .QUERYPARAM
57+ || defaultType == ParamType .HEADER
58+ || defaultType == ParamType .COOKIE ;
5559
56- this .typeHandler = TypeMap .enumParamHandler (type );
57- } else {
60+ typeHandler = initTypeHandler ();
5861
59- this .typeHandler = TypeMap .get (rawType );
60- }
6162 this .formMarker = formMarker ;
6263 this .varName = element .getSimpleName ().toString ();
6364 this .snakeName = Util .snakeCase (varName );
@@ -71,6 +72,50 @@ public class ElementReader {
7172 }
7273 }
7374
75+ TypeHandler initTypeHandler () {
76+
77+ if (specialParam ) {
78+
79+ final var typeOp =
80+ Optional .ofNullable (type ).or (() -> Optional .of (UType .parse (element .asType ())));
81+
82+ final var mainTypeEnum =
83+ typeOp
84+ .flatMap (t -> Optional .ofNullable (ctx .typeElement (t .mainType ())))
85+ .map (TypeElement ::getKind )
86+ .filter (ElementKind .ENUM ::equals )
87+ .isPresent ();
88+
89+ final var isCollection =
90+ typeOp
91+ .filter (t -> t .isGeneric () && !t .mainType ().startsWith ("java.util.Map" ))
92+ .isPresent ();
93+
94+ final var isMap =
95+ !isCollection && typeOp .filter (t -> t .mainType ().startsWith ("java.util.Map" )).isPresent ();
96+
97+ if (mainTypeEnum ) {
98+ return TypeMap .enumParamHandler (type );
99+ } else if (isCollection ) {
100+ this .isParamCollection = true ;
101+ final var isEnumCollection =
102+ typeOp
103+ .flatMap (t -> Optional .ofNullable (ctx .typeElement (t .param0 ())))
104+ .map (TypeElement ::getKind )
105+ .filter (ElementKind .ENUM ::equals )
106+ .isPresent ();
107+
108+ return TypeMap .collectionHandler (typeOp .orElseThrow (), isEnumCollection );
109+ } else if (isMap ) {
110+ this .isParamMap = true ;
111+
112+ return new TypeMap .StringHandler ();
113+ }
114+ }
115+
116+ return TypeMap .get (rawType );
117+ }
118+
74119 private boolean useValidation () {
75120 if (typeHandler != null ) {
76121 return false ;
@@ -182,10 +227,8 @@ private String handlerShortType() {
182227
183228 void addImports (ControllerReader bean ) {
184229 if (typeHandler != null ) {
185- String importType = typeHandler .importType ();
186- if (importType != null ) {
187- bean .addImportType (rawType );
188- }
230+ typeHandler .importTypes ().stream ().filter (Objects ::nonNull ).forEach (bean ::addImportType );
231+
189232 } else {
190233 bean .addImportType (rawType );
191234 }
@@ -203,7 +246,7 @@ void writeParamName(Append writer) {
203246 * Build the OpenAPI documentation for this parameter.
204247 */
205248 void buildApiDocumentation (MethodDocBuilder methodDoc ) {
206- if (!isPlatformContext ()) {
249+ if (!isPlatformContext () && ! isParamMap ) {
207250 new MethodParamDocBuilder (methodDoc , this ).build ();
208251 }
209252 }
@@ -285,19 +328,26 @@ private boolean setValue(Append writer, PathSegments segments, String shortType)
285328 // this is a body (POST, PATCH)
286329 writer .append (ctx .platform ().bodyAsClass (type ));
287330
288- } else {
331+ } else if ( isParamCollection && specialParam ) {
289332 if (hasParamDefault ()) {
290- ctx .platform ().writeReadParameter (writer , paramType , paramName , paramDefault );
333+ ctx .platform ().writeReadCollectionParameter (writer , paramType , paramName , paramDefault );
291334 } else {
292- boolean checkNull = notNullKotlin || (paramType == ParamType .FORMPARAM && typeHandler .isPrimitive ());
293- if (checkNull ) {
294- writer .append ("checkNull(" );
295- }
296- ctx .platform ().writeReadParameter (writer , paramType , paramName );
297- //writer.append("ctx.%s(\"%s\")", paramType, paramName);
298- if (checkNull ) {
299- writer .append (", \" %s\" )" , paramName );
300- }
335+ ctx .platform ().writeReadCollectionParameter (writer , paramType , paramName );
336+ }
337+ } else if (isParamMap ) {
338+ ctx .platform ().writeReadMapParameter (writer , paramType );
339+ } else if (hasParamDefault ()) {
340+ ctx .platform ().writeReadParameter (writer , paramType , paramName , paramDefault .get (0 ));
341+ } else {
342+ final var checkNull =
343+ notNullKotlin || (paramType == ParamType .FORMPARAM && typeHandler .isPrimitive ());
344+ if (checkNull ) {
345+ writer .append ("checkNull(" );
346+ }
347+ ctx .platform ().writeReadParameter (writer , paramType , paramName );
348+ // writer.append("ctx.%s(\"%s\")", paramType, paramName);
349+ if (checkNull ) {
350+ writer .append (", \" %s\" )" , paramName );
301351 }
302352 }
303353
0 commit comments