use of io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.console_pb.FigureDescriptor in project deephaven-core by deephaven.
the class JsFigureFactory method create.
private static Promise<JsFigure> create(JsFigureDescriptor descriptor) {
JsArray<JsTable> tables = descriptor.getTables();
if (tables == null || tables.length == 0) {
return (Promise<JsFigure>) (Promise) Promise.reject("No tables provided for Figure creation");
}
FigureDescriptor figureDescriptor = convertJsFigureDescriptor(descriptor);
FetchObjectResponse response = new FetchObjectResponse();
response.setData(figureDescriptor.serializeBinary());
Promise<?>[] tableCopyPromises = tables.map((table, index, all) -> table.copy(false)).asArray(new Promise[0]);
return Promise.all(tableCopyPromises).then(unknownTableCopies -> {
JsArray<JsTable> jsTableCopies = Js.cast(unknownTableCopies);
JsTable[] tableCopies = jsTableCopies.asArray(new JsTable[0]);
return new JsFigure(c -> c.apply(null, response), (figure, descriptor1) -> {
// We need to listen for disconnects and reconnects
boolean[] isTableDisconnected = new boolean[tableCopies.length];
ArrayList<RemoverFn> removerFns = new ArrayList<>(tableCopies.length * 3);
for (int i = 0; i < tableCopies.length; i++) {
final int tableIndex = i;
// Tables are closed when the figure is closed, no need to remove listeners later
removerFns.add(tableCopies[i].addEventListener(JsTable.EVENT_DISCONNECT, ignore -> {
isTableDisconnected[tableIndex] = true;
for (int j = 0; j < isTableDisconnected.length; j++) {
if (isTableDisconnected[j] && j != tableIndex) {
return;
}
}
figure.fireEvent(JsFigure.EVENT_DISCONNECT);
figure.unsubscribe();
}));
removerFns.add(tableCopies[i].addEventListener(JsTable.EVENT_RECONNECT, ignore -> {
isTableDisconnected[tableIndex] = false;
for (int j = 0; j < isTableDisconnected.length; j++) {
if (isTableDisconnected[j]) {
return;
}
}
try {
figure.verifyTables();
figure.fireEvent(JsFigure.EVENT_RECONNECT);
figure.enqueueSubscriptionCheck();
} catch (JsFigure.FigureSourceException e) {
final CustomEventInit init = CustomEventInit.create();
init.setDetail(e);
figure.fireEvent(JsFigure.EVENT_RECONNECTFAILED, init);
}
}));
removerFns.add(tableCopies[i].addEventListener(JsTable.EVENT_RECONNECTFAILED, err -> {
for (RemoverFn removerFn : removerFns) {
removerFn.remove();
}
figure.unsubscribe();
final CustomEventInit init = CustomEventInit.create();
init.setDetail(err);
figure.fireEvent(JsFigure.EVENT_RECONNECTFAILED, init);
}));
}
return Promise.resolve(new JsFigure.FigureTableFetchData(tableCopies, new TableMap[0], Collections.emptyMap()));
}).refetch();
});
}
use of io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.console_pb.FigureDescriptor in project deephaven-core by deephaven.
the class JsFigureFactory method convertJsFigureDescriptor.
private static FigureDescriptor convertJsFigureDescriptor(JsFigureDescriptor jsDescriptor) {
FigureDescriptor descriptor = new FigureDescriptor();
descriptor.setTitle(jsDescriptor.title);
descriptor.setTitleFont(jsDescriptor.titleFont);
descriptor.setTitleColor(jsDescriptor.titleColor);
descriptor.setUpdateInterval("" + jsDescriptor.updateInterval);
descriptor.setCols(jsDescriptor.cols);
descriptor.setRows(jsDescriptor.rows);
JsArray<JsTable> tables = jsDescriptor.getTables();
JsArray<JsChartDescriptor> charts = jsDescriptor.charts;
ChartDescriptor[] chartDescriptors = new ChartDescriptor[charts.length];
for (int i = 0; i < charts.length; i++) {
chartDescriptors[i] = convertJsChartDescriptor(charts.getAt(i), tables);
}
descriptor.setChartsList(chartDescriptors);
return descriptor;
}
Aggregations