Skip to content

Commit 676176e

Browse files
committed
support Map parameters
1 parent 46fca58 commit 676176e

File tree

10 files changed

+89
-33
lines changed

10 files changed

+89
-33
lines changed

http-generator-client/src/main/java/io/avaje/http/generator/client/ClientPlatformAdapter.java

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -54,17 +54,4 @@ public void writeReadParameter(Append writer, ParamType paramType, String paramN
5454
public void writeReadParameter(Append writer, ParamType paramType, String paramName, String paramDefault) {
5555

5656
}
57-
58-
@Override
59-
public void writeReadCollectionParameter(
60-
Append writer, ParamType paramType, String paramName) {
61-
}
62-
63-
@Override
64-
public void writeReadCollectionParameter(
65-
Append writer,
66-
ParamType paramType,
67-
String paramName,
68-
List<String> paramDefault) {
69-
}
7057
}

http-generator-core/src/main/java/io/avaje/http/generator/core/ElementReader.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,8 @@ public class ElementReader {
3636

3737
private boolean notNullKotlin;
3838
private boolean isParamCollection;
39-
//private boolean notNullJavax;
39+
private boolean isParamMap;
40+
// private boolean notNullJavax;
4041

4142
ElementReader(Element element, ProcessingContext ctx, ParamType defaultType, boolean formMarker) {
4243
this(element, null, Util.typeDef(element.asType()), ctx, defaultType, formMarker);
@@ -90,6 +91,9 @@ TypeHandler initTypeHandler() {
9091
.filter(t -> t.isGeneric() && !t.mainType().startsWith("java.util.Map"))
9192
.isPresent();
9293

94+
final var isMap =
95+
!isCollection && typeOp.filter(t -> t.mainType().startsWith("java.util.Map")).isPresent();
96+
9397
if (mainTypeEnum) {
9498
return TypeMap.enumParamHandler(type);
9599
} else if (isCollection) {
@@ -102,6 +106,10 @@ TypeHandler initTypeHandler() {
102106
.isPresent();
103107

104108
return TypeMap.collectionHandler(typeOp.orElseThrow(), isEnumCollection);
109+
} else if (isMap) {
110+
this.isParamMap = true;
111+
112+
return new TypeMap.StringHandler();
105113
}
106114
}
107115

@@ -326,6 +334,8 @@ private boolean setValue(Append writer, PathSegments segments, String shortType)
326334
} else {
327335
ctx.platform().writeReadCollectionParameter(writer, paramType, paramName);
328336
}
337+
} else if (isParamMap) {
338+
ctx.platform().writeReadMapParameter(writer, paramType);
329339
} else if (hasParamDefault()) {
330340
ctx.platform().writeReadParameter(writer, paramType, paramName, paramDefault.get(0));
331341
} else {

http-generator-core/src/main/java/io/avaje/http/generator/core/PlatformAdapter.java

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,19 @@ public interface PlatformAdapter {
4545

4646
void writeReadParameter(Append writer, ParamType paramType, String paramName);
4747

48-
void writeReadParameter(Append writer, ParamType paramType, String paramName, String paramDefault);
48+
void writeReadParameter(
49+
Append writer, ParamType paramType, String paramName, String paramDefault);
4950

50-
void writeReadCollectionParameter(Append writer, ParamType paramType, String paramName);
51+
default void writeReadMapParameter(Append writer, ParamType paramType) {
52+
throw new UnsupportedOperationException("Unsupported Map Parameter");
53+
}
5154

52-
void writeReadCollectionParameter(Append writer, ParamType paramType, String paramName, List<String> paramDefault);
55+
default void writeReadCollectionParameter(Append writer, ParamType paramType, String paramName) {
56+
throw new UnsupportedOperationException("Unsupported MultiValue Parameter");
57+
}
5358

59+
default void writeReadCollectionParameter(
60+
Append writer, ParamType paramType, String paramName, List<String> paramDefault) {
61+
throw new UnsupportedOperationException("Unsupported MultiValue Parameter");
62+
}
5463
}

http-generator-helidon/src/main/java/io/avaje/http/generator/helidon/HelidonPlatformAdapter.java

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,20 @@ public void writeReadParameter(Append writer, ParamType paramType, String paramN
114114
}
115115
}
116116

117+
@Override
118+
public void writeReadMapParameter(Append writer, ParamType paramType) {
119+
switch (paramType) {
120+
case QUERYPARAM:
121+
writer.append("req.queryParams().toMap()");
122+
break;
123+
case COOKIE:
124+
writer.append("req.headers().cookies().toMap()");
125+
break;
126+
default:
127+
throw new UnsupportedOperationException("Unsupported Map Parameter");
128+
}
129+
}
130+
117131
@Override
118132
public void writeReadCollectionParameter(Append writer, ParamType paramType, String paramName) {
119133
switch (paramType) {
@@ -137,16 +151,18 @@ public void writeReadCollectionParameter(
137151
switch (paramType) {
138152
case QUERYPARAM:
139153
writer.append(
140-
"withDefault(req.queryParams().all(\"%s\"), java.util.List.of(\"%s\"))", paramName, String.join(",", paramDefault));
154+
"withDefault(req.queryParams().all(\"%s\"), java.util.List.of(\"%s\"))",
155+
paramName, String.join(",", paramDefault));
141156
break;
142157
case HEADER:
143158
writer.append(
144-
"withDefault(req.headers().all(\"%s\"), java.util.List.of(\"%s\"))", paramName, String.join(",", paramDefault));
159+
"withDefault(req.headers().all(\"%s\"), java.util.List.of(\"%s\"))",
160+
paramName, String.join(",", paramDefault));
145161
break;
146162
case COOKIE:
147163
writer.append(
148-
"withDefault(req.headers().cookies().all(\"%s\"), java.util.List.of\"%s\"))", paramName, String.join(",", paramDefault)
149-
);
164+
"withDefault(req.headers().cookies().all(\"%s\"), java.util.List.of\"%s\"))",
165+
paramName, String.join(",", paramDefault));
150166
break;
151167
default:
152168
throw new UnsupportedOperationException("Unsupported MultiValue Parameter");

http-generator-javalin/src/main/java/io/avaje/http/generator/javalin/JavalinAdapter.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,15 @@ public void writeReadParameter(
6969
writer.append("withDefault(ctx.%s(\"%s\"), \"%s\")", paramType, paramName, paramDefault);
7070
}
7171

72+
@Override
73+
public void writeReadMapParameter(Append writer, ParamType paramType) {
74+
if (paramType != ParamType.QUERYPARAM) {
75+
throw new UnsupportedOperationException(
76+
"Only Query Params have Map<String, List<String>> supported in Javalin");
77+
}
78+
writer.append("ctx.queryParamMap()");
79+
}
80+
7281
@Override
7382
public void writeReadCollectionParameter(Append writer, ParamType paramType, String paramName) {
7483
if (paramType != ParamType.QUERYPARAM) {

http-generator-nima/src/main/java/io/avaje/http/generator/helidon/nima/NimaPlatformAdapter.java

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -100,14 +100,25 @@ public void writeReadParameter(Append writer, ParamType paramType, String paramN
100100
case COOKIE:
101101
writer.append("req.headers().cookies().first(\"%s\").orElse(\"%s\")", paramName, paramDefault);
102102
break;
103-
case BODY:
104-
case BEANPARAM:
105-
case FORM:
106103
default:
107104
writer.append("null // TODO req.%s().param(\"%s\")", paramType.type(), paramName);
108105
}
109106
}
110107

108+
@Override
109+
public void writeReadMapParameter(Append writer, ParamType paramType) {
110+
switch (paramType) {
111+
case QUERYPARAM:
112+
writer.append("req.query().toMap()");
113+
break;
114+
case COOKIE:
115+
writer.append("req.headers().cookies().toMap()");
116+
break;
117+
default:
118+
throw new UnsupportedOperationException("Unsupported Map Parameter");
119+
}
120+
}
121+
111122
@Override
112123
public void writeReadCollectionParameter(Append writer, ParamType paramType, String paramName) {
113124
switch (paramType) {

tests/test-helidon/src/main/java/org/example/TestController.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
package org.example;
22

3+
import java.util.List;
4+
import java.util.Map;
35
import java.util.Set;
46

57
import io.avaje.http.api.Controller;
8+
import io.avaje.http.api.Cookie;
69
import io.avaje.http.api.Default;
710
import io.avaje.http.api.Get;
811
import io.avaje.http.api.Path;
@@ -24,12 +27,17 @@ String enumQuery(@QueryParam @Default("FFA") ServerType type) {
2427
}
2528

2629
@Get("/enumQuery2")
27-
String enumMultiQuery(@QueryParam @Default("FFA") Set<ServerType> type) {
30+
String enumMultiQuery(@QueryParam @Default({"FFA", "PROXY"}) Set<ServerType> type) {
2831
return type.toString();
2932
}
3033

3134
@Post("/enumQueryImplied")
3235
String enumQueryImplied(String s, @QueryParam ServerType type) {
3336
return type.name();
3437
}
38+
39+
@Get("/mapTest")
40+
String mapTest(Map<String, List<String>> strings, @Cookie Map<String, List<String>> cookie) {
41+
return strings.toString();
42+
}
3543
}

tests/test-javalin-jsonb/src/main/java/org/example/myapp/web/test/TestController2.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
package org.example.myapp.web.test;
22

3+
import java.util.List;
4+
import java.util.Map;
35
import java.util.Set;
46

5-
import org.example.myapp.web.HelloDto;
6-
77
import io.avaje.http.api.Controller;
88
import io.avaje.http.api.Default;
99
import io.avaje.http.api.Form;
@@ -34,12 +34,17 @@ String enumQuery(@QueryParam @Default("FFA") ServerType type) {
3434
}
3535

3636
@Get("/enumQuery2")
37-
String enumMultiQuery(@QueryParam @Default("FFA") Set<ServerType> type) {
37+
String enumMultiQuery(@QueryParam @Default({"FFA", "PROXY"}) Set<ServerType> type) {
3838
return type.toString();
3939
}
4040

4141
@Post("/enumQueryImplied")
42-
String enumQueryImplied(HelloDto s, ServerType type) {
42+
String enumQueryImplied(String s, @QueryParam ServerType type) {
4343
return type.name();
4444
}
45+
46+
@Get("/mapTest")
47+
String mapTest(Map<String, List<String>> strings) {
48+
return strings.toString();
49+
}
4550
}

tests/test-jex/src/main/java/org/example/web/TestController.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,13 @@ String enumQuery(@QueryParam @Default("FFA") ServerType type) {
2424
}
2525

2626
@Get("/enumQuery2")
27-
String enumMultiQuery(@QueryParam @Default("FFA") Set<ServerType> type) {
27+
String enumMultiQuery(@QueryParam @Default({"FFA", "PROXY"}) Set<ServerType> type) {
2828
return type.toString();
2929
}
3030

3131
@Post("/enumQueryImplied")
32-
String enumQueryImplied(HelloDto s, @QueryParam ServerType type) {
32+
String enumQueryImplied(String s, @QueryParam ServerType type) {
3333
return type.name();
3434
}
35+
3536
}

tests/test-nima-jsonb/src/main/java/org/example/TestController.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,12 @@ String enumQuery(@QueryParam @Default("FFA") ServerType type) {
3737
}
3838

3939
@Get("/enumQuery2")
40-
String enumMultiQuery(@QueryParam @Default("FFA") Set<ServerType> type) {
40+
String enumMultiQuery(@QueryParam @Default({"FFA", "PROXY"}) Set<ServerType> type) {
4141
return type.toString();
4242
}
4343

4444
@Post("/enumQueryImplied")
45-
String enumQueryImplied(Person s, @QueryParam ServerType type) {
45+
String enumQueryImplied(String s, @QueryParam ServerType type) {
4646
return type.name();
4747
}
4848
}

0 commit comments

Comments
 (0)