Skip to content

Commit 7c283af

Browse files
committed
heh, forgot about the async and httpcall
1 parent eaf2295 commit 7c283af

File tree

5 files changed

+156
-6
lines changed

5 files changed

+156
-6
lines changed

client/src/main/java/io/avaje/http/client/DHttpAsync.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package io.avaje.http.client;
22

33
import java.io.InputStream;
4+
import java.lang.reflect.ParameterizedType;
45
import java.net.http.HttpResponse;
56
import java.util.List;
67
import java.util.concurrent.CompletableFuture;
@@ -78,4 +79,25 @@ public <E> CompletableFuture<Stream<E>> stream(Class<E> type) {
7879
.performSendAsync(false, HttpResponse.BodyHandlers.ofLines())
7980
.thenApply(httpResponse -> request.asyncStream(type, httpResponse));
8081
}
82+
83+
@Override
84+
public <E> CompletableFuture<E> bean(ParameterizedType type) {
85+
return request
86+
.performSendAsync(true, HttpResponse.BodyHandlers.ofByteArray())
87+
.thenApply(httpResponse -> request.asyncBean(type, httpResponse));
88+
}
89+
90+
@Override
91+
public <E> CompletableFuture<List<E>> list(ParameterizedType type) {
92+
return request
93+
.performSendAsync(true, HttpResponse.BodyHandlers.ofByteArray())
94+
.thenApply(httpResponse -> request.asyncList(type, httpResponse));
95+
}
96+
97+
@Override
98+
public <E> CompletableFuture<Stream<E>> stream(ParameterizedType type) {
99+
return request
100+
.performSendAsync(false, HttpResponse.BodyHandlers.ofLines())
101+
.thenApply(httpResponse -> request.asyncStream(type, httpResponse));
102+
}
81103
}

client/src/main/java/io/avaje/http/client/DHttpCall.java

Lines changed: 61 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package io.avaje.http.client;
22

33
import java.io.InputStream;
4+
import java.lang.reflect.ParameterizedType;
45
import java.net.http.HttpResponse;
56
import java.util.List;
67
import java.util.concurrent.CompletableFuture;
@@ -64,6 +65,21 @@ public <E> HttpCall<Stream<E>> stream(Class<E> type) {
6465
return new CallStream<>(type);
6566
}
6667

