package org.yamcs.web.rest; import java.io.BufferedWriter; import java.io.IOException; import java.io.OutputStreamWriter; import org.yamcs.api.MediaType; import org.yamcs.web.HttpException; import org.yamcs.web.InternalServerErrorException; import org.yamcs.yarch.Tuple; import com.csvreader.CsvWriter; import io.netty.buffer.ByteBufOutputStream; /** * Facilitates sending CSV data with chunked transfer encoding. * It wraps the ByteBufOutputSteam with a CSVWriter */ public abstract class StreamToChunkedCSVEncoder extends StreamToChunkedTransferEncoder { private CsvWriter csvWriter; public StreamToChunkedCSVEncoder(RestRequest req) throws HttpException { super(req, MediaType.CSV); String[] csvHeader = getCSVHeader(); if (csvHeader != null) { try { csvWriter.writeRecord(csvHeader); } catch (IOException e) { throw new InternalServerErrorException(e); } } } @Override protected void resetBuffer() { super.resetBuffer(); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(bufOut)); csvWriter = new CsvWriter(bw, '\t'); } @Override protected void closeBufferOutputStream() throws IOException { csvWriter.close(); } @Override public void processTuple(Tuple tuple, ByteBufOutputStream bufOut) throws IOException { processTuple(tuple, csvWriter); } public abstract void processTuple(Tuple tuple, CsvWriter csvWriter) throws IOException; public String[] getCSVHeader() { return null; } }