Search in sources :

Example 1 with GenericType

use of io.helidon.common.GenericType in project helidon by oracle.

the class JacksonBodyStreamWriter method write.

@Override
public Multi<DataChunk> write(Flow.Publisher<?> publisher, GenericType<?> type, MessageBodyWriterContext context) {
    MediaType contentType = context.findAccepted(MediaType.JSON_PREDICATE, MediaType.APPLICATION_JSON);
    context.contentType(contentType);
    AtomicBoolean first = new AtomicBoolean(true);
    JacksonBodyWriter.ObjectToChunks objectToChunks = new JacksonBodyWriter.ObjectToChunks(objectMapper, context.charset());
    return Multi.create(publisher).flatMap(objectToChunks).flatMap(it -> {
        if (first.getAndSet(false)) {
            // first record, do not prepend a comma
            return Multi.just(DataChunk.create(ARRAY_JSON_BEGIN_BYTES), it);
        } else {
            // any subsequent record starts with a comma
            return Multi.just(DataChunk.create(COMMA_BYTES), it);
        }
    }).onCompleteResume(DataChunk.create(ARRAY_JSON_END_BYTES));
}
Also used : Objects(java.util.Objects) Flow(java.util.concurrent.Flow) DataChunk(io.helidon.common.http.DataChunk) ObjectMapper(com.fasterxml.jackson.databind.ObjectMapper) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) MessageBodyStreamWriter(io.helidon.media.common.MessageBodyStreamWriter) GenericType(io.helidon.common.GenericType) StandardCharsets(java.nio.charset.StandardCharsets) Multi(io.helidon.common.reactive.Multi) MessageBodyWriterContext(io.helidon.media.common.MessageBodyWriterContext) MediaType(io.helidon.common.http.MediaType) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) MediaType(io.helidon.common.http.MediaType)

Example 2 with GenericType

use of io.helidon.common.GenericType in project helidon by oracle.

the class JsonpStreamWriterTest method write.

private JsonArray write(Multi<? extends JsonStructure> publisher, GenericType<? extends JsonStructure> type) {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    WRITER.write(publisher, type, CONTEXT).map(DataChunk::bytes).forEach(it -> {
        try {
            baos.write(it);
        } catch (IOException ignored) {
        // ignored
        }
    }).await();
    return JSON_PARSER.createReader(new ByteArrayInputStream(baos.toByteArray())).readArray();
}
Also used : CoreMatchers.is(org.hamcrest.CoreMatchers.is) ByteArrayOutputStream(java.io.ByteArrayOutputStream) JsonReaderFactory(jakarta.json.JsonReaderFactory) DataChunk(io.helidon.common.http.DataChunk) JsonArrayBuilder(jakarta.json.JsonArrayBuilder) JsonBuilderFactory(jakarta.json.JsonBuilderFactory) IOException(java.io.IOException) HashParameters(io.helidon.common.http.HashParameters) GenericType(io.helidon.common.GenericType) MessageBodyWriterContext(io.helidon.media.common.MessageBodyWriterContext) Json(jakarta.json.Json) IsCollectionWithSize.hasSize(org.hamcrest.collection.IsCollectionWithSize.hasSize) Test(org.junit.jupiter.api.Test) JsonStructure(jakarta.json.JsonStructure) ByteArrayInputStream(java.io.ByteArrayInputStream) MessageBodyOperator(io.helidon.media.common.MessageBodyOperator) Map(java.util.Map) JsonObject(jakarta.json.JsonObject) Assertions.assertAll(org.junit.jupiter.api.Assertions.assertAll) MatcherAssert.assertThat(org.hamcrest.MatcherAssert.assertThat) JsonArray(jakarta.json.JsonArray) Multi(io.helidon.common.reactive.Multi) ByteArrayInputStream(java.io.ByteArrayInputStream) DataChunk(io.helidon.common.http.DataChunk) ByteArrayOutputStream(java.io.ByteArrayOutputStream) IOException(java.io.IOException)

Example 3 with GenericType

use of io.helidon.common.GenericType in project helidon by oracle.

the class JsonpBodyStreamWriter method write.

