package org.yamcs.web.rest.archive; import java.io.IOException; import org.yamcs.api.MediaType; import org.yamcs.protobuf.Table.Cell; import org.yamcs.protobuf.Table.ColumnInfo; import org.yamcs.protobuf.Table.Row; import org.yamcs.web.HttpException; import org.yamcs.web.rest.RestRequest; import org.yamcs.web.rest.StreamToChunkedTransferEncoder; import org.yamcs.yarch.ColumnDefinition; import org.yamcs.yarch.ColumnSerializer; import org.yamcs.yarch.ColumnSerializerFactory; import org.yamcs.yarch.DataType; import org.yamcs.yarch.Tuple; import org.yamcs.yarch.TupleDefinition; import com.google.protobuf.ByteString; import org.yamcs.yarch.DataType._type; import io.netty.buffer.ByteBufOutputStream; /** * Encodes table dumps * @author nm * */ public class TableDumpEncoder extends StreamToChunkedTransferEncoder { TupleDefinition completeTuple = new TupleDefinition(); public TableDumpEncoder(RestRequest req) throws HttpException { super(req, MediaType.PROTOBUF); } @SuppressWarnings({ "rawtypes", "unchecked" }) @Override public void processTuple(Tuple tuple, ByteBufOutputStream bufOut) throws IOException { Row.Builder rowb = Row.newBuilder(); for(int i=0; i<tuple.size(); i++) { ColumnDefinition cd = tuple.getColumnDefinition(i); Object v = tuple.getColumn(i); int colId = completeTuple.getColumnIndex(cd.getName()); if(colId==-1) { completeTuple.addColumn(cd); colId = completeTuple.getColumnIndex(cd.getName()); rowb.addColumn(ColumnInfo.newBuilder().setId(colId).setName(cd.getName()).setType(cd.getType().toString()).build()); } DataType type = cd.getType(); ColumnSerializer cs; if(type.val==_type.ENUM) { cs = ColumnSerializerFactory.getBasicColumnSerializer(DataType.STRING); } else if(type.val==_type.PROTOBUF) { cs = ColumnSerializerFactory.getProtobufSerializer(cd); } else { cs = ColumnSerializerFactory.getBasicColumnSerializer(cd.getType()); } rowb.addCell(Cell.newBuilder().setColumnId(colId).setData(ByteString.copyFrom(cs.toByteArray(v))).build()); } rowb.build().writeDelimitedTo(bufOut); } }