Skip to content

Commit 675fc91

Browse files
committed
#63 - Add support for HttpResponse.BodyHandler with and without generic parameters
1 parent b4684f8 commit 675fc91

File tree

4 files changed

+76
-5
lines changed

4 files changed

+76
-5
lines changed

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ class ClientMethodWriter {
2121
private final ProcessingContext ctx;
2222
private final UType returnType;
2323
private MethodParam bodyHandlerParam;
24+
private String methodGenericParams = "";
2425

2526
ClientMethodWriter(MethodReader method, Append writer, ProcessingContext ctx) {
2627
this.method = method;
@@ -43,7 +44,7 @@ private void methodStart(Append writer) {
4344
}
4445
writer.append(" // %s %s", webMethod, method.getWebMethodPath()).eol();
4546
writer.append(" @Override").eol();
46-
writer.append(" public %s %s(", returnType.shortType(), method.simpleName());
47+
writer.append(" public %s%s %s(", methodGenericParams, returnType.shortType(), method.simpleName());
4748
int count = 0;
4849
for (MethodParam param : method.getParams()) {
4950
if (count++ > 0) {
@@ -61,7 +62,7 @@ private void methodStart(Append writer) {
6162
private void checkBodyHandler(MethodParam param) {
6263
if (param.getRawType().startsWith(BODY_HANDLER)) {
6364
bodyHandlerParam = param;
64-
param.getUType().param0();
65+
methodGenericParams = param.getUType().genericParams();
6566
}
6667
}
6768

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

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,10 @@ default String param1() {
4040
*/
4141
String full();
4242

43+
default String genericParams() {
44+
return "";
45+
}
46+
4347
class VoidType implements UType {
4448

4549
@Override
@@ -129,13 +133,25 @@ public String full() {
129133
public Set<String> importTypes() {
130134
Set<String> set = new LinkedHashSet<>();
131135
for (String type : allTypes) {
132-
if (!type.startsWith("java.lang.")) {
136+
if (!type.startsWith("java.lang.") && type.indexOf('.') > -1) {
133137
set.add(type);
134138
}
135139
}
136140
return set;
137141
}
138142

143+
@Override
144+
public String genericParams() {
145+
final StringJoiner joiner = new StringJoiner(",");
146+
for (String type : allTypes) {
147+
if (type.indexOf('.') == -1) {
148+
joiner.add(type);
149+
}
150+
}
151+
final String commaDelim = joiner.toString();
152+
return commaDelim.isEmpty() ? "" : "<" + commaDelim + "> ";
153+
}
154+
139155
@Override
140156
public String shortType() {
141157
return shortRawType;

http-generator-core/src/test/java/io/avaje/http/generator/core/UtilTest.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,4 +129,40 @@ void parse_CompletableFutureStreamBean() {
129129
assertThat(type.importTypes()).containsExactly("java.util.concurrent.CompletableFuture", "java.util.Stream", "org.example.Repo");
130130
assertThat(type.shortType()).isEqualTo("CompletableFuture<Stream<Repo>>");
131131
}
132+
133+
@Test
134+
void parse_BodyHandler_E() {
135+
UType type = Util.parse("java.net.http.HttpResponse.BodyHandler<E>");
136+
137+
assertThat(type.importTypes()).containsExactly("java.net.http.HttpResponse.BodyHandler");
138+
assertThat(type.shortType()).isEqualTo("BodyHandler<E>");
139+
assertThat(type.genericParams()).isEqualTo("<E> ");
140+
}
141+
142+
@Test
143+
void parse_BodyHandler_Path() {
144+
UType type = Util.parse("java.net.http.HttpResponse.BodyHandler<java.util.Path>");
145+
146+
assertThat(type.importTypes()).containsExactly("java.net.http.HttpResponse.BodyHandler", "java.util.Path");
147+
assertThat(type.shortType()).isEqualTo("BodyHandler<Path>");
148+
assertThat(type.genericParams()).isEqualTo("");
149+
}
150+
151+
@Test
152+
void parse_BodyHandler_Multi() {
153+
UType type = Util.parse("java.net.http.HttpResponse.BodyHandler<some.Foo<A,B>>");
154+
155+
assertThat(type.importTypes()).containsExactly("java.net.http.HttpResponse.BodyHandler", "some.Foo");
156+
assertThat(type.shortType()).isEqualTo("BodyHandler<Foo<A,B>>");
157+
assertThat(type.genericParams()).isEqualTo("<A,B> ");
158+
}
159+
160+
@Test
161+
void parse_BodyHandler_Multi2() {
162+
UType type = Util.parse("java.net.http.HttpResponse.BodyHandler<some.Foo<AB,BC,some.Bar<D>>>");
163+
164+
assertThat(type.importTypes()).containsExactly("java.net.http.HttpResponse.BodyHandler", "some.Foo", "some.Bar");
165+
assertThat(type.shortType()).isEqualTo("BodyHandler<Foo<AB,BC,Bar<D>>>");
166+
assertThat(type.genericParams()).isEqualTo("<AB,BC,D> ");
167+
}
132168
}

tests/test-client/src/main/java/org/example/JunkApi.java

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
package org.example;
22

33
import io.avaje.http.api.Client;
4+
import io.avaje.http.api.Get;
45
import io.avaje.http.api.Post;
56
import io.avaje.http.client.HttpCall;
67

78
import java.io.InputStream;
89
import java.net.http.HttpResponse;
10+
import java.nio.file.Path;
911
import java.util.List;
1012
import java.util.concurrent.CompletableFuture;
1113
import java.util.stream.Stream;
@@ -88,6 +90,22 @@ public interface JunkApi {
8890
@Post
8991
HttpCall<HttpResponse<Stream<String>>> callLines();
9092

91-
// @Get
92-
// <E> HttpResponse<E> withH(HttpResponse.BodyHandler<E> handler);
93+
@Get
94+
<E> HttpResponse<E> withHandGeneric(HttpResponse.BodyHandler<E> handler);
95+
96+
@Get
97+
HttpResponse<Path> withHandPath(HttpResponse.BodyHandler<Path> handler);
98+
99+
@Get
100+
<E> CompletableFuture<HttpResponse<E>> cfWithHandGeneric(HttpResponse.BodyHandler<E> handler);
101+
102+
@Get
103+
CompletableFuture<HttpResponse<Path>> cfWithHandPath(HttpResponse.BodyHandler<Path> handler);
104+
105+
@Get
106+
<E> HttpCall<HttpResponse<E>> callWithHandGeneric(HttpResponse.BodyHandler<E> handler);
107+
108+
@Get
109+
HttpCall<HttpResponse<Path>> callWithHandPath(HttpResponse.BodyHandler<Path> handler);
110+
93111
}

0 commit comments

Comments
 (0)