@Override
public Multi<DataChunk> write(Publisher<? extends JsonStructure> publisher, GenericType<? extends JsonStructure> type, MessageBodyWriterContext context) {
    MediaType contentType = context.findAccepted(MediaType.JSON_PREDICATE, MediaType.APPLICATION_JSON);
    context.contentType(contentType);
    // we do not have join operator
    AtomicBoolean first = new AtomicBoolean(true);
    JsonStructureToChunks jsonToChunks = new JsonStructureToChunks(true, jsonWriterFactory, context.charset());
    return Multi.create(publisher).map(jsonToChunks).flatMap(it -> {
        if (first.getAndSet(false)) {
            // first record, do not prepend a comma
            return Multi.just(DataChunk.create(ARRAY_JSON_BEGIN_BYTES), it);
        } else {
            // any subsequent record starts with a comma
            return Multi.just(DataChunk.create(COMMA_BYTES), it);
        }
    }).onCompleteResume(DataChunk.create(ARRAY_JSON_END_BYTES));
}
Also used : JsonWriterFactory(jakarta.json.JsonWriterFactory) JsonStructure(jakarta.json.JsonStructure) Publisher(java.util.concurrent.Flow.Publisher) DataChunk(io.helidon.common.http.DataChunk) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) MessageBodyStreamWriter(io.helidon.media.common.MessageBodyStreamWriter) GenericType(io.helidon.common.GenericType) JsonStructureToChunks(io.helidon.media.jsonp.JsonpBodyWriter.JsonStructureToChunks) StandardCharsets(java.nio.charset.StandardCharsets) Multi(io.helidon.common.reactive.Multi) MessageBodyWriterContext(io.helidon.media.common.MessageBodyWriterContext) MediaType(io.helidon.common.http.MediaType) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) MediaType(io.helidon.common.http.MediaType) JsonStructureToChunks(io.helidon.media.jsonp.JsonpBodyWriter.JsonStructureToChunks)

Example 4 with GenericType

use of io.helidon.common.GenericType in project helidon by oracle.

the class JsonbNdBodyStreamWriter method write.

@Override
public Multi<DataChunk> write(Flow.Publisher<?> publisher, GenericType<?> type, MessageBodyWriterContext context) {
    MediaType contentType = MediaType.APPLICATION_X_NDJSON;
    context.contentType(contentType);
    AtomicBoolean first = new AtomicBoolean(true);
    return Multi.create(publisher).map(object -> DataChunk.create(jsonb.toJson(object).getBytes(StandardCharsets.UTF_8))).flatMap(dataChunk -> {
        if (first.getAndSet(false)) {
            return Single.just(dataChunk);
        } else {
            return Multi.just(DataChunk.create(NL), dataChunk);
        }
    });
}
Also used : DataChunk(io.helidon.common.http.DataChunk) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) MessageBodyStreamWriter(io.helidon.media.common.MessageBodyStreamWriter) GenericType(io.helidon.common.GenericType) StandardCharsets(java.nio.charset.StandardCharsets) MessageBodyWriterContext(io.helidon.media.common.MessageBodyWriterContext) MediaType(io.helidon.common.http.MediaType) Objects(java.util.Objects) Jsonb(jakarta.json.bind.Jsonb) Flow(java.util.concurrent.Flow) Optional(java.util.Optional) Single(io.helidon.common.reactive.Single) Multi(io.helidon.common.reactive.Multi) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) MediaType(io.helidon.common.http.MediaType)

Example 5 with GenericType

use of io.helidon.common.GenericType in project helidon by oracle.

the class FormParamsBodyReader method read.

@Override
@SuppressWarnings("unchecked")
public <U extends FormParams> Single<U> read(Flow.Publisher<DataChunk> publisher, GenericType<U> type, MessageBodyReaderContext context) {
    MediaType mediaType = context.contentType().orElseThrow();
    Charset charset = mediaType.charset().map(Charset::forName).orElse(StandardCharsets.UTF_8);
    Function<String, String> decoder = decoder(mediaType, charset);
    return (Single<U>) ContentReaders.readString(publisher, charset).map(formStr -> create(formStr, mediaType, decoder));
}
Also used : URLDecoder(java.net.URLDecoder) DataChunk(io.helidon.common.http.DataChunk) GenericType(io.helidon.common.GenericType) Function(java.util.function.Function) StandardCharsets(java.nio.charset.StandardCharsets) MediaType(io.helidon.common.http.MediaType) Matcher(java.util.regex.Matcher) Charset(java.nio.charset.Charset) Flow(java.util.concurrent.Flow) Map(java.util.Map) FormParams(io.helidon.common.http.FormParams) Single(io.helidon.common.reactive.Single) Pattern(java.util.regex.Pattern) Single(io.helidon.common.reactive.Single) MediaType(io.helidon.common.http.MediaType) Charset(java.nio.charset.Charset)

Aggregations

GenericType (io.helidon.common.GenericType)12 DataChunk (io.helidon.common.http.DataChunk)8 MediaType (io.helidon.common.http.MediaType)6 Multi (io.helidon.common.reactive.Multi)6 MessageBodyWriterContext (io.helidon.media.common.MessageBodyWriterContext)5 Objects (java.util.Objects)5 Flow (java.util.concurrent.Flow)5 MessageBodyStreamWriter (io.helidon.media.common.MessageBodyStreamWriter)4 StandardCharsets (java.nio.charset.StandardCharsets)4 Single (io.helidon.common.reactive.Single)3 Optional (java.util.Optional)3 AtomicBoolean (java.util.concurrent.atomic.AtomicBoolean)3 ObjectMapper (com.fasterxml.jackson.databind.ObjectMapper)2 Routing (io.helidon.webserver.Routing)2 JsonStructure (jakarta.json.JsonStructure)2 List (java.util.List)2 Map (java.util.Map)2 Set (java.util.Set)2 Test (org.junit.jupiter.api.Test)2 Prioritized (io.helidon.common.Prioritized)1