package org.yamcs.web.websocket;
import java.io.IOException;
import org.yamcs.api.ws.WSConstants;
import org.yamcs.protobuf.Web.WebSocketServerMessage.WebSocketExceptionData;
import com.google.protobuf.ByteString;
import com.google.protobuf.MessageLite;
import io.protostuff.Schema;
/**
* When an exception occurred while handling an incoming web socket request. Used as a one-time response to a client request.
*/
public class WebSocketException extends Exception {
private static final long serialVersionUID = 1L;
private int requestId;
// Optional accompanying data
// eg. for InvalidIdentification we want to pass the names of the invalid parameters
private String dataType = "STRING";
private MessageLite data;
private Schema<MessageLite> dataSchema;
/**
* @param requestId the client request id, if at least this could be successfully interpreted.
*/
public WebSocketException(int requestId, String message) {
super(message);
this.requestId = requestId;
}
public WebSocketException(int requestId, Throwable t) {
super(t.getMessage(), t);
this.requestId = requestId;
}
public WebSocketException(int requestId, String message, Throwable t) {
super(message + ": " + t.getMessage(), t);
this.requestId = requestId;
}
public int getRequestId() {
return requestId;
}
@SuppressWarnings("unchecked")
public void attachData(String dataType, MessageLite data, Schema<? extends MessageLite> dataSchema) {
this.dataType = dataType;
this.data = data;
this.dataSchema = (Schema<MessageLite>) dataSchema;
}
public String getDataType() {
return dataType;
}
public MessageLite getData() {
return data;
}
public Schema<MessageLite> getDataSchema() {
return dataSchema;
}
/**
* Converts this exception to a protobuf message
*/
public WebSocketExceptionData toWebSocketExceptionData() throws IOException {
WebSocketExceptionData.Builder resultb = WebSocketExceptionData.newBuilder();
resultb.setProtocolVersion(WSConstants.PROTOCOL_VERSION);
resultb.setSequenceNumber(requestId);
resultb.setType(dataType);
String msg = getMessage();
if(msg!=null)resultb.setMessage(msg);
if (!dataType.equals("STRING")) {
try (ByteString.Output out = ByteString.newOutput()) {
data.writeTo(out);
out.close();
resultb.setData(out.toByteString());
}
}
return resultb.build();
}
}