package org.yamcs.web.websocket;
import java.io.IOException;
import java.io.StringWriter;
import org.yamcs.api.ws.WSConstants;
import org.yamcs.protobuf.Web.WebSocketServerMessage.WebSocketReplyData;
import org.yamcs.protobuf.Yamcs.ProtoDataType;
import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonGenerator;
import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
import io.netty.handler.codec.http.websocketx.WebSocketFrame;
import io.protostuff.JsonIOUtil;
import io.protostuff.Schema;
public class JsonEncoder implements WebSocketEncoder {
private JsonFactory jsonFactory = new JsonFactory();
@Override
public WebSocketFrame encodeReply(WebSocketReplyData reply) throws IOException {
StringWriter sw=new StringWriter();
JsonGenerator g=jsonFactory.createGenerator(sw);
writeMessageStart(g, WSConstants.MESSAGE_TYPE_REPLY, reply.getSequenceNumber());
writeMessageEnd(g);
return new TextWebSocketFrame(sw.toString());
}
@Override
public WebSocketFrame encodeException(WebSocketException e) throws IOException {
StringWriter sw = new StringWriter();
JsonGenerator g = jsonFactory.createGenerator(sw);
writeMessageStart(g, WSConstants.MESSAGE_TYPE_EXCEPTION, e.getRequestId());
g.writeStartObject();
if (e.getDataType().equals("STRING")) {
g.writeStringField("et", "STRING");
g.writeStringField("msg", e.getMessage());
} else {
g.writeStringField("et", e.getDataType());
g.writeFieldName("msg");
JsonIOUtil.writeTo(g, e.getData(), e.getDataSchema(), false);
}
g.writeEndObject();
writeMessageEnd(g);
return new TextWebSocketFrame(sw.toString());
}
@Override
public <T> WebSocketFrame encodeData(int sequenceNumber, ProtoDataType dataType, T message, Schema<T> schema) throws IOException {
StringWriter sw=new StringWriter();
JsonGenerator g=jsonFactory.createGenerator(sw);
writeMessageStart(g, WSConstants.MESSAGE_TYPE_DATA, sequenceNumber);
g.writeStartObject();
g.writeStringField("dt", dataType.name());
g.writeFieldName("data");
JsonIOUtil.writeTo(g, message, schema, false);
g.writeEndObject();
writeMessageEnd(g);
return new TextWebSocketFrame(sw.toString());
}
private void writeMessageStart(JsonGenerator g, int messageType, int seqId) throws IOException {
g.writeStartArray();
g.writeNumber(WSConstants.PROTOCOL_VERSION);
g.writeNumber(messageType);
g.writeNumber(seqId);
}
private void writeMessageEnd(JsonGenerator g) throws IOException {
g.writeEndArray();
g.close();
}
}