Skip to content

Commit 0736537

Browse files
authored
Simplify JsonService interface (#79)
* simplify JsonService interface * Update JsonService.java
1 parent 8975701 commit 0736537

File tree

11 files changed

+101
-67
lines changed

11 files changed

+101
-67
lines changed

avaje-jex/src/main/java/io/avaje/jex/Context.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@
1414

1515
import com.sun.net.httpserver.HttpExchange;
1616

17+
import io.avaje.jex.core.HeaderKeys;
1718
import io.avaje.jex.security.BasicAuthCredentials;
1819
import io.avaje.jex.security.Role;
19-
import io.avaje.jex.spi.HeaderKeys;
2020

2121
/**
2222
* Provides access to functions for handling the request and response.

avaje-jex/src/main/java/io/avaje/jex/core/CoreServiceManager.java

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package io.avaje.jex.core;
22

3+
import java.io.InputStream;
4+
import java.io.OutputStream;
35
import java.io.UncheckedIOException;
46
import java.io.UnsupportedEncodingException;
57
import java.lang.System.Logger.Level;
@@ -18,7 +20,6 @@
1820
import io.avaje.jex.Routing;
1921
import io.avaje.jex.core.json.JacksonJsonService;
2022
import io.avaje.jex.core.json.JsonbJsonService;
21-
import io.avaje.jex.spi.HeaderKeys;
2223
import io.avaje.jex.spi.JsonService;
2324
import io.avaje.jex.spi.SpiContext;
2425
import io.avaje.jex.spi.TemplateRender;
@@ -47,26 +48,26 @@ public static SpiServiceManager create(Jex jex) {
4748
}
4849

4950
@Override
50-
public <T> T jsonRead(Class<T> clazz, SpiContext ctx) {
51-
return jsonService.jsonRead(clazz, ctx);
51+
public <T> T jsonRead(Class<T> clazz, InputStream is) {
52+
return jsonService.jsonRead(clazz, is);
5253
}
5354

5455
@Override
55-
public void jsonWrite(Object bean, SpiContext ctx) {
56-
jsonService.jsonWrite(bean, ctx);
56+
public void jsonWrite(Object bean, OutputStream os) {
57+
jsonService.jsonWrite(bean, os);
5758
}
5859

5960
@Override
60-
public <E> void jsonWriteStream(Stream<E> stream, SpiContext ctx) {
61+
public <E> void jsonWriteStream(Stream<E> stream, OutputStream os) {
6162
try (stream) {
62-
jsonService.jsonWriteStream(stream.iterator(), ctx);
63+
jsonService.jsonWriteStream(stream.iterator(), os);
6364
}
6465
}
6566

6667
@Override
67-
public <E> void jsonWriteStream(Iterator<E> iterator, SpiContext ctx) {
68+
public <E> void jsonWriteStream(Iterator<E> iterator, OutputStream os) {
6869
try {
69-
jsonService.jsonWriteStream(iterator, ctx);
70+
jsonService.jsonWriteStream(iterator, os);
7071
} finally {
7172
maybeClose(iterator);
7273
}

avaje-jex/src/main/java/io/avaje/jex/core/ExceptionManager.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
import io.avaje.jex.http.ErrorCode;
1010
import io.avaje.jex.http.HttpResponseException;
1111
import io.avaje.jex.http.InternalServerErrorException;
12-
import io.avaje.jex.spi.HeaderKeys;
1312
import io.avaje.jex.spi.SpiContext;
1413

1514
public final class ExceptionManager {

avaje-jex/src/main/java/io/avaje/jex/spi/HeaderKeys.java renamed to avaje-jex/src/main/java/io/avaje/jex/core/HeaderKeys.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package io.avaje.jex.spi;
1+
package io.avaje.jex.core;
22

33
public class HeaderKeys {
44

avaje-jex/src/main/java/io/avaje/jex/core/SpiServiceManager.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
import io.avaje.jex.jdk.CtxServiceManager;
66
import io.avaje.jex.spi.SpiContext;
77

8+
import java.io.InputStream;
9+
import java.io.OutputStream;
810
import java.util.Iterator;
911
import java.util.List;
1012
import java.util.Map;
@@ -18,22 +20,22 @@ public sealed interface SpiServiceManager permits CoreServiceManager, CtxService
1820
/**
1921
* Read and return the type from json request content.
2022
*/
21-
<T> T jsonRead(Class<T> clazz, SpiContext ctx);
23+
<T> T jsonRead(Class<T> clazz, InputStream ctx);
2224

2325
/**
2426
* Write as json to response content.
2527
*/
26-
void jsonWrite(Object bean, SpiContext ctx);
28+
void jsonWrite(Object bean, OutputStream ctx);
2729

2830
/**
2931
* Write as json stream to response content.
3032
*/
31-
<E> void jsonWriteStream(Stream<E> stream, SpiContext ctx);
33+
<E> void jsonWriteStream(Stream<E> stream, OutputStream ctx);
3234

3335
/**
3436
* Write as json stream to response content.
3537
*/
36-
<E> void jsonWriteStream(Iterator<E> iterator, SpiContext ctx);
38+
<E> void jsonWriteStream(Iterator<E> iterator, OutputStream ctx);
3739

3840
/**
3941
* Maybe close if iterator is a AutoClosable.
Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,17 @@
11
package io.avaje.jex.core.json;
22

3-
import com.fasterxml.jackson.core.JsonGenerator;
4-
import com.fasterxml.jackson.databind.DeserializationFeature;
5-
import com.fasterxml.jackson.databind.ObjectMapper;
6-
import io.avaje.jex.spi.JsonService;
7-
import io.avaje.jex.spi.SpiContext;
8-
93
import java.io.IOException;
4+
import java.io.InputStream;
105
import java.io.OutputStream;
116
import java.io.UncheckedIOException;
127
import java.util.Iterator;
138

9+
import com.fasterxml.jackson.core.JsonGenerator;
10+
import com.fasterxml.jackson.databind.DeserializationFeature;
11+
import com.fasterxml.jackson.databind.ObjectMapper;
12+
13+
import io.avaje.jex.spi.JsonService;
14+
1415
public class JacksonJsonService implements JsonService {
1516

1617
private final ObjectMapper mapper;
@@ -25,22 +26,18 @@ public JacksonJsonService(ObjectMapper mapper) {
2526
}
2627

2728
@Override
28-
public <T> T jsonRead(Class<T> clazz, SpiContext ctx) {
29+
public <T> T jsonRead(Class<T> clazz, InputStream is) {
2930
try {
30-
// TODO: Handle gzipped content
3131
// read direct
32-
return mapper.readValue(ctx.inputStream(), clazz);
33-
//return mapper.readValue(ctx.bodyAsBytes(), clazz);
32+
return mapper.readValue(is, clazz);
3433
} catch (IOException e) {
3534
throw new UncheckedIOException(e);
3635
}
3736
}
3837

3938
@Override
40-
public void jsonWrite(Object bean, SpiContext ctx) {
39+
public void jsonWrite(Object bean, OutputStream os) {
4140
try {
42-
// gzip compression etc ?
43-
OutputStream os = ctx.outputStream();
4441
try (JsonGenerator generator = mapper.createGenerator(os)) {
4542
// only flush to underlying OutputStream on success
4643
generator.disable(JsonGenerator.Feature.AUTO_CLOSE_TARGET);
@@ -57,19 +54,14 @@ public void jsonWrite(Object bean, SpiContext ctx) {
5754
}
5855

5956
@Override
60-
public <T> void jsonWriteStream(Iterator<T> iterator, SpiContext ctx) {
57+
public <T> void jsonWriteStream(Iterator<T> iterator, OutputStream os) {
6158
final JsonGenerator generator;
6259
try {
63-
generator = mapper.createGenerator(ctx.outputStream());
60+
generator = mapper.createGenerator(os);
6461
generator.setPrettyPrinter(null);
6562
try {
6663
while (iterator.hasNext()) {
67-
try {
68-
mapper.writeValue(generator, iterator.next());
69-
generator.writeRaw('\n');
70-
} catch (IOException e) {
71-
throw new UncheckedIOException(e);
72-
}
64+
write(iterator, generator);
7365
}
7466
} finally {
7567
generator.flush();
@@ -79,4 +71,13 @@ public <T> void jsonWriteStream(Iterator<T> iterator, SpiContext ctx) {
7971
throw new UncheckedIOException(e);
8072
}
8173
}
74+
75+
private <T> void write(Iterator<T> iterator, final JsonGenerator generator) {
76+
try {
77+
mapper.writeValue(generator, iterator.next());
78+
generator.writeRaw('\n');
79+
} catch (IOException e) {
80+
throw new UncheckedIOException(e);
81+
}
82+
}
8283
}

avaje-jex/src/main/java/io/avaje/jex/core/json/JsonbJsonService.java

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
import io.avaje.jsonb.JsonWriter;
77
import io.avaje.jsonb.Jsonb;
88

9+
import java.io.InputStream;
10+
import java.io.OutputStream;
911
import java.util.Iterator;
1012

1113
/**
@@ -30,20 +32,20 @@ public JsonbJsonService(Jsonb jsonb) {
3032
}
3133

3234
@Override
33-
public <T> T jsonRead(Class<T> clazz, SpiContext ctx) {
34-
// TODO: Handle gzipped content
35-
return jsonb.type(clazz).fromJson(ctx.inputStream());
35+
public <T> T jsonRead(Class<T> clazz, InputStream is) {
36+
37+
return jsonb.type(clazz).fromJson(is);
3638
}
3739

3840
@Override
39-
public void jsonWrite(Object bean, SpiContext ctx) {
40-
// gzip compression etc ?
41-
jsonb.toJson(bean, ctx.outputStream());
41+
public void jsonWrite(Object bean, OutputStream os) {
42+
43+
jsonb.toJson(bean, os);
4244
}
4345

4446
@Override
45-
public <T> void jsonWriteStream(Iterator<T> iterator, SpiContext ctx) {
46-
try (JsonWriter writer = jsonb.writer(ctx.outputStream())) {
47+
public <T> void jsonWriteStream(Iterator<T> iterator, OutputStream os) {
48+
try (JsonWriter writer = jsonb.writer(os)) {
4749
writer.pretty(false);
4850
if (iterator.hasNext()) {
4951
T first = iterator.next();

avaje-jex/src/main/java/io/avaje/jex/jdk/CtxServiceManager.java

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import io.avaje.jex.core.SpiServiceManager;
66
import io.avaje.jex.spi.SpiContext;
77

8+
import java.io.InputStream;
89
import java.io.OutputStream;
910
import java.util.Iterator;
1011
import java.util.List;
@@ -41,23 +42,23 @@ public String contextPath() {
4142
}
4243

4344
@Override
44-
public <T> T jsonRead(Class<T> clazz, SpiContext ctx) {
45-
return delegate.jsonRead(clazz, ctx);
45+
public <T> T jsonRead(Class<T> clazz, InputStream is) {
46+
return delegate.jsonRead(clazz, is);
4647
}
4748

4849
@Override
49-
public void jsonWrite(Object bean, SpiContext ctx) {
50-
delegate.jsonWrite(bean, ctx);
50+
public void jsonWrite(Object bean, OutputStream os) {
51+
delegate.jsonWrite(bean, os);
5152
}
5253

5354
@Override
54-
public <E> void jsonWriteStream(Stream<E> stream, SpiContext ctx) {
55-
delegate.jsonWriteStream(stream, ctx);
55+
public <E> void jsonWriteStream(Stream<E> stream, OutputStream os) {
56+
delegate.jsonWriteStream(stream, os);
5657
}
5758

5859
@Override
59-
public <E> void jsonWriteStream(Iterator<E> iterator, SpiContext ctx) {
60-
delegate.jsonWriteStream(iterator, ctx);
60+
public <E> void jsonWriteStream(Iterator<E> iterator, OutputStream os) {
61+
delegate.jsonWriteStream(iterator, os);
6162
}
6263

6364
@Override

avaje-jex/src/main/java/io/avaje/jex/jdk/JdkContext.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,11 @@
2525

2626
import io.avaje.jex.Context;
2727
import io.avaje.jex.Routing;
28+
import io.avaje.jex.core.HeaderKeys;
2829
import io.avaje.jex.http.ErrorCode;
29-
import io.avaje.jex.http.HttpResponseException;
3030
import io.avaje.jex.http.RedirectException;
3131
import io.avaje.jex.security.BasicAuthCredentials;
3232
import io.avaje.jex.security.Role;
33-
import io.avaje.jex.spi.HeaderKeys;
3433
import io.avaje.jex.spi.SpiContext;
3534

3635
class JdkContext implements Context, SpiContext {
@@ -169,7 +168,7 @@ public void performRedirect() {
169168

170169
@Override
171170
public <T> T bodyAsClass(Class<T> beanType) {
172-
return mgr.jsonRead(beanType, this);
171+
return mgr.jsonRead(beanType, inputStream());
173172
}
174173

175174
@Override
@@ -316,21 +315,21 @@ public int status() {
316315
@Override
317316
public Context json(Object bean) {
318317
contentType(APPLICATION_JSON);
319-
mgr.jsonWrite(bean, this);
318+
mgr.jsonWrite(bean, outputStream());
320319
return this;
321320
}
322321

323322
@Override
324323
public <E> Context jsonStream(Stream<E> stream) {
325324
contentType(APPLICATION_X_JSON_STREAM);
326-
mgr.jsonWriteStream(stream, this);
325+
mgr.jsonWriteStream(stream, outputStream());
327326
return this;
328327
}
329328

330329
@Override
331330
public <E> Context jsonStream(Iterator<E> iterator) {
332331
contentType(APPLICATION_X_JSON_STREAM);
333-
mgr.jsonWriteStream(iterator, this);
332+
mgr.jsonWriteStream(iterator, outputStream());
334333
return this;
335334
}
336335

avaje-jex/src/main/java/io/avaje/jex/spi/JexExtension.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,11 @@
22

33
import io.avaje.spi.Service;
44

5+
/**
6+
* Extension point for all Jex SPI interfaces
7+
*
8+
* <p>All types that implement this interface must be registered as an entry in {@code
9+
* META-INF/services/io.avaje.jex.spi.JexExtension } for it to be loaded by Jex
10+
*/
511
@Service
612
public sealed interface JexExtension permits JsonService, TemplateRender {}

0 commit comments

Comments
 (0)