package com.aol.micro.server.reactive.rest;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.stream.Stream;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.StreamingOutput;
import com.aol.cyclops2.util.ExceptionSoftener;
import cyclops.stream.ReactiveSeq;
import org.reactivestreams.Publisher;
import com.aol.micro.server.rest.jackson.JacksonUtil;
public class ReactiveResponse {
public static <T> Response streamAsJson(Stream<T> json) {
return publishAsJson(ReactiveSeq.fromStream(json));
}
public static <T> Response publishAsJson(Publisher<T> json) {
StreamingOutput stream = new StreamingOutput() {
@Override
public void write(OutputStream os) throws IOException, WebApplicationException {
Writer writer = new BufferedWriter(
new OutputStreamWriter(
os));
ReactiveSeq.fromPublisher(json)
.map(JacksonUtil::serializeToJson)
.forEach(ExceptionSoftener.softenConsumer(json -> {
writer.write(json);
writer.write("\n");
}), e -> {
} , ExceptionSoftener.softenRunnable(() -> writer.flush()));
writer.flush();
}
};
return Response.ok(stream)
.build();
}
}