68+
@Override
69+
public <E> HttpCall<E> bean(ParameterizedType type) {
70+
return new CallBean<>(type);
71+
}
72+
73+
@Override
74+
public <E> HttpCall<List<E>> list(ParameterizedType type) {
75+
return new CallList<>(type);
76+
}
77+
78+
@Override
79+
public <E> HttpCall<Stream<E>> stream(ParameterizedType type) {
80+
return new CallStream<>(type);
81+
}
82+
6783
private class CallVoid implements HttpCall<HttpResponse<Void>> {
6884
@Override
6985
public HttpResponse<Void> execute() {
@@ -132,46 +148,85 @@ public CompletableFuture<HttpResponse<InputStream>> async() {
132148

133149
private class CallBean<E> implements HttpCall<E> {
134150
private final Class<E> type;
151+
private final ParameterizedType genericType;
152+
private final boolean isGeneric;
153+
135154
CallBean(Class<E> type) {
155+
this.isGeneric = false;
136156
this.type = type;
157+
this.genericType = null;
137158
}
159+
160+
CallBean(ParameterizedType type) {
161+
this.isGeneric = true;
162+
this.type = null;
163+
this.genericType = type;
164+
}
165+
138166
@Override
139167
public E execute() {
140-
return request.bean(type);
168+
return isGeneric ? request.bean(genericType) : request.bean(type);
141169
}
170+
142171
@Override
143172
public CompletableFuture<E> async() {
144-
return request.async().bean(type);
173+
return isGeneric ? request.async().bean(genericType) : request.async().bean(type);
145174
}
146175
}
147176

148177
private class CallList<E> implements HttpCall<List<E>> {
149178
private final Class<E> type;
179+
private final ParameterizedType genericType;
180+
private final boolean isGeneric;
181+
150182
CallList(Class<E> type) {
183+
this.isGeneric = false;
151184
this.type = type;
185+
this.genericType = null;
152186
}
187+
188+
CallList(ParameterizedType type) {
189+
this.isGeneric = true;
190+
this.type = null;
191+
this.genericType = type;
192+
}
193+
153194
@Override
154195
public List<E> execute() {
155-
return request.list(type);
196+
return isGeneric ? request.list(genericType) : request.list(type);
156197
}
198+
157199
@Override
158200
public CompletableFuture<List<E>> async() {
159-
return request.async().list(type);
201+
return isGeneric ? request.async().list(genericType) : request.async().list(type);
160202
}
161203
}
162204

163205
private class CallStream<E> implements HttpCall<Stream<E>> {
164206
private final Class<E> type;
207+
private final ParameterizedType genericType;
208+
private final boolean isGeneric;
209+
165210
CallStream(Class<E> type) {
211+
this.isGeneric = false;
166212
this.type = type;
213+
this.genericType = null;
214+
}
215+
216+
CallStream(ParameterizedType type) {
217+
this.isGeneric = true;
218+
this.type = null;
219+
this.genericType = type;
167220
}
221+
168222
@Override
169223
public Stream<E> execute() {
170-
return request.stream(type);
224+
return isGeneric ? request.stream(genericType) : request.stream(type);
171225
}
226+
172227
@Override
173228
public CompletableFuture<Stream<E>> async() {
174-
return request.async().stream(type);
229+
return isGeneric ? request.async().stream(genericType) : request.async().stream(type);
175230
}
176231
}
177232

client/src/main/java/io/avaje/http/client/DHttpClientRequest.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -532,6 +532,28 @@ protected <E> Stream<E> asyncStream(Class<E> type, HttpResponse<Stream<String>>
532532
return response.body().map(bodyReader::readBody);
533533
}
534534

535+
protected <E> E asyncBean(ParameterizedType type, HttpResponse<byte[]> response) {
536+
afterAsyncEncoded(response);
537+
return context.readBean(type, encodedResponseBody);
538+
}
539+
540+
protected <E> List<E> asyncList(ParameterizedType type, HttpResponse<byte[]> response) {
541+
afterAsyncEncoded(response);
542+
return context.readList(type, encodedResponseBody);
543+
}
544+
545+
protected <E> Stream<E> asyncStream(
546+
ParameterizedType type, HttpResponse<Stream<String>> response) {
547+
responseTimeNanos = System.nanoTime() - startAsyncNanos;
548+
httpResponse = response;
549+
context.afterResponse(this);
550+
if (response.statusCode() >= 300) {
551+
throw new HttpException(response, context);
552+
}
553+
final BodyReader<E> bodyReader = context.beanReader(type);
554+
return response.body().map(bodyReader::readBody);
555+
}
556+
535557
private void afterAsyncEncoded(HttpResponse<byte[]> response) {
536558
responseTimeNanos = System.nanoTime() - startAsyncNanos;
537559
httpResponse = response;

client/src/main/java/io/avaje/http/client/HttpAsyncResponse.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package io.avaje.http.client;
22

33
import java.io.InputStream;
4+
import java.lang.reflect.ParameterizedType;
45
import java.net.http.HttpResponse;
56
import java.util.List;
67
import java.util.concurrent.CompletableFuture;
@@ -334,4 +335,29 @@ default <E> CompletableFuture<HttpResponse<E>> withHandler(HttpResponse.BodyHand
334335
* @return The CompletableFuture of the response
335336
*/
336337
<E> CompletableFuture<Stream<E>> stream(Class<E> type);
338+
339+
/**
340+
* Process expecting a bean response body (typically from json content).
341+
*
342+
* @param type The parameterized type to convert the content to
343+
* @return The CompletableFuture of the response
344+
*/
345+
<E> CompletableFuture<E> bean(ParameterizedType type);
346+
347+
/**
348+
* Process expecting a list of beans response body (typically from json content).
349+
*
350+
* @param type The parameterized type to convert the content to
351+
* @return The CompletableFuture of the response
352+
*/
353+
<E> CompletableFuture<List<E>> list(ParameterizedType type);
354+
355+
/**
356+
* Process response as a stream of beans (x-json-stream).
357+
*
358+
* @param type The parameterized type to convert the content to
359+
* @return The CompletableFuture of the response
360+
*/
361+
<E> CompletableFuture<Stream<E>> stream(ParameterizedType type);
362+
337363
}

client/src/main/java/io/avaje/http/client/HttpCallResponse.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package io.avaje.http.client;
22

33
import java.io.InputStream;
4+
import java.lang.reflect.ParameterizedType;
45
import java.net.http.HttpResponse;
56
import java.util.List;
67
import java.util.stream.Stream;
@@ -186,4 +187,28 @@ default <E> HttpCall<HttpResponse<E>> withHandler(HttpResponse.BodyHandler<E> bo
186187
*/
187188
<E> HttpCall<Stream<E>> stream(Class<E> type);
188189

190+
/**
191+
* A bean response to execute async or sync.
192+
*
193+
* @param type The parameterized type to convert the content to
194+
* @return The HttpCall to allow sync or async execution
195+
*/
196+
<E> HttpCall<E> bean(ParameterizedType type);
197+
198+
/**
199+
* Process expecting a list of beans response body (typically from json content).
200+
*
201+
* @param type The parameterized type to convert the content to
202+
* @return The HttpCall to execute sync or async
203+
*/
204+
<E> HttpCall<List<E>> list(ParameterizedType type);
205+
206+
/**
207+
* Process expecting a stream of beans response body (typically from json content).
208+
*
209+
* @param type The parameterized type to convert the content to
210+
* @return The HttpCall to execute sync or async
211+
*/
212+
<E> HttpCall<Stream<E>> stream(ParameterizedType type);
213+
189214
}

0 commit comments

Comments
 (0)