From a24ec6001360c3acb50cd976c5e59b94b34007ac Mon Sep 17 00:00:00 2001 From: Devin Smith Date: Thu, 30 Dec 2021 10:13:20 -0800 Subject: [PATCH 01/62] ObjectType and Plugins --- .../python/deephaven/plugin/__init__.py | 20 +++ .../python/deephaven/server/__init__.py | 2 + .../server/script_session/__init__.py | 46 +++++ build.gradle | 4 +- docker/server/build.gradle | 3 - docker/server/src/main/docker/Dockerfile | 6 + engine/table/build.gradle | 2 + .../engine/util/AbstractScriptSession.java | 137 +++++++++------ .../engine/util/ExportedObjectType.java | 54 ------ .../engine/util/GroovyDeephavenSession.java | 55 +++++- .../io/deephaven/engine/util/IsWidget.java | 117 ------------- .../util/NoLanguageDeephavenSession.java | 17 +- .../engine/util/PythonDeephavenSession.java | 163 +++++++++++------- .../engine/util/PythonScopeJpyImpl.java | 1 - .../deephaven/engine/util/ScriptSession.java | 9 +- .../engine/table/impl/FuzzerTest.java | 3 +- .../scripts/TestGroovyDeephavenSession.java | 3 +- .../examples/SubscribeApplicationField.java | 31 ---- .../client/examples/SubscribeQueryScope.java | 29 ---- .../deephaven/client/examples/GetTable.java | 29 ++++ java-client/session-examples/build.gradle | 1 + .../client/examples/FetchObject.java | 44 +++++ .../client/impl/ApplicationService.java | 2 + .../deephaven/client/impl/ConsoleService.java | 8 + .../deephaven/client/impl/FetchedObject.java | 41 +++++ .../io/deephaven/client/impl/SessionImpl.java | 46 +++++ plugin/build.gradle | 11 ++ plugin/figure/build.gradle | 9 + .../deephaven/figure/FigureWidgetPlugin.java | 21 +++ .../figure/FigureWidgetTranslator.java | 32 +++- .../io/deephaven/figure/FigureWidgetType.java | 31 ++++ .../services/io.deephaven.plugin.Plugin | 1 + .../main/java/io/deephaven/plugin/Plugin.java | 6 + .../io/deephaven/plugin/PluginCallback.java | 8 + .../io/deephaven/plugin/type/Exporter.java | 13 ++ .../io/deephaven/plugin/type/ObjectType.java | 13 ++ .../deephaven/plugin/type/ObjectTypeBase.java | 17 ++ .../plugin/type/ObjectTypeClassBase.java | 60 +++++++ .../plugin/type/ObjectTypeLookup.java | 17 ++ .../proto/deephaven/proto/application.proto | 17 +- .../main/proto/deephaven/proto/console.proto | 15 ++ .../impl/select/TestConditionFilter.java | 3 +- server/build.gradle | 5 + .../deephaven/server/appmode/AppFieldId.java | 2 +- .../appmode/ApplicationServiceGrpcImpl.java | 66 ++++--- .../console/ConsoleServiceGrpcImpl.java | 78 +++++++-- .../groovy/GroovyConsoleSessionModule.java | 6 +- .../python/PythonConsoleSessionModule.java | 5 +- .../deephaven/server/plugin/ObjectTypes.java | 65 +++++++ .../deephaven/server/plugin/PluginModule.java | 21 +++ .../server/plugin/PluginsLoader.java | 156 +++++++++++++++++ .../server/runner/DeephavenApiServer.java | 5 + .../runner/DeephavenApiServerModule.java | 2 + .../server/session/SessionState.java | 30 ++++ .../server/appmode/ApplicationTest.java | 5 +- .../test/FlightMessageRoundTripTest.java | 6 - settings.gradle | 3 + 57 files changed, 1170 insertions(+), 432 deletions(-) create mode 100644 Integrations/python/deephaven/plugin/__init__.py create mode 100644 Integrations/python/deephaven/server/__init__.py create mode 100644 Integrations/python/deephaven/server/script_session/__init__.py delete mode 100644 engine/table/src/main/java/io/deephaven/engine/util/ExportedObjectType.java delete mode 100644 engine/table/src/main/java/io/deephaven/engine/util/IsWidget.java delete mode 100644 java-client/barrage-examples/src/main/java/io/deephaven/client/examples/SubscribeApplicationField.java delete mode 100644 java-client/barrage-examples/src/main/java/io/deephaven/client/examples/SubscribeQueryScope.java create mode 100644 java-client/flight-examples/src/main/java/io/deephaven/client/examples/GetTable.java create mode 100644 java-client/session-examples/src/main/java/io/deephaven/client/examples/FetchObject.java create mode 100644 java-client/session/src/main/java/io/deephaven/client/impl/FetchedObject.java create mode 100644 plugin/build.gradle create mode 100644 plugin/figure/build.gradle create mode 100644 plugin/figure/src/main/java/io/deephaven/figure/FigureWidgetPlugin.java rename {server/src/main/java/io/deephaven/server/console => plugin/figure/src/main/java/io/deephaven}/figure/FigureWidgetTranslator.java (97%) create mode 100644 plugin/figure/src/main/java/io/deephaven/figure/FigureWidgetType.java create mode 100644 plugin/figure/src/main/resources/META-INF/services/io.deephaven.plugin.Plugin create mode 100644 plugin/src/main/java/io/deephaven/plugin/Plugin.java create mode 100644 plugin/src/main/java/io/deephaven/plugin/PluginCallback.java create mode 100644 plugin/src/main/java/io/deephaven/plugin/type/Exporter.java create mode 100644 plugin/src/main/java/io/deephaven/plugin/type/ObjectType.java create mode 100644 plugin/src/main/java/io/deephaven/plugin/type/ObjectTypeBase.java create mode 100644 plugin/src/main/java/io/deephaven/plugin/type/ObjectTypeClassBase.java create mode 100644 plugin/src/main/java/io/deephaven/plugin/type/ObjectTypeLookup.java create mode 100644 server/src/main/java/io/deephaven/server/plugin/ObjectTypes.java create mode 100644 server/src/main/java/io/deephaven/server/plugin/PluginModule.java create mode 100644 server/src/main/java/io/deephaven/server/plugin/PluginsLoader.java diff --git a/Integrations/python/deephaven/plugin/__init__.py b/Integrations/python/deephaven/plugin/__init__.py new file mode 100644 index 00000000000..2fc702c987b --- /dev/null +++ b/Integrations/python/deephaven/plugin/__init__.py @@ -0,0 +1,20 @@ +DEEPHAVEN_PLUGIN_ENTRY_KEY = 'deephaven.plugin' +DEEPHAVEN_PLUGIN_REGISTER_NAME = 'register_into' + +def get_plugin_entrypoints(name): + import sys + if sys.version_info < (3, 8): + # TODO(deephaven-base-images#6): Add importlib-metadata backport install for future server plugin support + # We can remove the exception handling once above gets merged in + try: + from importlib_metadata import entry_points + except ImportError: + return [] + else: + from importlib.metadata import entry_points + return entry_points(group=DEEPHAVEN_PLUGIN_ENTRY_KEY, name=name) or [] + +def all_plugins_register_into(callback): + for entrypoint in get_plugin_entrypoints(DEEPHAVEN_PLUGIN_REGISTER_NAME): + plugin_register_into = entrypoint.load() + plugin_register_into(callback) diff --git a/Integrations/python/deephaven/server/__init__.py b/Integrations/python/deephaven/server/__init__.py new file mode 100644 index 00000000000..d69638ab9e9 --- /dev/null +++ b/Integrations/python/deephaven/server/__init__.py @@ -0,0 +1,2 @@ +# Packages under the deephaven.server heading are not meant to be called externally - it exists as a convenient place +# for the server to execute implementation logic via python diff --git a/Integrations/python/deephaven/server/script_session/__init__.py b/Integrations/python/deephaven/server/script_session/__init__.py new file mode 100644 index 00000000000..4482fd3d787 --- /dev/null +++ b/Integrations/python/deephaven/server/script_session/__init__.py @@ -0,0 +1,46 @@ +# Implementation utilities for io.deephaven.engine.util.PythonDeephavenSession + +from jpy import JType +from deephaven.Plot.figure_wrapper import FigureWrapper + +def create_change_list(from_snapshot, to_snapshot): + changes = [] + for (name, new_value) in to_snapshot.items(): + if not isinstance(name, str): + continue + if name not in from_snapshot: + changes.append(make_change_item(name, None, new_value)) + else: + existing_value = from_snapshot[name] + if new_value is not existing_value: + changes.append(make_change_item(name, existing_value, new_value)) + for (name, existing_value) in from_snapshot.items(): + if not isinstance(name, str): + continue + if name in to_snapshot: + continue # already handled + changes.append(make_change_item(name, existing_value, None)) + return changes + +def make_change_item(name, existing_value, new_value): + # TODO(deephaven-core#1775): multivariate jpy (unwrapped) return type into java + # It would be great if we could handle the maybe unwrapping at this layer, but we are unable to currently handle it + # properly at the java layer + # return name, maybe_unwrap(existing_value), maybe_unwrap(new_value) + return name, existing_value, new_value + +def unwrap_to_java_type(object): + """ + Returns a JType object if the object is already a JType, or if the object can be unwrapped into a JType object; + otherwise, returns None. + + :param object: the object to be unwrapped + :return: the JType object, or None + """ + if isinstance(object, JType): + return object + # Consider a generic ABC JType wrapper we could use + if isinstance(object, FigureWrapper): + return object.figure + # add more here when/if necessary + return None \ No newline at end of file diff --git a/build.gradle b/build.gradle index 1555d1d884c..b57de36138b 100644 --- a/build.gradle +++ b/build.gradle @@ -106,7 +106,7 @@ Set modsAreBasic = subprojects.findAll {it.name in [ 'docker-runtime-base', 'docker-server', 'docker-server-slim', - 'raw-js-openapi' + 'raw-js-openapi', ] } Set modsAreBin = subprojects.findAll {it.name in ['bin', 'configs', 'test-configs'] } @@ -397,6 +397,8 @@ tasks.register 'allJavadoc', Javadoc, { ':extensions-csv', ':extensions-kafka', ':extensions-parquet-table', + ':plugin', + ':plugin:figure', ':Util', ':ModelFarm', ':Numerics', diff --git a/docker/server/build.gradle b/docker/server/build.gradle index e76b3caf887..918a5013789 100644 --- a/docker/server/build.gradle +++ b/docker/server/build.gradle @@ -64,9 +64,6 @@ def prepareDocker = project.tasks.register('prepareDocker', Sync) { into server } } - from ('src/main/arch') { - into 'arch' - } from ('src/main/configure') { into 'configure' } diff --git a/docker/server/src/main/docker/Dockerfile b/docker/server/src/main/docker/Dockerfile index 7a3aaa67914..49b9d0b1784 100644 --- a/docker/server/src/main/docker/Dockerfile +++ b/docker/server/src/main/docker/Dockerfile @@ -1,6 +1,12 @@ ARG BASE FROM $BASE as install +# To test out the deephaven-plugin-matplotlib, uncomment the following: +#RUN set -eux; \ +# python3 -m pip install -q --no-cache-dir \ +# importlib-metadata \ +# https://github.com/deephaven/deephaven-plugin-matplotlib/releases/download/v0.0.1.dev1/deephaven_plugin_matplotlib-0.0.1.dev1-py3-none-any.whl + COPY licenses/ / # Note: all of the pip installs have the --no-index flag, with the expectation that all external dependencies are diff --git a/engine/table/build.gradle b/engine/table/build.gradle index 46b7b99b14f..33e7b0637d1 100644 --- a/engine/table/build.gradle +++ b/engine/table/build.gradle @@ -37,6 +37,8 @@ dependencies { "org.eclipse.jgit:org.eclipse.jgit:$Classpaths.JGIT_VERSION", 'com.tdunning:t-digest:3.2' + implementation project(':plugin') + Classpaths.inheritGroovy(project, 'groovy', 'implementation') Classpaths.inheritGroovy(project, 'groovy-json', 'implementation') Classpaths.inheritJavaParser project diff --git a/engine/table/src/main/java/io/deephaven/engine/util/AbstractScriptSession.java b/engine/table/src/main/java/io/deephaven/engine/util/AbstractScriptSession.java index d3264ed00ae..1d2ba94c242 100644 --- a/engine/table/src/main/java/io/deephaven/engine/util/AbstractScriptSession.java +++ b/engine/table/src/main/java/io/deephaven/engine/util/AbstractScriptSession.java @@ -9,13 +9,16 @@ import io.deephaven.api.util.NameValidator; import io.deephaven.base.FileUtils; import io.deephaven.compilertools.CompilerTools; +import io.deephaven.engine.liveness.LivenessScope; +import io.deephaven.engine.liveness.LivenessScopeStack; import io.deephaven.engine.table.Table; import io.deephaven.engine.table.TableDefinition; +import io.deephaven.engine.table.TableMap; import io.deephaven.engine.table.lang.QueryLibrary; -import io.deephaven.engine.table.lang.QueryScopeParam; import io.deephaven.engine.table.lang.QueryScope; -import io.deephaven.engine.liveness.LivenessScope; -import io.deephaven.engine.liveness.LivenessScopeStack; +import io.deephaven.engine.table.lang.QueryScopeParam; +import io.deephaven.plugin.type.ObjectType; +import io.deephaven.plugin.type.ObjectTypeLookup; import io.deephaven.util.SafeCloseable; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -23,13 +26,20 @@ import java.io.File; import java.io.IOException; import java.nio.file.Path; -import java.util.*; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; +import java.util.UUID; + +import static io.deephaven.engine.table.Table.HIERARCHICAL_CHILDREN_TABLE_MAP_ATTRIBUTE; +import static io.deephaven.engine.table.Table.NON_DISPLAY_TABLE; /** * This class exists to make all script sessions to be liveness artifacts, and provide a default implementation for * evaluateScript which handles liveness and diffs in a consistent way. */ -public abstract class AbstractScriptSession extends LivenessScope implements ScriptSession, VariableProvider { +public abstract class AbstractScriptSession extends LivenessScope + implements ScriptSession, VariableProvider { private static final Path CLASS_CACHE_LOCATION = CacheDir.get().resolve("script-session-classes"); @@ -54,9 +64,12 @@ private static void createOrClearDirectory(final File directory) { protected final QueryLibrary queryLibrary; protected final CompilerTools.Context compilerContext; + private final ObjectTypeLookup objectTypeLookup; private final Listener changeListener; - protected AbstractScriptSession(@Nullable Listener changeListener, boolean isDefaultScriptSession) { + protected AbstractScriptSession(ObjectTypeLookup objectTypeLookup, @Nullable Listener changeListener, + boolean isDefaultScriptSession) { + this.objectTypeLookup = objectTypeLookup; this.changeListener = changeListener; // TODO(deephaven-core#1713): Introduce instance-id concept @@ -90,10 +103,32 @@ public String getClassPath() { } } + protected synchronized void publishInitial() { + applyDiff(emptySnapshot(), takeSnapshot(), null); + } + + interface Snapshot { + + } + + protected abstract Snapshot emptySnapshot(); + + protected abstract Snapshot takeSnapshot(); + + protected abstract Changes createDiff(Snapshot from, Snapshot to, RuntimeException e); + + protected Changes applyDiff(Snapshot from, Snapshot to, RuntimeException e) { + final Changes diff = createDiff(from, to, e); + if (changeListener != null) { + changeListener.onScopeChanges(this, diff); + } + return diff; + } + @Override public synchronized final Changes evaluateScript(final String script, final @Nullable String scriptName) { - final Changes diff = new Changes(); - final Map existingScope = new HashMap<>(getVariables()); + RuntimeException evaluateErr = null; + final Snapshot fromSnapshot = takeSnapshot(); // store pointers to exist query scope static variables final QueryLibrary prevQueryLibrary = QueryLibrary.getLibrary(); @@ -110,7 +145,7 @@ public synchronized final Changes evaluateScript(final String script, final @Nul // actually evaluate the script evaluate(script, scriptName); } catch (final RuntimeException err) { - diff.error = err; + evaluateErr = err; } finally { // restore pointers to query scope static variables QueryScope.setScope(prevQueryScope); @@ -118,63 +153,70 @@ public synchronized final Changes evaluateScript(final String script, final @Nul QueryLibrary.setLibrary(prevQueryLibrary); } - final Map newScope = new HashMap<>(getVariables()); + final Snapshot toSnapshot = takeSnapshot(); - // produce a diff - for (final Map.Entry entry : newScope.entrySet()) { - final String name = entry.getKey(); - final Object existingValue = existingScope.get(name); - final Object newValue = entry.getValue(); - applyVariableChangeToDiff(diff, name, existingValue, newValue); - } - - for (final Map.Entry entry : existingScope.entrySet()) { - final String name = entry.getKey(); - if (newScope.containsKey(name)) { - continue; // this is already handled even if old or new values are non-displayable - } - applyVariableChangeToDiff(diff, name, entry.getValue(), null); - } - - if (changeListener != null && !diff.isEmpty()) { - changeListener.onScopeChanges(this, diff); - } + final Changes diff = applyDiff(fromSnapshot, toSnapshot, evaluateErr); // re-throw any captured exception now that our listener knows what query scope state had changed prior // to the script session execution error - if (diff.error != null) { - throw diff.error; + if (evaluateErr != null) { + throw evaluateErr; } return diff; } - private void applyVariableChangeToDiff(final Changes diff, String name, + protected void applyVariableChangeToDiff(final Changes diff, String name, @Nullable Object fromValue, @Nullable Object toValue) { - fromValue = unwrapObject(fromValue); - final ExportedObjectType fromType = ExportedObjectType.fromObject(fromValue); - if (!fromType.isDisplayable()) { + if (fromValue == toValue) { + return; + } + final String fromTypeName = getTypeNameIfDisplayable(fromValue).orElse(null); + if (fromTypeName == null) { fromValue = null; } - toValue = unwrapObject(toValue); - final ExportedObjectType toType = ExportedObjectType.fromObject(toValue); - if (!toType.isDisplayable()) { + final String toTypeName = getTypeNameIfDisplayable(toValue).orElse(null); + if (toTypeName == null) { toValue = null; } if (fromValue == toValue) { return; } - if (fromValue == null) { - diff.created.put(name, toType); - } else if (toValue == null) { - diff.removed.put(name, fromType); - } else if (fromType != toType) { - diff.created.put(name, toType); - diff.removed.put(name, fromType); - } else { - diff.updated.put(name, toType); + diff.created.put(name, toTypeName); + return; + } + if (toValue == null) { + diff.removed.put(name, fromTypeName); + return; + } + if (!fromTypeName.equals(toTypeName)) { + diff.created.put(name, toTypeName); + diff.removed.put(name, fromTypeName); + return; } + diff.updated.put(name, toTypeName); + } + + private Optional getTypeNameIfDisplayable(Object object) { + if (object == null) { + return Optional.empty(); + } + if (object instanceof Table) { + final Table table = (Table) object; + if (table.hasAttribute(NON_DISPLAY_TABLE)) { + return Optional.empty(); + } + if (table.hasAttribute(HIERARCHICAL_CHILDREN_TABLE_MAP_ATTRIBUTE)) { + return Optional.of("TreeTable"); + } + return Optional.of("Table"); + } + if (object instanceof TableMap) { + return Optional.empty(); + // return Optional.of("TableMap"); + } + return objectTypeLookup.findObjectType(object).map(ObjectType::name); } @Override @@ -193,7 +235,6 @@ protected synchronized void notifyVariableChange(String name, @Nullable Object o if (changeListener == null) { return; } - Changes changes = new Changes(); applyVariableChangeToDiff(changes, name, oldValue, newValue); if (!changes.isEmpty()) { diff --git a/engine/table/src/main/java/io/deephaven/engine/util/ExportedObjectType.java b/engine/table/src/main/java/io/deephaven/engine/util/ExportedObjectType.java deleted file mode 100644 index 4441538d881..00000000000 --- a/engine/table/src/main/java/io/deephaven/engine/util/ExportedObjectType.java +++ /dev/null @@ -1,54 +0,0 @@ -package io.deephaven.engine.util; - -import io.deephaven.engine.table.Table; -import io.deephaven.engine.table.TableMap; -import static io.deephaven.engine.table.Table.HIERARCHICAL_CHILDREN_TABLE_MAP_ATTRIBUTE; -import static io.deephaven.engine.table.Table.NON_DISPLAY_TABLE; - -public enum ExportedObjectType { - Table, - TreeTable, - TableMap, - Figure, - OtherWidget, - Pandas, - NonDisplayable; - - public static ExportedObjectType fromObject(Object value) { - if (IsWidget.isTable(value)) { - Table table = IsWidget.getTable(value); - if (!table.hasAttribute(NON_DISPLAY_TABLE)) { - if (table.hasAttribute(HIERARCHICAL_CHILDREN_TABLE_MAP_ATTRIBUTE)) { - return ExportedObjectType.TreeTable; - } else { - return ExportedObjectType.Table; - } - } - } else if (IsWidget.isWidget(value)) { - final LiveWidget widget = IsWidget.getWidget(value); - if (widget instanceof FigureWidgetMarker) { - return ExportedObjectType.Figure; - } else if (widget instanceof PandasWidgetMarker) { - return ExportedObjectType.Pandas; - } else { - return ExportedObjectType.OtherWidget; - } - } else if (value instanceof TableMap) { - return ExportedObjectType.TableMap; - } - return NonDisplayable; - } - - public boolean isTableType() { - return this == Table || this == TreeTable; - } - - public boolean isWidgetType() { - return this == Figure || this == OtherWidget || this == Pandas; - } - - public boolean isDisplayable() { - return this != NonDisplayable && this != TableMap; - } -} - diff --git a/engine/table/src/main/java/io/deephaven/engine/util/GroovyDeephavenSession.java b/engine/table/src/main/java/io/deephaven/engine/util/GroovyDeephavenSession.java index 18b6d696127..71e155f6b87 100644 --- a/engine/table/src/main/java/io/deephaven/engine/util/GroovyDeephavenSession.java +++ b/engine/table/src/main/java/io/deephaven/engine/util/GroovyDeephavenSession.java @@ -22,6 +22,7 @@ import io.deephaven.engine.util.scripts.StateOverrideScriptPathLoader; import io.deephaven.internal.log.LoggerFactory; import io.deephaven.io.logger.Logger; +import io.deephaven.plugin.type.ObjectTypeLookup; import io.deephaven.util.annotations.VisibleForTesting; import org.codehaus.groovy.control.CompilationUnit; import org.codehaus.groovy.control.Phases; @@ -122,14 +123,16 @@ private String getNextScriptClassName() { private transient SourceClosure sourceClosure; private transient SourceClosure sourceOnceClosure; - public GroovyDeephavenSession(final RunScripts runScripts) throws IOException { - this(null, runScripts, false); + public GroovyDeephavenSession(ObjectTypeLookup objectTypeLookup, final RunScripts runScripts) + throws IOException { + this(objectTypeLookup, null, runScripts, false); } public GroovyDeephavenSession( - @Nullable final Listener changeListener, final RunScripts runScripts, boolean isDefaultScriptSession) + ObjectTypeLookup objectTypeLookup, @Nullable final Listener changeListener, + final RunScripts runScripts, boolean isDefaultScriptSession) throws IOException { - super(changeListener, isDefaultScriptSession); + super(objectTypeLookup, changeListener, isDefaultScriptSession); this.scriptFinder = new ScriptFinder(DEFAULT_SCRIPT_PATH); @@ -138,6 +141,8 @@ public GroovyDeephavenSession( compilerContext.setParentClassLoader(getShell().getClassLoader()); + publishInitial(); + for (final String path : runScripts.paths) { runScript(path); } @@ -620,6 +625,48 @@ public Map getVariables() { } @Override + protected Snapshot emptySnapshot() { + return new GroovySnapshot(Collections.emptyMap()); + } + + @Override + protected Snapshot takeSnapshot() { + return new GroovySnapshot(new HashMap<>(getVariables())); + } + + @Override + protected Changes createDiff(Snapshot from, Snapshot to, RuntimeException e) { + return diffImpl((GroovySnapshot) from, (GroovySnapshot) to, e); + } + + private Changes diffImpl(GroovySnapshot from, GroovySnapshot to, RuntimeException e) { + Changes diff = new Changes(); + diff.error = e; + for (final Map.Entry entry : to.scope.entrySet()) { + final String name = entry.getKey(); + final Object existingValue = from.scope.get(name); + final Object newValue = entry.getValue(); + applyVariableChangeToDiff(diff, name, existingValue, newValue); + } + for (final Map.Entry entry : from.scope.entrySet()) { + final String name = entry.getKey(); + if (to.scope.containsKey(name)) { + continue; // this is already handled even if old or new values are non-displayable + } + applyVariableChangeToDiff(diff, name, entry.getValue(), null); + } + return diff; + } + + private static class GroovySnapshot implements Snapshot { + + private final Map scope; + + public GroovySnapshot(Map existingScope) { + this.scope = Objects.requireNonNull(existingScope); + } + } + public Set getVariableNames() { // noinspection unchecked return Collections.unmodifiableSet(groovyShell.getContext().getVariables().keySet()); diff --git a/engine/table/src/main/java/io/deephaven/engine/util/IsWidget.java b/engine/table/src/main/java/io/deephaven/engine/util/IsWidget.java deleted file mode 100644 index 480e7aba601..00000000000 --- a/engine/table/src/main/java/io/deephaven/engine/util/IsWidget.java +++ /dev/null @@ -1,117 +0,0 @@ -package io.deephaven.engine.util; - -import io.deephaven.engine.exceptions.ArgumentException; -import io.deephaven.engine.exceptions.OperationException; -import io.deephaven.engine.exceptions.StateException; -import io.deephaven.engine.table.Table; -import org.jpy.PyObject; - -/** - * Get a widget from an object. - */ -public class IsWidget { - private static final String GET_WIDGET_ATTRIBUTE = "getWidget"; - private static final String GET_WIDGET_VISIBILITY_ATTRIBUTE = "getValidGroups"; - private static final String GET_TABLE_ATTRIBUTE = "get_dh_table"; - - public static boolean isWidget(Object value) { - if (value instanceof LiveWidget) { - return true; - } else if ((value instanceof PyObject && ((PyObject) value).hasAttribute(GET_WIDGET_ATTRIBUTE))) { - try (final PyObject widget = ((PyObject) value).callMethod(GET_WIDGET_ATTRIBUTE)) { - return !widget.isNone(); - } - } - - return false; - } - - public static LiveWidget getWidget(Object value) { - if (value instanceof LiveWidget) { - return (LiveWidget) value; - } else if (value instanceof PyObject) { - return IsWidget.getWidget((PyObject) value); - } - - throw new OperationException("Can not convert value=" + value + " to a LiveWidget."); - } - - public static LiveWidget getWidget(PyObject pyObject) { - boolean isWidget = pyObject.hasAttribute(GET_WIDGET_ATTRIBUTE); - if (isWidget) { - try (final PyObject widget = pyObject.callMethod(GET_WIDGET_ATTRIBUTE)) { - if (!widget.isNone()) { - return (LiveWidget) widget.getObjectValue(); - } - } - } - - throw new OperationException("Can not convert pyOjbect=" + pyObject + " to a LiveWidget."); - } - - public static boolean isLiveWidgetVisibilityProvider(Object value) { - if (value instanceof LiveWidgetVisibilityProvider) { - return true; - } else if ((value instanceof PyObject && ((PyObject) value).hasAttribute(GET_WIDGET_VISIBILITY_ATTRIBUTE))) { - return true; - } - - return false; - } - - public static String[] getLiveWidgetVisibility(final Object object) { - if (object instanceof LiveWidgetVisibilityProvider) { - return ((LiveWidgetVisibilityProvider) object).getValidGroups(); - } else if (object instanceof PyObject) { - final PyObject pyObject = (PyObject) object; - boolean isWidget = pyObject.hasAttribute(GET_WIDGET_VISIBILITY_ATTRIBUTE); - if (isWidget) { - try (final PyObject widget = pyObject.callMethod(GET_WIDGET_VISIBILITY_ATTRIBUTE)) { - if (!widget.isNone()) { - return widget.getObjectArrayValue(String.class); - } else { - return null; - } - } - } else { - throw new StateException("PyObject " + object + " isLiveWidgetVisibilityProvider, but has no attribute " - + GET_WIDGET_VISIBILITY_ATTRIBUTE); - } - } - - throw new ArgumentException("Unknown LiveWidgetVisibilityProvider type " + object); - } - - public static boolean isTable(Object value) { - if (value instanceof Table) { - return true; - } else if ((value instanceof PyObject && ((PyObject) value).hasAttribute(GET_TABLE_ATTRIBUTE))) { - try (final PyObject widget = ((PyObject) value).callMethod(GET_TABLE_ATTRIBUTE)) { - return !widget.isNone(); - } - } - - return false; - } - - public static Table getTable(Object value) { - if (value instanceof Table) { - return (Table) value; - } else if (value instanceof PyObject) { - return getTable((PyObject) value); - } - throw new OperationException("Can not convert value=" + value + " to a Table."); - } - - public static Table getTable(PyObject pyObject) { - if (pyObject.hasAttribute(GET_TABLE_ATTRIBUTE)) { - try (final PyObject widget = pyObject.callMethod(GET_TABLE_ATTRIBUTE)) { - if (!widget.isNone()) { - return (Table) widget.getObjectValue(); - } - } - } - - throw new OperationException("Can not convert pyObject=" + pyObject + " to a Table."); - } -} diff --git a/engine/table/src/main/java/io/deephaven/engine/util/NoLanguageDeephavenSession.java b/engine/table/src/main/java/io/deephaven/engine/util/NoLanguageDeephavenSession.java index e8406533012..29f64a1bc04 100644 --- a/engine/table/src/main/java/io/deephaven/engine/util/NoLanguageDeephavenSession.java +++ b/engine/table/src/main/java/io/deephaven/engine/util/NoLanguageDeephavenSession.java @@ -31,7 +31,7 @@ public NoLanguageDeephavenSession() { } public NoLanguageDeephavenSession(final String scriptType) { - super(null, false); + super(null, null, false); this.scriptType = scriptType; variables = new LinkedHashMap<>(); @@ -62,6 +62,21 @@ public T getVariable(String name, T defaultValue) { } } + @Override + protected Snapshot emptySnapshot() { + throw new UnsupportedOperationException(SCRIPT_TYPE + " session does not support emptySnapshot"); + } + + @Override + protected Snapshot takeSnapshot() { + throw new UnsupportedOperationException(SCRIPT_TYPE + " session does not support takeSnapshot"); + } + + @Override + protected Changes createDiff(Snapshot from, Snapshot to, RuntimeException e) { + throw new UnsupportedOperationException(SCRIPT_TYPE + " session does not support diff"); + } + @Override protected void evaluate(String command, @Nullable String scriptName) { if (!scriptType.equals(SCRIPT_TYPE)) { diff --git a/engine/table/src/main/java/io/deephaven/engine/util/PythonDeephavenSession.java b/engine/table/src/main/java/io/deephaven/engine/util/PythonDeephavenSession.java index 2cf7d92b704..85cb0c33bd3 100644 --- a/engine/table/src/main/java/io/deephaven/engine/util/PythonDeephavenSession.java +++ b/engine/table/src/main/java/io/deephaven/engine/util/PythonDeephavenSession.java @@ -4,36 +4,37 @@ package io.deephaven.engine.util; -import io.deephaven.UncheckedDeephavenException; import io.deephaven.base.FileUtils; import io.deephaven.base.verify.Assert; import io.deephaven.configuration.Configuration; import io.deephaven.engine.exceptions.CancellationException; -import io.deephaven.engine.exceptions.OperationException; -import io.deephaven.engine.table.Table; import io.deephaven.engine.table.lang.QueryLibrary; -import io.deephaven.engine.updategraph.UpdateGraphProcessor; import io.deephaven.engine.table.lang.QueryScope; -import io.deephaven.engine.util.jpy.JpyInit; +import io.deephaven.engine.updategraph.UpdateGraphProcessor; import io.deephaven.engine.util.scripts.ScriptPathLoader; import io.deephaven.engine.util.scripts.ScriptPathLoaderState; import io.deephaven.internal.log.LoggerFactory; import io.deephaven.io.logger.Logger; +import io.deephaven.plugin.type.ObjectTypeLookup; import io.deephaven.util.annotations.VisibleForTesting; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jpy.KeyError; import org.jpy.PyDictWrapper; +import org.jpy.PyInputMode; +import org.jpy.PyLib.CallableKind; +import org.jpy.PyModule; import org.jpy.PyObject; +import java.io.Closeable; import java.io.FileWriter; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.util.Collections; import java.util.Map; +import java.util.Objects; import java.util.Set; -import java.util.concurrent.TimeoutException; import java.util.function.Supplier; import java.util.stream.Collectors; @@ -53,35 +54,43 @@ public class PythonDeephavenSession extends AbstractScriptSession implements Scr public static String SCRIPT_TYPE = "Python"; + private final PythonScriptSessionModule module; + private final ScriptFinder scriptFinder; private final PythonEvaluator evaluator; - private final PythonScope scope; + private final PythonScope scope; /** * Create a Python ScriptSession. * + * @param objectTypeLookup the object type lookup * @param runInitScripts if init scripts should be executed * @throws IOException if an IO error occurs running initialization scripts */ - public PythonDeephavenSession(boolean runInitScripts) throws IOException { - this(null, runInitScripts, false); + public PythonDeephavenSession(ObjectTypeLookup objectTypeLookup, boolean runInitScripts) + throws IOException { + this(objectTypeLookup, null, runInitScripts, false); } /** * Create a Python ScriptSession. * + * @param objectTypeLookup the object type lookup * @param listener an optional listener that will be notified whenever the query scope changes * @param runInitScripts if init scripts should be executed * @param isDefaultScriptSession true if this is in the default context of a worker jvm * @throws IOException if an IO error occurs running initialization scripts */ public PythonDeephavenSession( - @Nullable final Listener listener, boolean runInitScripts, boolean isDefaultScriptSession) + ObjectTypeLookup objectTypeLookup, @Nullable final Listener listener, boolean runInitScripts, + boolean isDefaultScriptSession) throws IOException { - super(listener, isDefaultScriptSession); + super(objectTypeLookup, listener, isDefaultScriptSession); PythonEvaluatorJpy jpy = PythonEvaluatorJpy.withGlobalCopy(); evaluator = jpy; scope = jpy.getScope(); + this.module = (PythonScriptSessionModule) PyModule.importModule("deephaven.server.script_session") + .createProxy(CallableKind.FUNCTION, PythonScriptSessionModule.class); this.scriptFinder = new ScriptFinder(DEFAULT_SCRIPT_PATH); /* @@ -89,6 +98,8 @@ public PythonDeephavenSession( */ PythonLogAdapter.interceptOutputStreams(evaluator); + publishInitial(); + /* * And now the user-defined initialization scripts, if any. */ @@ -113,10 +124,10 @@ public PythonDeephavenSession( * Creates a Python "{@link ScriptSession}", for use where we should only be reading from the scope, such as an * IPython kernel session. */ - public PythonDeephavenSession(PythonScope scope) { - super(null, false); - - this.scope = scope; + public PythonDeephavenSession(ObjectTypeLookup objectTypeLookup, PythonScope scope) { + super(objectTypeLookup, null, false); + this.scope = (PythonScope) scope; + this.module = null; this.evaluator = null; this.scriptFinder = null; } @@ -186,6 +197,65 @@ public Map getVariables() { return Collections.unmodifiableMap(scope.getEntriesMap()); } + private static class PythonSnapshot implements Snapshot, Closeable { + + private final PyDictWrapper dict; + + public PythonSnapshot(PyDictWrapper dict) { + this.dict = Objects.requireNonNull(dict); + } + + @Override + public void close() { + dict.close(); + } + } + + @Override + protected Snapshot emptySnapshot() { + return new PythonSnapshot(PyObject.executeCode("dict()", PyInputMode.EXPRESSION).asDict()); + } + + @Override + protected Snapshot takeSnapshot() { + return new PythonSnapshot(scope.globals().copy()); + } + + @Override + protected Changes createDiff(Snapshot from, Snapshot to, RuntimeException e) { + // TODO(deephaven-core#1775): multivariate jpy (unwrapped) return type into java + // It would be great if we could push down the maybeUnwrap logic into create_change_list (it could handle the + // unwrapping), but we are unable to tell jpy that we want to unwrap JType objects, but pass back python objects + // as PyObject. + try ( + PythonSnapshot fromSnapshot = (PythonSnapshot) from; + PythonSnapshot toSnapshot = (PythonSnapshot) to; + PyObject changes = module.create_change_list(fromSnapshot.dict.unwrap(), toSnapshot.dict.unwrap())) { + final Changes diff = new Changes(); + diff.error = e; + for (PyObject change : changes.asList()) { + // unpack the tuple + // (name, existing_value, new_value) + final String name = change.call(String.class, "__getitem__", int.class, 0); + final PyObject fromValue = change.call(PyObject.class, "__getitem__", int.class, 1); + final PyObject toValue = change.call(PyObject.class, "__getitem__", int.class, 2); + applyVariableChangeToDiff(diff, name, maybeUnwrap(fromValue), maybeUnwrap(toValue)); + } + return diff; + } + } + + private Object maybeUnwrap(PyObject o) { + if (o == null) { + return null; + } + final Object javaObject = module.unwrap_to_java_type(o); + if (javaObject != null) { + return javaObject; + } + return o; + } + @Override public Set getVariableNames() { return Collections.unmodifiableSet(scope.getKeys().collect(Collectors.toSet())); @@ -197,8 +267,8 @@ public boolean hasVariableName(String name) { } @Override - public void setVariable(String name, @Nullable Object newValue) { - final Object oldValue = getVariable(name, null); + public synchronized void setVariable(String name, @Nullable Object newValue) { + final Snapshot fromSnapshot = takeSnapshot(); final PyDictWrapper globals = scope.globals(); if (newValue == null) { try { @@ -209,7 +279,8 @@ public void setVariable(String name, @Nullable Object newValue) { } else { globals.setItem(name, newValue); } - notifyVariableChange(name, oldValue, newValue); + final Snapshot toSnapshot = takeSnapshot(); + applyDiff(fromSnapshot, toSnapshot, null); } @Override @@ -241,62 +312,20 @@ public boolean setUseOriginalScriptLoaderState(boolean useOriginal) { public Object unwrapObject(Object object) { if (object instanceof PyObject) { final PyObject pyObject = (PyObject) object; - if (isWidget(pyObject)) { - return getWidget(pyObject); - } else if (isTable(pyObject)) { - return getTable(pyObject); + final Object unwrapped = module.unwrap_to_java_type(pyObject); + if (unwrapped != null) { + return unwrapped; } } return object; } - private static final String GET_WIDGET_ATTRIBUTE = "getWidget"; - - private static boolean isWidget(PyObject value) { - if ((value != null && value.hasAttribute(GET_WIDGET_ATTRIBUTE))) { - try (final PyObject widget = value.callMethod(GET_WIDGET_ATTRIBUTE)) { - return !widget.isNone(); - } - } - - return false; - } + interface PythonScriptSessionModule extends Closeable { + PyObject create_change_list(PyObject from, PyObject to); - private static LiveWidget getWidget(PyObject pyObject) { - boolean isWidget = pyObject.hasAttribute(GET_WIDGET_ATTRIBUTE); - if (isWidget) { - try (final PyObject widget = pyObject.callMethod(GET_WIDGET_ATTRIBUTE)) { - if (!widget.isNone()) { - return (LiveWidget) widget.getObjectValue(); - } - } - } - - throw new OperationException("Can not convert pyOjbect=" + pyObject + " to a LiveWidget."); - } - - private static final String GET_TABLE_ATTRIBUTE = "get_dh_table"; - - private static boolean isTable(PyObject value) { - if ((value != null && value.hasAttribute(GET_TABLE_ATTRIBUTE))) { - try (final PyObject widget = value.callMethod(GET_TABLE_ATTRIBUTE)) { - return !widget.isNone(); - } - } - - return false; - } - - private static Table getTable(PyObject pyObject) { - if (pyObject.hasAttribute(GET_TABLE_ATTRIBUTE)) { - try (final PyObject widget = pyObject.callMethod(GET_TABLE_ATTRIBUTE)) { - if (!widget.isNone()) { - return (Table) widget.getObjectValue(); - } - } - } + Object unwrap_to_java_type(PyObject object); - throw new OperationException("Can not convert pyObject=" + pyObject + " to a Table."); + void close(); } } diff --git a/engine/table/src/main/java/io/deephaven/engine/util/PythonScopeJpyImpl.java b/engine/table/src/main/java/io/deephaven/engine/util/PythonScopeJpyImpl.java index 24789f013b2..0a3287f2be1 100644 --- a/engine/table/src/main/java/io/deephaven/engine/util/PythonScopeJpyImpl.java +++ b/engine/table/src/main/java/io/deephaven/engine/util/PythonScopeJpyImpl.java @@ -29,7 +29,6 @@ public static PythonScopeJpyImpl ofMainGlobals() { public PythonScopeJpyImpl(PyDictWrapper dict) { this.dict = dict; - } @Override diff --git a/engine/table/src/main/java/io/deephaven/engine/util/ScriptSession.java b/engine/table/src/main/java/io/deephaven/engine/util/ScriptSession.java index c078203eef7..b51799cabc4 100644 --- a/engine/table/src/main/java/io/deephaven/engine/util/ScriptSession.java +++ b/engine/table/src/main/java/io/deephaven/engine/util/ScriptSession.java @@ -57,14 +57,15 @@ public interface ScriptSession extends ReleasableLivenessManager, LivenessNode { class Changes { public RuntimeException error = null; - public Map created = new HashMap<>(); - public Map updated = new HashMap<>(); - public Map removed = new HashMap<>(); + public Map created = new HashMap<>(); + public Map updated = new HashMap<>(); + public Map removed = new HashMap<>(); public boolean isEmpty() { - return created.isEmpty() && updated.isEmpty() && removed.isEmpty(); + return error == null && created.isEmpty() && updated.isEmpty() && removed.isEmpty(); } } + interface Listener { void onScopeChanges(ScriptSession scriptSession, Changes changes); } diff --git a/engine/table/src/test/java/io/deephaven/engine/table/impl/FuzzerTest.java b/engine/table/src/test/java/io/deephaven/engine/table/impl/FuzzerTest.java index fa77564aea6..8483bc79681 100644 --- a/engine/table/src/test/java/io/deephaven/engine/table/impl/FuzzerTest.java +++ b/engine/table/src/test/java/io/deephaven/engine/table/impl/FuzzerTest.java @@ -4,6 +4,7 @@ import io.deephaven.configuration.Configuration; import io.deephaven.engine.table.Table; import io.deephaven.engine.table.TableMap; +import io.deephaven.plugin.type.ObjectTypeLookup.NoOp; import io.deephaven.time.DateTimeUtils; import io.deephaven.engine.updategraph.UpdateGraphProcessor; import io.deephaven.engine.table.lang.QueryScope; @@ -93,7 +94,7 @@ private GroovyDeephavenSession getGroovySession() throws IOException { } private GroovyDeephavenSession getGroovySession(@Nullable TimeProvider timeProvider) throws IOException { - final GroovyDeephavenSession session = new GroovyDeephavenSession(RunScripts.serviceLoader()); + final GroovyDeephavenSession session = new GroovyDeephavenSession(NoOp.INSTANCE, RunScripts.serviceLoader()); QueryScope.setScope(session.newQueryScope()); return session; } diff --git a/engine/table/src/test/java/io/deephaven/engine/util/scripts/TestGroovyDeephavenSession.java b/engine/table/src/test/java/io/deephaven/engine/util/scripts/TestGroovyDeephavenSession.java index 95f56650134..4f060df513e 100644 --- a/engine/table/src/test/java/io/deephaven/engine/util/scripts/TestGroovyDeephavenSession.java +++ b/engine/table/src/test/java/io/deephaven/engine/util/scripts/TestGroovyDeephavenSession.java @@ -10,6 +10,7 @@ import io.deephaven.engine.util.GroovyDeephavenSession; import io.deephaven.engine.liveness.LivenessScope; import io.deephaven.engine.liveness.LivenessScopeStack; +import io.deephaven.plugin.type.ObjectTypeLookup.NoOp; import org.junit.After; import org.junit.Before; import org.junit.Test; @@ -25,7 +26,7 @@ public class TestGroovyDeephavenSession { public void setup() throws IOException { livenessScope = new LivenessScope(); LivenessScopeStack.push(livenessScope); - session = new GroovyDeephavenSession(null, GroovyDeephavenSession.RunScripts.none(), false); + session = new GroovyDeephavenSession(NoOp.INSTANCE, null, GroovyDeephavenSession.RunScripts.none(), false); } @After diff --git a/java-client/barrage-examples/src/main/java/io/deephaven/client/examples/SubscribeApplicationField.java b/java-client/barrage-examples/src/main/java/io/deephaven/client/examples/SubscribeApplicationField.java deleted file mode 100644 index b2b99d44878..00000000000 --- a/java-client/barrage-examples/src/main/java/io/deephaven/client/examples/SubscribeApplicationField.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (c) 2016-2021 Deephaven Data Labs and Patent Pending - */ - -package io.deephaven.client.examples; - -import io.deephaven.qst.TableCreationLogic; -import io.deephaven.qst.table.TicketTable; -import picocli.CommandLine; -import picocli.CommandLine.Command; -import picocli.CommandLine.Parameters; - -@Command(name = "subscribe-application-field", mixinStandardHelpOptions = true, - description = "Request a table from an Application and subscribe over barrage", version = "0.1.0") -class SubscribeApplicationField extends SubscribeExampleBase { - - @Parameters(arity = "1", paramLabel = "app", description = "Application id to fetch from.") - String appId; - @Parameters(arity = "1", paramLabel = "field", description = "Application field name to subscribe to.") - String fieldName; - - @Override - protected TableCreationLogic logic() { - return TicketTable.fromApplicationField(appId, fieldName).logic(); - } - - public static void main(String[] args) { - int execute = new CommandLine(new SubscribeApplicationField()).execute(args); - System.exit(execute); - } -} diff --git a/java-client/barrage-examples/src/main/java/io/deephaven/client/examples/SubscribeQueryScope.java b/java-client/barrage-examples/src/main/java/io/deephaven/client/examples/SubscribeQueryScope.java deleted file mode 100644 index d6b515e8d76..00000000000 --- a/java-client/barrage-examples/src/main/java/io/deephaven/client/examples/SubscribeQueryScope.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (c) 2016-2021 Deephaven Data Labs and Patent Pending - */ - -package io.deephaven.client.examples; - -import io.deephaven.qst.TableCreationLogic; -import io.deephaven.qst.table.TicketTable; -import picocli.CommandLine; -import picocli.CommandLine.Command; -import picocli.CommandLine.Parameters; - -@Command(name = "subscribe-qs", mixinStandardHelpOptions = true, - description = "Request a table from the QueryScope and subscribe over barrage", version = "0.1.0") -class SubscribeQueryScope extends SubscribeExampleBase { - - @Parameters(arity = "1", paramLabel = "field", description = "Query scope field name to subscribe to.") - String fieldName; - - @Override - protected TableCreationLogic logic() { - return TicketTable.fromQueryScopeField(fieldName).logic(); - } - - public static void main(String[] args) { - int execute = new CommandLine(new SubscribeQueryScope()).execute(args); - System.exit(execute); - } -} diff --git a/java-client/flight-examples/src/main/java/io/deephaven/client/examples/GetTable.java b/java-client/flight-examples/src/main/java/io/deephaven/client/examples/GetTable.java new file mode 100644 index 00000000000..d84419416a6 --- /dev/null +++ b/java-client/flight-examples/src/main/java/io/deephaven/client/examples/GetTable.java @@ -0,0 +1,29 @@ +package io.deephaven.client.examples; + +import io.deephaven.client.impl.FlightSession; +import org.apache.arrow.flight.FlightStream; +import picocli.CommandLine; +import picocli.CommandLine.ArgGroup; +import picocli.CommandLine.Command; + +@Command(name = "get-table", mixinStandardHelpOptions = true, description = "Get a table", version = "0.1.0") +class GetTable extends FlightExampleBase { + + @ArgGroup(exclusive = true, multiplicity = "1") + Ticket ticket; + + @Override + protected void execute(FlightSession flight) throws Exception { + try (final FlightStream stream = flight.stream(ticket)) { + System.out.println(stream.getSchema()); + while (stream.next()) { + System.out.println(stream.getRoot().contentToTSVString()); + } + } + } + + public static void main(String[] args) { + int execute = new CommandLine(new GetTable()).execute(args); + System.exit(execute); + } +} diff --git a/java-client/session-examples/build.gradle b/java-client/session-examples/build.gradle index 2280478a36c..2e0c1a042fb 100644 --- a/java-client/session-examples/build.gradle +++ b/java-client/session-examples/build.gradle @@ -43,6 +43,7 @@ applicationDistribution.into('bin') { from(createApplication('execute-script', 'io.deephaven.client.examples.ExecuteScript')) from(createApplication('execute-code', 'io.deephaven.client.examples.ExecuteCode')) from(createApplication('subscribe-fields', 'io.deephaven.client.examples.SubscribeToFields')) + from(createApplication('fetch-object', 'io.deephaven.client.examples.FetchObject')) fileMode = 0755 } diff --git a/java-client/session-examples/src/main/java/io/deephaven/client/examples/FetchObject.java b/java-client/session-examples/src/main/java/io/deephaven/client/examples/FetchObject.java new file mode 100644 index 00000000000..c99441440e5 --- /dev/null +++ b/java-client/session-examples/src/main/java/io/deephaven/client/examples/FetchObject.java @@ -0,0 +1,44 @@ +package io.deephaven.client.examples; + +import io.deephaven.client.impl.FetchedObject; +import io.deephaven.client.impl.Session; +import picocli.CommandLine; +import picocli.CommandLine.ArgGroup; +import picocli.CommandLine.Command; +import picocli.CommandLine.Option; + +import java.io.BufferedOutputStream; +import java.io.OutputStream; +import java.nio.file.Files; +import java.nio.file.Path; + +@Command(name = "fetch-object", mixinStandardHelpOptions = true, + description = "Fetch object", version = "0.1.0") +class FetchObject extends SingleSessionExampleBase { + + @ArgGroup(exclusive = true, multiplicity = "1") + Ticket ticket; + + @Option(names = {"-f", "--file"}, description = "The output file, otherwise goes to STDOUT.") + Path file; + + @Override + protected void execute(Session session) throws Exception { + final FetchedObject customObject = session.fetchObject(ticket).get(); + final String type = customObject.type(); + System.err.println("type: " + type); + System.err.println("size: " + customObject.size()); + if (file != null) { + try (final OutputStream out = new BufferedOutputStream(Files.newOutputStream(file))) { + customObject.writeTo(out); + } + } else { + customObject.writeTo(System.out); + } + } + + public static void main(String[] args) { + int execute = new CommandLine(new FetchObject()).execute(args); + System.exit(execute); + } +} diff --git a/java-client/session/src/main/java/io/deephaven/client/impl/ApplicationService.java b/java-client/session/src/main/java/io/deephaven/client/impl/ApplicationService.java index e4612261aa9..56881f82c27 100644 --- a/java-client/session/src/main/java/io/deephaven/client/impl/ApplicationService.java +++ b/java-client/session/src/main/java/io/deephaven/client/impl/ApplicationService.java @@ -5,6 +5,8 @@ public interface ApplicationService { interface Listener { + + // TODO(deephaven-core#1783): Remove proto references from java client interface #1783 void onNext(FieldsChangeUpdate fields); void onError(Throwable t); diff --git a/java-client/session/src/main/java/io/deephaven/client/impl/ConsoleService.java b/java-client/session/src/main/java/io/deephaven/client/impl/ConsoleService.java index c894682aeed..942e64ac19c 100644 --- a/java-client/session/src/main/java/io/deephaven/client/impl/ConsoleService.java +++ b/java-client/session/src/main/java/io/deephaven/client/impl/ConsoleService.java @@ -23,4 +23,12 @@ public interface ConsoleService { * @return the publish completable future */ CompletableFuture publish(String name, HasTicketId ticketId); + + /** + * Fetch the object. + * + * @param ticket the ticket + * @return the future + */ + CompletableFuture fetchObject(HasTicketId ticket); } diff --git a/java-client/session/src/main/java/io/deephaven/client/impl/FetchedObject.java b/java-client/session/src/main/java/io/deephaven/client/impl/FetchedObject.java new file mode 100644 index 00000000000..f92fcdd9ab8 --- /dev/null +++ b/java-client/session/src/main/java/io/deephaven/client/impl/FetchedObject.java @@ -0,0 +1,41 @@ +package io.deephaven.client.impl; + +import com.google.protobuf.ByteString; + +import java.io.IOException; +import java.io.OutputStream; +import java.util.Objects; + +public final class FetchedObject { + private final String type; + private final ByteString bytes; + + FetchedObject(String type, ByteString bytes) { + this.type = Objects.requireNonNull(type); + this.bytes = Objects.requireNonNull(bytes); + } + + public String type() { + return type; + } + + public byte[] toByteArray() { + return bytes.toByteArray(); + } + + public int size() { + return bytes.size(); + } + + public void writeTo(OutputStream out) throws IOException { + bytes.writeTo(out); + } + + @Override + public String toString() { + return "FetchedObject{" + + "type='" + type + '\'' + + ", bytes=" + bytes + + '}'; + } +} diff --git a/java-client/session/src/main/java/io/deephaven/client/impl/SessionImpl.java b/java-client/session/src/main/java/io/deephaven/client/impl/SessionImpl.java index b6439125ec9..2ab34c86981 100644 --- a/java-client/session/src/main/java/io/deephaven/client/impl/SessionImpl.java +++ b/java-client/session/src/main/java/io/deephaven/client/impl/SessionImpl.java @@ -23,6 +23,8 @@ import io.deephaven.proto.backplane.script.grpc.ConsoleServiceGrpc.ConsoleServiceStub; import io.deephaven.proto.backplane.script.grpc.ExecuteCommandRequest; import io.deephaven.proto.backplane.script.grpc.ExecuteCommandResponse; +import io.deephaven.proto.backplane.script.grpc.FetchObjectRequest; +import io.deephaven.proto.backplane.script.grpc.FetchObjectResponse; import io.deephaven.proto.backplane.script.grpc.StartConsoleRequest; import io.deephaven.proto.backplane.script.grpc.StartConsoleResponse; import io.grpc.CallCredentials; @@ -246,6 +248,16 @@ public CompletableFuture publish(String name, HasTicketId ticketId) { return observer.future; } + @Override + public CompletableFuture fetchObject(HasTicketId ticketId) { + final FetchObjectRequest request = FetchObjectRequest.newBuilder() + .setSourceId(ticketId.ticketId().ticket()) + .build(); + final FetchObserver observer = new FetchObserver(); + consoleService.fetchObject(request, observer); + return observer.future; + } + @Override public void close() { try { @@ -396,6 +408,40 @@ public void onCompleted() { } } + private static final class FetchObserver + implements ClientResponseObserver { + private final CompletableFuture future = new CompletableFuture<>(); + + @Override + public void beforeStart(ClientCallStreamObserver requestStream) { + future.whenComplete((session, throwable) -> { + if (future.isCancelled()) { + requestStream.cancel("User cancelled", null); + } + }); + } + + @Override + public void onNext(FetchObjectResponse value) { + final String type = value.getType(); + final ByteString data = value.getData(); + future.complete(new FetchedObject(type, data)); + } + + @Override + public void onError(Throwable t) { + future.completeExceptionally(t); + } + + @Override + public void onCompleted() { + if (!future.isDone()) { + future.completeExceptionally( + new IllegalStateException("Observer completed without response")); + } + } + } + private class SessionCallCredentials extends CallCredentials { @Override diff --git a/plugin/build.gradle b/plugin/build.gradle new file mode 100644 index 00000000000..0a7c774e28f --- /dev/null +++ b/plugin/build.gradle @@ -0,0 +1,11 @@ +plugins { + id 'java-library' +} + +description = 'The Deephaven plugin interface' + +dependencies { + api project(':proto:proto-backplane-grpc') +} + +apply plugin: 'io.deephaven.java-publishing-conventions' diff --git a/plugin/figure/build.gradle b/plugin/figure/build.gradle new file mode 100644 index 00000000000..f91318ef2f6 --- /dev/null +++ b/plugin/figure/build.gradle @@ -0,0 +1,9 @@ +plugins { + id 'java' +} + +dependencies { + implementation project(':plugin') + implementation project(':Plot') + implementation project(':extensions-barrage') +} \ No newline at end of file diff --git a/plugin/figure/src/main/java/io/deephaven/figure/FigureWidgetPlugin.java b/plugin/figure/src/main/java/io/deephaven/figure/FigureWidgetPlugin.java new file mode 100644 index 00000000000..f509f87a72e --- /dev/null +++ b/plugin/figure/src/main/java/io/deephaven/figure/FigureWidgetPlugin.java @@ -0,0 +1,21 @@ +package io.deephaven.figure; + +import io.deephaven.plugin.Plugin; +import io.deephaven.plugin.PluginCallback; +import io.deephaven.plugin.type.Exporter; +import io.deephaven.plugin.type.ObjectType; + +import java.io.IOException; +import java.io.OutputStream; +import java.nio.charset.StandardCharsets; + +/** + * Registers the object type {@link FigureWidgetType}. + */ +public final class FigureWidgetPlugin implements Plugin { + + @Override + public void registerInto(PluginCallback callback) { + callback.registerCustomType(FigureWidgetType.instance()); + } +} diff --git a/server/src/main/java/io/deephaven/server/console/figure/FigureWidgetTranslator.java b/plugin/figure/src/main/java/io/deephaven/figure/FigureWidgetTranslator.java similarity index 97% rename from server/src/main/java/io/deephaven/server/console/figure/FigureWidgetTranslator.java rename to plugin/figure/src/main/java/io/deephaven/figure/FigureWidgetTranslator.java index a01c30a615d..98f76755498 100644 --- a/server/src/main/java/io/deephaven/server/console/figure/FigureWidgetTranslator.java +++ b/plugin/figure/src/main/java/io/deephaven/figure/FigureWidgetTranslator.java @@ -1,7 +1,8 @@ -package io.deephaven.server.console.figure; +package io.deephaven.figure; import io.deephaven.api.Selectable; import io.deephaven.engine.table.Table; +import io.deephaven.extensions.barrage.util.BarrageUtil; import io.deephaven.gui.shape.JShapes; import io.deephaven.gui.shape.NamedShape; import io.deephaven.gui.shape.Shape; @@ -37,6 +38,9 @@ import io.deephaven.plot.util.tables.SwappableTableOneClickMap; import io.deephaven.plot.util.tables.TableHandle; import io.deephaven.plot.util.tables.TableMapHandle; +import io.deephaven.plugin.type.Exporter; +import io.deephaven.plugin.type.Exporter.Export; +import io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse; import io.deephaven.proto.backplane.grpc.TableReference; import io.deephaven.proto.backplane.script.grpc.FigureDescriptor; import io.deephaven.proto.backplane.script.grpc.FigureDescriptor.AxisDescriptor; @@ -54,8 +58,6 @@ import io.deephaven.proto.backplane.script.grpc.FigureDescriptor.SourceDescriptor; import io.deephaven.proto.backplane.script.grpc.FigureDescriptor.SourceType; import io.deephaven.proto.backplane.script.grpc.FigureDescriptor.StringMapWithDefault; -import io.deephaven.server.session.SessionState; -import io.deephaven.server.table.TableServiceGrpcImpl; import io.deephaven.time.calendar.BusinessCalendar; import org.jetbrains.annotations.NotNull; import org.joda.time.format.DateTimeFormat; @@ -81,17 +83,29 @@ public class FigureWidgetTranslator { private static final DateTimeFormatter HOLIDAY_TIME_FORMAT = DateTimeFormat.forPattern("HH:mm"); + // Copied from TableServiceGrpcImpl + public static ExportedTableCreationResponse buildTableCreationResponse(final TableReference tableRef, + final Table table) { + return ExportedTableCreationResponse.newBuilder() + .setSuccess(true) + .setResultId(tableRef) + .setIsStatic(!table.isRefreshing()) + .setSize(table.size()) + .setSchemaHeader(BarrageUtil.schemaBytesFromTable(table)) + .build(); + } + private final List errorList = new ArrayList<>(); private final Map tablePositionMap = new HashMap<>(); private final Map tableMapPositionMap = new HashMap<>(); private FigureWidgetTranslator() {} - public static FigureDescriptor translate(FigureWidget figure, SessionState sessionState) { - return new FigureWidgetTranslator().translateFigure(figure, sessionState); + public static FigureDescriptor translate(FigureWidget figure, Exporter exporter) { + return new FigureWidgetTranslator().translateFigure(figure, exporter); } - private FigureDescriptor translateFigure(FigureWidget f, SessionState sessionState) { + private FigureDescriptor translateFigure(FigureWidget f, Exporter exporter) { FigureDescriptor.Builder clientFigure = FigureDescriptor.newBuilder(); BaseFigureImpl figure = f.getFigure(); @@ -108,9 +122,9 @@ private FigureDescriptor translateFigure(FigureWidget f, SessionState sessionSta } i++; - SessionState.ExportObject tableExportObject = sessionState.newServerSideExport(table); - clientFigure.addTables(TableServiceGrpcImpl.buildTableCreationResponse( - TableReference.newBuilder().setTicket(tableExportObject.getExportId()).build(), table)); + final Export
export = exporter.newServerSideExport(table); + clientFigure.addTables(buildTableCreationResponse( + TableReference.newBuilder().setTicket(export.getExportId()).build(), table)); } // TODO (deephaven-core#62) implement once tablemaps are ready diff --git a/plugin/figure/src/main/java/io/deephaven/figure/FigureWidgetType.java b/plugin/figure/src/main/java/io/deephaven/figure/FigureWidgetType.java new file mode 100644 index 00000000000..07f247c50b7 --- /dev/null +++ b/plugin/figure/src/main/java/io/deephaven/figure/FigureWidgetType.java @@ -0,0 +1,31 @@ +package io.deephaven.figure; + +import io.deephaven.plot.FigureWidget; +import io.deephaven.plugin.type.ObjectTypeClassBase; +import io.deephaven.plugin.type.Exporter; + +import java.io.IOException; +import java.io.OutputStream; + +/** + * An object type named {@value NAME} of java class type {@link FigureWidget}. + */ +public final class FigureWidgetType extends ObjectTypeClassBase { + + private static final FigureWidgetType INSTANCE = new FigureWidgetType(); + + public static final String NAME = "Figure"; + + public static FigureWidgetType instance() { + return INSTANCE; + } + + private FigureWidgetType() { + super(NAME, FigureWidget.class); + } + + @Override + public void writeToImpl(Exporter exporter, FigureWidget figureWidget, OutputStream out) throws IOException { + FigureWidgetTranslator.translate(figureWidget, exporter).writeTo(out); + } +} diff --git a/plugin/figure/src/main/resources/META-INF/services/io.deephaven.plugin.Plugin b/plugin/figure/src/main/resources/META-INF/services/io.deephaven.plugin.Plugin new file mode 100644 index 00000000000..526c0b8b53f --- /dev/null +++ b/plugin/figure/src/main/resources/META-INF/services/io.deephaven.plugin.Plugin @@ -0,0 +1 @@ +io.deephaven.figure.FigureWidgetPlugin diff --git a/plugin/src/main/java/io/deephaven/plugin/Plugin.java b/plugin/src/main/java/io/deephaven/plugin/Plugin.java new file mode 100644 index 00000000000..2019c3fabea --- /dev/null +++ b/plugin/src/main/java/io/deephaven/plugin/Plugin.java @@ -0,0 +1,6 @@ +package io.deephaven.plugin; + +public interface Plugin { + + void registerInto(PluginCallback callback); +} diff --git a/plugin/src/main/java/io/deephaven/plugin/PluginCallback.java b/plugin/src/main/java/io/deephaven/plugin/PluginCallback.java new file mode 100644 index 00000000000..a9046fa0b22 --- /dev/null +++ b/plugin/src/main/java/io/deephaven/plugin/PluginCallback.java @@ -0,0 +1,8 @@ +package io.deephaven.plugin; + +import io.deephaven.plugin.type.ObjectType; + +public interface PluginCallback { + + void registerCustomType(ObjectType objectType); +} diff --git a/plugin/src/main/java/io/deephaven/plugin/type/Exporter.java b/plugin/src/main/java/io/deephaven/plugin/type/Exporter.java new file mode 100644 index 00000000000..574b3df4e68 --- /dev/null +++ b/plugin/src/main/java/io/deephaven/plugin/type/Exporter.java @@ -0,0 +1,13 @@ +package io.deephaven.plugin.type; + +import io.deephaven.proto.backplane.grpc.Ticket; + +public interface Exporter { + Export newServerSideExport(T export); + + interface Export { + T get(); + + Ticket getExportId(); + } +} diff --git a/plugin/src/main/java/io/deephaven/plugin/type/ObjectType.java b/plugin/src/main/java/io/deephaven/plugin/type/ObjectType.java new file mode 100644 index 00000000000..76c662ccf35 --- /dev/null +++ b/plugin/src/main/java/io/deephaven/plugin/type/ObjectType.java @@ -0,0 +1,13 @@ +package io.deephaven.plugin.type; + +import java.io.IOException; +import java.io.OutputStream; + +public interface ObjectType { + + String name(); + + boolean isType(Object o); + + void writeTo(Exporter exporter, Object o, OutputStream out) throws IOException; +} diff --git a/plugin/src/main/java/io/deephaven/plugin/type/ObjectTypeBase.java b/plugin/src/main/java/io/deephaven/plugin/type/ObjectTypeBase.java new file mode 100644 index 00000000000..867bf21c972 --- /dev/null +++ b/plugin/src/main/java/io/deephaven/plugin/type/ObjectTypeBase.java @@ -0,0 +1,17 @@ +package io.deephaven.plugin.type; + +import java.io.IOException; +import java.io.OutputStream; + +public abstract class ObjectTypeBase implements ObjectType { + + public abstract void writeToTypeChecked(Exporter exporter, Object object, OutputStream out) throws IOException; + + @Override + public final void writeTo(Exporter exporter, Object o, OutputStream out) throws IOException { + if (!isType(o)) { + throw new IllegalArgumentException("Can't serialize object, wrong type: " + this + " / " + o); + } + writeToTypeChecked(exporter, o, out); + } +} diff --git a/plugin/src/main/java/io/deephaven/plugin/type/ObjectTypeClassBase.java b/plugin/src/main/java/io/deephaven/plugin/type/ObjectTypeClassBase.java new file mode 100644 index 00000000000..2036b852cc3 --- /dev/null +++ b/plugin/src/main/java/io/deephaven/plugin/type/ObjectTypeClassBase.java @@ -0,0 +1,60 @@ +package io.deephaven.plugin.type; + +import java.io.IOException; +import java.io.OutputStream; +import java.util.Objects; + +public abstract class ObjectTypeClassBase extends ObjectTypeBase { + private final String name; + private final Class clazz; + + public ObjectTypeClassBase(String name, Class clazz) { + this.name = Objects.requireNonNull(name); + this.clazz = Objects.requireNonNull(clazz); + } + + public abstract void writeToImpl(Exporter exporter, T object, OutputStream out) throws IOException; + + public final Class clazz() { + return clazz; + } + + @Override + public final String name() { + return name; + } + + @Override + public final boolean isType(Object o) { + return clazz.isInstance(o); + } + + @Override + public final void writeToTypeChecked(Exporter exporter, Object object, OutputStream out) throws IOException { + writeToImpl(exporter, clazz.cast(object), out); + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + ObjectTypeClassBase that = (ObjectTypeClassBase) o; + if (!name.equals(that.name)) + return false; + return clazz.equals(that.clazz); + } + + @Override + public int hashCode() { + int result = name.hashCode(); + result = 31 * result + clazz.hashCode(); + return result; + } + + @Override + public String toString() { + return name + ":" + clazz.getName(); + } +} diff --git a/plugin/src/main/java/io/deephaven/plugin/type/ObjectTypeLookup.java b/plugin/src/main/java/io/deephaven/plugin/type/ObjectTypeLookup.java new file mode 100644 index 00000000000..127194f49c1 --- /dev/null +++ b/plugin/src/main/java/io/deephaven/plugin/type/ObjectTypeLookup.java @@ -0,0 +1,17 @@ +package io.deephaven.plugin.type; + +import java.util.Optional; + +public interface ObjectTypeLookup { + + Optional findObjectType(Object object); + + enum NoOp implements ObjectTypeLookup { + INSTANCE; + + @Override + public Optional findObjectType(Object object) { + return Optional.empty(); + } + } +} diff --git a/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/application.proto b/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/application.proto index c7f6c889013..0885f7b805a 100644 --- a/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/application.proto +++ b/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/application.proto @@ -56,10 +56,10 @@ message FieldInfo { oneof field { CustomInfo custom = 1; TableInfo table = 2; - // reserved = 3; // for TreeTable + UnknownInfo unknown = 3; // reserved = 4; // for TableMap - FigureInfo figure = 5; - // reserved = 6; // for PANDAS + // reserved = 5; // *DEPRECATED* Figure + // reserved = 6; // for TreeTable // use values above 4096 for custom client behavior } @@ -82,6 +82,10 @@ message CustomInfo { string type = 1; // application-specific type to identify the purpose of this custom field reference } +message UnknownInfo { + +} + /* * Lightly describe a Table. */ @@ -95,10 +99,3 @@ message TableInfo { // The current number of rows for this table. sint64 size = 3 [jstype=JS_STRING]; } - -/* - * Lightly describes a Figure. - */ -message FigureInfo { - // Intentionally empty and is here for backwards compatibility should this API change. -} diff --git a/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/console.proto b/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/console.proto index d734aa711f3..82224d68e60 100644 --- a/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/console.proto +++ b/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/console.proto @@ -44,7 +44,12 @@ service ConsoleService { */ rpc NextAutoCompleteStream(AutoCompleteRequest) returns (BrowserNextResponse) {} + /** + * Deprecated: TODO(deephaven-core#1784): Remove fetchFigure RPC + */ rpc FetchFigure(FetchFigureRequest) returns (FetchFigureResponse) {} + + rpc FetchObject(FetchObjectRequest) returns (FetchObjectResponse) {} } @@ -216,10 +221,20 @@ message TextEdit { message FetchFigureRequest { io.deephaven.proto.backplane.grpc.Ticket source_id = 1; } + message FetchFigureResponse { FigureDescriptor figure_descriptor = 1; } +message FetchObjectRequest { + io.deephaven.proto.backplane.grpc.Ticket source_id = 1; +} + +message FetchObjectResponse { + string type = 1; + bytes data = 2; +} + message FigureDescriptor { optional string title = 1; string title_font = 2; diff --git a/python-engine-test/src/test/java/io/deephaven/engine/table/impl/select/TestConditionFilter.java b/python-engine-test/src/test/java/io/deephaven/engine/table/impl/select/TestConditionFilter.java index dd7dd89485d..64b7d7920df 100644 --- a/python-engine-test/src/test/java/io/deephaven/engine/table/impl/select/TestConditionFilter.java +++ b/python-engine-test/src/test/java/io/deephaven/engine/table/impl/select/TestConditionFilter.java @@ -8,6 +8,7 @@ import io.deephaven.engine.rowset.RowSetFactory; import io.deephaven.io.log.LogLevel; import io.deephaven.io.logger.StreamLoggerImpl; +import io.deephaven.plugin.type.ObjectTypeLookup.NoOp; import io.deephaven.util.process.ProcessEnvironment; import io.deephaven.compilertools.CompilerTools; import io.deephaven.engine.table.Table; @@ -369,7 +370,7 @@ private void check(String expression, Predicate> testPredica QueryScope currentScope = QueryScope.getScope(); try { if (pythonScope == null) { - pythonScope = new PythonDeephavenSession(new PythonScopeJpyImpl( + pythonScope = new PythonDeephavenSession(NoOp.INSTANCE, new PythonScopeJpyImpl( getMainGlobals().asDict())).newQueryScope(); QueryScope.setScope(pythonScope); } diff --git a/server/build.gradle b/server/build.gradle index 6d25f701134..f866bfc2d94 100644 --- a/server/build.gradle +++ b/server/build.gradle @@ -37,6 +37,11 @@ dependencies { runtimeOnly project(':extensions-suanshu') } + implementation project(':plugin') + // TODO(deephaven-core#1784): Remove fetchFigure RPC + // this can be runtimeOnly only after #1784 + implementation project(':plugin:figure') + Classpaths.inheritGrpcPlatform(project, 'api') //TODO(1722) This isn't actually an api dependency, but downstream dagger compiles will need it diff --git a/server/src/main/java/io/deephaven/server/appmode/AppFieldId.java b/server/src/main/java/io/deephaven/server/appmode/AppFieldId.java index c1a444bb383..251afd25310 100644 --- a/server/src/main/java/io/deephaven/server/appmode/AppFieldId.java +++ b/server/src/main/java/io/deephaven/server/appmode/AppFieldId.java @@ -52,7 +52,7 @@ public String applicationName() { @Override public String toString() { - return "AppFieldId{appId=" + app.id() + ", fieldName=" + fieldName + "}"; + return "AppFieldId{appId=" + (app == null ? "" : app.id()) + ", fieldName=" + fieldName + "}"; } @Override diff --git a/server/src/main/java/io/deephaven/server/appmode/ApplicationServiceGrpcImpl.java b/server/src/main/java/io/deephaven/server/appmode/ApplicationServiceGrpcImpl.java index b73a100ca70..6fa11644e3d 100644 --- a/server/src/main/java/io/deephaven/server/appmode/ApplicationServiceGrpcImpl.java +++ b/server/src/main/java/io/deephaven/server/appmode/ApplicationServiceGrpcImpl.java @@ -4,27 +4,29 @@ import io.deephaven.appmode.ApplicationState; import io.deephaven.appmode.CustomField; import io.deephaven.appmode.Field; -import io.deephaven.time.DateTimeUtils; -import io.deephaven.plot.FigureWidget; -import io.deephaven.engine.table.Table; -import io.deephaven.engine.util.ScriptSession; import io.deephaven.engine.liveness.LivenessArtifact; import io.deephaven.engine.liveness.LivenessReferent; +import io.deephaven.engine.table.Table; import io.deephaven.engine.updategraph.DynamicNode; +import io.deephaven.engine.util.ScriptSession; import io.deephaven.extensions.barrage.util.BarrageUtil; import io.deephaven.extensions.barrage.util.GrpcUtil; +import io.deephaven.plugin.type.ObjectTypeLookup; import io.deephaven.server.session.SessionService; import io.deephaven.server.session.SessionState; import io.deephaven.server.util.Scheduler; import io.deephaven.internal.log.LoggerFactory; import io.deephaven.io.logger.Logger; +import io.deephaven.plugin.type.ObjectType; import io.deephaven.proto.backplane.grpc.ApplicationServiceGrpc; import io.deephaven.proto.backplane.grpc.CustomInfo; import io.deephaven.proto.backplane.grpc.FieldInfo; +import io.deephaven.proto.backplane.grpc.FieldInfo.FieldType; import io.deephaven.proto.backplane.grpc.FieldsChangeUpdate; -import io.deephaven.proto.backplane.grpc.FigureInfo; import io.deephaven.proto.backplane.grpc.ListFieldsRequest; import io.deephaven.proto.backplane.grpc.TableInfo; +import io.deephaven.proto.backplane.grpc.UnknownInfo; +import io.deephaven.time.DateTimeUtils; import io.grpc.stub.ServerCallStreamObserver; import io.grpc.stub.StreamObserver; @@ -46,6 +48,8 @@ public class ApplicationServiceGrpcImpl extends ApplicationServiceGrpc.Applicati private final AppMode mode; private final Scheduler scheduler; private final SessionService sessionService; + private final ObjectTypeLookup objectTypeLookup; + private final LivenessTracker tracker = new LivenessTracker(); /** The list of Field listeners */ @@ -66,10 +70,12 @@ public class ApplicationServiceGrpcImpl extends ApplicationServiceGrpc.Applicati @Inject public ApplicationServiceGrpcImpl(final AppMode mode, final Scheduler scheduler, - final SessionService sessionService) { + final SessionService sessionService, + final ObjectTypeLookup objectTypeLookup) { this.mode = mode; this.scheduler = scheduler; this.sessionService = sessionService; + this.objectTypeLookup = objectTypeLookup; } @Override @@ -248,7 +254,7 @@ private static FieldInfo getRemovedFieldInfo(final AppFieldId id) { .build(); } - private static FieldInfo getFieldInfo(final AppFieldId id, final Field field) { + private FieldInfo getFieldInfo(final AppFieldId id, final Field field) { if (field instanceof CustomField) { return getCustomFieldInfo(id, (CustomField) field); } @@ -270,14 +276,9 @@ private static FieldInfo getCustomFieldInfo(final AppFieldId id, final CustomFie .build(); } - private static FieldInfo getStandardFieldInfo(final AppFieldId id, final Field field) { + private FieldInfo getStandardFieldInfo(final AppFieldId id, final Field field) { // Note that this method accepts any Field and not just StandardField - final FieldInfo.FieldType fieldType = fetchFieldType(field.value()); - - if (fieldType == null) { - throw new IllegalArgumentException("Application Field is not of standard type; use CustomField instead"); - } - + final FieldInfo.FieldType fieldType = fieldType(field.value()); return FieldInfo.newBuilder() .setTicket(id.getTicket()) .setFieldName(id.fieldName) @@ -288,20 +289,33 @@ private static FieldInfo getStandardFieldInfo(final AppFieldId id, final Field { diff --git a/server/src/main/java/io/deephaven/server/console/ConsoleServiceGrpcImpl.java b/server/src/main/java/io/deephaven/server/console/ConsoleServiceGrpcImpl.java index 51dcff0d640..78e8579a876 100644 --- a/server/src/main/java/io/deephaven/server/console/ConsoleServiceGrpcImpl.java +++ b/server/src/main/java/io/deephaven/server/console/ConsoleServiceGrpcImpl.java @@ -4,17 +4,20 @@ package io.deephaven.server.console; +import com.google.protobuf.ByteString; +import com.google.protobuf.ByteStringAccess; import com.google.rpc.Code; import io.deephaven.configuration.Configuration; import io.deephaven.engine.table.Table; import io.deephaven.engine.updategraph.DynamicNode; import io.deephaven.engine.util.DelegatingScriptSession; -import io.deephaven.engine.util.ExportedObjectType; import io.deephaven.engine.util.NoLanguageDeephavenSession; import io.deephaven.engine.util.ScriptSession; import io.deephaven.engine.util.VariableProvider; import io.deephaven.engine.util.jpy.JpyInit; +import io.deephaven.extensions.barrage.util.BarrageProtoUtil.ExposedByteArrayOutputStream; import io.deephaven.extensions.barrage.util.GrpcUtil; +import io.deephaven.figure.FigureWidgetTranslator; import io.deephaven.internal.log.LoggerFactory; import io.deephaven.io.logger.LogBuffer; import io.deephaven.io.logger.LogBufferRecord; @@ -27,6 +30,8 @@ import io.deephaven.lang.parse.ParsedDocument; import io.deephaven.lang.shared.lsp.CompletionCancelled; import io.deephaven.plot.FigureWidget; +import io.deephaven.plugin.type.ObjectType; +import io.deephaven.plugin.type.ObjectTypeLookup; import io.deephaven.proto.backplane.grpc.Ticket; import io.deephaven.proto.backplane.script.grpc.AutoCompleteRequest; import io.deephaven.proto.backplane.script.grpc.AutoCompleteResponse; @@ -42,6 +47,8 @@ import io.deephaven.proto.backplane.script.grpc.ExecuteCommandResponse; import io.deephaven.proto.backplane.script.grpc.FetchFigureRequest; import io.deephaven.proto.backplane.script.grpc.FetchFigureResponse; +import io.deephaven.proto.backplane.script.grpc.FetchObjectRequest; +import io.deephaven.proto.backplane.script.grpc.FetchObjectResponse; import io.deephaven.proto.backplane.script.grpc.FigureDescriptor; import io.deephaven.proto.backplane.script.grpc.GetCompletionItemsRequest; import io.deephaven.proto.backplane.script.grpc.GetCompletionItemsResponse; @@ -54,7 +61,6 @@ import io.deephaven.proto.backplane.script.grpc.TextDocumentItem; import io.deephaven.proto.backplane.script.grpc.VariableDefinition; import io.deephaven.proto.backplane.script.grpc.VersionedTextDocumentIdentifier; -import io.deephaven.server.console.figure.FigureWidgetTranslator; import io.deephaven.server.session.SessionCloseableObserver; import io.deephaven.server.session.SessionService; import io.deephaven.server.session.SessionState; @@ -86,6 +92,10 @@ public class ConsoleServiceGrpcImpl extends ConsoleServiceGrpc.ConsoleServiceImp public static final boolean REMOTE_CONSOLE_DISABLED = Configuration.getInstance().getBooleanWithDefault("deephaven.console.disable", false); + public static boolean isPythonSession() { + return PYTHON_TYPE.equals(WORKER_CONSOLE_TYPE); + } + private final Map> scriptTypes; private final TicketRouter ticketRouter; private final SessionService sessionService; @@ -95,25 +105,28 @@ public class ConsoleServiceGrpcImpl extends ConsoleServiceGrpc.ConsoleServiceImp private final GlobalSessionProvider globalSessionProvider; + private final ObjectTypeLookup objectTypeLookup; + @Inject public ConsoleServiceGrpcImpl(final Map> scriptTypes, final TicketRouter ticketRouter, final SessionService sessionService, final LogBuffer logBuffer, - final GlobalSessionProvider globalSessionProvider) { + final GlobalSessionProvider globalSessionProvider, + final ObjectTypeLookup objectTypeLookup) { this.scriptTypes = scriptTypes; this.ticketRouter = ticketRouter; this.sessionService = sessionService; this.logBuffer = logBuffer; this.globalSessionProvider = globalSessionProvider; - + this.objectTypeLookup = objectTypeLookup; if (!scriptTypes.containsKey(WORKER_CONSOLE_TYPE)) { throw new IllegalArgumentException("Console type not found: " + WORKER_CONSOLE_TYPE); } } public void initializeGlobalScriptSession() throws IOException, InterruptedException, TimeoutException { - if (PYTHON_TYPE.equals(WORKER_CONSOLE_TYPE)) { + if (isPythonSession()) { JpyInit.init(log); } globalSessionProvider.initializeGlobalScriptSession(scriptTypes.get(WORKER_CONSOLE_TYPE).get()); @@ -233,9 +246,16 @@ public void executeCommand(ExecuteCommandRequest request, StreamObserver entry) { - return VariableDefinition.newBuilder().setTitle(entry.getKey()).setType(entry.getValue().name()) - .setId(ScopeTicketResolver.ticketForName(entry.getKey())).build(); + private static VariableDefinition makeVariableDefinition(Map.Entry entry) { + return makeVariableDefinition(entry.getKey(), entry.getValue()); + } + + private static VariableDefinition makeVariableDefinition(String title, String type) { + return VariableDefinition.newBuilder() + .setTitle(title) + .setType(type) + .setId(ScopeTicketResolver.ticketForName(title)) + .build(); } @Override @@ -403,6 +423,8 @@ public void onCompleted() { }); } + // TODO(deephaven-core#1784): Remove fetchFigure RPC + @Deprecated @Override public void fetchFigure(FetchFigureRequest request, StreamObserver responseObserver) { GrpcUtil.rpcWrapper(log, responseObserver, () -> { @@ -424,9 +446,7 @@ public void fetchFigure(FetchFigureRequest request, StreamObserver responseObserver) { + GrpcUtil.rpcWrapper(log, responseObserver, () -> { + final SessionState session = sessionService.getCurrentSession(); + if (request.getSourceId().getTicket().isEmpty()) { + throw GrpcUtil.statusRuntimeException(Code.FAILED_PRECONDITION, "No sourceId supplied"); + } + final SessionState.ExportObject object = ticketRouter.resolve( + session, request.getSourceId(), "sourceId"); + session.nonExport() + .require(object) + .onError(responseObserver) + .submit(() -> { + final Object o = object.get(); + final FetchObjectResponse response = serialize(session, o); + responseObserver.onNext(response); + responseObserver.onCompleted(); + return null; + }); + }); + } + + private FetchObjectResponse serialize(SessionState state, Object object) throws IOException { + final ExposedByteArrayOutputStream out = new ExposedByteArrayOutputStream(); + final ObjectType type = objectTypeLookup.findObjectType(object).orElseThrow(() -> noTypeException(object)); + final String name = type.name(); + type.writeTo(state.asExporter(), object, out); + final ByteString data = ByteStringAccess.wrap(out.peekBuffer(), 0, out.size()); + return FetchObjectResponse.newBuilder().setType(name).setData(data).build(); + } + + private static IllegalArgumentException noTypeException(Object o) { + return new IllegalArgumentException( + "No type registered for object class=" + o.getClass().getName() + ", value=" + o); + } + private static class LogBufferStreamAdapter extends SessionCloseableObserver implements LogBufferRecordListener { private final LogSubscriptionRequest request; diff --git a/server/src/main/java/io/deephaven/server/console/groovy/GroovyConsoleSessionModule.java b/server/src/main/java/io/deephaven/server/console/groovy/GroovyConsoleSessionModule.java index c7e287426fe..3f01f929c0d 100644 --- a/server/src/main/java/io/deephaven/server/console/groovy/GroovyConsoleSessionModule.java +++ b/server/src/main/java/io/deephaven/server/console/groovy/GroovyConsoleSessionModule.java @@ -7,6 +7,7 @@ import io.deephaven.engine.util.GroovyDeephavenSession; import io.deephaven.engine.util.GroovyDeephavenSession.RunScripts; import io.deephaven.engine.util.ScriptSession; +import io.deephaven.plugin.type.ObjectTypeLookup; import java.io.IOException; import java.io.UncheckedIOException; @@ -21,9 +22,10 @@ ScriptSession bindScriptSession(final GroovyDeephavenSession groovySession) { } @Provides - GroovyDeephavenSession bindGroovySession(final ScriptSession.Listener listener, final RunScripts runScripts) { + GroovyDeephavenSession bindGroovySession(ObjectTypeLookup lookup, final ScriptSession.Listener listener, + final RunScripts runScripts) { try { - return new GroovyDeephavenSession(listener, runScripts, true); + return new GroovyDeephavenSession(lookup, listener, runScripts, true); } catch (final IOException e) { throw new UncheckedIOException(e); } diff --git a/server/src/main/java/io/deephaven/server/console/python/PythonConsoleSessionModule.java b/server/src/main/java/io/deephaven/server/console/python/PythonConsoleSessionModule.java index a90ebe9d3ae..41f6200179d 100644 --- a/server/src/main/java/io/deephaven/server/console/python/PythonConsoleSessionModule.java +++ b/server/src/main/java/io/deephaven/server/console/python/PythonConsoleSessionModule.java @@ -6,6 +6,7 @@ import dagger.multibindings.StringKey; import io.deephaven.engine.util.PythonDeephavenSession; import io.deephaven.engine.util.ScriptSession; +import io.deephaven.plugin.type.ObjectTypeLookup; import java.io.IOException; import java.io.UncheckedIOException; @@ -20,9 +21,9 @@ ScriptSession bindScriptSession(PythonDeephavenSession pythonSession) { } @Provides - PythonDeephavenSession bindPythonSession(final ScriptSession.Listener listener) { + PythonDeephavenSession bindPythonSession(ObjectTypeLookup lookup, final ScriptSession.Listener listener) { try { - return new PythonDeephavenSession(listener, true, true); + return new PythonDeephavenSession(lookup, listener, true, true); } catch (IOException e) { // can't happen since we pass false throw new UncheckedIOException(e); diff --git a/server/src/main/java/io/deephaven/server/plugin/ObjectTypes.java b/server/src/main/java/io/deephaven/server/plugin/ObjectTypes.java new file mode 100644 index 00000000000..c0d1926832d --- /dev/null +++ b/server/src/main/java/io/deephaven/server/plugin/ObjectTypes.java @@ -0,0 +1,65 @@ +package io.deephaven.server.plugin; + +import io.deephaven.plugin.type.ObjectType; +import io.deephaven.plugin.type.ObjectTypeClassBase; +import io.deephaven.plugin.type.ObjectTypeLookup; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; + +final class ObjectTypes implements ObjectTypeLookup { + + private static final Set RESERVED_TYPE_NAMES = Set.of("Table", "TableMap", "TreeTable"); + + private final Set names; + private final Map, ObjectType> classTypes; + private final List otherTypes; + + public ObjectTypes() { + names = new HashSet<>(); + classTypes = new HashMap<>(); + otherTypes = new ArrayList<>(); + } + + @Override + public synchronized Optional findObjectType(Object object) { + final ObjectType byClass = classTypes.get(object.getClass()); + if (byClass != null) { + return Optional.of(byClass); + } + for (ObjectType type : otherTypes) { + if (type.isType(object)) { + return Optional.of(type); + } + } + return Optional.empty(); + } + + public synchronized void register(ObjectType type) { + if (isReservedName(type.name())) { + throw new IllegalArgumentException("Unable to register type, type name is reserved: " + type.name()); + } + if (names.contains(type.name())) { + throw new IllegalArgumentException( + "Unable to register type, type name already registered: " + type.name()); + } + if (type instanceof ObjectTypeClassBase) { + final Class clazz = ((ObjectTypeClassBase) type).clazz(); + if (classTypes.putIfAbsent(clazz, type) != null) { + throw new IllegalArgumentException("Unable to register type, class already registered: " + clazz); + } + } else { + otherTypes.add(type); + } + names.add(type.name()); + } + + private static boolean isReservedName(String name) { + return RESERVED_TYPE_NAMES.contains(name); + } +} diff --git a/server/src/main/java/io/deephaven/server/plugin/PluginModule.java b/server/src/main/java/io/deephaven/server/plugin/PluginModule.java new file mode 100644 index 00000000000..199ef54ac13 --- /dev/null +++ b/server/src/main/java/io/deephaven/server/plugin/PluginModule.java @@ -0,0 +1,21 @@ +package io.deephaven.server.plugin; + +import dagger.Binds; +import dagger.Module; +import dagger.Provides; +import io.deephaven.plugin.type.ObjectTypeLookup; + +import javax.inject.Singleton; + +@Module +public interface PluginModule { + + @Provides + @Singleton + static ObjectTypes providesObjectTypes() { + return new ObjectTypes(); + } + + @Binds + ObjectTypeLookup providesLookup(ObjectTypes types); +} diff --git a/server/src/main/java/io/deephaven/server/plugin/PluginsLoader.java b/server/src/main/java/io/deephaven/server/plugin/PluginsLoader.java new file mode 100644 index 00000000000..14d190bf1e9 --- /dev/null +++ b/server/src/main/java/io/deephaven/server/plugin/PluginsLoader.java @@ -0,0 +1,156 @@ +package io.deephaven.server.plugin; + +import io.deephaven.internal.log.LoggerFactory; +import io.deephaven.io.logger.Logger; +import io.deephaven.plugin.Plugin; +import io.deephaven.plugin.PluginCallback; +import io.deephaven.plugin.type.ObjectType; +import io.deephaven.plugin.type.ObjectTypeBase; +import io.deephaven.plugin.type.Exporter; +import io.deephaven.server.console.ConsoleServiceGrpcImpl; +import org.jpy.PyLib.CallableKind; +import org.jpy.PyModule; +import org.jpy.PyObject; + +import javax.inject.Inject; +import java.io.IOException; +import java.io.OutputStream; +import java.util.Objects; +import java.util.ServiceLoader; + +public final class PluginsLoader implements PluginCallback { + private static final Logger log = LoggerFactory.getLogger(PluginsLoader.class); + + private static void allServiceLoaderRegisterInto(PluginCallback callback) { + for (Plugin provider : ServiceLoader.load(Plugin.class)) { + provider.registerInto(callback); + } + } + + private static void allPythonRegisterInto(PluginCallback callback) { + try (final PythonPluginModule module = PythonPluginModule.of()) { + module.all_plugins_register_into(new CallbackAdapter(callback)); + } + } + + public final ObjectTypes types; + + @Inject + public PluginsLoader(ObjectTypes types) { + this.types = Objects.requireNonNull(types); + } + + public void registerAll() { + log.info().append("Registering plugins...").endl(); + final Counting serviceLoaderCount = new Counting(); + allServiceLoaderRegisterInto(serviceLoaderCount); + final Counting pythonModuleCount = new Counting(); + if (ConsoleServiceGrpcImpl.isPythonSession()) { + allPythonRegisterInto(pythonModuleCount); + } + log.info().append("Registered via service loader: ").append(serviceLoaderCount.count).endl(); + if (ConsoleServiceGrpcImpl.isPythonSession()) { + log.info().append("Registered via python module: ").append(pythonModuleCount.count).endl(); + } + } + + @Override + public void registerCustomType(ObjectType objectType) { + log.info().append("Registering plugin object type: ") + .append(objectType.name()).append(" / ") + .append(objectType.toString()) + .endl(); + types.register(objectType); + } + + private class Counting implements PluginCallback { + + private int count = 0; + + @Override + public void registerCustomType(ObjectType objectType) { + PluginsLoader.this.registerCustomType(objectType); + ++count; + } + } + + interface PythonCustomType { + + static PythonCustomType of(PyObject object) { + return (PythonCustomType) object.createProxy(CallableKind.FUNCTION, PythonCustomType.class); + } + + String name(); + + boolean is_type(PyObject object); + + // TODO(deephaven-core#1785): Use more pythonic wrapper for io.deephaven.plugin.type.Exporter + byte[] to_bytes(Exporter exporter, PyObject object); + } + + private static final class Adapter extends ObjectTypeBase { + + public static Adapter of(PythonCustomType module) { + return new Adapter(module.name(), module); + } + + private final String name; + private final PythonCustomType module; + + private Adapter(String name, PythonCustomType module) { + this.name = Objects.requireNonNull(name); + this.module = Objects.requireNonNull(module); + } + + @Override + public String name() { + return name; + } + + @Override + public boolean isType(Object o) { + if (!(o instanceof PyObject)) { + return false; + } + return module.is_type((PyObject) o); + } + + @Override + public void writeToTypeChecked(Exporter exporter, Object object, OutputStream out) throws IOException { + out.write(module.to_bytes(exporter, (PyObject) object)); + } + + @Override + public String toString() { + return name + ":" + module; + } + } + + private static class CallbackAdapter { + private final PluginCallback callback; + + public CallbackAdapter(PluginCallback callback) { + this.callback = Objects.requireNonNull(callback); + } + + @SuppressWarnings("unused") + public void register_custom_type(PyObject module) { + final PythonCustomType pythonCustomType = PythonCustomType.of(module); + final Adapter adapter = Adapter.of(pythonCustomType); + callback.registerCustomType(adapter); + } + } + + interface PythonPluginModule extends AutoCloseable { + + static PythonPluginModule of() { + return (PythonPluginModule) PyModule.importModule("deephaven.plugin") + .createProxy(CallableKind.FUNCTION, PythonPluginModule.class); + } + + void all_plugins_register_into(CallbackAdapter callback); + + @Override + void close(); + } +} diff --git a/server/src/main/java/io/deephaven/server/runner/DeephavenApiServer.java b/server/src/main/java/io/deephaven/server/runner/DeephavenApiServer.java index 49dfb07ce16..55cd11fbbb8 100644 --- a/server/src/main/java/io/deephaven/server/runner/DeephavenApiServer.java +++ b/server/src/main/java/io/deephaven/server/runner/DeephavenApiServer.java @@ -8,6 +8,7 @@ import io.deephaven.engine.util.AbstractScriptSession; import io.deephaven.internal.log.LoggerFactory; import io.deephaven.io.logger.Logger; +import io.deephaven.server.plugin.PluginsLoader; import io.deephaven.server.appmode.ApplicationInjector; import io.deephaven.server.console.ConsoleServiceGrpcImpl; import io.deephaven.server.log.LogInit; @@ -35,6 +36,7 @@ public class DeephavenApiServer { private final UpdateGraphProcessor ugp; private final LogInit logInit; private final ConsoleServiceGrpcImpl consoleService; + private final PluginsLoader pluginsLoader; private final ApplicationInjector applicationInjector; private final UriResolvers uriResolvers; private final SessionService sessionService; @@ -45,6 +47,7 @@ public DeephavenApiServer( final UpdateGraphProcessor ugp, final LogInit logInit, final ConsoleServiceGrpcImpl consoleService, + final PluginsLoader pluginsLoader, final ApplicationInjector applicationInjector, final UriResolvers uriResolvers, final SessionService sessionService) { @@ -52,6 +55,7 @@ public DeephavenApiServer( this.ugp = ugp; this.logInit = logInit; this.consoleService = consoleService; + this.pluginsLoader = pluginsLoader; this.applicationInjector = applicationInjector; this.uriResolvers = uriResolvers; this.sessionService = sessionService; @@ -99,6 +103,7 @@ public void run() throws IOException, ClassNotFoundException, InterruptedExcepti log.info().append("Initializing Script Session...").endl(); consoleService.initializeGlobalScriptSession(); + pluginsLoader.registerAll(); log.info().append("Starting UGP...").endl(); ugp.start(); diff --git a/server/src/main/java/io/deephaven/server/runner/DeephavenApiServerModule.java b/server/src/main/java/io/deephaven/server/runner/DeephavenApiServerModule.java index 62e04656704..9a7f178dd6a 100644 --- a/server/src/main/java/io/deephaven/server/runner/DeephavenApiServerModule.java +++ b/server/src/main/java/io/deephaven/server/runner/DeephavenApiServerModule.java @@ -5,6 +5,7 @@ import dagger.multibindings.ElementsIntoSet; import io.deephaven.chunk.util.pools.MultiChunkPool; import io.deephaven.engine.updategraph.UpdateGraphProcessor; +import io.deephaven.server.plugin.PluginModule; import io.deephaven.server.appmode.AppMode; import io.deephaven.server.appmode.AppModeModule; import io.deephaven.server.arrow.ArrowModule; @@ -50,6 +51,7 @@ TableModule.class, InputTableModule.class, ConsoleModule.class, + PluginModule.class, GroovyConsoleSessionModule.class, PythonConsoleSessionModule.class }) diff --git a/server/src/main/java/io/deephaven/server/session/SessionState.java b/server/src/main/java/io/deephaven/server/session/SessionState.java index 7c16fdb4625..1ac97ef0a28 100644 --- a/server/src/main/java/io/deephaven/server/session/SessionState.java +++ b/server/src/main/java/io/deephaven/server/session/SessionState.java @@ -29,6 +29,7 @@ import io.deephaven.internal.log.LoggerFactory; import io.deephaven.io.log.LogEntry; import io.deephaven.io.logger.Logger; +import io.deephaven.plugin.type.Exporter; import io.deephaven.proto.backplane.grpc.ExportNotification; import io.deephaven.proto.backplane.grpc.Ticket; import io.deephaven.proto.flight.util.FlightExportTicketHelper; @@ -1329,4 +1330,33 @@ public ExportObject newValue(final int key) { return retval; } }; + + public Exporter asExporter() { + return new ExporterImpl(); + } + + private class ExporterImpl implements Exporter { + @Override + public Export newServerSideExport(T export) { + return new ExportImpl<>(SessionState.this.newServerSideExport(export)); + } + } + + private static class ExportImpl implements Exporter.Export { + private final ExportObject export; + + public ExportImpl(ExportObject export) { + this.export = Objects.requireNonNull(export); + } + + @Override + public T get() { + return export.get(); + } + + @Override + public Ticket getExportId() { + return export.getExportId(); + } + } } diff --git a/server/src/test/java/io/deephaven/server/appmode/ApplicationTest.java b/server/src/test/java/io/deephaven/server/appmode/ApplicationTest.java index 44fd5e9b62e..42515baec9e 100644 --- a/server/src/test/java/io/deephaven/server/appmode/ApplicationTest.java +++ b/server/src/test/java/io/deephaven/server/appmode/ApplicationTest.java @@ -6,6 +6,7 @@ import io.deephaven.engine.util.AbstractScriptSession; import io.deephaven.engine.util.GroovyDeephavenSession; import io.deephaven.engine.util.PythonDeephavenSession; +import io.deephaven.plugin.type.ObjectTypeLookup.NoOp; import io.deephaven.test.junit4.EngineCleanup; import org.junit.After; import org.junit.Ignore; @@ -44,7 +45,7 @@ public void app00() { @Test public void app01() throws IOException { - session = new GroovyDeephavenSession(null, GroovyDeephavenSession.RunScripts.none(), false); + session = new GroovyDeephavenSession(NoOp.INSTANCE, null, GroovyDeephavenSession.RunScripts.none(), false); ApplicationState app = ApplicationFactory.create(ApplicationConfigs.testAppDir(), ApplicationConfigs.app01(), session, new NoopStateListener()); assertThat(app.name()).isEqualTo("My Groovy Application"); @@ -56,7 +57,7 @@ public void app01() throws IOException { @Test @Ignore("TODO: deephaven-core#1741 python test needs to run in a container") public void app02() throws IOException, InterruptedException, TimeoutException { - session = new PythonDeephavenSession(null, false, false); + session = new PythonDeephavenSession(NoOp.INSTANCE, null, false, false); ApplicationState app = ApplicationFactory.create(ApplicationConfigs.testAppDir(), ApplicationConfigs.app02(), session, new NoopStateListener()); assertThat(app.name()).isEqualTo("My Python Application"); diff --git a/server/test/src/main/java/io/deephaven/server/test/FlightMessageRoundTripTest.java b/server/test/src/main/java/io/deephaven/server/test/FlightMessageRoundTripTest.java index 8b5cea0726d..6b07032af51 100644 --- a/server/test/src/main/java/io/deephaven/server/test/FlightMessageRoundTripTest.java +++ b/server/test/src/main/java/io/deephaven/server/test/FlightMessageRoundTripTest.java @@ -1,7 +1,5 @@ package io.deephaven.server.test; -import dagger.BindsInstance; -import dagger.Component; import dagger.Module; import dagger.Provides; import dagger.multibindings.IntoSet; @@ -19,13 +17,10 @@ import io.deephaven.proto.backplane.grpc.SessionServiceGrpc; import io.deephaven.proto.flight.util.FlightExportTicketHelper; import io.deephaven.proto.util.ScopeTicketHelper; -import io.deephaven.server.arrow.ArrowModule; import io.deephaven.server.arrow.FlightServiceGrpcBinding; -import io.deephaven.server.auth.AuthContextModule; import io.deephaven.server.console.GlobalSessionProvider; import io.deephaven.server.console.ScopeTicketResolver; import io.deephaven.server.runner.GrpcServer; -import io.deephaven.server.session.SessionModule; import io.deephaven.server.session.SessionService; import io.deephaven.server.session.SessionServiceGrpcImpl; import io.deephaven.server.session.SessionState; @@ -60,7 +55,6 @@ import org.junit.rules.ExternalResource; import javax.inject.Named; -import javax.inject.Singleton; import java.io.IOException; import java.util.EnumSet; import java.util.Set; diff --git a/settings.gradle b/settings.gradle index b8b0e146e51..a3ddce0f14f 100644 --- a/settings.gradle +++ b/settings.gradle @@ -211,6 +211,9 @@ project(':extensions-classgraph').projectDir = file('extensions/classgraph') include(':extensions-suanshu') project(':extensions-suanshu').projectDir = file('extensions/suanshu') +include(':plugin') +include(':plugin:figure') + include(':envoy') include(':grpc-proxy') From ecf7e800f279f9f8a90f63310c43784646d9e1e6 Mon Sep 17 00:00:00 2001 From: Devin Smith Date: Thu, 30 Dec 2021 13:54:50 -0800 Subject: [PATCH 02/62] Remove old custom type name --- .../io/deephaven/figure/FigureWidgetPlugin.java | 8 +------- .../java/io/deephaven/plugin/PluginCallback.java | 2 +- .../deephaven/server/plugin/PluginsLoader.java | 16 +++++++++++----- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/plugin/figure/src/main/java/io/deephaven/figure/FigureWidgetPlugin.java b/plugin/figure/src/main/java/io/deephaven/figure/FigureWidgetPlugin.java index f509f87a72e..fff4cdfa1ae 100644 --- a/plugin/figure/src/main/java/io/deephaven/figure/FigureWidgetPlugin.java +++ b/plugin/figure/src/main/java/io/deephaven/figure/FigureWidgetPlugin.java @@ -2,12 +2,6 @@ import io.deephaven.plugin.Plugin; import io.deephaven.plugin.PluginCallback; -import io.deephaven.plugin.type.Exporter; -import io.deephaven.plugin.type.ObjectType; - -import java.io.IOException; -import java.io.OutputStream; -import java.nio.charset.StandardCharsets; /** * Registers the object type {@link FigureWidgetType}. @@ -16,6 +10,6 @@ public final class FigureWidgetPlugin implements Plugin { @Override public void registerInto(PluginCallback callback) { - callback.registerCustomType(FigureWidgetType.instance()); + callback.registerObjectType(FigureWidgetType.instance()); } } diff --git a/plugin/src/main/java/io/deephaven/plugin/PluginCallback.java b/plugin/src/main/java/io/deephaven/plugin/PluginCallback.java index a9046fa0b22..32e575809c0 100644 --- a/plugin/src/main/java/io/deephaven/plugin/PluginCallback.java +++ b/plugin/src/main/java/io/deephaven/plugin/PluginCallback.java @@ -4,5 +4,5 @@ public interface PluginCallback { - void registerCustomType(ObjectType objectType); + void registerObjectType(ObjectType objectType); } diff --git a/server/src/main/java/io/deephaven/server/plugin/PluginsLoader.java b/server/src/main/java/io/deephaven/server/plugin/PluginsLoader.java index 14d190bf1e9..e210c49cbd8 100644 --- a/server/src/main/java/io/deephaven/server/plugin/PluginsLoader.java +++ b/server/src/main/java/io/deephaven/server/plugin/PluginsLoader.java @@ -55,7 +55,7 @@ public void registerAll() { } @Override - public void registerCustomType(ObjectType objectType) { + public void registerObjectType(ObjectType objectType) { log.info().append("Registering plugin object type: ") .append(objectType.name()).append(" / ") .append(objectType.toString()) @@ -68,8 +68,8 @@ private class Counting implements PluginCallback { private int count = 0; @Override - public void registerCustomType(ObjectType objectType) { - PluginsLoader.this.registerCustomType(objectType); + public void registerObjectType(ObjectType objectType) { + PluginsLoader.this.registerObjectType(objectType); ++count; } } @@ -134,10 +134,16 @@ public CallbackAdapter(PluginCallback callback) { } @SuppressWarnings("unused") - public void register_custom_type(PyObject module) { + public void register_object_type(PyObject module) { final PythonCustomType pythonCustomType = PythonCustomType.of(module); final Adapter adapter = Adapter.of(pythonCustomType); - callback.registerCustomType(adapter); + callback.registerObjectType(adapter); + } + + // Remove before merge, but still want code reviewers to be able to use existing matplotlib plugin + @Deprecated + public void register_custom_type(PyObject module) { + register_object_type(module); } } From 91bd98a0446c4a0864ccc221c0a87357f07fa3a0 Mon Sep 17 00:00:00 2001 From: Devin Smith Date: Thu, 30 Dec 2021 14:29:20 -0800 Subject: [PATCH 03/62] Fix python integration tests --- .../io/deephaven/engine/util/PythonDeephavenSession.java | 5 +++-- .../engine/table/impl/select/TestConditionFilter.java | 5 ++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/engine/table/src/main/java/io/deephaven/engine/util/PythonDeephavenSession.java b/engine/table/src/main/java/io/deephaven/engine/util/PythonDeephavenSession.java index 85cb0c33bd3..cc57009541e 100644 --- a/engine/table/src/main/java/io/deephaven/engine/util/PythonDeephavenSession.java +++ b/engine/table/src/main/java/io/deephaven/engine/util/PythonDeephavenSession.java @@ -16,6 +16,7 @@ import io.deephaven.internal.log.LoggerFactory; import io.deephaven.io.logger.Logger; import io.deephaven.plugin.type.ObjectTypeLookup; +import io.deephaven.plugin.type.ObjectTypeLookup.NoOp; import io.deephaven.util.annotations.VisibleForTesting; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -124,8 +125,8 @@ public PythonDeephavenSession( * Creates a Python "{@link ScriptSession}", for use where we should only be reading from the scope, such as an * IPython kernel session. */ - public PythonDeephavenSession(ObjectTypeLookup objectTypeLookup, PythonScope scope) { - super(objectTypeLookup, null, false); + public PythonDeephavenSession(PythonScope scope) { + super(NoOp.INSTANCE, null, false); this.scope = (PythonScope) scope; this.module = null; this.evaluator = null; diff --git a/python-engine-test/src/test/java/io/deephaven/engine/table/impl/select/TestConditionFilter.java b/python-engine-test/src/test/java/io/deephaven/engine/table/impl/select/TestConditionFilter.java index 64b7d7920df..6a836f1b9dc 100644 --- a/python-engine-test/src/test/java/io/deephaven/engine/table/impl/select/TestConditionFilter.java +++ b/python-engine-test/src/test/java/io/deephaven/engine/table/impl/select/TestConditionFilter.java @@ -8,7 +8,6 @@ import io.deephaven.engine.rowset.RowSetFactory; import io.deephaven.io.log.LogLevel; import io.deephaven.io.logger.StreamLoggerImpl; -import io.deephaven.plugin.type.ObjectTypeLookup.NoOp; import io.deephaven.util.process.ProcessEnvironment; import io.deephaven.compilertools.CompilerTools; import io.deephaven.engine.table.Table; @@ -370,8 +369,8 @@ private void check(String expression, Predicate> testPredica QueryScope currentScope = QueryScope.getScope(); try { if (pythonScope == null) { - pythonScope = new PythonDeephavenSession(NoOp.INSTANCE, new PythonScopeJpyImpl( - getMainGlobals().asDict())).newQueryScope(); + pythonScope = new PythonDeephavenSession(new PythonScopeJpyImpl(getMainGlobals().asDict())) + .newQueryScope(); QueryScope.setScope(pythonScope); } for (QueryScopeParam param : currentScope.getParams(currentScope.getParamNames())) { From 74aec625ee603f8c8fe620c50a13fdcc5d08d6b3 Mon Sep 17 00:00:00 2001 From: Devin Smith Date: Fri, 31 Dec 2021 10:23:03 -0800 Subject: [PATCH 04/62] Move logic into deephaven.server.plugin --- .../python/deephaven/plugin/__init__.py | 20 --- .../deephaven/server/plugin/__init__.py | 68 ++++++++++ docker/server/src/main/docker/Dockerfile | 2 +- .../server/plugin/ObjectTypesModule.java | 21 +++ .../deephaven/server/plugin/PluginModule.java | 15 +-- .../server/plugin/PluginsLoader.java | 124 ++---------------- .../deephaven/server/plugin/java/Loader.java | 14 ++ .../server/plugin/python/CallbackAdapter.java | 18 +++ .../server/plugin/python/Loader.java | 11 ++ .../server/plugin/python/Module.java | 20 +++ .../plugin/python/ObjectTypeAdapter.java | 49 +++++++ 11 files changed, 215 insertions(+), 147 deletions(-) delete mode 100644 Integrations/python/deephaven/plugin/__init__.py create mode 100644 Integrations/python/deephaven/server/plugin/__init__.py create mode 100644 server/src/main/java/io/deephaven/server/plugin/ObjectTypesModule.java create mode 100644 server/src/main/java/io/deephaven/server/plugin/java/Loader.java create mode 100644 server/src/main/java/io/deephaven/server/plugin/python/CallbackAdapter.java create mode 100644 server/src/main/java/io/deephaven/server/plugin/python/Loader.java create mode 100644 server/src/main/java/io/deephaven/server/plugin/python/Module.java create mode 100644 server/src/main/java/io/deephaven/server/plugin/python/ObjectTypeAdapter.java diff --git a/Integrations/python/deephaven/plugin/__init__.py b/Integrations/python/deephaven/plugin/__init__.py deleted file mode 100644 index 2fc702c987b..00000000000 --- a/Integrations/python/deephaven/plugin/__init__.py +++ /dev/null @@ -1,20 +0,0 @@ -DEEPHAVEN_PLUGIN_ENTRY_KEY = 'deephaven.plugin' -DEEPHAVEN_PLUGIN_REGISTER_NAME = 'register_into' - -def get_plugin_entrypoints(name): - import sys - if sys.version_info < (3, 8): - # TODO(deephaven-base-images#6): Add importlib-metadata backport install for future server plugin support - # We can remove the exception handling once above gets merged in - try: - from importlib_metadata import entry_points - except ImportError: - return [] - else: - from importlib.metadata import entry_points - return entry_points(group=DEEPHAVEN_PLUGIN_ENTRY_KEY, name=name) or [] - -def all_plugins_register_into(callback): - for entrypoint in get_plugin_entrypoints(DEEPHAVEN_PLUGIN_REGISTER_NAME): - plugin_register_into = entrypoint.load() - plugin_register_into(callback) diff --git a/Integrations/python/deephaven/server/plugin/__init__.py b/Integrations/python/deephaven/server/plugin/__init__.py new file mode 100644 index 00000000000..478f8998d14 --- /dev/null +++ b/Integrations/python/deephaven/server/plugin/__init__.py @@ -0,0 +1,68 @@ +import jpy + +PluginCallback = jpy.get_type('io.deephaven.plugin.PluginCallback') +Exporter = jpy.get_type('io.deephaven.plugin.type.Exporter') + +DEEPHAVEN_PLUGIN_ENTRY_KEY = 'deephaven.plugin' +DEEPHAVEN_PLUGIN_REGISTER_NAME = 'register_into' + +def get_plugin_entrypoints(name: str): + import sys + if sys.version_info < (3, 8): + # TODO(deephaven-base-images#6): Add importlib-metadata backport install for future server plugin support + # We can remove the exception handling once above gets merged in + try: + from importlib_metadata import entry_points + except ImportError: + return [] + else: + from importlib.metadata import entry_points + return entry_points(group=DEEPHAVEN_PLUGIN_ENTRY_KEY, name=name) or [] + +def all_plugins_register_into(callback: PluginCallback): + callback_adapter = CallbackAdapter(callback) + for entrypoint in get_plugin_entrypoints(DEEPHAVEN_PLUGIN_REGISTER_NAME): + plugin_register_into = entrypoint.load() + plugin_register_into(callback_adapter) + +# TODO(deephaven-core#1791): CallbackAdapter implements CallbackABC +class CallbackAdapter: + def __init__(self, callback: PluginCallback): + self._callback = callback + + # TODO(deephaven-core#1791): type hint object_type as ObjectTypeABC + def register_object_type(self, object_type): + self._callback.registerObjectType(ObjectTypeAdapter(object_type)) + + def __str__(self): + return str(self._callback) + +# TODO(deephaven-core#1791): ExporterAdapter implements ExporterABC +class ExporterAdapter: + def __init__(self, exporter: Exporter): + self._exporter = exporter + + def new_server_side_export(self, object): + # TODO(deephaven-core#1791): define and use ExportABC + raise NotImplementedError + + def __str__(self): + return str(self._exporter) + +class ObjectTypeAdapter: + # TODO(deephaven-core#1791): type hint user_object_type as ObjectTypeABC + def __init__(self, user_object_type): + self._user_object_type = user_object_type + + @property + def name(self): + return self._user_object_type.name + + def is_type(self, object): + return self._user_object_type.is_type(object) + + def to_bytes(self, exporter: Exporter, object): + return self._user_object_type.to_bytes(ExporterAdapter(exporter), object) + + def __str__(self): + return str(self._user_object_type) diff --git a/docker/server/src/main/docker/Dockerfile b/docker/server/src/main/docker/Dockerfile index 49b9d0b1784..3b48d46e4a5 100644 --- a/docker/server/src/main/docker/Dockerfile +++ b/docker/server/src/main/docker/Dockerfile @@ -5,7 +5,7 @@ FROM $BASE as install #RUN set -eux; \ # python3 -m pip install -q --no-cache-dir \ # importlib-metadata \ -# https://github.com/deephaven/deephaven-plugin-matplotlib/releases/download/v0.0.1.dev1/deephaven_plugin_matplotlib-0.0.1.dev1-py3-none-any.whl +# https://github.com/deephaven/deephaven-plugin-matplotlib/releases/download/v0.0.1.dev2/deephaven_plugin_matplotlib-0.0.1.dev2-py3-none-any.whl COPY licenses/ / diff --git a/server/src/main/java/io/deephaven/server/plugin/ObjectTypesModule.java b/server/src/main/java/io/deephaven/server/plugin/ObjectTypesModule.java new file mode 100644 index 00000000000..d27ed426b3f --- /dev/null +++ b/server/src/main/java/io/deephaven/server/plugin/ObjectTypesModule.java @@ -0,0 +1,21 @@ +package io.deephaven.server.plugin; + +import dagger.Binds; +import dagger.Module; +import dagger.Provides; +import io.deephaven.plugin.type.ObjectTypeLookup; + +import javax.inject.Singleton; + +@Module +public interface ObjectTypesModule { + + @Provides + @Singleton + static ObjectTypes providesObjectTypes() { + return new ObjectTypes(); + } + + @Binds + ObjectTypeLookup providesLookup(ObjectTypes types); +} diff --git a/server/src/main/java/io/deephaven/server/plugin/PluginModule.java b/server/src/main/java/io/deephaven/server/plugin/PluginModule.java index 199ef54ac13..bc73c51c51e 100644 --- a/server/src/main/java/io/deephaven/server/plugin/PluginModule.java +++ b/server/src/main/java/io/deephaven/server/plugin/PluginModule.java @@ -1,21 +1,8 @@ package io.deephaven.server.plugin; -import dagger.Binds; import dagger.Module; -import dagger.Provides; -import io.deephaven.plugin.type.ObjectTypeLookup; -import javax.inject.Singleton; - -@Module +@Module(includes = { ObjectTypesModule.class }) public interface PluginModule { - @Provides - @Singleton - static ObjectTypes providesObjectTypes() { - return new ObjectTypes(); - } - - @Binds - ObjectTypeLookup providesLookup(ObjectTypes types); } diff --git a/server/src/main/java/io/deephaven/server/plugin/PluginsLoader.java b/server/src/main/java/io/deephaven/server/plugin/PluginsLoader.java index e210c49cbd8..b19833b30cc 100644 --- a/server/src/main/java/io/deephaven/server/plugin/PluginsLoader.java +++ b/server/src/main/java/io/deephaven/server/plugin/PluginsLoader.java @@ -1,38 +1,19 @@ package io.deephaven.server.plugin; +import io.deephaven.base.log.LogOutput; +import io.deephaven.base.log.LogOutputAppendable; import io.deephaven.internal.log.LoggerFactory; import io.deephaven.io.logger.Logger; -import io.deephaven.plugin.Plugin; import io.deephaven.plugin.PluginCallback; import io.deephaven.plugin.type.ObjectType; -import io.deephaven.plugin.type.ObjectTypeBase; -import io.deephaven.plugin.type.Exporter; import io.deephaven.server.console.ConsoleServiceGrpcImpl; -import org.jpy.PyLib.CallableKind; -import org.jpy.PyModule; -import org.jpy.PyObject; import javax.inject.Inject; -import java.io.IOException; -import java.io.OutputStream; import java.util.Objects; -import java.util.ServiceLoader; public final class PluginsLoader implements PluginCallback { private static final Logger log = LoggerFactory.getLogger(PluginsLoader.class); - private static void allServiceLoaderRegisterInto(PluginCallback callback) { - for (Plugin provider : ServiceLoader.load(Plugin.class)) { - provider.registerInto(callback); - } - } - - private static void allPythonRegisterInto(PluginCallback callback) { - try (final PythonPluginModule module = PythonPluginModule.of()) { - module.all_plugins_register_into(new CallbackAdapter(callback)); - } - } - public final ObjectTypes types; @Inject @@ -43,120 +24,39 @@ public PluginsLoader(ObjectTypes types) { public void registerAll() { log.info().append("Registering plugins...").endl(); final Counting serviceLoaderCount = new Counting(); - allServiceLoaderRegisterInto(serviceLoaderCount); + io.deephaven.server.plugin.java.Loader.allRegisterInto(serviceLoaderCount); final Counting pythonModuleCount = new Counting(); if (ConsoleServiceGrpcImpl.isPythonSession()) { - allPythonRegisterInto(pythonModuleCount); + io.deephaven.server.plugin.python.Loader.allRegisterInto(pythonModuleCount); } - log.info().append("Registered via service loader: ").append(serviceLoaderCount.count).endl(); + log.info().append("Registered via service loader: ").append(serviceLoaderCount).endl(); if (ConsoleServiceGrpcImpl.isPythonSession()) { - log.info().append("Registered via python module: ").append(pythonModuleCount.count).endl(); + log.info().append("Registered via python modules: ").append(pythonModuleCount).endl(); } } @Override public void registerObjectType(ObjectType objectType) { - log.info().append("Registering plugin object type: ") + log.info().append("Registering object type: ") .append(objectType.name()).append(" / ") .append(objectType.toString()) .endl(); types.register(objectType); } - private class Counting implements PluginCallback { + private class Counting implements PluginCallback, LogOutputAppendable { - private int count = 0; + private int objectTypeCount = 0; @Override public void registerObjectType(ObjectType objectType) { PluginsLoader.this.registerObjectType(objectType); - ++count; - } - } - - interface PythonCustomType { - - static PythonCustomType of(PyObject object) { - return (PythonCustomType) object.createProxy(CallableKind.FUNCTION, PythonCustomType.class); - } - - String name(); - - boolean is_type(PyObject object); - - // TODO(deephaven-core#1785): Use more pythonic wrapper for io.deephaven.plugin.type.Exporter - byte[] to_bytes(Exporter exporter, PyObject object); - } - - private static final class Adapter extends ObjectTypeBase { - - public static Adapter of(PythonCustomType module) { - return new Adapter(module.name(), module); - } - - private final String name; - private final PythonCustomType module; - - private Adapter(String name, PythonCustomType module) { - this.name = Objects.requireNonNull(name); - this.module = Objects.requireNonNull(module); - } - - @Override - public String name() { - return name; - } - - @Override - public boolean isType(Object o) { - if (!(o instanceof PyObject)) { - return false; - } - return module.is_type((PyObject) o); + ++objectTypeCount; } @Override - public void writeToTypeChecked(Exporter exporter, Object object, OutputStream out) throws IOException { - out.write(module.to_bytes(exporter, (PyObject) object)); - } - - @Override - public String toString() { - return name + ":" + module; - } - } - - private static class CallbackAdapter { - private final PluginCallback callback; - - public CallbackAdapter(PluginCallback callback) { - this.callback = Objects.requireNonNull(callback); + public LogOutput append(LogOutput logOutput) { + return logOutput.append("objectType=").append(objectTypeCount); } - - @SuppressWarnings("unused") - public void register_object_type(PyObject module) { - final PythonCustomType pythonCustomType = PythonCustomType.of(module); - final Adapter adapter = Adapter.of(pythonCustomType); - callback.registerObjectType(adapter); - } - - // Remove before merge, but still want code reviewers to be able to use existing matplotlib plugin - @Deprecated - public void register_custom_type(PyObject module) { - register_object_type(module); - } - } - - interface PythonPluginModule extends AutoCloseable { - - static PythonPluginModule of() { - return (PythonPluginModule) PyModule.importModule("deephaven.plugin") - .createProxy(CallableKind.FUNCTION, PythonPluginModule.class); - } - - void all_plugins_register_into(CallbackAdapter callback); - - @Override - void close(); } } diff --git a/server/src/main/java/io/deephaven/server/plugin/java/Loader.java b/server/src/main/java/io/deephaven/server/plugin/java/Loader.java new file mode 100644 index 00000000000..2e1a8ba4b06 --- /dev/null +++ b/server/src/main/java/io/deephaven/server/plugin/java/Loader.java @@ -0,0 +1,14 @@ +package io.deephaven.server.plugin.java; + +import io.deephaven.plugin.Plugin; +import io.deephaven.plugin.PluginCallback; + +import java.util.ServiceLoader; + +public final class Loader { + public static void allRegisterInto(PluginCallback callback) { + for (Plugin provider : ServiceLoader.load(Plugin.class)) { + provider.registerInto(callback); + } + } +} diff --git a/server/src/main/java/io/deephaven/server/plugin/python/CallbackAdapter.java b/server/src/main/java/io/deephaven/server/plugin/python/CallbackAdapter.java new file mode 100644 index 00000000000..775a36930df --- /dev/null +++ b/server/src/main/java/io/deephaven/server/plugin/python/CallbackAdapter.java @@ -0,0 +1,18 @@ +package io.deephaven.server.plugin.python; + +import io.deephaven.plugin.PluginCallback; +import org.jpy.PyObject; + +class CallbackAdapter { + + private final PluginCallback callback; + + public CallbackAdapter(PluginCallback callback) { + this.callback = callback; + } + + @SuppressWarnings("unused") + public void registerObjectType(PyObject objectTypeAdapter) { + callback.registerObjectType(new ObjectTypeAdapter(objectTypeAdapter)); + } +} diff --git a/server/src/main/java/io/deephaven/server/plugin/python/Loader.java b/server/src/main/java/io/deephaven/server/plugin/python/Loader.java new file mode 100644 index 00000000000..962d5876f2b --- /dev/null +++ b/server/src/main/java/io/deephaven/server/plugin/python/Loader.java @@ -0,0 +1,11 @@ +package io.deephaven.server.plugin.python; + +import io.deephaven.plugin.PluginCallback; + +public final class Loader { + public static void allRegisterInto(PluginCallback callback) { + try (final Module module = Module.of()) { + module.all_plugins_register_into(new CallbackAdapter(callback)); + } + } +} diff --git a/server/src/main/java/io/deephaven/server/plugin/python/Module.java b/server/src/main/java/io/deephaven/server/plugin/python/Module.java new file mode 100644 index 00000000000..c4ab62dfc18 --- /dev/null +++ b/server/src/main/java/io/deephaven/server/plugin/python/Module.java @@ -0,0 +1,20 @@ +package io.deephaven.server.plugin.python; + +import org.jpy.PyLib.CallableKind; +import org.jpy.PyModule; + +interface Module extends AutoCloseable { + + static Module of() { + final PyModule module = PyModule.importModule("deephaven.server.plugin"); + if (module == null) { + throw new IllegalStateException("Unable to find `deephaven.server.plugin` module"); + } + return (Module) module.createProxy(CallableKind.FUNCTION, Module.class); + } + + void all_plugins_register_into(CallbackAdapter callback); + + @Override + void close(); +} diff --git a/server/src/main/java/io/deephaven/server/plugin/python/ObjectTypeAdapter.java b/server/src/main/java/io/deephaven/server/plugin/python/ObjectTypeAdapter.java new file mode 100644 index 00000000000..bbb90426c33 --- /dev/null +++ b/server/src/main/java/io/deephaven/server/plugin/python/ObjectTypeAdapter.java @@ -0,0 +1,49 @@ +package io.deephaven.server.plugin.python; + +import io.deephaven.plugin.type.Exporter; +import io.deephaven.plugin.type.ObjectTypeBase; +import org.jpy.PyObject; + +import java.io.IOException; +import java.io.OutputStream; +import java.util.Objects; + +final class ObjectTypeAdapter extends ObjectTypeBase implements AutoCloseable { + + private final PyObject objectTypeAdapter; + + public ObjectTypeAdapter(PyObject objectTypeAdapter) { + this.objectTypeAdapter = Objects.requireNonNull(objectTypeAdapter); + } + + @Override + public String name() { + return objectTypeAdapter.getAttribute("name", String.class); + } + + @Override + public boolean isType(Object o) { + if (!(o instanceof PyObject)) { + return false; + } + return objectTypeAdapter.call(boolean.class, "is_type", PyObject.class, (PyObject) o); + } + + @Override + public void writeToTypeChecked(Exporter exporter, Object object, OutputStream out) throws IOException { + final byte[] bytes = objectTypeAdapter.call(byte[].class, "to_bytes", + Exporter.class, exporter, + PyObject.class, (PyObject) object); + out.write(bytes); + } + + @Override + public String toString() { + return objectTypeAdapter.toString(); + } + + @Override + public void close() { + objectTypeAdapter.close(); + } +} From ebda9d1a9dddbf88ffa06e6346c3d6f496827d13 Mon Sep 17 00:00:00 2001 From: Devin Smith Date: Fri, 31 Dec 2021 11:33:27 -0800 Subject: [PATCH 05/62] spotless --- .../src/main/java/io/deephaven/server/plugin/PluginModule.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/src/main/java/io/deephaven/server/plugin/PluginModule.java b/server/src/main/java/io/deephaven/server/plugin/PluginModule.java index bc73c51c51e..b84979db01d 100644 --- a/server/src/main/java/io/deephaven/server/plugin/PluginModule.java +++ b/server/src/main/java/io/deephaven/server/plugin/PluginModule.java @@ -2,7 +2,7 @@ import dagger.Module; -@Module(includes = { ObjectTypesModule.class }) +@Module(includes = {ObjectTypesModule.class}) public interface PluginModule { } From 968ec24da25eb5dfce500df7e95087123b8d4f71 Mon Sep 17 00:00:00 2001 From: Devin Smith Date: Sat, 1 Jan 2022 11:11:28 -0800 Subject: [PATCH 06/62] Move deephaven.server into deephaven2.server so fix broken integration tests --- Integrations/python/deephaven/server/__init__.py | 2 -- .../java/io/deephaven/engine/util/PythonDeephavenSession.java | 2 +- pyintegration/deephaven2/server/__init__.py | 2 ++ .../deephaven2}/server/plugin/__init__.py | 0 .../deephaven2}/server/script_session/__init__.py | 0 .../src/main/java/io/deephaven/server/plugin/python/Module.java | 2 +- 6 files changed, 4 insertions(+), 4 deletions(-) delete mode 100644 Integrations/python/deephaven/server/__init__.py create mode 100644 pyintegration/deephaven2/server/__init__.py rename {Integrations/python/deephaven => pyintegration/deephaven2}/server/plugin/__init__.py (100%) rename {Integrations/python/deephaven => pyintegration/deephaven2}/server/script_session/__init__.py (100%) diff --git a/Integrations/python/deephaven/server/__init__.py b/Integrations/python/deephaven/server/__init__.py deleted file mode 100644 index d69638ab9e9..00000000000 --- a/Integrations/python/deephaven/server/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -# Packages under the deephaven.server heading are not meant to be called externally - it exists as a convenient place -# for the server to execute implementation logic via python diff --git a/engine/table/src/main/java/io/deephaven/engine/util/PythonDeephavenSession.java b/engine/table/src/main/java/io/deephaven/engine/util/PythonDeephavenSession.java index cc57009541e..aa863b84801 100644 --- a/engine/table/src/main/java/io/deephaven/engine/util/PythonDeephavenSession.java +++ b/engine/table/src/main/java/io/deephaven/engine/util/PythonDeephavenSession.java @@ -90,7 +90,7 @@ public PythonDeephavenSession( PythonEvaluatorJpy jpy = PythonEvaluatorJpy.withGlobalCopy(); evaluator = jpy; scope = jpy.getScope(); - this.module = (PythonScriptSessionModule) PyModule.importModule("deephaven.server.script_session") + this.module = (PythonScriptSessionModule) PyModule.importModule("deephaven2.server.script_session") .createProxy(CallableKind.FUNCTION, PythonScriptSessionModule.class); this.scriptFinder = new ScriptFinder(DEFAULT_SCRIPT_PATH); diff --git a/pyintegration/deephaven2/server/__init__.py b/pyintegration/deephaven2/server/__init__.py new file mode 100644 index 00000000000..5a6b3068c2a --- /dev/null +++ b/pyintegration/deephaven2/server/__init__.py @@ -0,0 +1,2 @@ +# Packages under the deephaven2.server heading are not meant to be called externally - it exists as a convenient place +# for the server to execute implementation logic via python diff --git a/Integrations/python/deephaven/server/plugin/__init__.py b/pyintegration/deephaven2/server/plugin/__init__.py similarity index 100% rename from Integrations/python/deephaven/server/plugin/__init__.py rename to pyintegration/deephaven2/server/plugin/__init__.py diff --git a/Integrations/python/deephaven/server/script_session/__init__.py b/pyintegration/deephaven2/server/script_session/__init__.py similarity index 100% rename from Integrations/python/deephaven/server/script_session/__init__.py rename to pyintegration/deephaven2/server/script_session/__init__.py diff --git a/server/src/main/java/io/deephaven/server/plugin/python/Module.java b/server/src/main/java/io/deephaven/server/plugin/python/Module.java index c4ab62dfc18..3bae3bee423 100644 --- a/server/src/main/java/io/deephaven/server/plugin/python/Module.java +++ b/server/src/main/java/io/deephaven/server/plugin/python/Module.java @@ -6,7 +6,7 @@ interface Module extends AutoCloseable { static Module of() { - final PyModule module = PyModule.importModule("deephaven.server.plugin"); + final PyModule module = PyModule.importModule("deephaven2.server.plugin"); if (module == null) { throw new IllegalStateException("Unable to find `deephaven.server.plugin` module"); } From bb638e61978dccb9fcae93c862b0236cc7152b70 Mon Sep 17 00:00:00 2001 From: Devin Smith Date: Tue, 4 Jan 2022 09:55:38 -0800 Subject: [PATCH 07/62] Review responses --- .../engine/util/GroovyDeephavenSession.java | 3 +- .../util/NoLanguageDeephavenSession.java | 2 +- .../extensions/barrage/util/ExportUtil.java | 22 ++++++++ .../client/examples/FetchObject.java | 4 ++ .../deephaven/client/impl/FetchedObject.java | 11 +++- .../io/deephaven/client/impl/SessionImpl.java | 11 +++- plugin/figure/build.gradle | 2 +- .../figure/FigureWidgetTranslator.java | 6 +-- .../io/deephaven/plugin/type/Exporter.java | 8 ++- .../main/proto/deephaven/proto/console.proto | 1 + .../server/script_session/__init__.py | 2 +- .../appmode/ApplicationServiceGrpcImpl.java | 2 +- .../console/ConsoleServiceGrpcImpl.java | 52 +++++++++++++++++-- .../deephaven/server/plugin/ObjectTypes.java | 2 + .../server/plugin/ObjectTypesModule.java | 2 +- .../server/plugin/PluginsLoader.java | 6 ++- .../{Loader.java => JavaServiceLoader.java} | 2 +- .../{Loader.java => PythonModuleLoader.java} | 2 +- .../server/session/SessionState.java | 30 ----------- .../server/table/TableServiceGrpcImpl.java | 23 ++------ 20 files changed, 120 insertions(+), 73 deletions(-) create mode 100644 extensions/barrage/src/main/java/io/deephaven/extensions/barrage/util/ExportUtil.java rename server/src/main/java/io/deephaven/server/plugin/java/{Loader.java => JavaServiceLoader.java} (89%) rename server/src/main/java/io/deephaven/server/plugin/python/{Loader.java => PythonModuleLoader.java} (88%) diff --git a/engine/table/src/main/java/io/deephaven/engine/util/GroovyDeephavenSession.java b/engine/table/src/main/java/io/deephaven/engine/util/GroovyDeephavenSession.java index 71e155f6b87..a8dd162ba5d 100644 --- a/engine/table/src/main/java/io/deephaven/engine/util/GroovyDeephavenSession.java +++ b/engine/table/src/main/java/io/deephaven/engine/util/GroovyDeephavenSession.java @@ -631,7 +631,8 @@ protected Snapshot emptySnapshot() { @Override protected Snapshot takeSnapshot() { - return new GroovySnapshot(new HashMap<>(getVariables())); + // noinspection unchecked,rawtypes + return new GroovySnapshot(new HashMap<>(groovyShell.getContext().getVariables())); } @Override diff --git a/engine/table/src/main/java/io/deephaven/engine/util/NoLanguageDeephavenSession.java b/engine/table/src/main/java/io/deephaven/engine/util/NoLanguageDeephavenSession.java index 29f64a1bc04..21e53083303 100644 --- a/engine/table/src/main/java/io/deephaven/engine/util/NoLanguageDeephavenSession.java +++ b/engine/table/src/main/java/io/deephaven/engine/util/NoLanguageDeephavenSession.java @@ -74,7 +74,7 @@ protected Snapshot takeSnapshot() { @Override protected Changes createDiff(Snapshot from, Snapshot to, RuntimeException e) { - throw new UnsupportedOperationException(SCRIPT_TYPE + " session does not support diff"); + throw new UnsupportedOperationException(SCRIPT_TYPE + " session does not support createDiff"); } @Override diff --git a/extensions/barrage/src/main/java/io/deephaven/extensions/barrage/util/ExportUtil.java b/extensions/barrage/src/main/java/io/deephaven/extensions/barrage/util/ExportUtil.java new file mode 100644 index 00000000000..fbcb43e1453 --- /dev/null +++ b/extensions/barrage/src/main/java/io/deephaven/extensions/barrage/util/ExportUtil.java @@ -0,0 +1,22 @@ +package io.deephaven.extensions.barrage.util; + +import io.deephaven.engine.table.Table; +import io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse; +import io.deephaven.proto.backplane.grpc.TableReference; +import io.deephaven.proto.backplane.grpc.Ticket; + +public class ExportUtil { + public static ExportedTableCreationResponse buildTableCreationResponse(Ticket ticket, Table table) { + return buildTableCreationResponse(TableReference.newBuilder().setTicket(ticket).build(), table); + } + + public static ExportedTableCreationResponse buildTableCreationResponse(TableReference tableRef, Table table) { + return ExportedTableCreationResponse.newBuilder() + .setSuccess(true) + .setResultId(tableRef) + .setIsStatic(!table.isRefreshing()) + .setSize(table.size()) + .setSchemaHeader(BarrageUtil.schemaBytesFromTable(table)) + .build(); + } +} diff --git a/java-client/session-examples/src/main/java/io/deephaven/client/examples/FetchObject.java b/java-client/session-examples/src/main/java/io/deephaven/client/examples/FetchObject.java index c99441440e5..8152ddd29ab 100644 --- a/java-client/session-examples/src/main/java/io/deephaven/client/examples/FetchObject.java +++ b/java-client/session-examples/src/main/java/io/deephaven/client/examples/FetchObject.java @@ -1,5 +1,6 @@ package io.deephaven.client.examples; +import io.deephaven.client.impl.ExportId; import io.deephaven.client.impl.FetchedObject; import io.deephaven.client.impl.Session; import picocli.CommandLine; @@ -28,6 +29,9 @@ protected void execute(Session session) throws Exception { final String type = customObject.type(); System.err.println("type: " + type); System.err.println("size: " + customObject.size()); + for (ExportId exportId : customObject.exportIds()) { + System.err.println("exportId: " + exportId); + } if (file != null) { try (final OutputStream out = new BufferedOutputStream(Files.newOutputStream(file))) { customObject.writeTo(out); diff --git a/java-client/session/src/main/java/io/deephaven/client/impl/FetchedObject.java b/java-client/session/src/main/java/io/deephaven/client/impl/FetchedObject.java index f92fcdd9ab8..13a4582732c 100644 --- a/java-client/session/src/main/java/io/deephaven/client/impl/FetchedObject.java +++ b/java-client/session/src/main/java/io/deephaven/client/impl/FetchedObject.java @@ -4,15 +4,19 @@ import java.io.IOException; import java.io.OutputStream; +import java.util.Collections; +import java.util.List; import java.util.Objects; public final class FetchedObject { private final String type; private final ByteString bytes; + private final List exportIds; - FetchedObject(String type, ByteString bytes) { + FetchedObject(String type, ByteString bytes, List exportIds) { this.type = Objects.requireNonNull(type); this.bytes = Objects.requireNonNull(bytes); + this.exportIds = Collections.unmodifiableList(exportIds); } public String type() { @@ -31,11 +35,16 @@ public void writeTo(OutputStream out) throws IOException { bytes.writeTo(out); } + public List exportIds() { + return exportIds; + } + @Override public String toString() { return "FetchedObject{" + "type='" + type + '\'' + ", bytes=" + bytes + + ", exportIds=" + exportIds + '}'; } } diff --git a/java-client/session/src/main/java/io/deephaven/client/impl/SessionImpl.java b/java-client/session/src/main/java/io/deephaven/client/impl/SessionImpl.java index 2ab34c86981..8edcf647d6a 100644 --- a/java-client/session/src/main/java/io/deephaven/client/impl/SessionImpl.java +++ b/java-client/session/src/main/java/io/deephaven/client/impl/SessionImpl.java @@ -27,6 +27,7 @@ import io.deephaven.proto.backplane.script.grpc.FetchObjectResponse; import io.deephaven.proto.backplane.script.grpc.StartConsoleRequest; import io.deephaven.proto.backplane.script.grpc.StartConsoleResponse; +import io.deephaven.proto.util.ExportTicketHelper; import io.grpc.CallCredentials; import io.grpc.Metadata; import io.grpc.Metadata.Key; @@ -50,6 +51,7 @@ import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; +import java.util.stream.Collectors; /** * A {@link Session} implementation that uses {@link io.deephaven.proto.backplane.grpc.BatchTableRequest batch requests} @@ -425,7 +427,14 @@ public void beforeStart(ClientCallStreamObserver requestStre public void onNext(FetchObjectResponse value) { final String type = value.getType(); final ByteString data = value.getData(); - future.complete(new FetchedObject(type, data)); + final List exportIds = value.getExportIdList().stream() + .map(FetchObserver::toExportId) + .collect(Collectors.toList()); + future.complete(new FetchedObject(type, data, exportIds)); + } + + private static ExportId toExportId(Ticket e) { + return new ExportId(ExportTicketHelper.ticketToExportId(e, "exportId")); } @Override diff --git a/plugin/figure/build.gradle b/plugin/figure/build.gradle index f91318ef2f6..b344d107fb5 100644 --- a/plugin/figure/build.gradle +++ b/plugin/figure/build.gradle @@ -6,4 +6,4 @@ dependencies { implementation project(':plugin') implementation project(':Plot') implementation project(':extensions-barrage') -} \ No newline at end of file +} diff --git a/plugin/figure/src/main/java/io/deephaven/figure/FigureWidgetTranslator.java b/plugin/figure/src/main/java/io/deephaven/figure/FigureWidgetTranslator.java index 98f76755498..0fc4dae9ceb 100644 --- a/plugin/figure/src/main/java/io/deephaven/figure/FigureWidgetTranslator.java +++ b/plugin/figure/src/main/java/io/deephaven/figure/FigureWidgetTranslator.java @@ -3,6 +3,7 @@ import io.deephaven.api.Selectable; import io.deephaven.engine.table.Table; import io.deephaven.extensions.barrage.util.BarrageUtil; +import io.deephaven.extensions.barrage.util.ExportUtil; import io.deephaven.gui.shape.JShapes; import io.deephaven.gui.shape.NamedShape; import io.deephaven.gui.shape.Shape; @@ -122,9 +123,8 @@ private FigureDescriptor translateFigure(FigureWidget f, Exporter exporter) { } i++; - final Export
export = exporter.newServerSideExport(table); - clientFigure.addTables(buildTableCreationResponse( - TableReference.newBuilder().setTicket(export.getExportId()).build(), table)); + final Export export = exporter.newServerSideExport(table); + clientFigure.addTables(ExportUtil.buildTableCreationResponse(export.id(), table)); } // TODO (deephaven-core#62) implement once tablemaps are ready diff --git a/plugin/src/main/java/io/deephaven/plugin/type/Exporter.java b/plugin/src/main/java/io/deephaven/plugin/type/Exporter.java index 574b3df4e68..417d5439730 100644 --- a/plugin/src/main/java/io/deephaven/plugin/type/Exporter.java +++ b/plugin/src/main/java/io/deephaven/plugin/type/Exporter.java @@ -3,11 +3,9 @@ import io.deephaven.proto.backplane.grpc.Ticket; public interface Exporter { - Export newServerSideExport(T export); + Export newServerSideExport(Object export); - interface Export { - T get(); - - Ticket getExportId(); + interface Export { + Ticket id(); } } diff --git a/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/console.proto b/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/console.proto index 82224d68e60..d69a185f728 100644 --- a/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/console.proto +++ b/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/console.proto @@ -233,6 +233,7 @@ message FetchObjectRequest { message FetchObjectResponse { string type = 1; bytes data = 2; + repeated io.deephaven.proto.backplane.grpc.Ticket export_id = 3; } message FigureDescriptor { diff --git a/pyintegration/deephaven2/server/script_session/__init__.py b/pyintegration/deephaven2/server/script_session/__init__.py index 4482fd3d787..b36b6de80ae 100644 --- a/pyintegration/deephaven2/server/script_session/__init__.py +++ b/pyintegration/deephaven2/server/script_session/__init__.py @@ -43,4 +43,4 @@ def unwrap_to_java_type(object): if isinstance(object, FigureWrapper): return object.figure # add more here when/if necessary - return None \ No newline at end of file + return None diff --git a/server/src/main/java/io/deephaven/server/appmode/ApplicationServiceGrpcImpl.java b/server/src/main/java/io/deephaven/server/appmode/ApplicationServiceGrpcImpl.java index 6fa11644e3d..3ec2abc8a9a 100644 --- a/server/src/main/java/io/deephaven/server/appmode/ApplicationServiceGrpcImpl.java +++ b/server/src/main/java/io/deephaven/server/appmode/ApplicationServiceGrpcImpl.java @@ -314,7 +314,7 @@ private static FieldType customFieldType(ObjectType type) { private static FieldType unknownType() { return FieldType.newBuilder() - .setUnknown(UnknownInfo.newBuilder().build()) + .setUnknown(UnknownInfo.getDefaultInstance()) .build(); } diff --git a/server/src/main/java/io/deephaven/server/console/ConsoleServiceGrpcImpl.java b/server/src/main/java/io/deephaven/server/console/ConsoleServiceGrpcImpl.java index 78e8579a876..a62ff423142 100644 --- a/server/src/main/java/io/deephaven/server/console/ConsoleServiceGrpcImpl.java +++ b/server/src/main/java/io/deephaven/server/console/ConsoleServiceGrpcImpl.java @@ -30,6 +30,8 @@ import io.deephaven.lang.parse.ParsedDocument; import io.deephaven.lang.shared.lsp.CompletionCancelled; import io.deephaven.plot.FigureWidget; +import io.deephaven.plugin.type.Exporter; +import io.deephaven.plugin.type.Exporter.Export; import io.deephaven.plugin.type.ObjectType; import io.deephaven.plugin.type.ObjectTypeLookup; import io.deephaven.proto.backplane.grpc.Ticket; @@ -49,6 +51,7 @@ import io.deephaven.proto.backplane.script.grpc.FetchFigureResponse; import io.deephaven.proto.backplane.script.grpc.FetchObjectRequest; import io.deephaven.proto.backplane.script.grpc.FetchObjectResponse; +import io.deephaven.proto.backplane.script.grpc.FetchObjectResponse.Builder; import io.deephaven.proto.backplane.script.grpc.FigureDescriptor; import io.deephaven.proto.backplane.script.grpc.GetCompletionItemsRequest; import io.deephaven.proto.backplane.script.grpc.GetCompletionItemsResponse; @@ -65,6 +68,7 @@ import io.deephaven.server.session.SessionService; import io.deephaven.server.session.SessionState; import io.deephaven.server.session.SessionState.ExportBuilder; +import io.deephaven.server.session.SessionState.ExportObject; import io.deephaven.server.session.TicketRouter; import io.grpc.stub.StreamObserver; @@ -74,6 +78,7 @@ import java.io.IOException; import java.util.Collection; import java.util.Map; +import java.util.Objects; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.TimeoutException; import java.util.stream.Collectors; @@ -446,7 +451,9 @@ public void fetchFigure(FetchFigureRequest request, StreamObserver noTypeException(object)); - final String name = type.name(); - type.writeTo(state.asExporter(), object, out); + final Builder builder = FetchObjectResponse.newBuilder().setType(type.name()); + final ExportCollector exportCollector = new ExportCollector(state, builder); + type.writeTo(exportCollector, object, out); final ByteString data = ByteStringAccess.wrap(out.peekBuffer(), 0, out.size()); - return FetchObjectResponse.newBuilder().setType(name).setData(data).build(); + return builder.setData(data).build(); } private static IllegalArgumentException noTypeException(Object o) { @@ -535,4 +543,40 @@ public void record(LogBufferRecord record) { } } } + + private static final class ExportCollector implements Exporter { + + private final SessionState sessionState; + private final Builder builder; + private final Thread thread; + + public ExportCollector(SessionState sessionState, Builder builder) { + this.sessionState = Objects.requireNonNull(sessionState); + this.builder = Objects.requireNonNull(builder); + this.thread = Thread.currentThread(); + } + + @Override + public Export newServerSideExport(Object object) { + if (thread != Thread.currentThread()) { + throw new IllegalStateException("Should only create exports on the calling thread"); + } + final ExportObject exportObject = sessionState.newServerSideExport(object); + builder.addExportId(exportObject.getExportId()); + return new ExportImpl(exportObject); + } + } + + private static final class ExportImpl implements Export { + private final ExportObject export; + + public ExportImpl(ExportObject export) { + this.export = Objects.requireNonNull(export); + } + + @Override + public Ticket id() { + return export.getExportId(); + } + } } diff --git a/server/src/main/java/io/deephaven/server/plugin/ObjectTypes.java b/server/src/main/java/io/deephaven/server/plugin/ObjectTypes.java index c0d1926832d..4c89864bf5a 100644 --- a/server/src/main/java/io/deephaven/server/plugin/ObjectTypes.java +++ b/server/src/main/java/io/deephaven/server/plugin/ObjectTypes.java @@ -4,6 +4,7 @@ import io.deephaven.plugin.type.ObjectTypeClassBase; import io.deephaven.plugin.type.ObjectTypeLookup; +import javax.inject.Inject; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; @@ -20,6 +21,7 @@ final class ObjectTypes implements ObjectTypeLookup { private final Map, ObjectType> classTypes; private final List otherTypes; + @Inject public ObjectTypes() { names = new HashSet<>(); classTypes = new HashMap<>(); diff --git a/server/src/main/java/io/deephaven/server/plugin/ObjectTypesModule.java b/server/src/main/java/io/deephaven/server/plugin/ObjectTypesModule.java index d27ed426b3f..c02697d6a79 100644 --- a/server/src/main/java/io/deephaven/server/plugin/ObjectTypesModule.java +++ b/server/src/main/java/io/deephaven/server/plugin/ObjectTypesModule.java @@ -17,5 +17,5 @@ static ObjectTypes providesObjectTypes() { } @Binds - ObjectTypeLookup providesLookup(ObjectTypes types); + ObjectTypeLookup bindsLookup(ObjectTypes types); } diff --git a/server/src/main/java/io/deephaven/server/plugin/PluginsLoader.java b/server/src/main/java/io/deephaven/server/plugin/PluginsLoader.java index b19833b30cc..7310ae0b7e4 100644 --- a/server/src/main/java/io/deephaven/server/plugin/PluginsLoader.java +++ b/server/src/main/java/io/deephaven/server/plugin/PluginsLoader.java @@ -7,6 +7,8 @@ import io.deephaven.plugin.PluginCallback; import io.deephaven.plugin.type.ObjectType; import io.deephaven.server.console.ConsoleServiceGrpcImpl; +import io.deephaven.server.plugin.java.JavaServiceLoader; +import io.deephaven.server.plugin.python.PythonModuleLoader; import javax.inject.Inject; import java.util.Objects; @@ -24,10 +26,10 @@ public PluginsLoader(ObjectTypes types) { public void registerAll() { log.info().append("Registering plugins...").endl(); final Counting serviceLoaderCount = new Counting(); - io.deephaven.server.plugin.java.Loader.allRegisterInto(serviceLoaderCount); + JavaServiceLoader.allRegisterInto(serviceLoaderCount); final Counting pythonModuleCount = new Counting(); if (ConsoleServiceGrpcImpl.isPythonSession()) { - io.deephaven.server.plugin.python.Loader.allRegisterInto(pythonModuleCount); + PythonModuleLoader.allRegisterInto(pythonModuleCount); } log.info().append("Registered via service loader: ").append(serviceLoaderCount).endl(); if (ConsoleServiceGrpcImpl.isPythonSession()) { diff --git a/server/src/main/java/io/deephaven/server/plugin/java/Loader.java b/server/src/main/java/io/deephaven/server/plugin/java/JavaServiceLoader.java similarity index 89% rename from server/src/main/java/io/deephaven/server/plugin/java/Loader.java rename to server/src/main/java/io/deephaven/server/plugin/java/JavaServiceLoader.java index 2e1a8ba4b06..ee5c59b87c9 100644 --- a/server/src/main/java/io/deephaven/server/plugin/java/Loader.java +++ b/server/src/main/java/io/deephaven/server/plugin/java/JavaServiceLoader.java @@ -5,7 +5,7 @@ import java.util.ServiceLoader; -public final class Loader { +public final class JavaServiceLoader { public static void allRegisterInto(PluginCallback callback) { for (Plugin provider : ServiceLoader.load(Plugin.class)) { provider.registerInto(callback); diff --git a/server/src/main/java/io/deephaven/server/plugin/python/Loader.java b/server/src/main/java/io/deephaven/server/plugin/python/PythonModuleLoader.java similarity index 88% rename from server/src/main/java/io/deephaven/server/plugin/python/Loader.java rename to server/src/main/java/io/deephaven/server/plugin/python/PythonModuleLoader.java index 962d5876f2b..0f1011e0584 100644 --- a/server/src/main/java/io/deephaven/server/plugin/python/Loader.java +++ b/server/src/main/java/io/deephaven/server/plugin/python/PythonModuleLoader.java @@ -2,7 +2,7 @@ import io.deephaven.plugin.PluginCallback; -public final class Loader { +public final class PythonModuleLoader { public static void allRegisterInto(PluginCallback callback) { try (final Module module = Module.of()) { module.all_plugins_register_into(new CallbackAdapter(callback)); diff --git a/server/src/main/java/io/deephaven/server/session/SessionState.java b/server/src/main/java/io/deephaven/server/session/SessionState.java index 1ac97ef0a28..7c16fdb4625 100644 --- a/server/src/main/java/io/deephaven/server/session/SessionState.java +++ b/server/src/main/java/io/deephaven/server/session/SessionState.java @@ -29,7 +29,6 @@ import io.deephaven.internal.log.LoggerFactory; import io.deephaven.io.log.LogEntry; import io.deephaven.io.logger.Logger; -import io.deephaven.plugin.type.Exporter; import io.deephaven.proto.backplane.grpc.ExportNotification; import io.deephaven.proto.backplane.grpc.Ticket; import io.deephaven.proto.flight.util.FlightExportTicketHelper; @@ -1330,33 +1329,4 @@ public ExportObject newValue(final int key) { return retval; } }; - - public Exporter asExporter() { - return new ExporterImpl(); - } - - private class ExporterImpl implements Exporter { - @Override - public Export newServerSideExport(T export) { - return new ExportImpl<>(SessionState.this.newServerSideExport(export)); - } - } - - private static class ExportImpl implements Exporter.Export { - private final ExportObject export; - - public ExportImpl(ExportObject export) { - this.export = Objects.requireNonNull(export); - } - - @Override - public T get() { - return export.get(); - } - - @Override - public Ticket getExportId() { - return export.getExportId(); - } - } } diff --git a/server/src/main/java/io/deephaven/server/table/TableServiceGrpcImpl.java b/server/src/main/java/io/deephaven/server/table/TableServiceGrpcImpl.java index 9a5ed7d64ed..9cb3aca7c94 100644 --- a/server/src/main/java/io/deephaven/server/table/TableServiceGrpcImpl.java +++ b/server/src/main/java/io/deephaven/server/table/TableServiceGrpcImpl.java @@ -6,8 +6,8 @@ import com.google.rpc.Code; import io.deephaven.engine.table.Table; -import io.deephaven.extensions.barrage.util.BarrageUtil; import io.deephaven.extensions.barrage.util.GrpcUtil; +import io.deephaven.extensions.barrage.util.ExportUtil; import io.deephaven.internal.log.LoggerFactory; import io.deephaven.io.logger.Logger; import io.deephaven.proto.backplane.grpc.ApplyPreviewColumnsRequest; @@ -313,7 +313,7 @@ public void batch(final BatchTableRequest request, final Table table = exportBuilder.doExport(); safelyExecuteLocked(responseObserver, - () -> responseObserver.onNext(buildTableCreationResponse(resultId, table))); + () -> responseObserver.onNext(ExportUtil.buildTableCreationResponse(resultId, table))); if (remaining.decrementAndGet() == 0) { safelyExecuteLocked(responseObserver, responseObserver::onCompleted); } @@ -358,25 +358,12 @@ public void getExportedTableCreationResponse(final Ticket request, GrpcUtil.statusRuntimeException(Code.FAILED_PRECONDITION, "Ticket is not a table")); return; } - - TableReference ref = TableReference.newBuilder().setTicket(request).build(); - responseObserver.onNext(buildTableCreationResponse(ref, (Table) obj)); + responseObserver.onNext(ExportUtil.buildTableCreationResponse(request, (Table) obj)); responseObserver.onCompleted(); }); }); } - public static ExportedTableCreationResponse buildTableCreationResponse(final TableReference tableRef, - final Table table) { - return ExportedTableCreationResponse.newBuilder() - .setSuccess(true) - .setResultId(tableRef) - .setIsStatic(!table.isRefreshing()) - .setSize(table.size()) - .setSchemaHeader(BarrageUtil.schemaBytesFromTable(table)) - .build(); - } - /** * This helper is a wrapper that enables one-shot RPCs to utilize the same code paths that a batch RPC utilizes. * @@ -397,8 +384,6 @@ private void oneShotOperationWrapper(final BatchTableRequest.Operation.OpCas throw GrpcUtil.statusRuntimeException(Code.FAILED_PRECONDITION, "No result ticket supplied"); } - final TableReference resultRef = TableReference.newBuilder().setTicket(resultId).build(); - final List> dependencies = operation.getTableReferences(request).stream() .map(ref -> resolveOneShotReference(session, ref)) .collect(Collectors.toList()); @@ -409,7 +394,7 @@ private void oneShotOperationWrapper(final BatchTableRequest.Operation.OpCas .submit(() -> { final Table result = operation.create(request, dependencies); safelyExecute(() -> { - responseObserver.onNext(buildTableCreationResponse(resultRef, result)); + responseObserver.onNext(ExportUtil.buildTableCreationResponse(resultId, result)); responseObserver.onCompleted(); }); return result; From fe8414f6ec4e88d75c206c355e98b2f7b5f409e7 Mon Sep 17 00:00:00 2001 From: Devin Smith Date: Tue, 4 Jan 2022 17:39:53 -0800 Subject: [PATCH 08/62] f --- .../engine/util/AbstractScriptSession.java | 16 +++++++++------- .../engine/util/GroovyDeephavenSession.java | 15 ++++++--------- .../util/NoLanguageDeephavenSession.java | 3 ++- .../engine/util/PythonDeephavenSession.java | 19 ++++++++++--------- .../deephaven/engine/util/ScriptSession.java | 3 +++ java-client/session-examples/build.gradle | 1 - 6 files changed, 30 insertions(+), 27 deletions(-) diff --git a/engine/table/src/main/java/io/deephaven/engine/util/AbstractScriptSession.java b/engine/table/src/main/java/io/deephaven/engine/util/AbstractScriptSession.java index 1d2ba94c242..aa231baf066 100644 --- a/engine/table/src/main/java/io/deephaven/engine/util/AbstractScriptSession.java +++ b/engine/table/src/main/java/io/deephaven/engine/util/AbstractScriptSession.java @@ -17,6 +17,7 @@ import io.deephaven.engine.table.lang.QueryLibrary; import io.deephaven.engine.table.lang.QueryScope; import io.deephaven.engine.table.lang.QueryScopeParam; +import io.deephaven.engine.util.AbstractScriptSession.Snapshot; import io.deephaven.plugin.type.ObjectType; import io.deephaven.plugin.type.ObjectTypeLookup; import io.deephaven.util.SafeCloseable; @@ -38,7 +39,7 @@ * This class exists to make all script sessions to be liveness artifacts, and provide a default implementation for * evaluateScript which handles liveness and diffs in a consistent way. */ -public abstract class AbstractScriptSession extends LivenessScope +public abstract class AbstractScriptSession extends LivenessScope implements ScriptSession, VariableProvider { private static final Path CLASS_CACHE_LOCATION = CacheDir.get().resolve("script-session-classes"); @@ -111,13 +112,13 @@ interface Snapshot { } - protected abstract Snapshot emptySnapshot(); + protected abstract S emptySnapshot(); - protected abstract Snapshot takeSnapshot(); + protected abstract S takeSnapshot(); - protected abstract Changes createDiff(Snapshot from, Snapshot to, RuntimeException e); + protected abstract Changes createDiff(S from, S to, RuntimeException e); - protected Changes applyDiff(Snapshot from, Snapshot to, RuntimeException e) { + protected Changes applyDiff(S from, S to, RuntimeException e) { final Changes diff = createDiff(from, to, e); if (changeListener != null) { changeListener.onScopeChanges(this, diff); @@ -128,7 +129,7 @@ protected Changes applyDiff(Snapshot from, Snapshot to, RuntimeException e) { @Override public synchronized final Changes evaluateScript(final String script, final @Nullable String scriptName) { RuntimeException evaluateErr = null; - final Snapshot fromSnapshot = takeSnapshot(); + final S fromSnapshot = takeSnapshot(); // store pointers to exist query scope static variables final QueryLibrary prevQueryLibrary = QueryLibrary.getLibrary(); @@ -153,7 +154,7 @@ public synchronized final Changes evaluateScript(final String script, final @Nul QueryLibrary.setLibrary(prevQueryLibrary); } - final Snapshot toSnapshot = takeSnapshot(); + final S toSnapshot = takeSnapshot(); final Changes diff = applyDiff(fromSnapshot, toSnapshot, evaluateErr); @@ -214,6 +215,7 @@ private Optional getTypeNameIfDisplayable(Object object) { } if (object instanceof TableMap) { return Optional.empty(); + // TODO(deephaven-core#1762): Implement Smart-Keys and Table-Maps // return Optional.of("TableMap"); } return objectTypeLookup.findObjectType(object).map(ObjectType::name); diff --git a/engine/table/src/main/java/io/deephaven/engine/util/GroovyDeephavenSession.java b/engine/table/src/main/java/io/deephaven/engine/util/GroovyDeephavenSession.java index a8dd162ba5d..8a6fa21f691 100644 --- a/engine/table/src/main/java/io/deephaven/engine/util/GroovyDeephavenSession.java +++ b/engine/table/src/main/java/io/deephaven/engine/util/GroovyDeephavenSession.java @@ -17,6 +17,7 @@ import io.deephaven.engine.updategraph.UpdateGraphProcessor; import io.deephaven.engine.table.lang.QueryScope; import io.deephaven.api.util.NameValidator; +import io.deephaven.engine.util.GroovyDeephavenSession.GroovySnapshot; import io.deephaven.engine.util.scripts.ScriptPathLoader; import io.deephaven.engine.util.scripts.ScriptPathLoaderState; import io.deephaven.engine.util.scripts.StateOverrideScriptPathLoader; @@ -53,7 +54,7 @@ /** * Groovy {@link ScriptSession}. Not safe for concurrent use. */ -public class GroovyDeephavenSession extends AbstractScriptSession implements ScriptSession { +public class GroovyDeephavenSession extends AbstractScriptSession implements ScriptSession { private static final Logger log = LoggerFactory.getLogger(GroovyDeephavenSession.class); public static final String SCRIPT_TYPE = "Groovy"; @@ -625,22 +626,18 @@ public Map getVariables() { } @Override - protected Snapshot emptySnapshot() { + protected GroovySnapshot emptySnapshot() { return new GroovySnapshot(Collections.emptyMap()); } @Override - protected Snapshot takeSnapshot() { + protected GroovySnapshot takeSnapshot() { // noinspection unchecked,rawtypes return new GroovySnapshot(new HashMap<>(groovyShell.getContext().getVariables())); } @Override - protected Changes createDiff(Snapshot from, Snapshot to, RuntimeException e) { - return diffImpl((GroovySnapshot) from, (GroovySnapshot) to, e); - } - - private Changes diffImpl(GroovySnapshot from, GroovySnapshot to, RuntimeException e) { + protected Changes createDiff(GroovySnapshot from, GroovySnapshot to, RuntimeException e) { Changes diff = new Changes(); diff.error = e; for (final Map.Entry entry : to.scope.entrySet()) { @@ -659,7 +656,7 @@ private Changes diffImpl(GroovySnapshot from, GroovySnapshot to, RuntimeExceptio return diff; } - private static class GroovySnapshot implements Snapshot { + protected static class GroovySnapshot implements Snapshot { private final Map scope; diff --git a/engine/table/src/main/java/io/deephaven/engine/util/NoLanguageDeephavenSession.java b/engine/table/src/main/java/io/deephaven/engine/util/NoLanguageDeephavenSession.java index 21e53083303..8a7cc58be46 100644 --- a/engine/table/src/main/java/io/deephaven/engine/util/NoLanguageDeephavenSession.java +++ b/engine/table/src/main/java/io/deephaven/engine/util/NoLanguageDeephavenSession.java @@ -5,6 +5,7 @@ package io.deephaven.engine.util; import io.deephaven.engine.table.lang.QueryScope; +import io.deephaven.engine.util.AbstractScriptSession.Snapshot; import io.deephaven.engine.util.scripts.ScriptPathLoader; import io.deephaven.engine.util.scripts.ScriptPathLoaderState; import org.jetbrains.annotations.NotNull; @@ -20,7 +21,7 @@ * ScriptSession implementation that simply allows variables to be exported. This is not intended for use in user * scripts. */ -public class NoLanguageDeephavenSession extends AbstractScriptSession implements ScriptSession { +public class NoLanguageDeephavenSession extends AbstractScriptSession implements ScriptSession { private static final String SCRIPT_TYPE = "NoLanguage"; private final String scriptType; diff --git a/engine/table/src/main/java/io/deephaven/engine/util/PythonDeephavenSession.java b/engine/table/src/main/java/io/deephaven/engine/util/PythonDeephavenSession.java index aa863b84801..bb3541a11f9 100644 --- a/engine/table/src/main/java/io/deephaven/engine/util/PythonDeephavenSession.java +++ b/engine/table/src/main/java/io/deephaven/engine/util/PythonDeephavenSession.java @@ -11,6 +11,7 @@ import io.deephaven.engine.table.lang.QueryLibrary; import io.deephaven.engine.table.lang.QueryScope; import io.deephaven.engine.updategraph.UpdateGraphProcessor; +import io.deephaven.engine.util.PythonDeephavenSession.PythonSnapshot; import io.deephaven.engine.util.scripts.ScriptPathLoader; import io.deephaven.engine.util.scripts.ScriptPathLoaderState; import io.deephaven.internal.log.LoggerFactory; @@ -45,7 +46,7 @@ * This is used for applications or the console; Python code running remotely uses WorkerPythonEnvironment for it's * supporting structures. */ -public class PythonDeephavenSession extends AbstractScriptSession implements ScriptSession { +public class PythonDeephavenSession extends AbstractScriptSession implements ScriptSession { private static final Logger log = LoggerFactory.getLogger(PythonDeephavenSession.class); private static final String DEFAULT_SCRIPT_PATH = Configuration.getInstance() @@ -198,7 +199,7 @@ public Map getVariables() { return Collections.unmodifiableMap(scope.getEntriesMap()); } - private static class PythonSnapshot implements Snapshot, Closeable { + protected static class PythonSnapshot implements Snapshot, Closeable { private final PyDictWrapper dict; @@ -213,24 +214,24 @@ public void close() { } @Override - protected Snapshot emptySnapshot() { + protected PythonSnapshot emptySnapshot() { return new PythonSnapshot(PyObject.executeCode("dict()", PyInputMode.EXPRESSION).asDict()); } @Override - protected Snapshot takeSnapshot() { + protected PythonSnapshot takeSnapshot() { return new PythonSnapshot(scope.globals().copy()); } @Override - protected Changes createDiff(Snapshot from, Snapshot to, RuntimeException e) { + protected Changes createDiff(PythonSnapshot from, PythonSnapshot to, RuntimeException e) { // TODO(deephaven-core#1775): multivariate jpy (unwrapped) return type into java // It would be great if we could push down the maybeUnwrap logic into create_change_list (it could handle the // unwrapping), but we are unable to tell jpy that we want to unwrap JType objects, but pass back python objects // as PyObject. try ( - PythonSnapshot fromSnapshot = (PythonSnapshot) from; - PythonSnapshot toSnapshot = (PythonSnapshot) to; + PythonSnapshot fromSnapshot = from; + PythonSnapshot toSnapshot = to; PyObject changes = module.create_change_list(fromSnapshot.dict.unwrap(), toSnapshot.dict.unwrap())) { final Changes diff = new Changes(); diff.error = e; @@ -269,7 +270,7 @@ public boolean hasVariableName(String name) { @Override public synchronized void setVariable(String name, @Nullable Object newValue) { - final Snapshot fromSnapshot = takeSnapshot(); + final PythonSnapshot fromSnapshot = takeSnapshot(); final PyDictWrapper globals = scope.globals(); if (newValue == null) { try { @@ -280,7 +281,7 @@ public synchronized void setVariable(String name, @Nullable Object newValue) { } else { globals.setItem(name, newValue); } - final Snapshot toSnapshot = takeSnapshot(); + final PythonSnapshot toSnapshot = takeSnapshot(); applyDiff(fromSnapshot, toSnapshot, null); } diff --git a/engine/table/src/main/java/io/deephaven/engine/util/ScriptSession.java b/engine/table/src/main/java/io/deephaven/engine/util/ScriptSession.java index b51799cabc4..75db4e39219 100644 --- a/engine/table/src/main/java/io/deephaven/engine/util/ScriptSession.java +++ b/engine/table/src/main/java/io/deephaven/engine/util/ScriptSession.java @@ -57,6 +57,9 @@ public interface ScriptSession extends ReleasableLivenessManager, LivenessNode { class Changes { public RuntimeException error = null; + + // TODO(deephaven-core#1781): Close gaps between proto "CustomType" fields + public Map created = new HashMap<>(); public Map updated = new HashMap<>(); public Map removed = new HashMap<>(); diff --git a/java-client/session-examples/build.gradle b/java-client/session-examples/build.gradle index 2e0c1a042fb..6732655b8ef 100644 --- a/java-client/session-examples/build.gradle +++ b/java-client/session-examples/build.gradle @@ -6,7 +6,6 @@ plugins { dependencies { implementation project(':java-client-session-dagger') implementation project(':java-client-example-utilities') - runtimeOnly 'io.grpc:grpc-netty' Classpaths.inheritJUnitPlatform(project) Classpaths.inheritAssertJ(project) From e4da7bb53a9be14b1fe80aa809fd3b8e45445d62 Mon Sep 17 00:00:00 2001 From: Devin Smith Date: Wed, 5 Jan 2022 14:00:31 -0800 Subject: [PATCH 09/62] f --- proto/proto-backplane-grpc/Dockerfile | 3 + .../main/proto/deephaven/proto/object.proto | 29 +++++ server/build.gradle | 3 +- .../server/object/ObjectServiceGrpcImpl.java | 116 ++++++++++++++++++ .../server/object/ObjectServiceModule.java | 13 ++ .../deephaven/server/plugin/ObjectTypes.java | 2 +- .../server/plugin/PluginsLoader.java | 2 +- .../runner/DeephavenApiServerModule.java | 2 + 8 files changed, 167 insertions(+), 3 deletions(-) create mode 100644 proto/proto-backplane-grpc/src/main/proto/deephaven/proto/object.proto create mode 100644 server/src/main/java/io/deephaven/server/object/ObjectServiceGrpcImpl.java create mode 100644 server/src/main/java/io/deephaven/server/object/ObjectServiceModule.java diff --git a/proto/proto-backplane-grpc/Dockerfile b/proto/proto-backplane-grpc/Dockerfile index 5900d668241..3794bf86700 100644 --- a/proto/proto-backplane-grpc/Dockerfile +++ b/proto/proto-backplane-grpc/Dockerfile @@ -18,6 +18,7 @@ RUN set -eux; \ /dependencies/BrowserFlight.proto \ /includes/deephaven/proto/ticket.proto \ /includes/deephaven/proto/console.proto \ + /includes/deephaven/proto/object.proto \ /includes/deephaven/proto/session.proto \ /includes/deephaven/proto/table.proto \ /includes/deephaven/proto/application.proto \ @@ -32,6 +33,7 @@ RUN set -eux; \ /dependencies/Flight.proto \ /includes/deephaven/proto/ticket.proto \ /includes/deephaven/proto/console.proto \ + /includes/deephaven/proto/object.proto \ /includes/deephaven/proto/session.proto \ /includes/deephaven/proto/table.proto \ /includes/deephaven/proto/application.proto \ @@ -42,6 +44,7 @@ RUN set -eux; \ -I/includes \ /includes/deephaven/proto/ticket.proto \ /includes/deephaven/proto/console.proto \ + /includes/deephaven/proto/object.proto \ /includes/deephaven/proto/session.proto \ /includes/deephaven/proto/table.proto \ /includes/deephaven/proto/application.proto \ diff --git a/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/object.proto b/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/object.proto new file mode 100644 index 00000000000..a20b21f2370 --- /dev/null +++ b/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/object.proto @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2016-2021 Deephaven Data Labs and Patent Pending + */ + +syntax = "proto3"; + +package io.deephaven.proto.backplane.grpc; + +option java_multiple_files = true; +option optimize_for = SPEED; + +import "deephaven/proto/ticket.proto"; + +/* + * Object service +*/ +service ObjectService { + rpc FetchObject2(FetchObjectRequest2) returns (FetchObjectResponse2) {} +} + +message FetchObjectRequest2 { + io.deephaven.proto.backplane.grpc.Ticket source_id = 1; +} + +message FetchObjectResponse2 { + string type = 1; + bytes data = 2; + repeated io.deephaven.proto.backplane.grpc.Ticket export_id = 3; +} diff --git a/server/build.gradle b/server/build.gradle index f866bfc2d94..a156009127c 100644 --- a/server/build.gradle +++ b/server/build.gradle @@ -37,7 +37,8 @@ dependencies { runtimeOnly project(':extensions-suanshu') } - implementation project(':plugin') + api project(':plugin') + // TODO(deephaven-core#1784): Remove fetchFigure RPC // this can be runtimeOnly only after #1784 implementation project(':plugin:figure') diff --git a/server/src/main/java/io/deephaven/server/object/ObjectServiceGrpcImpl.java b/server/src/main/java/io/deephaven/server/object/ObjectServiceGrpcImpl.java new file mode 100644 index 00000000000..b12723ae05c --- /dev/null +++ b/server/src/main/java/io/deephaven/server/object/ObjectServiceGrpcImpl.java @@ -0,0 +1,116 @@ +package io.deephaven.server.object; + +import com.google.protobuf.ByteString; +import com.google.protobuf.ByteStringAccess; +import com.google.rpc.Code; +import io.deephaven.extensions.barrage.util.BarrageProtoUtil.ExposedByteArrayOutputStream; +import io.deephaven.extensions.barrage.util.GrpcUtil; +import io.deephaven.internal.log.LoggerFactory; +import io.deephaven.io.logger.Logger; +import io.deephaven.plugin.type.Exporter; +import io.deephaven.plugin.type.Exporter.Export; +import io.deephaven.plugin.type.ObjectType; +import io.deephaven.plugin.type.ObjectTypeLookup; +import io.deephaven.proto.backplane.grpc.FetchObjectRequest2; +import io.deephaven.proto.backplane.grpc.FetchObjectResponse2; +import io.deephaven.proto.backplane.grpc.FetchObjectResponse2.Builder; +import io.deephaven.proto.backplane.grpc.ObjectServiceGrpc; +import io.deephaven.proto.backplane.grpc.Ticket; +import io.deephaven.server.session.SessionService; +import io.deephaven.server.session.SessionState; +import io.deephaven.server.session.SessionState.ExportObject; +import io.deephaven.server.session.TicketRouter; +import io.grpc.stub.StreamObserver; + +import javax.inject.Inject; +import javax.inject.Provider; +import java.io.IOException; +import java.util.Objects; + +public class ObjectServiceGrpcImpl extends ObjectServiceGrpc.ObjectServiceImplBase { + private static final Logger log = LoggerFactory.getLogger(ObjectServiceGrpcImpl.class); + + private final SessionService sessionService; + private final TicketRouter ticketRouter; + private final ObjectTypeLookup objectTypeLookup; + + @Inject + public ObjectServiceGrpcImpl(SessionService sessionService, TicketRouter ticketRouter, ObjectTypeLookup objectTypeLookup) { + this.sessionService = Objects.requireNonNull(sessionService); + this.ticketRouter = Objects.requireNonNull(ticketRouter); + this.objectTypeLookup = Objects.requireNonNull(objectTypeLookup); + } + + @Override + public void fetchObject2(FetchObjectRequest2 request, StreamObserver responseObserver) { + GrpcUtil.rpcWrapper(log, responseObserver, () -> { + final SessionState session = sessionService.getCurrentSession(); + if (request.getSourceId().getTicket().isEmpty()) { + throw GrpcUtil.statusRuntimeException(Code.FAILED_PRECONDITION, "No sourceId supplied"); + } + final SessionState.ExportObject object = ticketRouter.resolve( + session, request.getSourceId(), "sourceId"); + session.nonExport() + .require(object) + .onError(responseObserver) + .submit(() -> { + final Object o = object.get(); + final FetchObjectResponse2 response = serialize(session, o); + responseObserver.onNext(response); + responseObserver.onCompleted(); + return null; + }); + }); + } + + private FetchObjectResponse2 serialize(SessionState state, Object object) throws IOException { + final ExposedByteArrayOutputStream out = new ExposedByteArrayOutputStream(); + final ObjectType type = objectTypeLookup.findObjectType(object).orElseThrow(() -> noTypeException(object)); + final Builder builder = FetchObjectResponse2.newBuilder().setType(type.name()); + final ExportCollector exportCollector = new ExportCollector(state, builder); + type.writeTo(exportCollector, object, out); + final ByteString data = ByteStringAccess.wrap(out.peekBuffer(), 0, out.size()); + return builder.setData(data).build(); + } + + private static IllegalArgumentException noTypeException(Object o) { + return new IllegalArgumentException( + "No type registered for object class=" + o.getClass().getName() + ", value=" + o); + } + + private static final class ExportCollector implements Exporter { + + private final SessionState sessionState; + private final Builder builder; + private final Thread thread; + + public ExportCollector(SessionState sessionState, Builder builder) { + this.sessionState = Objects.requireNonNull(sessionState); + this.builder = Objects.requireNonNull(builder); + this.thread = Thread.currentThread(); + } + + @Override + public Export newServerSideExport(Object object) { + if (thread != Thread.currentThread()) { + throw new IllegalStateException("Should only create exports on the calling thread"); + } + final ExportObject exportObject = sessionState.newServerSideExport(object); + builder.addExportId(exportObject.getExportId()); + return new ExportImpl(exportObject); + } + } + + private static final class ExportImpl implements Export { + private final ExportObject export; + + public ExportImpl(ExportObject export) { + this.export = Objects.requireNonNull(export); + } + + @Override + public Ticket id() { + return export.getExportId(); + } + } +} diff --git a/server/src/main/java/io/deephaven/server/object/ObjectServiceModule.java b/server/src/main/java/io/deephaven/server/object/ObjectServiceModule.java new file mode 100644 index 00000000000..7da9872eb85 --- /dev/null +++ b/server/src/main/java/io/deephaven/server/object/ObjectServiceModule.java @@ -0,0 +1,13 @@ +package io.deephaven.server.object; + +import dagger.Binds; +import dagger.Module; +import dagger.multibindings.IntoSet; +import io.grpc.BindableService; + +@Module +public interface ObjectServiceModule { + @Binds + @IntoSet + BindableService bindObjectServiceGrpcImpl(ObjectServiceGrpcImpl objectService); +} diff --git a/server/src/main/java/io/deephaven/server/plugin/ObjectTypes.java b/server/src/main/java/io/deephaven/server/plugin/ObjectTypes.java index 4c89864bf5a..c39a1488cb5 100644 --- a/server/src/main/java/io/deephaven/server/plugin/ObjectTypes.java +++ b/server/src/main/java/io/deephaven/server/plugin/ObjectTypes.java @@ -13,7 +13,7 @@ import java.util.Optional; import java.util.Set; -final class ObjectTypes implements ObjectTypeLookup { +public final class ObjectTypes implements ObjectTypeLookup { private static final Set RESERVED_TYPE_NAMES = Set.of("Table", "TableMap", "TreeTable"); diff --git a/server/src/main/java/io/deephaven/server/plugin/PluginsLoader.java b/server/src/main/java/io/deephaven/server/plugin/PluginsLoader.java index 7310ae0b7e4..5c688f98005 100644 --- a/server/src/main/java/io/deephaven/server/plugin/PluginsLoader.java +++ b/server/src/main/java/io/deephaven/server/plugin/PluginsLoader.java @@ -16,7 +16,7 @@ public final class PluginsLoader implements PluginCallback { private static final Logger log = LoggerFactory.getLogger(PluginsLoader.class); - public final ObjectTypes types; + private final ObjectTypes types; @Inject public PluginsLoader(ObjectTypes types) { diff --git a/server/src/main/java/io/deephaven/server/runner/DeephavenApiServerModule.java b/server/src/main/java/io/deephaven/server/runner/DeephavenApiServerModule.java index 9a7f178dd6a..5905499a06b 100644 --- a/server/src/main/java/io/deephaven/server/runner/DeephavenApiServerModule.java +++ b/server/src/main/java/io/deephaven/server/runner/DeephavenApiServerModule.java @@ -5,6 +5,7 @@ import dagger.multibindings.ElementsIntoSet; import io.deephaven.chunk.util.pools.MultiChunkPool; import io.deephaven.engine.updategraph.UpdateGraphProcessor; +import io.deephaven.server.object.ObjectServiceModule; import io.deephaven.server.plugin.PluginModule; import io.deephaven.server.appmode.AppMode; import io.deephaven.server.appmode.AppModeModule; @@ -51,6 +52,7 @@ TableModule.class, InputTableModule.class, ConsoleModule.class, + ObjectServiceModule.class, PluginModule.class, GroovyConsoleSessionModule.class, PythonConsoleSessionModule.class From 8ee1947ed033ca77e3defde7193b1ba95cbb5398 Mon Sep 17 00:00:00 2001 From: Devin Smith Date: Thu, 6 Jan 2022 10:29:13 -0800 Subject: [PATCH 10/62] better dagger and docs --- docker/server/src/main/docker/Dockerfile | 8 +-- .../figure/FigureWidgetTranslator.java | 4 +- .../main/java/io/deephaven/plugin/Plugin.java | 3 + .../io/deephaven/plugin/PluginCallback.java | 8 ++- .../io/deephaven/plugin/type/Exporter.java | 4 +- .../io/deephaven/plugin/type/ObjectType.java | 31 +++++++++- .../deephaven/plugin/type/ObjectTypeBase.java | 8 +-- .../plugin/type/ObjectTypeCallback.java | 14 +++++ .../plugin/type/ObjectTypeClassBase.java | 4 +- .../plugin/type/ObjectTypeLookup.java | 10 ++++ .../console/ConsoleServiceGrpcImpl.java | 56 +++++++++++++------ .../server/object/ObjectServiceGrpcImpl.java | 10 ++-- .../server/plugin/ObjectTypesModule.java | 21 ------- .../deephaven/server/plugin/PluginModule.java | 8 --- ...sLoader.java => PluginsAutoDiscovery.java} | 33 ++++++----- .../server/plugin/PluginsModule.java | 19 +++++++ .../java/io/deephaven/server/plugin/What.java | 10 ++++ .../server/plugin/java/JavaServiceLoader.java | 6 ++ .../server/plugin/python/Module.java | 6 +- .../plugin/python/ObjectTypeAdapter.java | 6 +- .../plugin/python/PythonModuleLoader.java | 8 +++ .../server/plugin/{ => type}/ObjectTypes.java | 35 ++++++++---- .../server/plugin/type/ObjectTypesModule.java | 19 +++++++ .../server/runner/DeephavenApiServer.java | 10 ++-- .../runner/DeephavenApiServerModule.java | 4 +- 25 files changed, 238 insertions(+), 107 deletions(-) create mode 100644 plugin/src/main/java/io/deephaven/plugin/type/ObjectTypeCallback.java delete mode 100644 server/src/main/java/io/deephaven/server/plugin/ObjectTypesModule.java delete mode 100644 server/src/main/java/io/deephaven/server/plugin/PluginModule.java rename server/src/main/java/io/deephaven/server/plugin/{PluginsLoader.java => PluginsAutoDiscovery.java} (67%) create mode 100644 server/src/main/java/io/deephaven/server/plugin/PluginsModule.java create mode 100644 server/src/main/java/io/deephaven/server/plugin/What.java rename server/src/main/java/io/deephaven/server/plugin/{ => type}/ObjectTypes.java (60%) create mode 100644 server/src/main/java/io/deephaven/server/plugin/type/ObjectTypesModule.java diff --git a/docker/server/src/main/docker/Dockerfile b/docker/server/src/main/docker/Dockerfile index 3b48d46e4a5..ba65b3aea6e 100644 --- a/docker/server/src/main/docker/Dockerfile +++ b/docker/server/src/main/docker/Dockerfile @@ -2,10 +2,10 @@ ARG BASE FROM $BASE as install # To test out the deephaven-plugin-matplotlib, uncomment the following: -#RUN set -eux; \ -# python3 -m pip install -q --no-cache-dir \ -# importlib-metadata \ -# https://github.com/deephaven/deephaven-plugin-matplotlib/releases/download/v0.0.1.dev2/deephaven_plugin_matplotlib-0.0.1.dev2-py3-none-any.whl +RUN set -eux; \ + python3 -m pip install -q --no-cache-dir \ + importlib-metadata \ + https://github.com/deephaven/deephaven-plugin-matplotlib/releases/download/v0.0.1.dev2/deephaven_plugin_matplotlib-0.0.1.dev2-py3-none-any.whl COPY licenses/ / diff --git a/plugin/figure/src/main/java/io/deephaven/figure/FigureWidgetTranslator.java b/plugin/figure/src/main/java/io/deephaven/figure/FigureWidgetTranslator.java index 0fc4dae9ceb..8d9723b2846 100644 --- a/plugin/figure/src/main/java/io/deephaven/figure/FigureWidgetTranslator.java +++ b/plugin/figure/src/main/java/io/deephaven/figure/FigureWidgetTranslator.java @@ -40,7 +40,7 @@ import io.deephaven.plot.util.tables.TableHandle; import io.deephaven.plot.util.tables.TableMapHandle; import io.deephaven.plugin.type.Exporter; -import io.deephaven.plugin.type.Exporter.Export; +import io.deephaven.plugin.type.Exporter.Reference; import io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse; import io.deephaven.proto.backplane.grpc.TableReference; import io.deephaven.proto.backplane.script.grpc.FigureDescriptor; @@ -123,7 +123,7 @@ private FigureDescriptor translateFigure(FigureWidget f, Exporter exporter) { } i++; - final Export export = exporter.newServerSideExport(table); + final Reference export = exporter.newServerSideReference(table); clientFigure.addTables(ExportUtil.buildTableCreationResponse(export.id(), table)); } diff --git a/plugin/src/main/java/io/deephaven/plugin/Plugin.java b/plugin/src/main/java/io/deephaven/plugin/Plugin.java index 2019c3fabea..c3912e07a20 100644 --- a/plugin/src/main/java/io/deephaven/plugin/Plugin.java +++ b/plugin/src/main/java/io/deephaven/plugin/Plugin.java @@ -1,5 +1,8 @@ package io.deephaven.plugin; +/** + * + */ public interface Plugin { void registerInto(PluginCallback callback); diff --git a/plugin/src/main/java/io/deephaven/plugin/PluginCallback.java b/plugin/src/main/java/io/deephaven/plugin/PluginCallback.java index 32e575809c0..e9ce432dd9e 100644 --- a/plugin/src/main/java/io/deephaven/plugin/PluginCallback.java +++ b/plugin/src/main/java/io/deephaven/plugin/PluginCallback.java @@ -1,8 +1,10 @@ package io.deephaven.plugin; -import io.deephaven.plugin.type.ObjectType; +import io.deephaven.plugin.type.ObjectTypeCallback; -public interface PluginCallback { +/** + * + */ +public interface PluginCallback extends ObjectTypeCallback { - void registerObjectType(ObjectType objectType); } diff --git a/plugin/src/main/java/io/deephaven/plugin/type/Exporter.java b/plugin/src/main/java/io/deephaven/plugin/type/Exporter.java index 417d5439730..c32e204b680 100644 --- a/plugin/src/main/java/io/deephaven/plugin/type/Exporter.java +++ b/plugin/src/main/java/io/deephaven/plugin/type/Exporter.java @@ -3,9 +3,9 @@ import io.deephaven.proto.backplane.grpc.Ticket; public interface Exporter { - Export newServerSideExport(Object export); + Reference newServerSideReference(Object object); - interface Export { + interface Reference { Ticket id(); } } diff --git a/plugin/src/main/java/io/deephaven/plugin/type/ObjectType.java b/plugin/src/main/java/io/deephaven/plugin/type/ObjectType.java index 76c662ccf35..dde70699bbd 100644 --- a/plugin/src/main/java/io/deephaven/plugin/type/ObjectType.java +++ b/plugin/src/main/java/io/deephaven/plugin/type/ObjectType.java @@ -1,13 +1,40 @@ package io.deephaven.plugin.type; +import io.deephaven.plugin.type.Exporter.Reference; + import java.io.IOException; import java.io.OutputStream; public interface ObjectType { + /** + * The name of the object type. + * + * @return the name + */ String name(); - boolean isType(Object o); + /** + * Returns true if, and only if, the {@code object} is compatible with {@code this} object type. + * + * @param object the object + * @return true if the {@code object} is compatible + */ + boolean isType(Object object); - void writeTo(Exporter exporter, Object o, OutputStream out) throws IOException; + /** + * Serializes {@code object} into {@code out}. Must only be called with compatible objects, see + * {@link #isType(Object)}. If the serialized {@code object} references another server side object(s), the other + * server side object(s) should be referenced with the {@code exporter}, and the {@link Reference#id()} serialized + * as appropriate. + * + *

+ * Note: the implementation should not hold onto references, or create references outside the calling thread. + * + * @param exporter the exporter + * @param object the (compatible) object + * @param out the output stream + * @throws IOException if an IO exception occurs + */ + void writeTo(Exporter exporter, Object object, OutputStream out) throws IOException; } diff --git a/plugin/src/main/java/io/deephaven/plugin/type/ObjectTypeBase.java b/plugin/src/main/java/io/deephaven/plugin/type/ObjectTypeBase.java index 867bf21c972..0031d4cb75e 100644 --- a/plugin/src/main/java/io/deephaven/plugin/type/ObjectTypeBase.java +++ b/plugin/src/main/java/io/deephaven/plugin/type/ObjectTypeBase.java @@ -8,10 +8,10 @@ public abstract class ObjectTypeBase implements ObjectType { public abstract void writeToTypeChecked(Exporter exporter, Object object, OutputStream out) throws IOException; @Override - public final void writeTo(Exporter exporter, Object o, OutputStream out) throws IOException { - if (!isType(o)) { - throw new IllegalArgumentException("Can't serialize object, wrong type: " + this + " / " + o); + public final void writeTo(Exporter exporter, Object object, OutputStream out) throws IOException { + if (!isType(object)) { + throw new IllegalArgumentException("Can't serialize object, wrong type: " + this + " / " + object); } - writeToTypeChecked(exporter, o, out); + writeToTypeChecked(exporter, object, out); } } diff --git a/plugin/src/main/java/io/deephaven/plugin/type/ObjectTypeCallback.java b/plugin/src/main/java/io/deephaven/plugin/type/ObjectTypeCallback.java new file mode 100644 index 00000000000..d9472d5df89 --- /dev/null +++ b/plugin/src/main/java/io/deephaven/plugin/type/ObjectTypeCallback.java @@ -0,0 +1,14 @@ +package io.deephaven.plugin.type; + +/** + * The registration interface for {@link ObjectType}. + */ +public interface ObjectTypeCallback { + + /** + * Registers {@code objectType}. + * + * @param objectType the object type + */ + void registerObjectType(ObjectType objectType); +} diff --git a/plugin/src/main/java/io/deephaven/plugin/type/ObjectTypeClassBase.java b/plugin/src/main/java/io/deephaven/plugin/type/ObjectTypeClassBase.java index 2036b852cc3..3fd662bf535 100644 --- a/plugin/src/main/java/io/deephaven/plugin/type/ObjectTypeClassBase.java +++ b/plugin/src/main/java/io/deephaven/plugin/type/ObjectTypeClassBase.java @@ -25,8 +25,8 @@ public final String name() { } @Override - public final boolean isType(Object o) { - return clazz.isInstance(o); + public final boolean isType(Object object) { + return clazz.isInstance(object); } @Override diff --git a/plugin/src/main/java/io/deephaven/plugin/type/ObjectTypeLookup.java b/plugin/src/main/java/io/deephaven/plugin/type/ObjectTypeLookup.java index 127194f49c1..46a7e8da4ba 100644 --- a/plugin/src/main/java/io/deephaven/plugin/type/ObjectTypeLookup.java +++ b/plugin/src/main/java/io/deephaven/plugin/type/ObjectTypeLookup.java @@ -2,8 +2,18 @@ import java.util.Optional; +/** + * + */ public interface ObjectTypeLookup { + /** + * Find the {@link ObjectType} compatible with {@code object}. That is, {@link ObjectType#isType(Object)} will be + * {@code true} for {@code object}. + * + * @param object the object + * @return the object type, if found + */ Optional findObjectType(Object object); enum NoOp implements ObjectTypeLookup { diff --git a/server/src/main/java/io/deephaven/server/console/ConsoleServiceGrpcImpl.java b/server/src/main/java/io/deephaven/server/console/ConsoleServiceGrpcImpl.java index a62ff423142..1ba95b7bf91 100644 --- a/server/src/main/java/io/deephaven/server/console/ConsoleServiceGrpcImpl.java +++ b/server/src/main/java/io/deephaven/server/console/ConsoleServiceGrpcImpl.java @@ -31,7 +31,7 @@ import io.deephaven.lang.shared.lsp.CompletionCancelled; import io.deephaven.plot.FigureWidget; import io.deephaven.plugin.type.Exporter; -import io.deephaven.plugin.type.Exporter.Export; +import io.deephaven.plugin.type.Exporter.Reference; import io.deephaven.plugin.type.ObjectType; import io.deephaven.plugin.type.ObjectTypeLookup; import io.deephaven.proto.backplane.grpc.Ticket; @@ -76,7 +76,9 @@ import javax.inject.Provider; import javax.inject.Singleton; import java.io.IOException; +import java.util.ArrayList; import java.util.Collection; +import java.util.List; import java.util.Map; import java.util.Objects; import java.util.concurrent.ConcurrentHashMap; @@ -451,8 +453,7 @@ public void fetchFigure(FetchFigureRequest request, StreamObserver noTypeException(object)); - final Builder builder = FetchObjectResponse.newBuilder().setType(type.name()); - final ExportCollector exportCollector = new ExportCollector(state, builder); - type.writeTo(exportCollector, object, out); - final ByteString data = ByteStringAccess.wrap(out.peekBuffer(), 0, out.size()); - return builder.setData(data).build(); + final ExportCollector exportCollector = new ExportCollector(state); + try { + type.writeTo(exportCollector, object, out); + final Builder builder = FetchObjectResponse.newBuilder() + .setType(type.name()) + .setData(ByteStringAccess.wrap(out.peekBuffer(), 0, out.size()));; + for (ExportObject export : exportCollector.exports()) { + builder.addExportId(export.getExportId()); + } + return builder.build(); + } catch (Throwable t) { + cleanup(exportCollector, t); + throw t; + } + } + + private static void cleanup(ExportCollector exportCollector, Throwable t) { + for (ExportObject export : exportCollector.exports()) { + try { + export.release(); + } catch (Throwable inner) { + t.addSuppressed(inner); + } + } } private static IllegalArgumentException noTypeException(Object o) { @@ -547,30 +567,34 @@ public void record(LogBufferRecord record) { private static final class ExportCollector implements Exporter { private final SessionState sessionState; - private final Builder builder; private final Thread thread; + private final List> exports; - public ExportCollector(SessionState sessionState, Builder builder) { + public ExportCollector(SessionState sessionState) { this.sessionState = Objects.requireNonNull(sessionState); - this.builder = Objects.requireNonNull(builder); this.thread = Thread.currentThread(); + this.exports = new ArrayList<>(); + } + + public List> exports() { + return exports; } @Override - public Export newServerSideExport(Object object) { + public Reference newServerSideReference(Object object) { if (thread != Thread.currentThread()) { throw new IllegalStateException("Should only create exports on the calling thread"); } final ExportObject exportObject = sessionState.newServerSideExport(object); - builder.addExportId(exportObject.getExportId()); - return new ExportImpl(exportObject); + exports.add(exportObject); + return new ReferenceImpl(exportObject); } } - private static final class ExportImpl implements Export { + private static final class ReferenceImpl implements Reference { private final ExportObject export; - public ExportImpl(ExportObject export) { + public ReferenceImpl(ExportObject export) { this.export = Objects.requireNonNull(export); } diff --git a/server/src/main/java/io/deephaven/server/object/ObjectServiceGrpcImpl.java b/server/src/main/java/io/deephaven/server/object/ObjectServiceGrpcImpl.java index b12723ae05c..a8c57fbf44e 100644 --- a/server/src/main/java/io/deephaven/server/object/ObjectServiceGrpcImpl.java +++ b/server/src/main/java/io/deephaven/server/object/ObjectServiceGrpcImpl.java @@ -8,7 +8,7 @@ import io.deephaven.internal.log.LoggerFactory; import io.deephaven.io.logger.Logger; import io.deephaven.plugin.type.Exporter; -import io.deephaven.plugin.type.Exporter.Export; +import io.deephaven.plugin.type.Exporter.Reference; import io.deephaven.plugin.type.ObjectType; import io.deephaven.plugin.type.ObjectTypeLookup; import io.deephaven.proto.backplane.grpc.FetchObjectRequest2; @@ -23,7 +23,6 @@ import io.grpc.stub.StreamObserver; import javax.inject.Inject; -import javax.inject.Provider; import java.io.IOException; import java.util.Objects; @@ -35,7 +34,8 @@ public class ObjectServiceGrpcImpl extends ObjectServiceGrpc.ObjectServiceImplBa private final ObjectTypeLookup objectTypeLookup; @Inject - public ObjectServiceGrpcImpl(SessionService sessionService, TicketRouter ticketRouter, ObjectTypeLookup objectTypeLookup) { + public ObjectServiceGrpcImpl(SessionService sessionService, TicketRouter ticketRouter, + ObjectTypeLookup objectTypeLookup) { this.sessionService = Objects.requireNonNull(sessionService); this.ticketRouter = Objects.requireNonNull(ticketRouter); this.objectTypeLookup = Objects.requireNonNull(objectTypeLookup); @@ -91,7 +91,7 @@ public ExportCollector(SessionState sessionState, Builder builder) { } @Override - public Export newServerSideExport(Object object) { + public Reference newServerSideReference(Object object) { if (thread != Thread.currentThread()) { throw new IllegalStateException("Should only create exports on the calling thread"); } @@ -101,7 +101,7 @@ public Export newServerSideExport(Object object) { } } - private static final class ExportImpl implements Export { + private static final class ExportImpl implements Reference { private final ExportObject export; public ExportImpl(ExportObject export) { diff --git a/server/src/main/java/io/deephaven/server/plugin/ObjectTypesModule.java b/server/src/main/java/io/deephaven/server/plugin/ObjectTypesModule.java deleted file mode 100644 index c02697d6a79..00000000000 --- a/server/src/main/java/io/deephaven/server/plugin/ObjectTypesModule.java +++ /dev/null @@ -1,21 +0,0 @@ -package io.deephaven.server.plugin; - -import dagger.Binds; -import dagger.Module; -import dagger.Provides; -import io.deephaven.plugin.type.ObjectTypeLookup; - -import javax.inject.Singleton; - -@Module -public interface ObjectTypesModule { - - @Provides - @Singleton - static ObjectTypes providesObjectTypes() { - return new ObjectTypes(); - } - - @Binds - ObjectTypeLookup bindsLookup(ObjectTypes types); -} diff --git a/server/src/main/java/io/deephaven/server/plugin/PluginModule.java b/server/src/main/java/io/deephaven/server/plugin/PluginModule.java deleted file mode 100644 index b84979db01d..00000000000 --- a/server/src/main/java/io/deephaven/server/plugin/PluginModule.java +++ /dev/null @@ -1,8 +0,0 @@ -package io.deephaven.server.plugin; - -import dagger.Module; - -@Module(includes = {ObjectTypesModule.class}) -public interface PluginModule { - -} diff --git a/server/src/main/java/io/deephaven/server/plugin/PluginsLoader.java b/server/src/main/java/io/deephaven/server/plugin/PluginsAutoDiscovery.java similarity index 67% rename from server/src/main/java/io/deephaven/server/plugin/PluginsLoader.java rename to server/src/main/java/io/deephaven/server/plugin/PluginsAutoDiscovery.java index 5c688f98005..a4221a62831 100644 --- a/server/src/main/java/io/deephaven/server/plugin/PluginsLoader.java +++ b/server/src/main/java/io/deephaven/server/plugin/PluginsAutoDiscovery.java @@ -6,6 +6,7 @@ import io.deephaven.io.logger.Logger; import io.deephaven.plugin.PluginCallback; import io.deephaven.plugin.type.ObjectType; +import io.deephaven.plugin.type.ObjectTypeCallback; import io.deephaven.server.console.ConsoleServiceGrpcImpl; import io.deephaven.server.plugin.java.JavaServiceLoader; import io.deephaven.server.plugin.python.PythonModuleLoader; @@ -13,16 +14,25 @@ import javax.inject.Inject; import java.util.Objects; -public final class PluginsLoader implements PluginCallback { - private static final Logger log = LoggerFactory.getLogger(PluginsLoader.class); +/** + * Provides a {@link #registerAll()} entrypoint for {@link io.deephaven.plugin.Plugin} auto-discovery. Logs + * auto-discovered details. + */ +public final class PluginsAutoDiscovery { + private static final Logger log = LoggerFactory.getLogger(PluginsAutoDiscovery.class); - private final ObjectTypes types; + private final ObjectTypeCallback types; @Inject - public PluginsLoader(ObjectTypes types) { + public PluginsAutoDiscovery(ObjectTypeCallback types) { this.types = Objects.requireNonNull(types); } + /** + * Registers {@link io.deephaven.plugin.Plugin plugins} via + * {@link JavaServiceLoader#allRegisterInto(PluginCallback)} and + * {@link PythonModuleLoader#allRegisterInto(PluginCallback)} (if python is enabled). + */ public void registerAll() { log.info().append("Registering plugins...").endl(); final Counting serviceLoaderCount = new Counting(); @@ -37,22 +47,17 @@ public void registerAll() { } } - @Override - public void registerObjectType(ObjectType objectType) { - log.info().append("Registering object type: ") - .append(objectType.name()).append(" / ") - .append(objectType.toString()) - .endl(); - types.register(objectType); - } - private class Counting implements PluginCallback, LogOutputAppendable { private int objectTypeCount = 0; @Override public void registerObjectType(ObjectType objectType) { - PluginsLoader.this.registerObjectType(objectType); + log.info().append("Registering object type: ") + .append(objectType.name()).append(" / ") + .append(objectType.toString()) + .endl(); + types.registerObjectType(objectType); ++objectTypeCount; } diff --git a/server/src/main/java/io/deephaven/server/plugin/PluginsModule.java b/server/src/main/java/io/deephaven/server/plugin/PluginsModule.java new file mode 100644 index 00000000000..3d001d1a0db --- /dev/null +++ b/server/src/main/java/io/deephaven/server/plugin/PluginsModule.java @@ -0,0 +1,19 @@ +package io.deephaven.server.plugin; + +import dagger.Module; +import io.deephaven.server.plugin.type.ObjectTypesModule; + +/** + * Includes the {@link Module modules} necessary to provide {@link PluginsAutoDiscovery}. + * + *

+ * Note: runtime plugin registration is not currently supported - ie, no {@link io.deephaven.plugin.PluginCallback} is + * provided. See deephaven-core#1809 for the + * feature request. + * + * @see ObjectTypesModule + */ +@Module(includes = {ObjectTypesModule.class}) +public interface PluginsModule { + +} diff --git a/server/src/main/java/io/deephaven/server/plugin/What.java b/server/src/main/java/io/deephaven/server/plugin/What.java new file mode 100644 index 00000000000..527353ef226 --- /dev/null +++ b/server/src/main/java/io/deephaven/server/plugin/What.java @@ -0,0 +1,10 @@ +package io.deephaven.server.plugin; + +import io.deephaven.proto.backplane.grpc.FieldInfo.FieldType; + +public class What { + public static void main(String[] args) { + + System.out.println(FieldType.getDefaultInstance().getFieldCase()); + } +} diff --git a/server/src/main/java/io/deephaven/server/plugin/java/JavaServiceLoader.java b/server/src/main/java/io/deephaven/server/plugin/java/JavaServiceLoader.java index ee5c59b87c9..dcc5fc0b00d 100644 --- a/server/src/main/java/io/deephaven/server/plugin/java/JavaServiceLoader.java +++ b/server/src/main/java/io/deephaven/server/plugin/java/JavaServiceLoader.java @@ -6,6 +6,12 @@ import java.util.ServiceLoader; public final class JavaServiceLoader { + + /** + * Registers all {@link Plugin plugins} found via {@link ServiceLoader#load(Class)}. + * + * @param callback the plugin callback + */ public static void allRegisterInto(PluginCallback callback) { for (Plugin provider : ServiceLoader.load(Plugin.class)) { provider.registerInto(callback); diff --git a/server/src/main/java/io/deephaven/server/plugin/python/Module.java b/server/src/main/java/io/deephaven/server/plugin/python/Module.java index 3bae3bee423..b455713fc2c 100644 --- a/server/src/main/java/io/deephaven/server/plugin/python/Module.java +++ b/server/src/main/java/io/deephaven/server/plugin/python/Module.java @@ -5,10 +5,12 @@ interface Module extends AutoCloseable { + String MODULE = "deephaven2.server.plugin"; + static Module of() { - final PyModule module = PyModule.importModule("deephaven2.server.plugin"); + final PyModule module = PyModule.importModule(MODULE); if (module == null) { - throw new IllegalStateException("Unable to find `deephaven.server.plugin` module"); + throw new IllegalStateException(String.format("Unable to find `%s` module", MODULE)); } return (Module) module.createProxy(CallableKind.FUNCTION, Module.class); } diff --git a/server/src/main/java/io/deephaven/server/plugin/python/ObjectTypeAdapter.java b/server/src/main/java/io/deephaven/server/plugin/python/ObjectTypeAdapter.java index bbb90426c33..bfff7ec227e 100644 --- a/server/src/main/java/io/deephaven/server/plugin/python/ObjectTypeAdapter.java +++ b/server/src/main/java/io/deephaven/server/plugin/python/ObjectTypeAdapter.java @@ -22,11 +22,11 @@ public String name() { } @Override - public boolean isType(Object o) { - if (!(o instanceof PyObject)) { + public boolean isType(Object object) { + if (!(object instanceof PyObject)) { return false; } - return objectTypeAdapter.call(boolean.class, "is_type", PyObject.class, (PyObject) o); + return objectTypeAdapter.call(boolean.class, "is_type", PyObject.class, (PyObject) object); } @Override diff --git a/server/src/main/java/io/deephaven/server/plugin/python/PythonModuleLoader.java b/server/src/main/java/io/deephaven/server/plugin/python/PythonModuleLoader.java index 0f1011e0584..95ce994d0e9 100644 --- a/server/src/main/java/io/deephaven/server/plugin/python/PythonModuleLoader.java +++ b/server/src/main/java/io/deephaven/server/plugin/python/PythonModuleLoader.java @@ -1,8 +1,16 @@ package io.deephaven.server.plugin.python; +import io.deephaven.plugin.Plugin; import io.deephaven.plugin.PluginCallback; public final class PythonModuleLoader { + + /** + * Registers all {@link Plugin plugins} found via python entrypoints "deephaven.plugin". See the deephaven-plugin + * python package for more information. + * + * @param callback the plugin callback + */ public static void allRegisterInto(PluginCallback callback) { try (final Module module = Module.of()) { module.all_plugins_register_into(new CallbackAdapter(callback)); diff --git a/server/src/main/java/io/deephaven/server/plugin/ObjectTypes.java b/server/src/main/java/io/deephaven/server/plugin/type/ObjectTypes.java similarity index 60% rename from server/src/main/java/io/deephaven/server/plugin/ObjectTypes.java rename to server/src/main/java/io/deephaven/server/plugin/type/ObjectTypes.java index c39a1488cb5..75ff4b5e820 100644 --- a/server/src/main/java/io/deephaven/server/plugin/ObjectTypes.java +++ b/server/src/main/java/io/deephaven/server/plugin/type/ObjectTypes.java @@ -1,10 +1,12 @@ -package io.deephaven.server.plugin; +package io.deephaven.server.plugin.type; import io.deephaven.plugin.type.ObjectType; +import io.deephaven.plugin.type.ObjectTypeCallback; import io.deephaven.plugin.type.ObjectTypeClassBase; import io.deephaven.plugin.type.ObjectTypeLookup; import javax.inject.Inject; +import javax.inject.Singleton; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; @@ -13,7 +15,15 @@ import java.util.Optional; import java.util.Set; -public final class ObjectTypes implements ObjectTypeLookup { +/** + * Provides synchronized object type {@link ObjectTypeCallback registration} and {@link ObjectTypeLookup lookup}. + * + *

+ * Object type registration that is an instances of {@link ObjectTypeClassBase} receives special consideration, and + * these objects have more efficient lookups. + */ +@Singleton +public final class ObjectTypes implements ObjectTypeLookup, ObjectTypeCallback { private static final Set RESERVED_TYPE_NAMES = Set.of("Table", "TableMap", "TreeTable"); @@ -42,23 +52,24 @@ public synchronized Optional findObjectType(Object object) { return Optional.empty(); } - public synchronized void register(ObjectType type) { - if (isReservedName(type.name())) { - throw new IllegalArgumentException("Unable to register type, type name is reserved: " + type.name()); + @Override + public synchronized void registerObjectType(ObjectType objectType) { + if (isReservedName(objectType.name())) { + throw new IllegalArgumentException("Unable to register type, name is reserved: " + objectType.name()); } - if (names.contains(type.name())) { + if (names.contains(objectType.name())) { throw new IllegalArgumentException( - "Unable to register type, type name already registered: " + type.name()); + "Unable to register type, type name already registered: " + objectType.name()); } - if (type instanceof ObjectTypeClassBase) { - final Class clazz = ((ObjectTypeClassBase) type).clazz(); - if (classTypes.putIfAbsent(clazz, type) != null) { + if (objectType instanceof ObjectTypeClassBase) { + final Class clazz = ((ObjectTypeClassBase) objectType).clazz(); + if (classTypes.putIfAbsent(clazz, objectType) != null) { throw new IllegalArgumentException("Unable to register type, class already registered: " + clazz); } } else { - otherTypes.add(type); + otherTypes.add(objectType); } - names.add(type.name()); + names.add(objectType.name()); } private static boolean isReservedName(String name) { diff --git a/server/src/main/java/io/deephaven/server/plugin/type/ObjectTypesModule.java b/server/src/main/java/io/deephaven/server/plugin/type/ObjectTypesModule.java new file mode 100644 index 00000000000..a51e7befce0 --- /dev/null +++ b/server/src/main/java/io/deephaven/server/plugin/type/ObjectTypesModule.java @@ -0,0 +1,19 @@ +package io.deephaven.server.plugin.type; + +import dagger.Binds; +import dagger.Module; +import io.deephaven.plugin.type.ObjectTypeCallback; +import io.deephaven.plugin.type.ObjectTypeLookup; + +/** + * Binds {@link ObjectTypes} as {@link ObjectTypeLookup} and {@link ObjectTypeCallback}. + */ +@Module +public interface ObjectTypesModule { + + @Binds + ObjectTypeLookup bindsLookup(ObjectTypes types); + + @Binds + ObjectTypeCallback bindsCallback(ObjectTypes types); +} diff --git a/server/src/main/java/io/deephaven/server/runner/DeephavenApiServer.java b/server/src/main/java/io/deephaven/server/runner/DeephavenApiServer.java index 55cd11fbbb8..80cbe0f3521 100644 --- a/server/src/main/java/io/deephaven/server/runner/DeephavenApiServer.java +++ b/server/src/main/java/io/deephaven/server/runner/DeephavenApiServer.java @@ -8,7 +8,7 @@ import io.deephaven.engine.util.AbstractScriptSession; import io.deephaven.internal.log.LoggerFactory; import io.deephaven.io.logger.Logger; -import io.deephaven.server.plugin.PluginsLoader; +import io.deephaven.server.plugin.PluginsAutoDiscovery; import io.deephaven.server.appmode.ApplicationInjector; import io.deephaven.server.console.ConsoleServiceGrpcImpl; import io.deephaven.server.log.LogInit; @@ -36,7 +36,7 @@ public class DeephavenApiServer { private final UpdateGraphProcessor ugp; private final LogInit logInit; private final ConsoleServiceGrpcImpl consoleService; - private final PluginsLoader pluginsLoader; + private final PluginsAutoDiscovery pluginsAutoDiscovery; private final ApplicationInjector applicationInjector; private final UriResolvers uriResolvers; private final SessionService sessionService; @@ -47,7 +47,7 @@ public DeephavenApiServer( final UpdateGraphProcessor ugp, final LogInit logInit, final ConsoleServiceGrpcImpl consoleService, - final PluginsLoader pluginsLoader, + final PluginsAutoDiscovery pluginsAutoDiscovery, final ApplicationInjector applicationInjector, final UriResolvers uriResolvers, final SessionService sessionService) { @@ -55,7 +55,7 @@ public DeephavenApiServer( this.ugp = ugp; this.logInit = logInit; this.consoleService = consoleService; - this.pluginsLoader = pluginsLoader; + this.pluginsAutoDiscovery = pluginsAutoDiscovery; this.applicationInjector = applicationInjector; this.uriResolvers = uriResolvers; this.sessionService = sessionService; @@ -103,7 +103,7 @@ public void run() throws IOException, ClassNotFoundException, InterruptedExcepti log.info().append("Initializing Script Session...").endl(); consoleService.initializeGlobalScriptSession(); - pluginsLoader.registerAll(); + pluginsAutoDiscovery.registerAll(); log.info().append("Starting UGP...").endl(); ugp.start(); diff --git a/server/src/main/java/io/deephaven/server/runner/DeephavenApiServerModule.java b/server/src/main/java/io/deephaven/server/runner/DeephavenApiServerModule.java index 5905499a06b..2ffde4ef48a 100644 --- a/server/src/main/java/io/deephaven/server/runner/DeephavenApiServerModule.java +++ b/server/src/main/java/io/deephaven/server/runner/DeephavenApiServerModule.java @@ -6,7 +6,7 @@ import io.deephaven.chunk.util.pools.MultiChunkPool; import io.deephaven.engine.updategraph.UpdateGraphProcessor; import io.deephaven.server.object.ObjectServiceModule; -import io.deephaven.server.plugin.PluginModule; +import io.deephaven.server.plugin.PluginsModule; import io.deephaven.server.appmode.AppMode; import io.deephaven.server.appmode.AppModeModule; import io.deephaven.server.arrow.ArrowModule; @@ -53,7 +53,7 @@ InputTableModule.class, ConsoleModule.class, ObjectServiceModule.class, - PluginModule.class, + PluginsModule.class, GroovyConsoleSessionModule.class, PythonConsoleSessionModule.class }) From 354a5a725882fbde2391de4c3ba1430a68ddc7c6 Mon Sep 17 00:00:00 2001 From: Devin Smith Date: Thu, 6 Jan 2022 13:14:37 -0800 Subject: [PATCH 11/62] f --- .../deephaven/client/impl/ConsoleService.java | 8 ----- .../deephaven/client/impl/ObjectService.java | 13 ++++++++ .../io/deephaven/client/impl/Session.java | 3 +- .../io/deephaven/client/impl/SessionImpl.java | 17 ++++++----- .../deephaven/figure/FigureWidgetPlugin.java | 8 ++--- .../figure/FigureWidgetTranslator.java | 4 +-- .../io/deephaven/figure/FigureWidgetType.java | 1 - .../main/java/io/deephaven/plugin/Plugin.java | 11 ++++++- .../java/io/deephaven/plugin/PluginBase.java | 19 ++++++++++++ .../io/deephaven/plugin/PluginCallback.java | 2 ++ .../io/deephaven/plugin/type/Exporter.java | 11 ------- .../io/deephaven/plugin/type/ObjectType.java | 30 +++++++++++++++++-- .../deephaven/plugin/type/ObjectTypeBase.java | 4 +-- .../plugin/type/ObjectTypeClassBase.java | 2 +- .../plugin/type/ObjectTypeLookup.java | 2 +- .../plugin/type/ObjectTypePlugin.java | 14 +++++++++ .../io/deephaven/proto/DeephavenChannel.java | 6 ++++ .../proto/deephaven/proto/application.proto | 12 ++++---- .../deephaven2/server/plugin/__init__.py | 12 +++----- .../appmode/ApplicationServiceGrpcImpl.java | 26 +++++++--------- .../console/ConsoleServiceGrpcImpl.java | 5 ++-- .../server/object/ObjectServiceGrpcImpl.java | 4 +-- .../java/io/deephaven/server/plugin/What.java | 10 ------- .../server/plugin/python/CallbackAdapter.java | 4 +-- .../plugin/python/ObjectTypeAdapter.java | 9 +++--- 25 files changed, 146 insertions(+), 91 deletions(-) create mode 100644 java-client/session/src/main/java/io/deephaven/client/impl/ObjectService.java create mode 100644 plugin/src/main/java/io/deephaven/plugin/PluginBase.java delete mode 100644 plugin/src/main/java/io/deephaven/plugin/type/Exporter.java create mode 100644 plugin/src/main/java/io/deephaven/plugin/type/ObjectTypePlugin.java delete mode 100644 server/src/main/java/io/deephaven/server/plugin/What.java diff --git a/java-client/session/src/main/java/io/deephaven/client/impl/ConsoleService.java b/java-client/session/src/main/java/io/deephaven/client/impl/ConsoleService.java index 942e64ac19c..c894682aeed 100644 --- a/java-client/session/src/main/java/io/deephaven/client/impl/ConsoleService.java +++ b/java-client/session/src/main/java/io/deephaven/client/impl/ConsoleService.java @@ -23,12 +23,4 @@ public interface ConsoleService { * @return the publish completable future */ CompletableFuture publish(String name, HasTicketId ticketId); - - /** - * Fetch the object. - * - * @param ticket the ticket - * @return the future - */ - CompletableFuture fetchObject(HasTicketId ticket); } diff --git a/java-client/session/src/main/java/io/deephaven/client/impl/ObjectService.java b/java-client/session/src/main/java/io/deephaven/client/impl/ObjectService.java new file mode 100644 index 00000000000..50a29809518 --- /dev/null +++ b/java-client/session/src/main/java/io/deephaven/client/impl/ObjectService.java @@ -0,0 +1,13 @@ +package io.deephaven.client.impl; + +import java.util.concurrent.CompletableFuture; + +public interface ObjectService { + /** + * Fetch the object. + * + * @param ticket the ticket + * @return the future + */ + CompletableFuture fetchObject(HasTicketId ticket); +} diff --git a/java-client/session/src/main/java/io/deephaven/client/impl/Session.java b/java-client/session/src/main/java/io/deephaven/client/impl/Session.java index 4022b3b4da8..ad0f15c5929 100644 --- a/java-client/session/src/main/java/io/deephaven/client/impl/Session.java +++ b/java-client/session/src/main/java/io/deephaven/client/impl/Session.java @@ -5,7 +5,8 @@ /** * A session represents a client-side connection to a Deephaven server. */ -public interface Session extends AutoCloseable, ApplicationService, ConsoleService, InputTableService, TableService { +public interface Session + extends AutoCloseable, ApplicationService, ConsoleService, InputTableService, ObjectService, TableService { // ---------------------------------------------------------- diff --git a/java-client/session/src/main/java/io/deephaven/client/impl/SessionImpl.java b/java-client/session/src/main/java/io/deephaven/client/impl/SessionImpl.java index 8edcf647d6a..541145554b0 100644 --- a/java-client/session/src/main/java/io/deephaven/client/impl/SessionImpl.java +++ b/java-client/session/src/main/java/io/deephaven/client/impl/SessionImpl.java @@ -9,11 +9,14 @@ import io.deephaven.proto.backplane.grpc.CloseSessionResponse; import io.deephaven.proto.backplane.grpc.DeleteTableRequest; import io.deephaven.proto.backplane.grpc.DeleteTableResponse; +import io.deephaven.proto.backplane.grpc.FetchObjectRequest2; +import io.deephaven.proto.backplane.grpc.FetchObjectResponse2; import io.deephaven.proto.backplane.grpc.FieldsChangeUpdate; import io.deephaven.proto.backplane.grpc.HandshakeRequest; import io.deephaven.proto.backplane.grpc.HandshakeResponse; import io.deephaven.proto.backplane.grpc.InputTableServiceGrpc.InputTableServiceStub; import io.deephaven.proto.backplane.grpc.ListFieldsRequest; +import io.deephaven.proto.backplane.grpc.ObjectServiceGrpc.ObjectServiceStub; import io.deephaven.proto.backplane.grpc.ReleaseRequest; import io.deephaven.proto.backplane.grpc.ReleaseResponse; import io.deephaven.proto.backplane.grpc.SessionServiceGrpc.SessionServiceStub; @@ -23,8 +26,6 @@ import io.deephaven.proto.backplane.script.grpc.ConsoleServiceGrpc.ConsoleServiceStub; import io.deephaven.proto.backplane.script.grpc.ExecuteCommandRequest; import io.deephaven.proto.backplane.script.grpc.ExecuteCommandResponse; -import io.deephaven.proto.backplane.script.grpc.FetchObjectRequest; -import io.deephaven.proto.backplane.script.grpc.FetchObjectResponse; import io.deephaven.proto.backplane.script.grpc.StartConsoleRequest; import io.deephaven.proto.backplane.script.grpc.StartConsoleResponse; import io.deephaven.proto.util.ExportTicketHelper; @@ -184,6 +185,7 @@ public void onCompleted() { private final ScheduledExecutorService executor; private final SessionServiceStub sessionService; private final ConsoleServiceStub consoleService; + private final ObjectServiceStub objectService; private final InputTableServiceStub inputTableService; private final ApplicationServiceStub applicationServiceStub; private final Handler handler; @@ -207,6 +209,7 @@ private SessionImpl(SessionImplConfig config, Handler handler, AuthenticationInf this.executor = config.executor(); this.sessionService = config.channel().session().withCallCredentials(credentials); this.consoleService = config.channel().console().withCallCredentials(credentials); + this.objectService = config.channel().object().withCallCredentials(credentials); this.inputTableService = config.channel().inputTable().withCallCredentials(credentials); this.applicationServiceStub = config.channel().application().withCallCredentials(credentials); this.exportTicketCreator = new ExportTicketCreator(); @@ -252,11 +255,11 @@ public CompletableFuture publish(String name, HasTicketId ticketId) { @Override public CompletableFuture fetchObject(HasTicketId ticketId) { - final FetchObjectRequest request = FetchObjectRequest.newBuilder() + final FetchObjectRequest2 request = FetchObjectRequest2.newBuilder() .setSourceId(ticketId.ticketId().ticket()) .build(); final FetchObserver observer = new FetchObserver(); - consoleService.fetchObject(request, observer); + objectService.fetchObject2(request, observer); return observer.future; } @@ -411,11 +414,11 @@ public void onCompleted() { } private static final class FetchObserver - implements ClientResponseObserver { + implements ClientResponseObserver { private final CompletableFuture future = new CompletableFuture<>(); @Override - public void beforeStart(ClientCallStreamObserver requestStream) { + public void beforeStart(ClientCallStreamObserver requestStream) { future.whenComplete((session, throwable) -> { if (future.isCancelled()) { requestStream.cancel("User cancelled", null); @@ -424,7 +427,7 @@ public void beforeStart(ClientCallStreamObserver requestStre } @Override - public void onNext(FetchObjectResponse value) { + public void onNext(FetchObjectResponse2 value) { final String type = value.getType(); final ByteString data = value.getData(); final List exportIds = value.getExportIdList().stream() diff --git a/plugin/figure/src/main/java/io/deephaven/figure/FigureWidgetPlugin.java b/plugin/figure/src/main/java/io/deephaven/figure/FigureWidgetPlugin.java index fff4cdfa1ae..9f97e71b330 100644 --- a/plugin/figure/src/main/java/io/deephaven/figure/FigureWidgetPlugin.java +++ b/plugin/figure/src/main/java/io/deephaven/figure/FigureWidgetPlugin.java @@ -1,15 +1,15 @@ package io.deephaven.figure; -import io.deephaven.plugin.Plugin; -import io.deephaven.plugin.PluginCallback; +import io.deephaven.plugin.PluginBase; +import io.deephaven.plugin.type.ObjectTypeCallback; /** * Registers the object type {@link FigureWidgetType}. */ -public final class FigureWidgetPlugin implements Plugin { +public final class FigureWidgetPlugin extends PluginBase { @Override - public void registerInto(PluginCallback callback) { + public void registerInto(ObjectTypeCallback callback) { callback.registerObjectType(FigureWidgetType.instance()); } } diff --git a/plugin/figure/src/main/java/io/deephaven/figure/FigureWidgetTranslator.java b/plugin/figure/src/main/java/io/deephaven/figure/FigureWidgetTranslator.java index 8d9723b2846..b83d0eecf43 100644 --- a/plugin/figure/src/main/java/io/deephaven/figure/FigureWidgetTranslator.java +++ b/plugin/figure/src/main/java/io/deephaven/figure/FigureWidgetTranslator.java @@ -39,8 +39,8 @@ import io.deephaven.plot.util.tables.SwappableTableOneClickMap; import io.deephaven.plot.util.tables.TableHandle; import io.deephaven.plot.util.tables.TableMapHandle; -import io.deephaven.plugin.type.Exporter; -import io.deephaven.plugin.type.Exporter.Reference; +import io.deephaven.plugin.type.ObjectType.Exporter; +import io.deephaven.plugin.type.ObjectType.Exporter.Reference; import io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse; import io.deephaven.proto.backplane.grpc.TableReference; import io.deephaven.proto.backplane.script.grpc.FigureDescriptor; diff --git a/plugin/figure/src/main/java/io/deephaven/figure/FigureWidgetType.java b/plugin/figure/src/main/java/io/deephaven/figure/FigureWidgetType.java index 07f247c50b7..8dbabb777fd 100644 --- a/plugin/figure/src/main/java/io/deephaven/figure/FigureWidgetType.java +++ b/plugin/figure/src/main/java/io/deephaven/figure/FigureWidgetType.java @@ -2,7 +2,6 @@ import io.deephaven.plot.FigureWidget; import io.deephaven.plugin.type.ObjectTypeClassBase; -import io.deephaven.plugin.type.Exporter; import java.io.IOException; import java.io.OutputStream; diff --git a/plugin/src/main/java/io/deephaven/plugin/Plugin.java b/plugin/src/main/java/io/deephaven/plugin/Plugin.java index c3912e07a20..62d11950fd5 100644 --- a/plugin/src/main/java/io/deephaven/plugin/Plugin.java +++ b/plugin/src/main/java/io/deephaven/plugin/Plugin.java @@ -1,9 +1,18 @@ package io.deephaven.plugin; +import io.deephaven.plugin.type.ObjectTypePlugin; + /** + * The generic plugin interface which extends all of the specific plugin interfaces. * + * @see ObjectTypePlugin */ -public interface Plugin { +public interface Plugin extends ObjectTypePlugin { + /** + * The generic registration entrypoint. + * + * @param callback the callback. + */ void registerInto(PluginCallback callback); } diff --git a/plugin/src/main/java/io/deephaven/plugin/PluginBase.java b/plugin/src/main/java/io/deephaven/plugin/PluginBase.java new file mode 100644 index 00000000000..3f6c79c25f4 --- /dev/null +++ b/plugin/src/main/java/io/deephaven/plugin/PluginBase.java @@ -0,0 +1,19 @@ +package io.deephaven.plugin; + +import io.deephaven.plugin.type.ObjectTypeCallback; + +/** + * The plugin base. Implementations should override the appropriate registration methods as necessary. + */ +public abstract class PluginBase implements Plugin { + + @Override + public final void registerInto(PluginCallback callback) { + registerInto((ObjectTypeCallback) callback); + } + + @Override + public void registerInto(ObjectTypeCallback callback) { + + } +} diff --git a/plugin/src/main/java/io/deephaven/plugin/PluginCallback.java b/plugin/src/main/java/io/deephaven/plugin/PluginCallback.java index e9ce432dd9e..e194b959849 100644 --- a/plugin/src/main/java/io/deephaven/plugin/PluginCallback.java +++ b/plugin/src/main/java/io/deephaven/plugin/PluginCallback.java @@ -3,7 +3,9 @@ import io.deephaven.plugin.type.ObjectTypeCallback; /** + * The generic plugin callback interface which extends all of the specific plugin callback interfaces. * + * @see ObjectTypeCallback */ public interface PluginCallback extends ObjectTypeCallback { diff --git a/plugin/src/main/java/io/deephaven/plugin/type/Exporter.java b/plugin/src/main/java/io/deephaven/plugin/type/Exporter.java deleted file mode 100644 index c32e204b680..00000000000 --- a/plugin/src/main/java/io/deephaven/plugin/type/Exporter.java +++ /dev/null @@ -1,11 +0,0 @@ -package io.deephaven.plugin.type; - -import io.deephaven.proto.backplane.grpc.Ticket; - -public interface Exporter { - Reference newServerSideReference(Object object); - - interface Reference { - Ticket id(); - } -} diff --git a/plugin/src/main/java/io/deephaven/plugin/type/ObjectType.java b/plugin/src/main/java/io/deephaven/plugin/type/ObjectType.java index dde70699bbd..ae3bf73e882 100644 --- a/plugin/src/main/java/io/deephaven/plugin/type/ObjectType.java +++ b/plugin/src/main/java/io/deephaven/plugin/type/ObjectType.java @@ -1,10 +1,16 @@ package io.deephaven.plugin.type; -import io.deephaven.plugin.type.Exporter.Reference; +import io.deephaven.plugin.type.ObjectType.Exporter.Reference; +import io.deephaven.proto.backplane.grpc.Ticket; import java.io.IOException; import java.io.OutputStream; +/** + * An "object type" plugin object. Useful for serializing custom objects between the server / client. + * + * @see ObjectTypePlugin + */ public interface ObjectType { /** @@ -29,7 +35,7 @@ public interface ObjectType { * as appropriate. * *

- * Note: the implementation should not hold onto references, or create references outside the calling thread. + * Note: the implementation should not hold onto references nor create references outside the calling thread. * * @param exporter the exporter * @param object the (compatible) object @@ -37,4 +43,24 @@ public interface ObjectType { * @throws IOException if an IO exception occurs */ void writeTo(Exporter exporter, Object object, OutputStream out) throws IOException; + + interface Exporter { + + /** + * Create a new server side reference in anticipation of serialization. + * + * @param object the object + * @return the reference + */ + Reference newServerSideReference(Object object); + + /** + * + * + * TODO: management + */ + interface Reference { + Ticket id(); + } + } } diff --git a/plugin/src/main/java/io/deephaven/plugin/type/ObjectTypeBase.java b/plugin/src/main/java/io/deephaven/plugin/type/ObjectTypeBase.java index 0031d4cb75e..3d5526e433a 100644 --- a/plugin/src/main/java/io/deephaven/plugin/type/ObjectTypeBase.java +++ b/plugin/src/main/java/io/deephaven/plugin/type/ObjectTypeBase.java @@ -5,13 +5,13 @@ public abstract class ObjectTypeBase implements ObjectType { - public abstract void writeToTypeChecked(Exporter exporter, Object object, OutputStream out) throws IOException; + public abstract void writeToCompatibleObject(Exporter exporter, Object object, OutputStream out) throws IOException; @Override public final void writeTo(Exporter exporter, Object object, OutputStream out) throws IOException { if (!isType(object)) { throw new IllegalArgumentException("Can't serialize object, wrong type: " + this + " / " + object); } - writeToTypeChecked(exporter, object, out); + writeToCompatibleObject(exporter, object, out); } } diff --git a/plugin/src/main/java/io/deephaven/plugin/type/ObjectTypeClassBase.java b/plugin/src/main/java/io/deephaven/plugin/type/ObjectTypeClassBase.java index 3fd662bf535..6be61d19830 100644 --- a/plugin/src/main/java/io/deephaven/plugin/type/ObjectTypeClassBase.java +++ b/plugin/src/main/java/io/deephaven/plugin/type/ObjectTypeClassBase.java @@ -30,7 +30,7 @@ public final boolean isType(Object object) { } @Override - public final void writeToTypeChecked(Exporter exporter, Object object, OutputStream out) throws IOException { + public final void writeToCompatibleObject(Exporter exporter, Object object, OutputStream out) throws IOException { writeToImpl(exporter, clazz.cast(object), out); } diff --git a/plugin/src/main/java/io/deephaven/plugin/type/ObjectTypeLookup.java b/plugin/src/main/java/io/deephaven/plugin/type/ObjectTypeLookup.java index 46a7e8da4ba..1c4247b3b53 100644 --- a/plugin/src/main/java/io/deephaven/plugin/type/ObjectTypeLookup.java +++ b/plugin/src/main/java/io/deephaven/plugin/type/ObjectTypeLookup.java @@ -3,7 +3,7 @@ import java.util.Optional; /** - * + * The {@link ObjectType object type} lookup. */ public interface ObjectTypeLookup { diff --git a/plugin/src/main/java/io/deephaven/plugin/type/ObjectTypePlugin.java b/plugin/src/main/java/io/deephaven/plugin/type/ObjectTypePlugin.java new file mode 100644 index 00000000000..4559babc61b --- /dev/null +++ b/plugin/src/main/java/io/deephaven/plugin/type/ObjectTypePlugin.java @@ -0,0 +1,14 @@ +package io.deephaven.plugin.type; + +/** + * The plugin interface for registration of {@link ObjectType object types}. + */ +public interface ObjectTypePlugin { + + /** + * The registration entrypoint for {@link ObjectType object types}. + * + * @param callback the callback + */ + void registerInto(ObjectTypeCallback callback); +} diff --git a/proto/proto-backplane-grpc/src/main/java/io/deephaven/proto/DeephavenChannel.java b/proto/proto-backplane-grpc/src/main/java/io/deephaven/proto/DeephavenChannel.java index 423964c8217..d7bfa32e98c 100644 --- a/proto/proto-backplane-grpc/src/main/java/io/deephaven/proto/DeephavenChannel.java +++ b/proto/proto-backplane-grpc/src/main/java/io/deephaven/proto/DeephavenChannel.java @@ -8,6 +8,8 @@ import io.deephaven.proto.backplane.grpc.InputTableServiceGrpc.InputTableServiceBlockingStub; import io.deephaven.proto.backplane.grpc.InputTableServiceGrpc.InputTableServiceFutureStub; import io.deephaven.proto.backplane.grpc.InputTableServiceGrpc.InputTableServiceStub; +import io.deephaven.proto.backplane.grpc.ObjectServiceGrpc; +import io.deephaven.proto.backplane.grpc.ObjectServiceGrpc.ObjectServiceStub; import io.deephaven.proto.backplane.grpc.SessionServiceGrpc; import io.deephaven.proto.backplane.grpc.SessionServiceGrpc.SessionServiceBlockingStub; import io.deephaven.proto.backplane.grpc.SessionServiceGrpc.SessionServiceFutureStub; @@ -52,6 +54,10 @@ public ConsoleServiceStub console() { return ConsoleServiceGrpc.newStub(channel); } + public ObjectServiceStub object() { + return ObjectServiceGrpc.newStub(channel); + } + public ApplicationServiceStub application() { return ApplicationServiceGrpc.newStub(channel); } diff --git a/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/application.proto b/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/application.proto index 0885f7b805a..f345fd3b2c1 100644 --- a/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/application.proto +++ b/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/application.proto @@ -56,10 +56,7 @@ message FieldInfo { oneof field { CustomInfo custom = 1; TableInfo table = 2; - UnknownInfo unknown = 3; - // reserved = 4; // for TableMap - // reserved = 5; // *DEPRECATED* Figure - // reserved = 6; // for TreeTable + PluginTypeInfo plugin = 3; // use values above 4096 for custom client behavior } @@ -82,8 +79,11 @@ message CustomInfo { string type = 1; // application-specific type to identify the purpose of this custom field reference } -message UnknownInfo { - +/* + * io.deephaven.plugin.type.ObjectType + */ +message PluginTypeInfo { + string name = 1; } /* diff --git a/pyintegration/deephaven2/server/plugin/__init__.py b/pyintegration/deephaven2/server/plugin/__init__.py index 478f8998d14..c24ae55f97b 100644 --- a/pyintegration/deephaven2/server/plugin/__init__.py +++ b/pyintegration/deephaven2/server/plugin/__init__.py @@ -1,7 +1,7 @@ import jpy PluginCallback = jpy.get_type('io.deephaven.plugin.PluginCallback') -Exporter = jpy.get_type('io.deephaven.plugin.type.Exporter') +Exporter = jpy.get_type('io.deephaven.plugin.type.ObjectType$Exporter') DEEPHAVEN_PLUGIN_ENTRY_KEY = 'deephaven.plugin' DEEPHAVEN_PLUGIN_REGISTER_NAME = 'register_into' @@ -32,7 +32,7 @@ def __init__(self, callback: PluginCallback): # TODO(deephaven-core#1791): type hint object_type as ObjectTypeABC def register_object_type(self, object_type): - self._callback.registerObjectType(ObjectTypeAdapter(object_type)) + self._callback.registerObjectType(object_type.name, ObjectTypeAdapter(object_type)) def __str__(self): return str(self._callback) @@ -42,8 +42,8 @@ class ExporterAdapter: def __init__(self, exporter: Exporter): self._exporter = exporter - def new_server_side_export(self, object): - # TODO(deephaven-core#1791): define and use ExportABC + def new_server_side_reference(self, object): + # TODO(deephaven-core#1791): define and use ReferenceABC raise NotImplementedError def __str__(self): @@ -54,10 +54,6 @@ class ObjectTypeAdapter: def __init__(self, user_object_type): self._user_object_type = user_object_type - @property - def name(self): - return self._user_object_type.name - def is_type(self, object): return self._user_object_type.is_type(object) diff --git a/server/src/main/java/io/deephaven/server/appmode/ApplicationServiceGrpcImpl.java b/server/src/main/java/io/deephaven/server/appmode/ApplicationServiceGrpcImpl.java index 3ec2abc8a9a..d7b0c30a979 100644 --- a/server/src/main/java/io/deephaven/server/appmode/ApplicationServiceGrpcImpl.java +++ b/server/src/main/java/io/deephaven/server/appmode/ApplicationServiceGrpcImpl.java @@ -11,21 +11,21 @@ import io.deephaven.engine.util.ScriptSession; import io.deephaven.extensions.barrage.util.BarrageUtil; import io.deephaven.extensions.barrage.util.GrpcUtil; -import io.deephaven.plugin.type.ObjectTypeLookup; -import io.deephaven.server.session.SessionService; -import io.deephaven.server.session.SessionState; -import io.deephaven.server.util.Scheduler; import io.deephaven.internal.log.LoggerFactory; import io.deephaven.io.logger.Logger; import io.deephaven.plugin.type.ObjectType; +import io.deephaven.plugin.type.ObjectTypeLookup; import io.deephaven.proto.backplane.grpc.ApplicationServiceGrpc; import io.deephaven.proto.backplane.grpc.CustomInfo; import io.deephaven.proto.backplane.grpc.FieldInfo; import io.deephaven.proto.backplane.grpc.FieldInfo.FieldType; import io.deephaven.proto.backplane.grpc.FieldsChangeUpdate; import io.deephaven.proto.backplane.grpc.ListFieldsRequest; +import io.deephaven.proto.backplane.grpc.PluginTypeInfo; import io.deephaven.proto.backplane.grpc.TableInfo; -import io.deephaven.proto.backplane.grpc.UnknownInfo; +import io.deephaven.server.session.SessionService; +import io.deephaven.server.session.SessionState; +import io.deephaven.server.util.Scheduler; import io.deephaven.time.DateTimeUtils; import io.grpc.stub.ServerCallStreamObserver; import io.grpc.stub.StreamObserver; @@ -265,10 +265,8 @@ private static FieldInfo getCustomFieldInfo(final AppFieldId id, final CustomFie return FieldInfo.newBuilder() .setTicket(id.getTicket()) .setFieldName(id.fieldName) - .setFieldType(FieldInfo.FieldType.newBuilder() - .setCustom(CustomInfo.newBuilder() - .setType(field.type()) - .build()) + .setFieldType(FieldType.newBuilder() + .setCustom(CustomInfo.newBuilder().setType(field.type()).build()) .build()) .setFieldDescription(field.description().orElse("")) .setApplicationId(id.applicationId()) @@ -294,7 +292,7 @@ private FieldInfo.FieldType fieldType(final Object object) { return tableFieldType((Table) object); } return objectTypeLookup.findObjectType(object) - .map(ApplicationServiceGrpcImpl::customFieldType) + .map(ApplicationServiceGrpcImpl::pluginType) .orElseGet(ApplicationServiceGrpcImpl::unknownType); } @@ -306,16 +304,14 @@ private static FieldType tableFieldType(Table table) { .build()).build(); } - private static FieldType customFieldType(ObjectType type) { + private static FieldType pluginType(ObjectType type) { return FieldType.newBuilder() - .setCustom(CustomInfo.newBuilder().setType(type.name()).build()) + .setPlugin(PluginTypeInfo.newBuilder().setName(type.name()).build()) .build(); } private static FieldType unknownType() { - return FieldType.newBuilder() - .setUnknown(UnknownInfo.getDefaultInstance()) - .build(); + return FieldType.getDefaultInstance(); } private static class ScopeField implements Field { diff --git a/server/src/main/java/io/deephaven/server/console/ConsoleServiceGrpcImpl.java b/server/src/main/java/io/deephaven/server/console/ConsoleServiceGrpcImpl.java index 1ba95b7bf91..c59c9e3c50e 100644 --- a/server/src/main/java/io/deephaven/server/console/ConsoleServiceGrpcImpl.java +++ b/server/src/main/java/io/deephaven/server/console/ConsoleServiceGrpcImpl.java @@ -4,7 +4,6 @@ package io.deephaven.server.console; -import com.google.protobuf.ByteString; import com.google.protobuf.ByteStringAccess; import com.google.rpc.Code; import io.deephaven.configuration.Configuration; @@ -30,8 +29,8 @@ import io.deephaven.lang.parse.ParsedDocument; import io.deephaven.lang.shared.lsp.CompletionCancelled; import io.deephaven.plot.FigureWidget; -import io.deephaven.plugin.type.Exporter; -import io.deephaven.plugin.type.Exporter.Reference; +import io.deephaven.plugin.type.ObjectType.Exporter; +import io.deephaven.plugin.type.ObjectType.Exporter.Reference; import io.deephaven.plugin.type.ObjectType; import io.deephaven.plugin.type.ObjectTypeLookup; import io.deephaven.proto.backplane.grpc.Ticket; diff --git a/server/src/main/java/io/deephaven/server/object/ObjectServiceGrpcImpl.java b/server/src/main/java/io/deephaven/server/object/ObjectServiceGrpcImpl.java index a8c57fbf44e..7ee294c9640 100644 --- a/server/src/main/java/io/deephaven/server/object/ObjectServiceGrpcImpl.java +++ b/server/src/main/java/io/deephaven/server/object/ObjectServiceGrpcImpl.java @@ -7,8 +7,8 @@ import io.deephaven.extensions.barrage.util.GrpcUtil; import io.deephaven.internal.log.LoggerFactory; import io.deephaven.io.logger.Logger; -import io.deephaven.plugin.type.Exporter; -import io.deephaven.plugin.type.Exporter.Reference; +import io.deephaven.plugin.type.ObjectType.Exporter; +import io.deephaven.plugin.type.ObjectType.Exporter.Reference; import io.deephaven.plugin.type.ObjectType; import io.deephaven.plugin.type.ObjectTypeLookup; import io.deephaven.proto.backplane.grpc.FetchObjectRequest2; diff --git a/server/src/main/java/io/deephaven/server/plugin/What.java b/server/src/main/java/io/deephaven/server/plugin/What.java deleted file mode 100644 index 527353ef226..00000000000 --- a/server/src/main/java/io/deephaven/server/plugin/What.java +++ /dev/null @@ -1,10 +0,0 @@ -package io.deephaven.server.plugin; - -import io.deephaven.proto.backplane.grpc.FieldInfo.FieldType; - -public class What { - public static void main(String[] args) { - - System.out.println(FieldType.getDefaultInstance().getFieldCase()); - } -} diff --git a/server/src/main/java/io/deephaven/server/plugin/python/CallbackAdapter.java b/server/src/main/java/io/deephaven/server/plugin/python/CallbackAdapter.java index 775a36930df..7594f945857 100644 --- a/server/src/main/java/io/deephaven/server/plugin/python/CallbackAdapter.java +++ b/server/src/main/java/io/deephaven/server/plugin/python/CallbackAdapter.java @@ -12,7 +12,7 @@ public CallbackAdapter(PluginCallback callback) { } @SuppressWarnings("unused") - public void registerObjectType(PyObject objectTypeAdapter) { - callback.registerObjectType(new ObjectTypeAdapter(objectTypeAdapter)); + public void registerObjectType(String name, PyObject objectTypeAdapter) { + callback.registerObjectType(new ObjectTypeAdapter(name, objectTypeAdapter)); } } diff --git a/server/src/main/java/io/deephaven/server/plugin/python/ObjectTypeAdapter.java b/server/src/main/java/io/deephaven/server/plugin/python/ObjectTypeAdapter.java index bfff7ec227e..bcdcf3b1bb2 100644 --- a/server/src/main/java/io/deephaven/server/plugin/python/ObjectTypeAdapter.java +++ b/server/src/main/java/io/deephaven/server/plugin/python/ObjectTypeAdapter.java @@ -1,6 +1,5 @@ package io.deephaven.server.plugin.python; -import io.deephaven.plugin.type.Exporter; import io.deephaven.plugin.type.ObjectTypeBase; import org.jpy.PyObject; @@ -10,15 +9,17 @@ final class ObjectTypeAdapter extends ObjectTypeBase implements AutoCloseable { + private final String name; private final PyObject objectTypeAdapter; - public ObjectTypeAdapter(PyObject objectTypeAdapter) { + public ObjectTypeAdapter(String name, PyObject objectTypeAdapter) { + this.name = Objects.requireNonNull(name); this.objectTypeAdapter = Objects.requireNonNull(objectTypeAdapter); } @Override public String name() { - return objectTypeAdapter.getAttribute("name", String.class); + return name; } @Override @@ -30,7 +31,7 @@ public boolean isType(Object object) { } @Override - public void writeToTypeChecked(Exporter exporter, Object object, OutputStream out) throws IOException { + public void writeToCompatibleObject(Exporter exporter, Object object, OutputStream out) throws IOException { final byte[] bytes = objectTypeAdapter.call(byte[].class, "to_bytes", Exporter.class, exporter, PyObject.class, (PyObject) object); From edc061709bcd10ad12aa2949b2068c5dc3da52ce Mon Sep 17 00:00:00 2001 From: Devin Smith Date: Thu, 6 Jan 2022 13:21:55 -0800 Subject: [PATCH 12/62] f --- .../main/proto/deephaven/proto/console.proto | 12 -- .../main/proto/deephaven/proto/object.proto | 2 +- .../console/ConsoleServiceGrpcImpl.java | 116 +----------------- .../server/object/ObjectServiceGrpcImpl.java | 56 ++++++--- 4 files changed, 44 insertions(+), 142 deletions(-) diff --git a/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/console.proto b/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/console.proto index d69a185f728..ddf89b6116a 100644 --- a/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/console.proto +++ b/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/console.proto @@ -48,8 +48,6 @@ service ConsoleService { * Deprecated: TODO(deephaven-core#1784): Remove fetchFigure RPC */ rpc FetchFigure(FetchFigureRequest) returns (FetchFigureResponse) {} - - rpc FetchObject(FetchObjectRequest) returns (FetchObjectResponse) {} } @@ -226,16 +224,6 @@ message FetchFigureResponse { FigureDescriptor figure_descriptor = 1; } -message FetchObjectRequest { - io.deephaven.proto.backplane.grpc.Ticket source_id = 1; -} - -message FetchObjectResponse { - string type = 1; - bytes data = 2; - repeated io.deephaven.proto.backplane.grpc.Ticket export_id = 3; -} - message FigureDescriptor { optional string title = 1; string title_font = 2; diff --git a/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/object.proto b/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/object.proto index a20b21f2370..4d633038a9b 100644 --- a/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/object.proto +++ b/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/object.proto @@ -13,7 +13,7 @@ import "deephaven/proto/ticket.proto"; /* * Object service -*/ + */ service ObjectService { rpc FetchObject2(FetchObjectRequest2) returns (FetchObjectResponse2) {} } diff --git a/server/src/main/java/io/deephaven/server/console/ConsoleServiceGrpcImpl.java b/server/src/main/java/io/deephaven/server/console/ConsoleServiceGrpcImpl.java index c59c9e3c50e..71e470c7d88 100644 --- a/server/src/main/java/io/deephaven/server/console/ConsoleServiceGrpcImpl.java +++ b/server/src/main/java/io/deephaven/server/console/ConsoleServiceGrpcImpl.java @@ -4,7 +4,6 @@ package io.deephaven.server.console; -import com.google.protobuf.ByteStringAccess; import com.google.rpc.Code; import io.deephaven.configuration.Configuration; import io.deephaven.engine.table.Table; @@ -14,7 +13,6 @@ import io.deephaven.engine.util.ScriptSession; import io.deephaven.engine.util.VariableProvider; import io.deephaven.engine.util.jpy.JpyInit; -import io.deephaven.extensions.barrage.util.BarrageProtoUtil.ExposedByteArrayOutputStream; import io.deephaven.extensions.barrage.util.GrpcUtil; import io.deephaven.figure.FigureWidgetTranslator; import io.deephaven.internal.log.LoggerFactory; @@ -29,10 +27,6 @@ import io.deephaven.lang.parse.ParsedDocument; import io.deephaven.lang.shared.lsp.CompletionCancelled; import io.deephaven.plot.FigureWidget; -import io.deephaven.plugin.type.ObjectType.Exporter; -import io.deephaven.plugin.type.ObjectType.Exporter.Reference; -import io.deephaven.plugin.type.ObjectType; -import io.deephaven.plugin.type.ObjectTypeLookup; import io.deephaven.proto.backplane.grpc.Ticket; import io.deephaven.proto.backplane.script.grpc.AutoCompleteRequest; import io.deephaven.proto.backplane.script.grpc.AutoCompleteResponse; @@ -48,9 +42,6 @@ import io.deephaven.proto.backplane.script.grpc.ExecuteCommandResponse; import io.deephaven.proto.backplane.script.grpc.FetchFigureRequest; import io.deephaven.proto.backplane.script.grpc.FetchFigureResponse; -import io.deephaven.proto.backplane.script.grpc.FetchObjectRequest; -import io.deephaven.proto.backplane.script.grpc.FetchObjectResponse; -import io.deephaven.proto.backplane.script.grpc.FetchObjectResponse.Builder; import io.deephaven.proto.backplane.script.grpc.FigureDescriptor; import io.deephaven.proto.backplane.script.grpc.GetCompletionItemsRequest; import io.deephaven.proto.backplane.script.grpc.GetCompletionItemsResponse; @@ -63,11 +54,11 @@ import io.deephaven.proto.backplane.script.grpc.TextDocumentItem; import io.deephaven.proto.backplane.script.grpc.VariableDefinition; import io.deephaven.proto.backplane.script.grpc.VersionedTextDocumentIdentifier; +import io.deephaven.server.object.ObjectServiceGrpcImpl.ExportCollector; import io.deephaven.server.session.SessionCloseableObserver; import io.deephaven.server.session.SessionService; import io.deephaven.server.session.SessionState; import io.deephaven.server.session.SessionState.ExportBuilder; -import io.deephaven.server.session.SessionState.ExportObject; import io.deephaven.server.session.TicketRouter; import io.grpc.stub.StreamObserver; @@ -75,11 +66,8 @@ import javax.inject.Provider; import javax.inject.Singleton; import java.io.IOException; -import java.util.ArrayList; import java.util.Collection; -import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.TimeoutException; import java.util.stream.Collectors; @@ -111,21 +99,17 @@ public static boolean isPythonSession() { private final GlobalSessionProvider globalSessionProvider; - private final ObjectTypeLookup objectTypeLookup; - @Inject public ConsoleServiceGrpcImpl(final Map> scriptTypes, final TicketRouter ticketRouter, final SessionService sessionService, final LogBuffer logBuffer, - final GlobalSessionProvider globalSessionProvider, - final ObjectTypeLookup objectTypeLookup) { + final GlobalSessionProvider globalSessionProvider) { this.scriptTypes = scriptTypes; this.ticketRouter = ticketRouter; this.sessionService = sessionService; this.logBuffer = logBuffer; this.globalSessionProvider = globalSessionProvider; - this.objectTypeLookup = objectTypeLookup; if (!scriptTypes.containsKey(WORKER_CONSOLE_TYPE)) { throw new IllegalArgumentException("Console type not found: " + WORKER_CONSOLE_TYPE); } @@ -461,62 +445,6 @@ public void fetchFigure(FetchFigureRequest request, StreamObserver responseObserver) { - GrpcUtil.rpcWrapper(log, responseObserver, () -> { - final SessionState session = sessionService.getCurrentSession(); - if (request.getSourceId().getTicket().isEmpty()) { - throw GrpcUtil.statusRuntimeException(Code.FAILED_PRECONDITION, "No sourceId supplied"); - } - final SessionState.ExportObject object = ticketRouter.resolve( - session, request.getSourceId(), "sourceId"); - session.nonExport() - .require(object) - .onError(responseObserver) - .submit(() -> { - final Object o = object.get(); - final FetchObjectResponse response = serialize(session, o); - responseObserver.onNext(response); - responseObserver.onCompleted(); - return null; - }); - }); - } - - private FetchObjectResponse serialize(SessionState state, Object object) throws IOException { - final ExposedByteArrayOutputStream out = new ExposedByteArrayOutputStream(); - final ObjectType type = objectTypeLookup.findObjectType(object).orElseThrow(() -> noTypeException(object)); - final ExportCollector exportCollector = new ExportCollector(state); - try { - type.writeTo(exportCollector, object, out); - final Builder builder = FetchObjectResponse.newBuilder() - .setType(type.name()) - .setData(ByteStringAccess.wrap(out.peekBuffer(), 0, out.size()));; - for (ExportObject export : exportCollector.exports()) { - builder.addExportId(export.getExportId()); - } - return builder.build(); - } catch (Throwable t) { - cleanup(exportCollector, t); - throw t; - } - } - - private static void cleanup(ExportCollector exportCollector, Throwable t) { - for (ExportObject export : exportCollector.exports()) { - try { - export.release(); - } catch (Throwable inner) { - t.addSuppressed(inner); - } - } - } - - private static IllegalArgumentException noTypeException(Object o) { - return new IllegalArgumentException( - "No type registered for object class=" + o.getClass().getName() + ", value=" + o); - } - private static class LogBufferStreamAdapter extends SessionCloseableObserver implements LogBufferRecordListener { private final LogSubscriptionRequest request; @@ -562,44 +490,4 @@ public void record(LogBufferRecord record) { } } } - - private static final class ExportCollector implements Exporter { - - private final SessionState sessionState; - private final Thread thread; - private final List> exports; - - public ExportCollector(SessionState sessionState) { - this.sessionState = Objects.requireNonNull(sessionState); - this.thread = Thread.currentThread(); - this.exports = new ArrayList<>(); - } - - public List> exports() { - return exports; - } - - @Override - public Reference newServerSideReference(Object object) { - if (thread != Thread.currentThread()) { - throw new IllegalStateException("Should only create exports on the calling thread"); - } - final ExportObject exportObject = sessionState.newServerSideExport(object); - exports.add(exportObject); - return new ReferenceImpl(exportObject); - } - } - - private static final class ReferenceImpl implements Reference { - private final ExportObject export; - - public ReferenceImpl(ExportObject export) { - this.export = Objects.requireNonNull(export); - } - - @Override - public Ticket id() { - return export.getExportId(); - } - } } diff --git a/server/src/main/java/io/deephaven/server/object/ObjectServiceGrpcImpl.java b/server/src/main/java/io/deephaven/server/object/ObjectServiceGrpcImpl.java index 7ee294c9640..dd8223de00f 100644 --- a/server/src/main/java/io/deephaven/server/object/ObjectServiceGrpcImpl.java +++ b/server/src/main/java/io/deephaven/server/object/ObjectServiceGrpcImpl.java @@ -1,15 +1,14 @@ package io.deephaven.server.object; -import com.google.protobuf.ByteString; import com.google.protobuf.ByteStringAccess; import com.google.rpc.Code; import io.deephaven.extensions.barrage.util.BarrageProtoUtil.ExposedByteArrayOutputStream; import io.deephaven.extensions.barrage.util.GrpcUtil; import io.deephaven.internal.log.LoggerFactory; import io.deephaven.io.logger.Logger; +import io.deephaven.plugin.type.ObjectType; import io.deephaven.plugin.type.ObjectType.Exporter; import io.deephaven.plugin.type.ObjectType.Exporter.Reference; -import io.deephaven.plugin.type.ObjectType; import io.deephaven.plugin.type.ObjectTypeLookup; import io.deephaven.proto.backplane.grpc.FetchObjectRequest2; import io.deephaven.proto.backplane.grpc.FetchObjectResponse2; @@ -24,6 +23,8 @@ import javax.inject.Inject; import java.io.IOException; +import java.util.ArrayList; +import java.util.List; import java.util.Objects; public class ObjectServiceGrpcImpl extends ObjectServiceGrpc.ObjectServiceImplBase { @@ -66,11 +67,30 @@ public void fetchObject2(FetchObjectRequest2 request, StreamObserver noTypeException(object)); - final Builder builder = FetchObjectResponse2.newBuilder().setType(type.name()); - final ExportCollector exportCollector = new ExportCollector(state, builder); - type.writeTo(exportCollector, object, out); - final ByteString data = ByteStringAccess.wrap(out.peekBuffer(), 0, out.size()); - return builder.setData(data).build(); + final ExportCollector exportCollector = new ExportCollector(state); + try { + type.writeTo(exportCollector, object, out); + final Builder builder = FetchObjectResponse2.newBuilder() + .setType(type.name()) + .setData(ByteStringAccess.wrap(out.peekBuffer(), 0, out.size()));; + for (ExportObject export : exportCollector.exports()) { + builder.addExportId(export.getExportId()); + } + return builder.build(); + } catch (Throwable t) { + cleanup(exportCollector, t); + throw t; + } + } + + private static void cleanup(ExportCollector exportCollector, Throwable t) { + for (ExportObject export : exportCollector.exports()) { + try { + export.release(); + } catch (Throwable inner) { + t.addSuppressed(inner); + } + } } private static IllegalArgumentException noTypeException(Object o) { @@ -78,16 +98,22 @@ private static IllegalArgumentException noTypeException(Object o) { "No type registered for object class=" + o.getClass().getName() + ", value=" + o); } - private static final class ExportCollector implements Exporter { + // Make private after + // TODO(deephaven-core#1784): Remove fetchFigure RPC + public static final class ExportCollector implements Exporter { private final SessionState sessionState; - private final Builder builder; private final Thread thread; + private final List> exports; - public ExportCollector(SessionState sessionState, Builder builder) { + public ExportCollector(SessionState sessionState) { this.sessionState = Objects.requireNonNull(sessionState); - this.builder = Objects.requireNonNull(builder); this.thread = Thread.currentThread(); + this.exports = new ArrayList<>(); + } + + public List> exports() { + return exports; } @Override @@ -96,15 +122,15 @@ public Reference newServerSideReference(Object object) { throw new IllegalStateException("Should only create exports on the calling thread"); } final ExportObject exportObject = sessionState.newServerSideExport(object); - builder.addExportId(exportObject.getExportId()); - return new ExportImpl(exportObject); + exports.add(exportObject); + return new ReferenceImpl(exportObject); } } - private static final class ExportImpl implements Reference { + private static final class ReferenceImpl implements Reference { private final ExportObject export; - public ExportImpl(ExportObject export) { + public ReferenceImpl(ExportObject export) { this.export = Objects.requireNonNull(export); } From 781cbf2d62250a21209fe0445e86ff3d94e67c7a Mon Sep 17 00:00:00 2001 From: Devin Smith Date: Thu, 6 Jan 2022 13:29:28 -0800 Subject: [PATCH 13/62] Stuff --- build.gradle | 2 +- .../io/deephaven/client/impl/SessionImpl.java | 14 ++++----- .../java/io/deephaven/plugin/PluginBase.java | 2 +- .../io/deephaven/plugin/type/ObjectType.java | 25 ++++++++++------ .../plugin/type/ObjectTypeClassBase.java | 29 +++++-------------- .../proto/deephaven/proto/application.proto | 2 +- .../main/proto/deephaven/proto/object.proto | 9 ++---- server/build.gradle | 2 +- .../server/object/ObjectServiceGrpcImpl.java | 16 +++++----- .../server/plugin/PluginsAutoDiscovery.java | 1 + .../server/plugin/type/ObjectTypes.java | 25 ++++++++++------ settings.gradle | 4 ++- 12 files changed, 66 insertions(+), 65 deletions(-) diff --git a/build.gradle b/build.gradle index b57de36138b..86d11c6b992 100644 --- a/build.gradle +++ b/build.gradle @@ -398,7 +398,7 @@ tasks.register 'allJavadoc', Javadoc, { ':extensions-kafka', ':extensions-parquet-table', ':plugin', - ':plugin:figure', + ':plugin-figure', ':Util', ':ModelFarm', ':Numerics', diff --git a/java-client/session/src/main/java/io/deephaven/client/impl/SessionImpl.java b/java-client/session/src/main/java/io/deephaven/client/impl/SessionImpl.java index 541145554b0..de9f5444871 100644 --- a/java-client/session/src/main/java/io/deephaven/client/impl/SessionImpl.java +++ b/java-client/session/src/main/java/io/deephaven/client/impl/SessionImpl.java @@ -9,8 +9,8 @@ import io.deephaven.proto.backplane.grpc.CloseSessionResponse; import io.deephaven.proto.backplane.grpc.DeleteTableRequest; import io.deephaven.proto.backplane.grpc.DeleteTableResponse; -import io.deephaven.proto.backplane.grpc.FetchObjectRequest2; -import io.deephaven.proto.backplane.grpc.FetchObjectResponse2; +import io.deephaven.proto.backplane.grpc.FetchObjectRequest; +import io.deephaven.proto.backplane.grpc.FetchObjectResponse; import io.deephaven.proto.backplane.grpc.FieldsChangeUpdate; import io.deephaven.proto.backplane.grpc.HandshakeRequest; import io.deephaven.proto.backplane.grpc.HandshakeResponse; @@ -255,11 +255,11 @@ public CompletableFuture publish(String name, HasTicketId ticketId) { @Override public CompletableFuture fetchObject(HasTicketId ticketId) { - final FetchObjectRequest2 request = FetchObjectRequest2.newBuilder() + final FetchObjectRequest request = FetchObjectRequest.newBuilder() .setSourceId(ticketId.ticketId().ticket()) .build(); final FetchObserver observer = new FetchObserver(); - objectService.fetchObject2(request, observer); + objectService.fetchObject(request, observer); return observer.future; } @@ -414,11 +414,11 @@ public void onCompleted() { } private static final class FetchObserver - implements ClientResponseObserver { + implements ClientResponseObserver { private final CompletableFuture future = new CompletableFuture<>(); @Override - public void beforeStart(ClientCallStreamObserver requestStream) { + public void beforeStart(ClientCallStreamObserver requestStream) { future.whenComplete((session, throwable) -> { if (future.isCancelled()) { requestStream.cancel("User cancelled", null); @@ -427,7 +427,7 @@ public void beforeStart(ClientCallStreamObserver requestStr } @Override - public void onNext(FetchObjectResponse2 value) { + public void onNext(FetchObjectResponse value) { final String type = value.getType(); final ByteString data = value.getData(); final List exportIds = value.getExportIdList().stream() diff --git a/plugin/src/main/java/io/deephaven/plugin/PluginBase.java b/plugin/src/main/java/io/deephaven/plugin/PluginBase.java index 3f6c79c25f4..60b5a4a7593 100644 --- a/plugin/src/main/java/io/deephaven/plugin/PluginBase.java +++ b/plugin/src/main/java/io/deephaven/plugin/PluginBase.java @@ -14,6 +14,6 @@ public final void registerInto(PluginCallback callback) { @Override public void registerInto(ObjectTypeCallback callback) { - + // override as necessary } } diff --git a/plugin/src/main/java/io/deephaven/plugin/type/ObjectType.java b/plugin/src/main/java/io/deephaven/plugin/type/ObjectType.java index ae3bf73e882..cf2dcaa88cb 100644 --- a/plugin/src/main/java/io/deephaven/plugin/type/ObjectType.java +++ b/plugin/src/main/java/io/deephaven/plugin/type/ObjectType.java @@ -7,7 +7,7 @@ import java.io.OutputStream; /** - * An "object type" plugin object. Useful for serializing custom objects between the server / client. + * An "object type" plugin information. Useful for serializing custom objects between the server / client. * * @see ObjectTypePlugin */ @@ -29,10 +29,10 @@ public interface ObjectType { boolean isType(Object object); /** - * Serializes {@code object} into {@code out}. Must only be called with compatible objects, see - * {@link #isType(Object)}. If the serialized {@code object} references another server side object(s), the other - * server side object(s) should be referenced with the {@code exporter}, and the {@link Reference#id()} serialized - * as appropriate. + * Serializes {@code object} into {@code out}. Must only be called with a compatible object, see + * {@link #isType(Object)}. If the {@code object} references another server side object(s), the other server side + * object(s) should be referenced with the {@code exporter}, and the {@link Reference#id()} serialized as + * appropriate. * *

* Note: the implementation should not hold onto references nor create references outside the calling thread. @@ -44,10 +44,13 @@ public interface ObjectType { */ void writeTo(Exporter exporter, Object object, OutputStream out) throws IOException; + /** + * The interface for objects to describe their relationship to other objects. + */ interface Exporter { /** - * Create a new server side reference in anticipation of serialization. + * Create a new server side reference. * * @param object the object * @return the reference @@ -55,11 +58,15 @@ interface Exporter { Reference newServerSideReference(Object object); /** - * - * - * TODO: management + * A reference. */ interface Reference { + + /** + * The ticket id, should be used in the serialized representation for the object. + * + * @return the id + */ Ticket id(); } } diff --git a/plugin/src/main/java/io/deephaven/plugin/type/ObjectTypeClassBase.java b/plugin/src/main/java/io/deephaven/plugin/type/ObjectTypeClassBase.java index 6be61d19830..4a56b66fc7d 100644 --- a/plugin/src/main/java/io/deephaven/plugin/type/ObjectTypeClassBase.java +++ b/plugin/src/main/java/io/deephaven/plugin/type/ObjectTypeClassBase.java @@ -4,6 +4,11 @@ import java.io.OutputStream; import java.util.Objects; +/** + * An implementation that uses strict {@link Class} equality for the {@link #isType(Object)} check. + * + * @param the class type + */ public abstract class ObjectTypeClassBase extends ObjectTypeBase { private final String name; private final Class clazz; @@ -26,31 +31,13 @@ public final String name() { @Override public final boolean isType(Object object) { - return clazz.isInstance(object); + return clazz.equals(object.getClass()); } @Override public final void writeToCompatibleObject(Exporter exporter, Object object, OutputStream out) throws IOException { - writeToImpl(exporter, clazz.cast(object), out); - } - - @Override - public boolean equals(Object o) { - if (this == o) - return true; - if (o == null || getClass() != o.getClass()) - return false; - ObjectTypeClassBase that = (ObjectTypeClassBase) o; - if (!name.equals(that.name)) - return false; - return clazz.equals(that.clazz); - } - - @Override - public int hashCode() { - int result = name.hashCode(); - result = 31 * result + clazz.hashCode(); - return result; + // noinspection unchecked + writeToImpl(exporter, (T) clazz, out); } @Override diff --git a/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/application.proto b/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/application.proto index f345fd3b2c1..74e4188bf08 100644 --- a/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/application.proto +++ b/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/application.proto @@ -80,7 +80,7 @@ message CustomInfo { } /* - * io.deephaven.plugin.type.ObjectType + * Plugin object type information, as installed from io.deephaven.plugin.type.ObjectTypePlugin */ message PluginTypeInfo { string name = 1; diff --git a/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/object.proto b/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/object.proto index 4d633038a9b..aa5b2746c52 100644 --- a/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/object.proto +++ b/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/object.proto @@ -11,18 +11,15 @@ option optimize_for = SPEED; import "deephaven/proto/ticket.proto"; -/* - * Object service - */ service ObjectService { - rpc FetchObject2(FetchObjectRequest2) returns (FetchObjectResponse2) {} + rpc FetchObject(FetchObjectRequest) returns (FetchObjectResponse) {} } -message FetchObjectRequest2 { +message FetchObjectRequest { io.deephaven.proto.backplane.grpc.Ticket source_id = 1; } -message FetchObjectResponse2 { +message FetchObjectResponse { string type = 1; bytes data = 2; repeated io.deephaven.proto.backplane.grpc.Ticket export_id = 3; diff --git a/server/build.gradle b/server/build.gradle index a156009127c..f5f7067f709 100644 --- a/server/build.gradle +++ b/server/build.gradle @@ -41,7 +41,7 @@ dependencies { // TODO(deephaven-core#1784): Remove fetchFigure RPC // this can be runtimeOnly only after #1784 - implementation project(':plugin:figure') + implementation project(':plugin-figure') Classpaths.inheritGrpcPlatform(project, 'api') diff --git a/server/src/main/java/io/deephaven/server/object/ObjectServiceGrpcImpl.java b/server/src/main/java/io/deephaven/server/object/ObjectServiceGrpcImpl.java index dd8223de00f..64fa3525dcb 100644 --- a/server/src/main/java/io/deephaven/server/object/ObjectServiceGrpcImpl.java +++ b/server/src/main/java/io/deephaven/server/object/ObjectServiceGrpcImpl.java @@ -10,9 +10,9 @@ import io.deephaven.plugin.type.ObjectType.Exporter; import io.deephaven.plugin.type.ObjectType.Exporter.Reference; import io.deephaven.plugin.type.ObjectTypeLookup; -import io.deephaven.proto.backplane.grpc.FetchObjectRequest2; -import io.deephaven.proto.backplane.grpc.FetchObjectResponse2; -import io.deephaven.proto.backplane.grpc.FetchObjectResponse2.Builder; +import io.deephaven.proto.backplane.grpc.FetchObjectRequest; +import io.deephaven.proto.backplane.grpc.FetchObjectResponse; +import io.deephaven.proto.backplane.grpc.FetchObjectResponse.Builder; import io.deephaven.proto.backplane.grpc.ObjectServiceGrpc; import io.deephaven.proto.backplane.grpc.Ticket; import io.deephaven.server.session.SessionService; @@ -43,7 +43,7 @@ public ObjectServiceGrpcImpl(SessionService sessionService, TicketRouter ticketR } @Override - public void fetchObject2(FetchObjectRequest2 request, StreamObserver responseObserver) { + public void fetchObject(FetchObjectRequest request, StreamObserver responseObserver) { GrpcUtil.rpcWrapper(log, responseObserver, () -> { final SessionState session = sessionService.getCurrentSession(); if (request.getSourceId().getTicket().isEmpty()) { @@ -56,7 +56,7 @@ public void fetchObject2(FetchObjectRequest2 request, StreamObserver { final Object o = object.get(); - final FetchObjectResponse2 response = serialize(session, o); + final FetchObjectResponse response = serialize(session, o); responseObserver.onNext(response); responseObserver.onCompleted(); return null; @@ -64,13 +64,13 @@ public void fetchObject2(FetchObjectRequest2 request, StreamObserver noTypeException(object)); final ExportCollector exportCollector = new ExportCollector(state); try { type.writeTo(exportCollector, object, out); - final Builder builder = FetchObjectResponse2.newBuilder() + final Builder builder = FetchObjectResponse.newBuilder() .setType(type.name()) .setData(ByteStringAccess.wrap(out.peekBuffer(), 0, out.size()));; for (ExportObject export : exportCollector.exports()) { @@ -119,7 +119,7 @@ public List> exports() { @Override public Reference newServerSideReference(Object object) { if (thread != Thread.currentThread()) { - throw new IllegalStateException("Should only create exports on the calling thread"); + throw new IllegalStateException("Should only create new references on the calling thread"); } final ExportObject exportObject = sessionState.newServerSideExport(object); exports.add(exportObject); diff --git a/server/src/main/java/io/deephaven/server/plugin/PluginsAutoDiscovery.java b/server/src/main/java/io/deephaven/server/plugin/PluginsAutoDiscovery.java index a4221a62831..8f4a44907e9 100644 --- a/server/src/main/java/io/deephaven/server/plugin/PluginsAutoDiscovery.java +++ b/server/src/main/java/io/deephaven/server/plugin/PluginsAutoDiscovery.java @@ -35,6 +35,7 @@ public PluginsAutoDiscovery(ObjectTypeCallback types) { */ public void registerAll() { log.info().append("Registering plugins...").endl(); + // TODO(deephaven-core#1810): Use service loader to abstract the different plugin auto-discovery methods final Counting serviceLoaderCount = new Counting(); JavaServiceLoader.allRegisterInto(serviceLoaderCount); final Counting pythonModuleCount = new Counting(); diff --git a/server/src/main/java/io/deephaven/server/plugin/type/ObjectTypes.java b/server/src/main/java/io/deephaven/server/plugin/type/ObjectTypes.java index 75ff4b5e820..e4bab851520 100644 --- a/server/src/main/java/io/deephaven/server/plugin/type/ObjectTypes.java +++ b/server/src/main/java/io/deephaven/server/plugin/type/ObjectTypes.java @@ -7,10 +7,12 @@ import javax.inject.Inject; import javax.inject.Singleton; +import javax.lang.model.SourceVersion; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.Optional; import java.util.Set; @@ -25,15 +27,15 @@ @Singleton public final class ObjectTypes implements ObjectTypeLookup, ObjectTypeCallback { - private static final Set RESERVED_TYPE_NAMES = Set.of("Table", "TableMap", "TreeTable"); + private static final Set RESERVED_TYPE_NAMES_LOWERCASE = Set.of("table", "tablemap", "treetable", ""); - private final Set names; + private final Set namesLowercase; private final Map, ObjectType> classTypes; private final List otherTypes; @Inject public ObjectTypes() { - names = new HashSet<>(); + namesLowercase = new HashSet<>(); classTypes = new HashMap<>(); otherTypes = new ArrayList<>(); } @@ -54,12 +56,17 @@ public synchronized Optional findObjectType(Object object) { @Override public synchronized void registerObjectType(ObjectType objectType) { - if (isReservedName(objectType.name())) { - throw new IllegalArgumentException("Unable to register type, name is reserved: " + objectType.name()); + final String name = objectType.name(); + final String nameLowercase = name.toLowerCase(Locale.ENGLISH); + if (SourceVersion.isKeyword(nameLowercase)) { + throw new IllegalArgumentException("Unable to register type, name is keyword: " + name); } - if (names.contains(objectType.name())) { + if (isReservedName(nameLowercase)) { + throw new IllegalArgumentException("Unable to register type, name is reserved: " + name); + } + if (namesLowercase.contains(nameLowercase)) { throw new IllegalArgumentException( - "Unable to register type, type name already registered: " + objectType.name()); + "Unable to register type, type name already registered: " + name); } if (objectType instanceof ObjectTypeClassBase) { final Class clazz = ((ObjectTypeClassBase) objectType).clazz(); @@ -69,10 +76,10 @@ public synchronized void registerObjectType(ObjectType objectType) { } else { otherTypes.add(objectType); } - names.add(objectType.name()); + namesLowercase.add(nameLowercase); } private static boolean isReservedName(String name) { - return RESERVED_TYPE_NAMES.contains(name); + return RESERVED_TYPE_NAMES_LOWERCASE.contains(name); } } diff --git a/settings.gradle b/settings.gradle index a3ddce0f14f..29a96f7f4b3 100644 --- a/settings.gradle +++ b/settings.gradle @@ -212,7 +212,9 @@ include(':extensions-suanshu') project(':extensions-suanshu').projectDir = file('extensions/suanshu') include(':plugin') -include(':plugin:figure') + +include(':plugin-figure') +project(':plugin-figure').projectDir = file('plugin/figure') include(':envoy') From 9de9a46dcf84757aebdedf7dcdaac879f456b1b6 Mon Sep 17 00:00:00 2001 From: Devin Smith Date: Thu, 6 Jan 2022 14:30:14 -0800 Subject: [PATCH 14/62] remove test from dockerfile --- docker/server/src/main/docker/Dockerfile | 6 ------ 1 file changed, 6 deletions(-) diff --git a/docker/server/src/main/docker/Dockerfile b/docker/server/src/main/docker/Dockerfile index ba65b3aea6e..7a3aaa67914 100644 --- a/docker/server/src/main/docker/Dockerfile +++ b/docker/server/src/main/docker/Dockerfile @@ -1,12 +1,6 @@ ARG BASE FROM $BASE as install -# To test out the deephaven-plugin-matplotlib, uncomment the following: -RUN set -eux; \ - python3 -m pip install -q --no-cache-dir \ - importlib-metadata \ - https://github.com/deephaven/deephaven-plugin-matplotlib/releases/download/v0.0.1.dev2/deephaven_plugin_matplotlib-0.0.1.dev2-py3-none-any.whl - COPY licenses/ / # Note: all of the pip installs have the --no-index flag, with the expectation that all external dependencies are From 44bec3bf97f0392650816314aa7b7b2d576ff4d8 Mon Sep 17 00:00:00 2001 From: Devin Smith Date: Fri, 7 Jan 2022 08:44:10 -0800 Subject: [PATCH 15/62] wrong cast --- .../main/java/io/deephaven/plugin/type/ObjectTypeClassBase.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugin/src/main/java/io/deephaven/plugin/type/ObjectTypeClassBase.java b/plugin/src/main/java/io/deephaven/plugin/type/ObjectTypeClassBase.java index 4a56b66fc7d..ba165af0481 100644 --- a/plugin/src/main/java/io/deephaven/plugin/type/ObjectTypeClassBase.java +++ b/plugin/src/main/java/io/deephaven/plugin/type/ObjectTypeClassBase.java @@ -37,7 +37,7 @@ public final boolean isType(Object object) { @Override public final void writeToCompatibleObject(Exporter exporter, Object object, OutputStream out) throws IOException { // noinspection unchecked - writeToImpl(exporter, (T) clazz, out); + writeToImpl(exporter, (T) object, out); } @Override From 18b66c1b4771552082da77cf91fb47f5df913173 Mon Sep 17 00:00:00 2001 From: Devin Smith Date: Fri, 7 Jan 2022 08:53:11 -0800 Subject: [PATCH 16/62] Revert "remove test from dockerfile" This reverts commit 9de9a46dcf84757aebdedf7dcdaac879f456b1b6. --- docker/server/src/main/docker/Dockerfile | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docker/server/src/main/docker/Dockerfile b/docker/server/src/main/docker/Dockerfile index 7a3aaa67914..ba65b3aea6e 100644 --- a/docker/server/src/main/docker/Dockerfile +++ b/docker/server/src/main/docker/Dockerfile @@ -1,6 +1,12 @@ ARG BASE FROM $BASE as install +# To test out the deephaven-plugin-matplotlib, uncomment the following: +RUN set -eux; \ + python3 -m pip install -q --no-cache-dir \ + importlib-metadata \ + https://github.com/deephaven/deephaven-plugin-matplotlib/releases/download/v0.0.1.dev2/deephaven_plugin_matplotlib-0.0.1.dev2-py3-none-any.whl + COPY licenses/ / # Note: all of the pip installs have the --no-index flag, with the expectation that all external dependencies are From a2dc389ff534b9fa557b571fb1f76ffe81b90ad7 Mon Sep 17 00:00:00 2001 From: Devin Smith Date: Fri, 7 Jan 2022 11:47:28 -0800 Subject: [PATCH 17/62] Add ObjectServiceTest --- .../io/deephaven/proto/DeephavenChannel.java | 10 ++ server/build.gradle | 2 + .../server/runner/DeephavenApiServer.java | 8 ++ .../server/object/ObjectServiceTest.java | 119 ++++++++++++++++++ ...havenApiServerSingleAuthenticatedBase.java | 17 ++- ...venApiServerSingleUnauthenticatedBase.java | 2 +- .../runner/DeephavenApiServerTestBase.java | 6 +- .../services/io.deephaven.plugin.Plugin | 1 + 8 files changed, 160 insertions(+), 5 deletions(-) create mode 100644 server/src/test/java/io/deephaven/server/object/ObjectServiceTest.java create mode 100644 server/src/test/resources/META-INF/services/io.deephaven.plugin.Plugin diff --git a/proto/proto-backplane-grpc/src/main/java/io/deephaven/proto/DeephavenChannel.java b/proto/proto-backplane-grpc/src/main/java/io/deephaven/proto/DeephavenChannel.java index d7bfa32e98c..4b39e907075 100644 --- a/proto/proto-backplane-grpc/src/main/java/io/deephaven/proto/DeephavenChannel.java +++ b/proto/proto-backplane-grpc/src/main/java/io/deephaven/proto/DeephavenChannel.java @@ -9,6 +9,8 @@ import io.deephaven.proto.backplane.grpc.InputTableServiceGrpc.InputTableServiceFutureStub; import io.deephaven.proto.backplane.grpc.InputTableServiceGrpc.InputTableServiceStub; import io.deephaven.proto.backplane.grpc.ObjectServiceGrpc; +import io.deephaven.proto.backplane.grpc.ObjectServiceGrpc.ObjectServiceBlockingStub; +import io.deephaven.proto.backplane.grpc.ObjectServiceGrpc.ObjectServiceFutureStub; import io.deephaven.proto.backplane.grpc.ObjectServiceGrpc.ObjectServiceStub; import io.deephaven.proto.backplane.grpc.SessionServiceGrpc; import io.deephaven.proto.backplane.grpc.SessionServiceGrpc.SessionServiceBlockingStub; @@ -78,6 +80,10 @@ public ConsoleServiceBlockingStub consoleBlocking() { return ConsoleServiceGrpc.newBlockingStub(channel); } + public ObjectServiceBlockingStub objectBlocking() { + return ObjectServiceGrpc.newBlockingStub(channel); + } + public ApplicationServiceBlockingStub applicationBlocking() { return ApplicationServiceGrpc.newBlockingStub(channel); } @@ -98,6 +104,10 @@ public ConsoleServiceFutureStub consoleFuture() { return ConsoleServiceGrpc.newFutureStub(channel); } + public ObjectServiceFutureStub objectFuture() { + return ObjectServiceGrpc.newFutureStub(channel); + } + public ApplicationServiceFutureStub applicationFuture() { return ApplicationServiceGrpc.newFutureStub(channel); } diff --git a/server/build.gradle b/server/build.gradle index f5f7067f709..6b88551a300 100644 --- a/server/build.gradle +++ b/server/build.gradle @@ -61,3 +61,5 @@ dependencies { testRuntimeOnly project(':log-to-slf4j') Classpaths.inheritSlf4j(project, 'slf4j-simple', 'testRuntimeOnly') } + +test.systemProperty 'deephaven.console.type', 'groovy' diff --git a/server/src/main/java/io/deephaven/server/runner/DeephavenApiServer.java b/server/src/main/java/io/deephaven/server/runner/DeephavenApiServer.java index 80cbe0f3521..47179b40d13 100644 --- a/server/src/main/java/io/deephaven/server/runner/DeephavenApiServer.java +++ b/server/src/main/java/io/deephaven/server/runner/DeephavenApiServer.java @@ -66,6 +66,12 @@ public GrpcServer server() { return server; } + @VisibleForTesting + SessionService sessionService() { + return sessionService; + } + + /** * Starts the various server components, and blocks until the gRPC server has shut down. That shutdown is mediated * by the ShutdownManager, and will call the gRPC server to shut it down when the process is itself shutting down. @@ -128,6 +134,8 @@ public void run() throws IOException, ClassNotFoundException, InterruptedExcepti } void startForUnitTests() throws Exception { + pluginsAutoDiscovery.registerAll(); + log.info().append("Starting server...").endl(); server.start(); } diff --git a/server/src/test/java/io/deephaven/server/object/ObjectServiceTest.java b/server/src/test/java/io/deephaven/server/object/ObjectServiceTest.java new file mode 100644 index 00000000000..89c8b627359 --- /dev/null +++ b/server/src/test/java/io/deephaven/server/object/ObjectServiceTest.java @@ -0,0 +1,119 @@ +package io.deephaven.server.object; + +import io.deephaven.engine.table.Table; +import io.deephaven.engine.util.TableTools; +import io.deephaven.plugin.PluginBase; +import io.deephaven.plugin.type.ObjectType.Exporter.Reference; +import io.deephaven.plugin.type.ObjectTypeCallback; +import io.deephaven.plugin.type.ObjectTypeClassBase; +import io.deephaven.proto.backplane.grpc.FetchObjectRequest; +import io.deephaven.proto.backplane.grpc.FetchObjectResponse; +import io.deephaven.proto.backplane.grpc.Ticket; +import io.deephaven.server.runner.DeephavenApiServerSingleAuthenticatedBase; +import io.deephaven.server.session.SessionState.ExportObject; +import io.grpc.StatusRuntimeException; +import org.junit.Test; + +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.IOException; +import java.io.OutputStream; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.failBecauseExceptionWasNotThrown; + +public class ObjectServiceTest extends DeephavenApiServerSingleAuthenticatedBase { + + private static final String MY_OBJECT_SOME_STRING = "some string"; + private static final int MY_OBJECT_SOME_INT = 42; + + public static MyObject createMyObject() { + return new MyObject(MY_OBJECT_SOME_STRING, MY_OBJECT_SOME_INT, + TableTools.emptyTable(MY_OBJECT_SOME_INT).view("I=i")); + } + + @Test + public void myObject() throws IOException { + ExportObject export = authenticatedSessionState() + .newExport(1) + .submit(ObjectServiceTest::createMyObject); + fetchMyObject(export.getExportId(), MY_OBJECT_SOME_STRING, MY_OBJECT_SOME_INT); + } + + @Test + public void myUnregisteredObject() { + ExportObject export = authenticatedSessionState() + .newExport(1) + .submit(MyUnregisteredObject::new); + final FetchObjectRequest request = FetchObjectRequest.newBuilder().setSourceId(export.getExportId()).build(); + try { + // noinspection ResultOfMethodCallIgnored + channel().objectBlocking().fetchObject(request); + failBecauseExceptionWasNotThrown(StatusRuntimeException.class); + } catch (StatusRuntimeException e) { + // expected + } + } + + private void fetchMyObject(Ticket ticket, String expectedSomeString, int expectedSomeInt) throws IOException { + final FetchObjectRequest request = FetchObjectRequest.newBuilder().setSourceId(ticket).build(); + final FetchObjectResponse response = channel().objectBlocking().fetchObject(request); + + assertThat(response.getType()).isEqualTo(MyObjectPlugin.MY_OBJECT_TYPE_NAME); + assertThat(response.getExportIdCount()).isEqualTo(1); + + final DataInputStream dis = new DataInputStream(response.getData().newInput()); + final String someString = dis.readUTF(); + final int someInt = dis.readInt(); + final byte ticketLen = dis.readByte(); + final byte[] someTableTicket = dis.readNBytes(ticketLen); + + assertThat(someString).isEqualTo(expectedSomeString); + assertThat(someInt).isEqualTo(expectedSomeInt); + assertThat(someTableTicket).containsExactly(response.getExportId(0).toByteArray()); + } + + public static class MyObjectPlugin extends PluginBase { + + public static final String MY_OBJECT_TYPE_NAME = MyObject.class.getName(); + + @Override + public void registerInto(ObjectTypeCallback callback) { + callback.registerObjectType(new MyObjectType(MY_OBJECT_TYPE_NAME)); + } + } + + public static class MyObject { + private final String someString; + private final int someInt; + private final Table someTable; + + public MyObject(String someString, int someInt, Table someTable) { + this.someString = someString; + this.someInt = someInt; + this.someTable = someTable; + } + } + + public static class MyUnregisteredObject { + } + + private static class MyObjectType extends ObjectTypeClassBase { + public MyObjectType(String name) { + super(name, MyObject.class); + } + + @Override + public void writeToImpl(Exporter exporter, MyObject object, OutputStream out) throws IOException { + final Reference tableReference = exporter.newServerSideReference(object.someTable); + final DataOutputStream doas = new DataOutputStream(out); + doas.writeUTF(object.someString); + doas.writeInt(object.someInt); + + final Ticket id = tableReference.id(); + final byte[] idBytes = id.toByteArray(); + doas.writeByte((byte) idBytes.length); + doas.write(idBytes); + } + } +} diff --git a/server/src/test/java/io/deephaven/server/runner/DeephavenApiServerSingleAuthenticatedBase.java b/server/src/test/java/io/deephaven/server/runner/DeephavenApiServerSingleAuthenticatedBase.java index 8daa74e1aec..eca46c3e58d 100644 --- a/server/src/test/java/io/deephaven/server/runner/DeephavenApiServerSingleAuthenticatedBase.java +++ b/server/src/test/java/io/deephaven/server/runner/DeephavenApiServerSingleAuthenticatedBase.java @@ -3,6 +3,7 @@ import io.deephaven.proto.DeephavenChannel; import io.deephaven.proto.backplane.grpc.HandshakeRequest; import io.deephaven.proto.backplane.grpc.HandshakeResponse; +import io.deephaven.server.session.SessionState; import io.grpc.CallOptions; import io.grpc.Channel; import io.grpc.ClientCall; @@ -20,16 +21,18 @@ public abstract class DeephavenApiServerSingleAuthenticatedBase extends Deephave DeephavenChannel channel; + UUID sessionToken; + @Override @Before public void setUp() throws Exception { super.setUp(); - final DeephavenChannel channel = channel(); + final DeephavenChannel channel = createChannel(); final HandshakeResponse result = channel.sessionBlocking().newSession(HandshakeRequest.newBuilder().setAuthProtocol(1).build()); // Note: the authentication token for DeephavenApiServerTestBase is valid for 7 days, // so we should only need to authenticate once :) - final UUID session = UUID.fromString(result.getSessionToken().toStringUtf8()); + sessionToken = UUID.fromString(result.getSessionToken().toStringUtf8()); final String sessionHeader = result.getMetadataHeader().toStringUtf8(); final Key sessionHeaderKey = Metadata.Key.of(sessionHeader, Metadata.ASCII_STRING_MARSHALLER); final Channel authenticatedChannel = ClientInterceptors.intercept(channel.channel(), new ClientInterceptor() { @@ -41,7 +44,7 @@ public ClientCall interceptCall( channel.newCall(methodDescriptor, callOptions)) { @Override public void start(final Listener responseListener, final Metadata headers) { - headers.put(sessionHeaderKey, session.toString()); + headers.put(sessionHeaderKey, sessionToken.toString()); super.start(responseListener, headers); } }; @@ -49,4 +52,12 @@ public void start(final Listener responseListener, final Metadata headers }); this.channel = new DeephavenChannel(authenticatedChannel); } + + public SessionState authenticatedSessionState() { + return server().sessionService().getSessionForToken(sessionToken); + } + + public DeephavenChannel channel() { + return channel; + } } diff --git a/server/src/test/java/io/deephaven/server/runner/DeephavenApiServerSingleUnauthenticatedBase.java b/server/src/test/java/io/deephaven/server/runner/DeephavenApiServerSingleUnauthenticatedBase.java index fbcb3860c06..5978a5122c1 100644 --- a/server/src/test/java/io/deephaven/server/runner/DeephavenApiServerSingleUnauthenticatedBase.java +++ b/server/src/test/java/io/deephaven/server/runner/DeephavenApiServerSingleUnauthenticatedBase.java @@ -11,6 +11,6 @@ public abstract class DeephavenApiServerSingleUnauthenticatedBase extends Deepha @Before public void setUp() throws Exception { super.setUp(); - channel = channel(); + channel = createChannel(); } } diff --git a/server/src/test/java/io/deephaven/server/runner/DeephavenApiServerTestBase.java b/server/src/test/java/io/deephaven/server/runner/DeephavenApiServerTestBase.java index d1c0fce4cdf..1dd5faa06da 100644 --- a/server/src/test/java/io/deephaven/server/runner/DeephavenApiServerTestBase.java +++ b/server/src/test/java/io/deephaven/server/runner/DeephavenApiServerTestBase.java @@ -64,6 +64,10 @@ public void tearDown() throws Exception { } } + public DeephavenApiServer server() { + return server; + } + /** * The session token expiration, in milliseconds. * @@ -83,7 +87,7 @@ public void register(ManagedChannel managedChannel) { grpcCleanup.register(managedChannel); } - public DeephavenChannel channel() { + public DeephavenChannel createChannel() { ManagedChannel channel = channelBuilder().build(); register(channel); return new DeephavenChannel(channel); diff --git a/server/src/test/resources/META-INF/services/io.deephaven.plugin.Plugin b/server/src/test/resources/META-INF/services/io.deephaven.plugin.Plugin new file mode 100644 index 00000000000..ebcc4d3cb0a --- /dev/null +++ b/server/src/test/resources/META-INF/services/io.deephaven.plugin.Plugin @@ -0,0 +1 @@ +io.deephaven.server.object.ObjectServiceTest$MyObjectPlugin From 2881aff4350aa4192e9db1150565419a76e1bb5b Mon Sep 17 00:00:00 2001 From: Devin Smith Date: Fri, 7 Jan 2022 12:45:58 -0800 Subject: [PATCH 18/62] Fix plugin discovery for unit tests --- server/build.gradle | 2 -- .../deephaven/server/plugin/PluginsAutoDiscovery.java | 10 ++++++++-- .../io/deephaven/server/runner/DeephavenApiServer.java | 2 +- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/server/build.gradle b/server/build.gradle index 6b88551a300..f5f7067f709 100644 --- a/server/build.gradle +++ b/server/build.gradle @@ -61,5 +61,3 @@ dependencies { testRuntimeOnly project(':log-to-slf4j') Classpaths.inheritSlf4j(project, 'slf4j-simple', 'testRuntimeOnly') } - -test.systemProperty 'deephaven.console.type', 'groovy' diff --git a/server/src/main/java/io/deephaven/server/plugin/PluginsAutoDiscovery.java b/server/src/main/java/io/deephaven/server/plugin/PluginsAutoDiscovery.java index 8f4a44907e9..735ad0fcf1e 100644 --- a/server/src/main/java/io/deephaven/server/plugin/PluginsAutoDiscovery.java +++ b/server/src/main/java/io/deephaven/server/plugin/PluginsAutoDiscovery.java @@ -10,6 +10,7 @@ import io.deephaven.server.console.ConsoleServiceGrpcImpl; import io.deephaven.server.plugin.java.JavaServiceLoader; import io.deephaven.server.plugin.python.PythonModuleLoader; +import io.deephaven.util.annotations.VisibleForTesting; import javax.inject.Inject; import java.util.Objects; @@ -34,16 +35,21 @@ public PluginsAutoDiscovery(ObjectTypeCallback types) { * {@link PythonModuleLoader#allRegisterInto(PluginCallback)} (if python is enabled). */ public void registerAll() { + registerAll(ConsoleServiceGrpcImpl.isPythonSession()); + } + + @VisibleForTesting + public void registerAll(boolean includePython) { log.info().append("Registering plugins...").endl(); // TODO(deephaven-core#1810): Use service loader to abstract the different plugin auto-discovery methods final Counting serviceLoaderCount = new Counting(); JavaServiceLoader.allRegisterInto(serviceLoaderCount); final Counting pythonModuleCount = new Counting(); - if (ConsoleServiceGrpcImpl.isPythonSession()) { + if (includePython) { PythonModuleLoader.allRegisterInto(pythonModuleCount); } log.info().append("Registered via service loader: ").append(serviceLoaderCount).endl(); - if (ConsoleServiceGrpcImpl.isPythonSession()) { + if (includePython) { log.info().append("Registered via python modules: ").append(pythonModuleCount).endl(); } } diff --git a/server/src/main/java/io/deephaven/server/runner/DeephavenApiServer.java b/server/src/main/java/io/deephaven/server/runner/DeephavenApiServer.java index 47179b40d13..d7638c696f6 100644 --- a/server/src/main/java/io/deephaven/server/runner/DeephavenApiServer.java +++ b/server/src/main/java/io/deephaven/server/runner/DeephavenApiServer.java @@ -134,7 +134,7 @@ public void run() throws IOException, ClassNotFoundException, InterruptedExcepti } void startForUnitTests() throws Exception { - pluginsAutoDiscovery.registerAll(); + pluginsAutoDiscovery.registerAll(false); log.info().append("Starting server...").endl(); server.start(); From aa89badef21fc57cd3c806b1dd46f2c264097f71 Mon Sep 17 00:00:00 2001 From: Devin Smith Date: Mon, 10 Jan 2022 09:00:55 -0800 Subject: [PATCH 19/62] Refactor into Plugin interface which can be walked --- m_figure.png | Bin 0 -> 22382 bytes .../deephaven/figure/FigureWidgetPlugin.java | 15 --------- .../FigureWidgetPluginRegistration.java | 14 ++++++++ ...tType.java => FigureWidgetTypePlugin.java} | 8 ++--- .../services/io.deephaven.plugin.Plugin | 1 - .../services/io.deephaven.plugin.Registration | 1 + .../main/java/io/deephaven/plugin/Plugin.java | 19 +++++------ .../java/io/deephaven/plugin/PluginBase.java | 19 ----------- .../io/deephaven/plugin/PluginCallback.java | 12 ------- .../io/deephaven/plugin/Registration.java | 24 ++++++++++++++ .../io/deephaven/plugin/type/ObjectType.java | 7 ++-- .../deephaven/plugin/type/ObjectTypeBase.java | 5 +++ .../plugin/type/ObjectTypeCallback.java | 14 -------- .../plugin/type/ObjectTypePlugin.java | 14 -------- .../plugin/type/ObjectTypeRegistration.java | 14 ++++++++ .../plugin/PluginRegistrationVisitor.java | 30 +++++++++++++++++ .../server/plugin/PluginsAutoDiscovery.java | 31 ++++++++++-------- .../server/plugin/PluginsModule.java | 10 ++++-- .../server/plugin/java/JavaServiceLoader.java | 10 +++--- .../server/plugin/python/CallbackAdapter.java | 8 ++--- .../plugin/python/PythonModuleLoader.java | 10 +++--- .../server/plugin/type/ObjectTypes.java | 8 ++--- .../server/plugin/type/ObjectTypesModule.java | 6 ++-- .../server/object/ObjectServiceTest.java | 9 +++-- ...lugin => io.deephaven.plugin.Registration} | 0 25 files changed, 154 insertions(+), 135 deletions(-) create mode 100644 m_figure.png delete mode 100644 plugin/figure/src/main/java/io/deephaven/figure/FigureWidgetPlugin.java create mode 100644 plugin/figure/src/main/java/io/deephaven/figure/FigureWidgetPluginRegistration.java rename plugin/figure/src/main/java/io/deephaven/figure/{FigureWidgetType.java => FigureWidgetTypePlugin.java} (69%) delete mode 100644 plugin/figure/src/main/resources/META-INF/services/io.deephaven.plugin.Plugin create mode 100644 plugin/figure/src/main/resources/META-INF/services/io.deephaven.plugin.Registration delete mode 100644 plugin/src/main/java/io/deephaven/plugin/PluginBase.java delete mode 100644 plugin/src/main/java/io/deephaven/plugin/PluginCallback.java create mode 100644 plugin/src/main/java/io/deephaven/plugin/Registration.java delete mode 100644 plugin/src/main/java/io/deephaven/plugin/type/ObjectTypeCallback.java delete mode 100644 plugin/src/main/java/io/deephaven/plugin/type/ObjectTypePlugin.java create mode 100644 plugin/src/main/java/io/deephaven/plugin/type/ObjectTypeRegistration.java create mode 100644 server/src/main/java/io/deephaven/server/plugin/PluginRegistrationVisitor.java rename server/src/test/resources/META-INF/services/{io.deephaven.plugin.Plugin => io.deephaven.plugin.Registration} (100%) diff --git a/m_figure.png b/m_figure.png new file mode 100644 index 0000000000000000000000000000000000000000..3bbd156ce8b6130688a249660a1aa3414f101119 GIT binary patch literal 22382 zcmd?Rhdh%YxO$xD>C|x?pW{7V^Z9(f-*FcVbtuVL$Pfgf)YHWnBM5#Ng5XV% z5X0Zd_K!@%4+ZZt=H3_GoV@+)Jg*|>?7ZD?x_RHcZqMm^)zj;`o9iiYS#c>*&THP@ z?p}%#61V>Q25~n}XNe)ZUk&gOQg_|UUI;>MhyIIKq*izxK}>(>VKhwqpRA1f1@&xC z9a|q9<@5Ur^?p`f@e(Jooko=lb*fBoPQV{7Ipx8^XiF zpCaEXgpQV$R*!<56MiJORsP@eYclEP=4R{qWNUk((N*aTiZ9R3(JN_Jr=PyX;wYUl zBz5wxloNlRKr6m3X1gxnxA3!bk7L@}+V*D4EUL-8W_yZ%8(=Ud!RAQZysBA+b^F%B zm&-^T)_~!EmXbN+?cnuH1ux=*z3te{O!g<4nH%3M-EyBkolah|sddLY*!>-O|33Zm z=g-%BPW4Ts*@X1>jlXoJekAKcj4(;r6FN#W!#@wjuiWun8J>jKo7?Z6`2FQze}8M~ zh75~ArsDD6OM|gz3nFT2RL~FE1~zGUQ-)@8SLT zj!bf{Y^UAE;wvj9i%f*0Vq&<(#aA1zZm*5sbNcwGxupdk4-e1$)itBk#)rih3tL7; z*y`%)wm$|Q{2rW~m{@OGTYzzsW*EfWJs~kB=l0=&&;{YtTAw9GWa6IMq58X!gNdoB z{G-PDgFioNgZKVuZC-VBoPW1{WcvO0BeQa=W|4||d_OQfNg&oxN@Q~`b$3gAv>?~^ennES;PuuSArHvMH2~K%=rtF|!q^gHI4)uq-OV_?U zqeOCGZHg`yQvKT8^!WShYS89KIRs&4Wktda3$^;PRH{OcLeMvpP*G_c8`CxZon?KZ zb&h6Wr|L*~_D*JXa3Kkg>_~w?icSnh%5{kP$J8 zSwyib`P%;dHM9QfSHScxIA{02@hfkdzyiRowQk>5cxISM=I6Jq6C$P+OVuur9TXw! z^38Un)?;^}prF9~U5Lu=pA~X)^1EjTSH|C|p|)hZGF>4KG2e1E=9D|}TfHAhGN?M-)BmFJc`caTNQUhD*YEtiyQ^kln57)|?r@hpl9;mOp(w_L2%nZY6|9I1iONz5 zG)-4^>S4kQbN|^!dLUzCV`B#kwL3@8Z$N{Pgzj&|hFEB5gioxkN$mXnOKMSON<*k2 z?>UV{)XiTwz7MV#ZwT~j9vs|mT`Zsk`ofvU(f67>CrNfMPEp@ zsS>k%&0qokVmI88zzSaiw!l&6YGPs%eH|8)5g|F+8$a6ma(EyMg9RHVlg@aqx%yVk z(yySfP;Gr~Vtl+bnMa2#D=Vu7oL@wA`?J0T>7PG;b}1SHe$#1cX>siO&>DT560+sy zk@a03BI_Fu+B}CeRlrI&`Gg$&Hj{B1W9w7hdmi#AA%W65^uWi_(UFsnZzgUN_K>Q% zxtWBF41ML4#eNiD6d)udoX^(5V48Y+sZNMnA;`6Ai?+_re807^ z^^J{wi4$yW@#R$}%Q%*vx6tPQ`uwfD*A7zI;UR8$n%Qu*bV z#KNg$Fx8SR7ja=>be#PqmqbV+!lpX!nF-Cc!v9gSp3c#^canxMw`KdC%V2p|U*F)G z&9P(0tQv!ubrRWbFAnnM33TG?IzGiGAP`ZeCLsy464%kz?jRVf^WWfRIepWAd~0ID z_F!MY=Wze_6Gb1g^78WICn;HE5M+9KdfrA$Jk3nd6cPUTThb=vFW-|VPm64I#I2ZBNa=tqEu}1>tC6%^Be0d>fH2Pe~?DSOsdJr$(`M$3X#mUm6a=H6@L3W9>K-B zXV11Yg%fbp^>T#nhl6weteeYf-T%8exv)U$<>e)M`Nh-Ek7*dl&J_HhC7fJn8E@_H zr|nZaQZ_BOii1GUv@}=|tDWDR#HDqzt~@R6#PF-@k<~7PKM%IYJ9D*SlQJ^mzQ1%{ zO6$K-JwH-+%5|(hPVYWHm!KfYw{PESJ!i;bs5z)I4Y!+C)aISfmJXQuhxoB-#ZWX? z+O-N_5#Z*=Z^~3V-J7Ly7uKFjT%3ya^vxz1;KoKLhr{mH!oB@RaYX@8;V>6(&h@p9 zkJ}t6%gP>C%q(xYQg<}Fv~>5SbKjWUK~Ki1-M>w(-P4h?M1+JBZE^JTLse5+gWJD< zM?=i=hJHc)b0^=RL#e!Yc!_iY-7V`~g0BwF>LAY~Kb z)R5g2KK+vY;cZVJpJ>Rgz1eD^-Ufo(8AP0kN{*Wp{%gh}2>C-3SG9}w4 zB%b*cv2$NmJM6jb)vM7bRRZSc1o-$SA<&z@zR8S!^k6Gf$xqeuho2kw`|j>i$%Ap7 zJ8NSf%LZ=rLkQJz9ULBJAt0t`3d19~0O>` zJqnJVgPcl$KzXC=o(Z{f63QY-NI4-EMn<%Z64n%uO~Lt)+D&50k)w`KKkKW7lzZE2 z_rOIbVmU%;-Nsga)EGew;~IwniimE?N9vz{Btx2!k%5l3@o?7#LNpq_w<+Z|-N>Tx zA*i*`K97%&C-W0jql(rHhX7y?qv-1C`FdV0cvl7@aA|#JdOA~WZLRH}EQznLue*mwb7SzHumP-g zNc0?hCDaz}F_f%HPo4yg`>wLj&O-b>J}Z=Z7N!Qd;6ZAtiZng#CF+xSywb)C3kzuB zl$W3Hu|A=3P$`_iA{#KFcwgXr$9c7bC>U2fhuTR)Lql|apTB&mvTG&on(;g2r+`or z8A-q>Zbf2gX=!e0nSbUk;3(v2-Wz5%3 zKodd#8y^=4j!&Rwgs61}?B~(xTX$fb4iin`>1v^>P=KJpZh5$xytugd((aqkqXWO5 zY&DLHg@$MD^PfXT6e0%8uP6m=_3P~HZ}xH2x^AzIZu}m!;Zam%fi$aWXh_v~bQt)x z!iGcOd{$6=!_hsc2YJ9>ZVkU`PM31HU~OH_F;`ylLq<-nQ(vMXYOQgPiYz+sY~jl_ zPcJVm$mrx-oo zdDp)@8>(^R=mnb{_k8K}5jWkuGvxJuhFwTVNt-`Dmh)I1lG=xwsP^_If0&Zoy1&1F zj?dCJcR#;Q7~;mL-*|4|_9~P+Wxoc`Vb1H-vnIvO>y5CN@bK}S@!x1aK?Ez_43QOT z)+g>TPO|R9Kqe*)ny6Q=WG35B*f6lMu@OR%lY4t}wgt+l)xb>1#w6gu5g8emqjS~C z$jPHMB8f?JbXw7QGpSXDpBfLK6yn&G9x3S7D#&05TOq|Yuv^ep^TJ} zS5hK}D5VKI8l|5muHwnWRBa))v%5=n?vV`bhYufwdjj`XYKZEr#MzYn*K_yQjtbp}BeM*4iF3O_WmWXYa+YdT6y`Wn~pLXdQS??dit`t$LG( zb+xtTP=`IWb#s##8XhKtj^u==r>F3N^;KtQa)-{u3e@>Dk$q z_VzQ&@+RjDpU8)U*-nKX?Qz6Vu?zdMaZ7vD6DMK2kp1;mYSj9(RfF3SH8FHeF3>h% zwl@3JU>k`bV|CPeObL%PX<$q)LU#o(%|3QRi^|bAK2!4k7!wzN%75J|nzZ0goE;u7 z+SM{K{`+1W)LL}iXR-I!>zgVFX6Lq z3xijdm(lTI;{*F6~&N%9wd?#ixaZTDcdRy1U8G z7NqDrFA3))5fl?U0|f*GA6h0R!S5Q%FqSL^a$8CvF)_$gkx)B9kJOgvU@R&oX6Ndf z2y2`7>Jf?-D2Xcd$Y#3XOMhU_iVhd5&pmyADS%VQ6TmxrGHc zCns{ssV9t+#9oK~(p%pZNxK%p120GlkSldwDZ?;L4tN78Czijztg>y!M?0$A++6v9 zEkW&gCcMDFK!}yr%l^buUCBI^uV0t<4+;tiH5VD>CnY6?eJMOY^>;42bN1t7mn~VC z!&8G7MC(vFU@EK|K0yhO_$7KDK)9C=+Ntb%PjR=j)Ft6vjA<#FOTqc>L9zFBX9>30 zq7`kT;f{D=&$qiB;$MFTN4 z^}R>C##n3@miJ0;=jP@g9@#?mWkG(u7ewyArr-N76r|BGFc5-MVYIdFTcSvr!1W0R z;}R008yXr8Cs$Su%qxUQ@bBn%yBrve4$2y4tFnV*cD}za&|hXLM{!b_NzQGI5SgBt zfdYvN46O~iF4_|(Vwab1Zmo^Kvp7XVo4oMmlF1z-5xOMLa|v#K1$WpxdG-D;?2WZBeB36Eic>5S=f*>4hpl(&H!Qz^mHgz?^U0H-nLjqf^c2PiN{c zJu`Em(ltw!pdEJ#HhCIE(rebBCsXMJbSK*0-ZG7Qt4ipEW_vPrXV6{+e28_fH&Y93 z;>3>8(q^12Gi=%!==9)QJH7v;Z2kJ0WED>a?|a6k?Xke~p$s%gOKYpg#?Ld*+^AL} zB__f}CMCo1*OR~|w~hd@hyknwf)nJj)W*PV*P)@Iks50Y3lB>tc<#a4b5&ZBUzPL<$qVq%<^KF* zs(Z_)c6N3+Wn>sS?{Rbv+Jq*US>G<`u)fHD|I$*ixz^XGdh|DkD)B->LL^U}TB%6I zVoT2N{^mBYx=(^IjeVeQ;90`5cD3pK;ZK6hgJz;ONVGK2_V|qlpFmqFr=D~!Uzz;V zzRTt#^|$E>j#0HikC*iDVa(2sKU!s4l>G@`DtP*oQ%Z^!i~ZErN9J<;(OZy>hg+c!o)t0oJrOioEiNI=_*K$)PKCVmA_ zq6sK^=jZ2RLqgnYTu0quOAa=>x^$7GeSw!Wv>A#TG?G^x=z5(_G!2+WuN{*M|7`H0 zv+zcOBRS_KSAac^XE{4Mn)q8^=IVw5bX{3el7>~zHR$=^!S)hZri|#pDFREn3QexG z$vus86Ryr&zPx(2?fkIOMr`kEiKeC<1kL6vhOMWL`Nz~RLD+AD9=}~hNJuWMYC1NH%Tf7<5RUZaoG62 z@6YiK#*zpTrZ3{i6-^b4A@3E@FxlzV&Vu6*oS(GGjE+_u9hxgb>@-+Rk&d@W4*PM{ zLfLYhXwCb&Ak1w_Z<{6Wg5bo&MA(xjY)DvY>TwD8GU5o%oZ4C@1qB6nclR(&qlRoR zzzzq_7t*iy4%6$tvyM`vdYG;xNk^tIPT$@JDM49zm2J4u62Ev?US58FTY{FB`884C zm&#LotY@RyHeo03R~s+urgXx40U%UXQJI{bjd}4xx@sz&0s_v-zdYR1bfHiB+Rc=D z@e$R9<9D>jsD2W2Bcfr|nzX`y8Y09pzdQ6lLO#ZXPMzaKWG?FL@VB?a}S7n7s-h3QXrnBafPf104Zu9pf;jm+) zYKvfb`qFz=5eCFP!9sLC>}BxKqZU9>VaBu5Gs;2rzZsB;QE|!*D+04*dZVlVHr8T9 zRJeWqc;^L+a;-vJzj#+xPG8;t1eekSZdhc7!9Y7x>wm0!y>1yKVA1Gp&Z1<*ZMsTz zgSCH9vAjCAv$r|2}sbyyChRUGLQs zEjX``4X=x+ZZTh1Is;R@ck6vP#eUFF;ht&f9*z-0S6|4rd7VwT`QMvy-#yo}|62x` zIB;#gHao}b$sJ%N8iua-RfR>m_$xjXGm3aBthenjE^1Xg{q(kIF_9-M^korsh-t=a zpFWK;zTAz`;-9kZ>%jiojp>&*hEwzHmX((>>|p-pLLXtt&;NVzRyTg77} zi!0Ic_Lh~>?pF9_5g02*)oQ^MkHbh=I2Z8e=jM)O z82FAmEDu%L>+o=Mm-wi$_qILCPvcC(+ax}%aYaW2eN6I}b1j>KCn3OxN6HEc%+Q}` z1160zfbBHdGqn29`c&p^f8$(g@&&<3d267_GcD zDr%lTPAWLC_(`FSJ^u$WmObu9`cv|W2B`5+4A|g_JgxNQnMf-D@2|-B>yj+7e&4bXr2g};jr7dD)d?Y6ME{{^_~XZ{Z~WH8eHp-fSnwfWj2>T+~S?Ix4J zUtSeeX{QDQHGS@!^BajH+Hqnd*kz$>$SDBwiiv=#AjJD5;RGBk&D7h;P_c>+- z09pEH9eHhxTHjm5{ng6Lk-ms!ze~Y{M#tpjy@hqY=lZo2brk7xl5{?7qF{@}iMV-S z`K&**LgoNx^1X%q_8WDkjxgLyx}$<$ZMW_aKDgmC&$5` zV`3zIR1TkV8tY4LR69y>vGr8azM#Th|3R5&68Z3L3(ldEt6PTKbJUp}UqMW$DZcnz$9lQRz+ z;bZi;aO;?Jw%dp4r8M3kxjyZ*-Q6KoT6FG2xYZ8d-AZF%>+Xpxi)KdmzQ7n9K$;e3 z7sS`5s=9Z^o9`lF3Ir^zeeD+07{{}?WuY+ma7lJ-`~eg?KU)4{@P1<}$T@v!|3+>0& zigykSs7xU8v(XV96Da_z!ThtDuu*3(N#{WYq^Yo>mBzHw8V2(LHyDiXf|C^gbHgZ3 zB+_Ch$L69Nd|@1JUFeMTG8o-N&#NDS|lZ+-&i?C$N&pu_^7tn@6Saw}I%bot9yG)fe5~nqD-j;R6 z>6Y+XA`(`$VMOGNoKT=|Y-}*81jwL`^VRN$D(;y>L*_$2ek^f}jjPf&KIknjZcTA4?8pj{&yq3EQYS`~mYrSJ#e5bEb9;Ai8W^pp zj8o3s0R00(&;q$l3YxB}d~n}5`E*}`mp^+EL^VK_(5R8^Mm$BNBe^Z0m6g}O@S~73 z2|0NyK=YE$y=>5)n=fC3c!6I&Gu}~qsWWGQbe{h5F|F)LW`1e5lm^nLitF6Quq*M; ztnQ{UamY&(lmpI?4O+@1@B7pJ;c2 zoU5Z+VR>V(*{NQ|L#slAx_JLZsNW3Cz1Y%R$6{*k^UYFRqo}ju_Z7`MhV$}(vtFTU z_rP6qrSCg5PYBAJ3qc6qx`6ZX^LE=AY(a0Al#z*-Ct7H6evG+?i*H*|(rye>WdogD zBux{Hs{T?Xn#_G;D6Ao9?H^C3KdnixbRJ-iaz~fT)5!NsgO}gZ#tW;Ha{axB)T znEj3u78uLzZ<*>AuC&U_qLOa5^yxx7ul1gVtG$QXAl1Bn4ga-(bF&p!>ps`H zi5sPKN_0lmxUbwzQ@dE<;5)*MGz?B9`MLHNADDUO* zRmFP^bDpR%LZ$W37)?abE!Is5QM(U_SLQLKCy0wJ*ZL0x@)8x?#}rPuG1#>%Vvwd! z&O!ZhCFQl@*c-T(Q18Qvv6yz5Jh6|S0(UUmdjBSxQ%ZbrA7chfJUEB5#1pK1v(&Em z1)u{X_UaOT^&TB_+vygHiSSLwqEiVU$LU;0Y8O zyeHB5N#Cv`g4~f2CS4ZhI(gE+?3@bBJ?;)#yBJv1nZ|mQCURMpX@r%^s)kn4I!aUh zG5G96M- z1r!@V=xg6!@Yy>!OioQ*TzJ8fK+KY$ePmT;s`mW^0CKV=IZr9vp6jZ66f=q~DNHq# zQ$iSWyb!-il9Qj$17JNNg1viJtI#kL8DSo|SURBk?KQ|M!hsn9g%TBjwCVu?iYUn( z5fO1V?cRS-SC1Mj*eXf}td%Lnk=LDBuYB25uaPWyk!kb?yHP?4X#^*h{ijDfs~iZKcFw;=R+%oFCg-G9S0lJ{$=F0PBD0*^3k zraNuwyK{ClaP#8U^(098DQBwJH^2Wf|8X0*y(+&oYmkXdzzEyOCF&8NY{LnTeZ$;@ z1jqHr6B=~on8#-dNH$)zI!i=(R66IyO1{Cb1v&t2dI5Ov>hAtBz5|l5Fa@t!eM0gcLezgA&Y}UBah42xhFK>6Eh#TAFX1WY zUd-B9gPn`ZU3vk-9P5SvT|+}{pe5WvCt=aua#uGF+g9^uo^RjzK(EWODKu72YcIwX z+?=3u+l@yVKRqiev8$_V?^&sdFvIcVaVVzMmJ-Cr!QpC1j2O%hh0WY6x&!X8ySK+9 zCAHDG;Njr`(ysCYb#R_LmS+mk_Ml)!(VN7x^)dV6UG})HYfPh8nqW9>pn5SfHpbVW zao<_DLrVs1LP9&}9|V1sVWo%w$*TFr`}0@Xk9Ch1Epi8}THsVQ_q2as zB@rbzgKg}97V?tf0SMqaf!1(QpoEq_=7_x>d#^8eoS;NpddekcK~1abmv z1+-O{B;Z;1ZM_S_czAe3MhLk{@L#-mk@WcS-M^c2chlpc_`R5ci^x2M>XEyyr_&GY z+qB&9dGkt6y}<_o!WvoMjHd#qZ2Ey>CnO?@qrZcqq01}I?(zrxH%*+(<$0l8$Peu1 zmNwVkes_KGYq7l!jF;ulW?boxN2nq)(H%ltwC2R)$<6)6o`L8B5K*@;7bni2!#D~9 zq-gs&<~|Z;bc=w7eO3s4j{^hIr{?C#p?_03QuSG+ZA_PN6K&OeE6Eo3PJ^@*?>?Jjgub=TCc36ar`Xs$~m{B}oR*r2qbK z=%Hd`yc#)@K75KWp@F@P665$2oMm=)*1io(3n?S8VDmOmw8MJ1)B#iClThYue@Aa8wfwVQ^C2@Ac{9rk-z>`5)?{TxhrC!CCg zG#i#B^Zl5hCM+S+_9I;19uMt&C}#QT)%A;AGoHY*=XuTbLa(58^QI^cb;5wB!6@o{t%NDri-2k3V&51gh8QGD{R z!s%G|eSt2ABZO99c({7A8oYAdL99`Et)JVf&Xb7zgm_e;z%g<@ZfRn@w9SplhmJ_o zk4%=FD_Us%qj$GI6F+3Bti~M(Uc^t8Q5;klsIJYpxD7b`c1lpi-SaLjVnF@sl~rt_ zhAY!xVu#x=xYG*0(qTsb2VP*`_0q4s{k1#SdAlND~rT_5xNUGLOKsBcvR<4LZ`s}9{kT= z0@!GSEM;bB$29%@<^QaXioi?UZ(=z~P*lzN1sND`3jl#RGN%@6PJ*YuIwGfLlMj<} z=xBoW5>>yLn=^&{ojFnE09&o{@E{{xEY2)9se64iN4NIJWq@n3woy}vVTLpjhyyx6 zaob<#bd+Tjo&IgeEG20OP{3n|5P$%uzdH{r0&7wRIS|r{t zo0l7DlioYpcXHD0*22A! zrnCbVuBHKPDF02E8JpgHd?ZT_qIOg&t3*bdY^3=3QkdS-d3;2>hFsk{Jr+8Xc@1*} z4@JH~1MwCJcx-uNL-n`{CY<=EvweAxGis}O4>&a@cVdAmtqQtZ8tv_NSOk~9HAVq%mv1})!* zi?`gMhMFI1P*U_+-0He2%R>3}hEMb{coJzu*vrdAJMQ|@zRw)Bijy1;q3-`t)Rw4? zxo7KL%F4aAyuxWM&s`#&!ATM^#Ff=i<g@?oMK$xEkz&I33h6PK2>Hi1Tr*w03 zo1U9%?d>feZUn+p%eZ`C(!Jwcn}9R=iEa~Qif2bn^$fTE7 zR`?DMZ+Yt=Yd#P(mPhL7mHbwtG;`H~qD6JxNl7$8hkxh%!6-r9rKyPzRQV@hpbuoq zOz(omZ4&CgNWg?NbBihy;bg$s_KU0-$6es_FjicIGtDdJA)xMUG$Nn2wp3 zq<-ZxPt2OQspIGk^|kHg%gnD`NAK|IKeX*kWQXFYskEZ;4(Os5EcZcfzy3j_Vgi5{ z>JdW?4Lm3n&FzMGO(q^P+o>TD6ey=f7EV`_4KQhm_EF>#G zRY5VfmPfIN0NQn1yK?`ohgb^M@plR9BsqnJ0^W-3#8hn9)>!I%Sk!H?FOW@u0#)`_ z0$sp%sgj-h0I_G#oShu}<>t^?e6x+ud9q@Q_0y==$*%EsmMdB+ z=u@zYf0DXypW{dtl74fsDJCj5DXz=>sf~oDl_%p*!>f~R1@&Z`n#wCQ?7oFtL~p*Y zYg0+z4mvvB!UK-GbuEIEbLNpn=-le}W&8u>3<~To4~%#Eu{SXRO+VhBZF`F0B}O|$ z`rI$1D2}mFxXQNh)_e1HNLGeb%tO3hEY+s^9F1S?chwzf7VduyvG#L=($-v{G}4|# zvkQIi65DZpZcOf_kVWo&2A-`*T-Q2QvPdvPpL`t!SEQwD^s9&bR8MS#-s>+E7aHt) zc_|~;VLel7H_K&$OoT7=BYpqD&f{=w7s>Rv_}f$3HlB=svbx(>UW9hcdsP|bd39wz zmbduk74td1wVI~C6@>_xi$?G%eV>i|?HN`3Ql4+H*Ox;HNdIp+56oXh&E`o9?7S2T z2{0#h*W95EUF>b@(GeeOYas9$@O!DTHSVw#9q`?wmXSNa9&Nk1^*;)Iy4Rl;bmoek zHRej7H)Vs@(~8E&3A&_lT_Dt=qaBdeph5X&FkY-$YV@lS?gQmI3LsFowsk6R=OjiJ zVD;j2LUn>Q72d2%hC&E8uz<{| zeR1VfRUlWo_`)N<$V9F0Y_a;=m~x;Y!vAQvR=%8I3dWcOqVFy-N`A%`*f+y1u0Z|{ z%sO{ATWWV%>|?*s5PQGf$!qlU_~c&E=)-Zyc9yZVhfs)8uycH)TJN0Z#quwGUN0}@ zE{*%Gp5FG0sEcseqD{tuRaxplL@60wMFRtsbuC`mYW9Xj(39sh^t0jR@L;P!JkP{_ z9Sku_T@>9B9~1mMUKc2Os-mTyliKnixe@-0dp!YOpT`3V?fde(&UyV_sJkP`HhF^C zXb!fSf&vK?3?}ZOpqrd{Lt_yHdX5b zR;d@Pb+DxIl!+5t{ynV034qWtUa>~A?E5ORf(<|%BPbXK1KoU8^J%>9$Jaqx+#7KK zzd`Rn{ST~~&s^^)53`&{A5C!4oPEN4B?M9JuhnzzVi;aMSO7=5&z|J8p~B=F@H`KN zcP;gmioWwKo^!f3!E&q*Rk>4?!8xVR0wVPFQuU$k_}?d*s1sjXT*8*a@a9$=`C!)E zt>^(UZLLyzchSv6(=X6S+TG+ zy$?jKBt!@LUP`9rUm=jg#NN&cPGSXfIs@zOs0{1gHG#?y#_O!wvOjdV6}~jOU|gQ< z>|z(w+q^nYw;2AK(#o!Q8YYCfha!Fynjs#{zM1c}_aWS>q}@$<5gOy-QDu~?U!;_$ zr2?DlEcj90iX7ldltJmAW_V!h`~e~X)w5CczbaGJUwvL-Q0F|eE3e5lm-!azi)eW6 zje&y4?Yl~T^wMq`wP4J|tEaJ4ztsmNsiXXdQ7_J8LFFB?XK4tZ^a)|m*m(Zx7E-Nl@&_IbIbQ2#DdFFyfB~nYPc+0D*}? zDNf(L-0SAhpr$LyRfhGR* z=|a%{Mkh8dj#iE-S@(0ri3M=o`Uhrq)|G{sU{SE%s26l$_1++mbx)w>FQ8K3<sB>>+kuKz_xEM+{rn*Ie%Y;F+2F=rob%@`^3z8Jc1{Yw zpCC|7L)kRVlXj_ept7b$2Q+1HsN@D0d;ga&3xsU%ywRK#L})qt(f&aBR2>E2n*Ds} zK8;L*lneFwN6p)AaU6K{X`mNH&xM(oL_tkv`X(Og5AFPZHM7!zRB;_g?5{ieQhsK_ zuQTiKJc$SmNxbCbsXW+pNliODGS#^40TivQyf(=Fl$1{|uIfK{@Sv%qgBY++O@vnDeSS;_EUxi`% z`ufRmpaewP&jAroJKW)ccER#G>2n-JSM!vb>%QIFM}Djvw+uVVPbnZ_Xt&SC9(9`1 z3V1}=QQmXPL_PTa*@l^lsKx_oM)BmW0c zw|Q*rBnVL8qdEZEwkK+DnI}4qv`teABtNtyMCRFkCY}$7Zuv51 zJnaZA1?W|gBT%59UnaqvKXb)6=KGI6+Zme-1TnKbuDZZ{2P(o4V^DIcBt0ePOqRL} zIrm--FOOyL+@k?hopaVea=EPMjG^{F!|&>HEY+9v=@x3s{D6<_yft^2C7-;;JR#~S z4KrngXsfMRNME_z#nL60W-@s4<*qj8(8WhnX3(vn9E-FqfNr8=X)$&03iDoB9n<$B8e18rX|?>T(VTk) zi=8KhD9czYD2n_&D+!eO0dOwm{PGIWn*eygoo8Je8yW}s6;O6`cSfnn*O5*Fp{p^dC zzuPV$VL+q-iIOjsodG zJu{(1k*tfdX23ZNWe2b$G(WG$UJh=hH5$|yv4xHL1zF(6WgrQTPU?0JD)r?)H8_@< z!A7qr+f;gM->y9AE((?Kf`+1q5oKSd69kfj&QKyKB9tK!g(Ll8!+H5&($y0H-+6^7 z#d2&HLb|ebyPin>=2*Us$raqJt6>9*Vph~b*#WQ91dm6WHfgichj|#vUkfMS2X+)K zuLhC;{M=a{{9>N%&Wxa_()qyHT!+fHUGIUrUWDP6KnJz+cUsn9Jb+B@&RMSecoJ$; zcenE*ZS#MIDgbA|F`j@e=?5j>j{8MANcu#GjC+m7&1@2=9dT=i)3pq!m(s7li)7y6 zJ`@Fr>w@q!(_pTub~R<#=XkBRAYQZsa|k%={NihRJr`+Q+Ajq8xX(uWLjWJxj5bOz z%q@^QV$K&mHMqMLa=yK#;kw`;DXNh3tl^}%IZIIY1oxOp2=W2=p`gqVV!iJ^89YFG)-tNRCdMRt03o{SK%U=JJoeiNe-@UgESx2K9C!I&GZo7Tx)oQZYFtR+w}# z2M?jRxf=OiN(0prYPN9R1y6HozI+hZ@bMZS820|9>3Vk9Yid>?Db%domsSZxE z=+5utrWT2RP63LDc-IqQRVz!aEmmA8dYmT!Osh%U*C(0=-~H)yq+Rh4mfK3UzT@tM zw};|TyPIEtO&ZMyBq=)Z%lhbAF-XyD3rr?}J=yToR}++fMGlP<38Q-6JNEAS==ZFK zKdpSZkepyGvz~eOm^X>0+yban&RR5#_crKXf|x@YyQ!SiX%Jv$fwhguN~q_&zfr^i zPXT%><<*tKmm8o4vic~2hiu(4KEdHj9Rms^G|XURV~LV@g@A@#P|I$4eSZ)^#ta{( z|J9TSNg-~hQTc7kQwZrkq-h)9B?^;6-%@~J!{Tv3`ln(%(NtVycp45*nfjT)UH?vq z^q8?5f}n8VTQ|a%#i6_CoY6}RQr?RUF0M}t2G6P~ z*vA1yMs?}yfYC`oM1E>@kpQt6^y}z3(Sjq@Ay9E|R3a&Q!s23`sKWf{PazPeKtSwN z21;7Tmvp1?MfVqP@S(`*(~JPGM3$9_jf{+Zf@5h<;HdJl`PKu#<yDGZ~HE7zX>;&Nq7Ap2_2;4@GUAg|BPXIpo_FOmj^qaf62qLkg)$f_jTn5z>QlBtB(co!b&?S3{zDfFL06YmmE zs<8a1aqB!h*fRoP<7`^-e>3yl$t_t~emD6z`m{B+s#~jTQA4VeB<|I;=+`q7WZ}=! zsv}KsNT~AGkJHOPYSzMMs1Xz4<0itF#Q5_AQy*NH@*BJ@I_8H5V%pb?PU&>?@sPEE zXc=t)v%JK&fGo2JxrzU17ZeqPvxs= zMIpxkb41SsxID&Xz1IEF>uB&OGnr89*I@b;FTsFw$0BX;l52F(&QDY7$!A|AK|pyD z!`#q%p)=gimLB|!mr=dMhluYg8oD2Hydlv*tZqI)6G@+rzv_A~@P*tZs-j^gr2y|u z<$rwNWen?u@&m_4BPVSO{u!BfC1PCGB_!CqRVIWA>X4?v?_{TJNOYD^y%vP16bL^h zMiHF0qy61Gpn@yX|A6AS5Ig)!9XS6JJ9H`FdmNyoo;*mKRyfM=R=SKzZQlcL{LuI0BTshGo*Dl_FRl1%E5}YnTj7=tg!Z}vi){tU24m?_ zpyEWrPKS%{Jol3idQyf#131R73Nfx0gx~>UT)X$--t&Y_%^%n}e5f^`c)*3-XL!~!Qg@pzeE4TV6f~u$3T+^=S%G{qSOAPlvs0)ys z`y>u?(uVf$q|i(W%YC`5w)fqCkub(XLo{s#l%K|JLY@Hh{M2a6U-P!tVWW}!(;^{g zVkaYAo9D;BvU)1S`ohsUX;avRVnB+fU>CY-jVKU+JDaw$a@}9Pq(Oa}Rz(aplk;6I zMfSm?h-w`P0%T;xB)wmR0(S@lU0$>k1)hI+Che(9`fFLDL2_9njH_=4HO|VHk|z|{ z;W3v47}Z;#``_``mj>{G0D+*<@w|~1r?f|%xP(+RjPBVNQuB?$GpL`ODX>8OJwdktZJK)JkfscGl)<=srK|!HdP4U*H zzJXRtb^<%QUNom+u|%JqT6KxFJxI{ofwmRl%qv#`y))0(Zfjf`chogU&Zz@0+P)_~ z@#D&zkwtlAK^;B_;=?A(_HCd2D?+gp6y!O{(6`2-MTLPW9+Gn|huo==hRRJq1ZTR* zx%PN6#%G|YsGAafc$k5wfv}bJYbgtMXNDjL#hy#T+p7aPd;*UH>ej{^+N`xdY%5Lb4omLab?E%jR|Q})5P$c#Xq)o#xMgm9 zC8?jSr;miw;8hMLC03=a zq0~>OmNMr+KppwnAdxf^e*+@Yf81${0s1bEwEt<1Wq&EYH~S@ZdrFVjrtal|^P&RR z>+^*BSDw2}|Au|hweS~Qkb*;UEg;1|g0rXP$%B_YISJmIeFc+mU2dG*S*Uh4KZLgy z4X=|-IHXHoCF3`IQiMz6PYFXlsW3TtGLJ0`Lpov{XbgrCr<`VN>ID6Mj`6_0c_19l z=n0X^>#&K1XFQE742y%GyxO025I7{A{OD0hC|oj<*w%)TS5Ro~?9^#<1f#;pLb_Rp z)x9>}*l_rFbZHL`)yIJB=FS6P!?8t9fK$A78KgpWG?D0Em~Q<4pVNh+7#-37I=1_N z{xx|^AY8fZZ8mqFY3Uh5Xwxv4e71uvKV%bk;O{Vyk-^1XAY9@WK#%HnUb=7r0cB~G z16Gq?x9(7tFVipc~j^Kuw91vEaXJdzwDL%uE2cPnFsQqu>*5JQy2lpx1>qzTX zRaIU4_M91xiKB(%SVJHxnYHhfHb+HL!2E@*e+SeCy{ZTP(jV}p2m^k!ylYFePXfM& zIK#knl9qvi*H<*s2Tu4?FiR8m_Vz;Ag8>>g@uZ5duju_2{A;%Vx!%AYR1YZo#v*$o z3T}1a77)-`zD8UKtUKJH&;sL@@MVa64RWG*b|psOeOus803%b=7|=iE6cy>hdy8R> z(`8*4>FDU(x8{w!ftiN;URr?aYfE&h1XeEsrVKl+xhzO52FEht#)B_va3d1vJ0iW8 zzKOkZ9c2MI0;*m!Ha13eHR!DX%h&j$Tbr2D;f|#oIJ&d5`gRQ&`CD%XOkMro*~jV1 zw_kKEP^7`!VbW+_UzN{PKQdxfTUTcXdL#eUx;Z#Z%>XyOtiuUTTabL&>qyB*M@L`# z{FHRIFZ&)`48Z_*GIhZ94Q+{6-Qg)QaH|0*h>T#IZg3=6-hBc&+?k@T%1@U$i6_HZ zP*4B}mpW+Jw!TbzDgYH41;px|^mqe3z~aJ`3Sv$gmJZkhn<*$Ptl9lgtUb{o3GE=z zn*nwj&ZH`Z9x6kOLvIH_PYc6!8|Z#p*0`R5YoGcnY}8=vT+-5XYWwSvLsbS;j*vCP*!a?-P8wOBFnOEB4!D00NXXjWM7#OhZA1C1MBs|o{ z0Ir1VJfs4)uA!G^z&z-c9_dNZDSg>j zkA=^C^}oMa0^=$G_vyeUtb-_V>nIV6RR>@WJ;e$a$^7~p5!%1teQo%akW=pyQUs1m zV>~^j;UW$!NX+7%^m+ruhzH{YW>g*AH+tdw_wVcL>oh{gGwuM{Xa{n?p@u-Y#cyRI zzHE`tOoWZzg#=^HoZ*6o54BtnVu^qYq`;YVINT|7{WGDHlM@{HMMo*+w`v8)`Zdrq z{{1-$^73$*6tV8PbH~BcH@3Fw|DRg!HKwUEj05<|*eI!JhnJv}OQnKqWr0D0lU6Fo zWr`C=1e_Y7zyu^HactvK?iAV#*}{T41eO6CNMX=yB*M6c2#hwPwqw)}!eFvdxye={ z)*|~qn0?#)wvPmw9?p5s`<(N>|L3>#X$v%=8n4z1?s?XMw@$eT1Z*VMbYXg9nxQ?} zzExbi&&}o~kO?L4-1M2kO;WP)Qc_xmM*iSBJ7KZE(V*g$mzP5sYRsh&K1ND#Y^)1Z zDTCeSGZM)jolf_w(a6U|(PJ(4X>pV9$BPaKCB@*Jt2`uWW6LdYbu_4~CS1j-t zk~A<&d`4|zz`vsKi2|iksa3^=NU)oY5zMBBy@|}ZH&k&u>wzxWpvV=3-`b98i)Xvj z^YF%HyVh?8N+5%J_m9wlP66~(UwLcG3-O5;S26l+rW~f*VYkosczA>n@i6u;lYD6a zUB%{tl*GrVV}*rvF?igUOB8JhfKk)$Qi0hN}_8j8olscTNF?k{A;VS>8-m^V7!{GJth%<;X} z%t=h>ySy(DpJeFD@b>cZ@|3PVY8dH+NkID@tMlKDrkYJjbj6*sO?DVx=+Xk!N67&BLqi9kVMyZQ>T;!KV*`G+ zVr-rL925#gB9dm*pMw)Dx|@vGBR*|K3V@>BM(zp`37k!*4hz0Rm9v%!w@3m2(T2kb zK{?J7zTbi!0i@vuKuS@64o%&C)pI5R@49+_Rk-zHRdA0I5grB(ix`~1yX%P04g#29 z7+^L22u%Yc$j91DUGDlbQgxiOqF==^K#OvzBZqL$k>VJjQgoE(vsWVay1JqtX(4}( zC@UCqzSGmwZ5PJ`U6w!9=8S}&s`^nAJ(GWNPtVG-V(_?N*4n~S8y*=c;M$n=!}y2I zPZk#!DeEfRWG`??vK$Z!g}4*R7wY@OqenhFn@B1Gf}Iifb_527(Y9piAj?@wP8!h^ zK0ZFHh+!`ynG%C(oO5mnP6t-V27#Cq0T_t`pJdMP^Yg=OaO1#br{Jrv$sRn22cG!b zSGyo(l%ULSglh2blCJ^H3dx-ly&6bAZ-OgCgB1Bm2&vC{#ot}?h%Uo^loje?`fMjg@*qSgEovqv z+}Q>q6OFpBNwx|I2%xhjeKK>Mb3ZaQ)sr4Eux98)wFndBGM--|PybHF65_>jq;gvcpGp2+}YcU1M3D;hr1A|Sn(0b)O>|5q2a=PCJ#1#Au6EFsH literal 0 HcmV?d00001 diff --git a/plugin/figure/src/main/java/io/deephaven/figure/FigureWidgetPlugin.java b/plugin/figure/src/main/java/io/deephaven/figure/FigureWidgetPlugin.java deleted file mode 100644 index 9f97e71b330..00000000000 --- a/plugin/figure/src/main/java/io/deephaven/figure/FigureWidgetPlugin.java +++ /dev/null @@ -1,15 +0,0 @@ -package io.deephaven.figure; - -import io.deephaven.plugin.PluginBase; -import io.deephaven.plugin.type.ObjectTypeCallback; - -/** - * Registers the object type {@link FigureWidgetType}. - */ -public final class FigureWidgetPlugin extends PluginBase { - - @Override - public void registerInto(ObjectTypeCallback callback) { - callback.registerObjectType(FigureWidgetType.instance()); - } -} diff --git a/plugin/figure/src/main/java/io/deephaven/figure/FigureWidgetPluginRegistration.java b/plugin/figure/src/main/java/io/deephaven/figure/FigureWidgetPluginRegistration.java new file mode 100644 index 00000000000..4a60f0733fa --- /dev/null +++ b/plugin/figure/src/main/java/io/deephaven/figure/FigureWidgetPluginRegistration.java @@ -0,0 +1,14 @@ +package io.deephaven.figure; + +import io.deephaven.plugin.Registration; + +/** + * Registers the object type plugin {@link FigureWidgetTypePlugin}. + */ +public final class FigureWidgetPluginRegistration implements Registration { + + @Override + public void registerInto(Callback callback) { + callback.register(FigureWidgetTypePlugin.instance()); + } +} diff --git a/plugin/figure/src/main/java/io/deephaven/figure/FigureWidgetType.java b/plugin/figure/src/main/java/io/deephaven/figure/FigureWidgetTypePlugin.java similarity index 69% rename from plugin/figure/src/main/java/io/deephaven/figure/FigureWidgetType.java rename to plugin/figure/src/main/java/io/deephaven/figure/FigureWidgetTypePlugin.java index 8dbabb777fd..888b66b3737 100644 --- a/plugin/figure/src/main/java/io/deephaven/figure/FigureWidgetType.java +++ b/plugin/figure/src/main/java/io/deephaven/figure/FigureWidgetTypePlugin.java @@ -9,17 +9,17 @@ /** * An object type named {@value NAME} of java class type {@link FigureWidget}. */ -public final class FigureWidgetType extends ObjectTypeClassBase { +public final class FigureWidgetTypePlugin extends ObjectTypeClassBase { - private static final FigureWidgetType INSTANCE = new FigureWidgetType(); + private static final FigureWidgetTypePlugin INSTANCE = new FigureWidgetTypePlugin(); public static final String NAME = "Figure"; - public static FigureWidgetType instance() { + public static FigureWidgetTypePlugin instance() { return INSTANCE; } - private FigureWidgetType() { + private FigureWidgetTypePlugin() { super(NAME, FigureWidget.class); } diff --git a/plugin/figure/src/main/resources/META-INF/services/io.deephaven.plugin.Plugin b/plugin/figure/src/main/resources/META-INF/services/io.deephaven.plugin.Plugin deleted file mode 100644 index 526c0b8b53f..00000000000 --- a/plugin/figure/src/main/resources/META-INF/services/io.deephaven.plugin.Plugin +++ /dev/null @@ -1 +0,0 @@ -io.deephaven.figure.FigureWidgetPlugin diff --git a/plugin/figure/src/main/resources/META-INF/services/io.deephaven.plugin.Registration b/plugin/figure/src/main/resources/META-INF/services/io.deephaven.plugin.Registration new file mode 100644 index 00000000000..10d2126487d --- /dev/null +++ b/plugin/figure/src/main/resources/META-INF/services/io.deephaven.plugin.Registration @@ -0,0 +1 @@ +io.deephaven.figure.FigureWidgetPluginRegistration diff --git a/plugin/src/main/java/io/deephaven/plugin/Plugin.java b/plugin/src/main/java/io/deephaven/plugin/Plugin.java index 62d11950fd5..b1d54497814 100644 --- a/plugin/src/main/java/io/deephaven/plugin/Plugin.java +++ b/plugin/src/main/java/io/deephaven/plugin/Plugin.java @@ -1,18 +1,17 @@ package io.deephaven.plugin; -import io.deephaven.plugin.type.ObjectTypePlugin; +import io.deephaven.plugin.type.ObjectType; /** - * The generic plugin interface which extends all of the specific plugin interfaces. + * A plugin is a structured extension point for user-definable behavior. * - * @see ObjectTypePlugin + * @see ObjectType */ -public interface Plugin extends ObjectTypePlugin { +public interface Plugin { - /** - * The generic registration entrypoint. - * - * @param callback the callback. - */ - void registerInto(PluginCallback callback); + > T walk(V visitor); + + interface Visitor { + T visit(ObjectType objectType); + } } diff --git a/plugin/src/main/java/io/deephaven/plugin/PluginBase.java b/plugin/src/main/java/io/deephaven/plugin/PluginBase.java deleted file mode 100644 index 60b5a4a7593..00000000000 --- a/plugin/src/main/java/io/deephaven/plugin/PluginBase.java +++ /dev/null @@ -1,19 +0,0 @@ -package io.deephaven.plugin; - -import io.deephaven.plugin.type.ObjectTypeCallback; - -/** - * The plugin base. Implementations should override the appropriate registration methods as necessary. - */ -public abstract class PluginBase implements Plugin { - - @Override - public final void registerInto(PluginCallback callback) { - registerInto((ObjectTypeCallback) callback); - } - - @Override - public void registerInto(ObjectTypeCallback callback) { - // override as necessary - } -} diff --git a/plugin/src/main/java/io/deephaven/plugin/PluginCallback.java b/plugin/src/main/java/io/deephaven/plugin/PluginCallback.java deleted file mode 100644 index e194b959849..00000000000 --- a/plugin/src/main/java/io/deephaven/plugin/PluginCallback.java +++ /dev/null @@ -1,12 +0,0 @@ -package io.deephaven.plugin; - -import io.deephaven.plugin.type.ObjectTypeCallback; - -/** - * The generic plugin callback interface which extends all of the specific plugin callback interfaces. - * - * @see ObjectTypeCallback - */ -public interface PluginCallback extends ObjectTypeCallback { - -} diff --git a/plugin/src/main/java/io/deephaven/plugin/Registration.java b/plugin/src/main/java/io/deephaven/plugin/Registration.java new file mode 100644 index 00000000000..384c2492d13 --- /dev/null +++ b/plugin/src/main/java/io/deephaven/plugin/Registration.java @@ -0,0 +1,24 @@ +package io.deephaven.plugin; + +/** + * The registration interface for plugins. + */ +public interface Registration { + + /** + * The registration entrypoint. + * + * @param callback the callback. + */ + void registerInto(Callback callback); + + interface Callback { + + /** + * Registers {@code plugin}. + * + * @param plugin the plugin + */ + void register(Plugin plugin); + } +} diff --git a/plugin/src/main/java/io/deephaven/plugin/type/ObjectType.java b/plugin/src/main/java/io/deephaven/plugin/type/ObjectType.java index cf2dcaa88cb..2a75d8bb961 100644 --- a/plugin/src/main/java/io/deephaven/plugin/type/ObjectType.java +++ b/plugin/src/main/java/io/deephaven/plugin/type/ObjectType.java @@ -1,5 +1,6 @@ package io.deephaven.plugin.type; +import io.deephaven.plugin.Plugin; import io.deephaven.plugin.type.ObjectType.Exporter.Reference; import io.deephaven.proto.backplane.grpc.Ticket; @@ -7,11 +8,9 @@ import java.io.OutputStream; /** - * An "object type" plugin information. Useful for serializing custom objects between the server / client. - * - * @see ObjectTypePlugin + * An "object type" plugin. Useful for serializing custom objects between the server / client. */ -public interface ObjectType { +public interface ObjectType extends Plugin { /** * The name of the object type. diff --git a/plugin/src/main/java/io/deephaven/plugin/type/ObjectTypeBase.java b/plugin/src/main/java/io/deephaven/plugin/type/ObjectTypeBase.java index 3d5526e433a..a42ab13e879 100644 --- a/plugin/src/main/java/io/deephaven/plugin/type/ObjectTypeBase.java +++ b/plugin/src/main/java/io/deephaven/plugin/type/ObjectTypeBase.java @@ -14,4 +14,9 @@ public final void writeTo(Exporter exporter, Object object, OutputStream out) th } writeToCompatibleObject(exporter, object, out); } + + @Override + public final > T walk(V visitor) { + return visitor.visit(this); + } } diff --git a/plugin/src/main/java/io/deephaven/plugin/type/ObjectTypeCallback.java b/plugin/src/main/java/io/deephaven/plugin/type/ObjectTypeCallback.java deleted file mode 100644 index d9472d5df89..00000000000 --- a/plugin/src/main/java/io/deephaven/plugin/type/ObjectTypeCallback.java +++ /dev/null @@ -1,14 +0,0 @@ -package io.deephaven.plugin.type; - -/** - * The registration interface for {@link ObjectType}. - */ -public interface ObjectTypeCallback { - - /** - * Registers {@code objectType}. - * - * @param objectType the object type - */ - void registerObjectType(ObjectType objectType); -} diff --git a/plugin/src/main/java/io/deephaven/plugin/type/ObjectTypePlugin.java b/plugin/src/main/java/io/deephaven/plugin/type/ObjectTypePlugin.java deleted file mode 100644 index 4559babc61b..00000000000 --- a/plugin/src/main/java/io/deephaven/plugin/type/ObjectTypePlugin.java +++ /dev/null @@ -1,14 +0,0 @@ -package io.deephaven.plugin.type; - -/** - * The plugin interface for registration of {@link ObjectType object types}. - */ -public interface ObjectTypePlugin { - - /** - * The registration entrypoint for {@link ObjectType object types}. - * - * @param callback the callback - */ - void registerInto(ObjectTypeCallback callback); -} diff --git a/plugin/src/main/java/io/deephaven/plugin/type/ObjectTypeRegistration.java b/plugin/src/main/java/io/deephaven/plugin/type/ObjectTypeRegistration.java new file mode 100644 index 00000000000..e34f9c6bcc0 --- /dev/null +++ b/plugin/src/main/java/io/deephaven/plugin/type/ObjectTypeRegistration.java @@ -0,0 +1,14 @@ +package io.deephaven.plugin.type; + +/** + * The {@link ObjectType} specific registration. + */ +public interface ObjectTypeRegistration { + + /** + * Register {@code objectType}. + * + * @param objectType the object type + */ + void register(ObjectType objectType); +} diff --git a/server/src/main/java/io/deephaven/server/plugin/PluginRegistrationVisitor.java b/server/src/main/java/io/deephaven/server/plugin/PluginRegistrationVisitor.java new file mode 100644 index 00000000000..3d79d921ce8 --- /dev/null +++ b/server/src/main/java/io/deephaven/server/plugin/PluginRegistrationVisitor.java @@ -0,0 +1,30 @@ +package io.deephaven.server.plugin; + +import io.deephaven.plugin.Plugin; +import io.deephaven.plugin.type.ObjectType; +import io.deephaven.plugin.type.ObjectTypeRegistration; + +import javax.inject.Inject; +import java.util.Objects; + +final class PluginRegistrationVisitor + implements io.deephaven.plugin.Registration.Callback, Plugin.Visitor { + + private final ObjectTypeRegistration objectTypeRegistration; + + @Inject + public PluginRegistrationVisitor(ObjectTypeRegistration objectTypeRegistration) { + this.objectTypeRegistration = Objects.requireNonNull(objectTypeRegistration); + } + + @Override + public void register(Plugin plugin) { + plugin.walk(this); + } + + @Override + public PluginRegistrationVisitor visit(ObjectType objectType) { + objectTypeRegistration.register(objectType); + return this; + } +} diff --git a/server/src/main/java/io/deephaven/server/plugin/PluginsAutoDiscovery.java b/server/src/main/java/io/deephaven/server/plugin/PluginsAutoDiscovery.java index 735ad0fcf1e..92e4fdcd4ca 100644 --- a/server/src/main/java/io/deephaven/server/plugin/PluginsAutoDiscovery.java +++ b/server/src/main/java/io/deephaven/server/plugin/PluginsAutoDiscovery.java @@ -4,9 +4,10 @@ import io.deephaven.base.log.LogOutputAppendable; import io.deephaven.internal.log.LoggerFactory; import io.deephaven.io.logger.Logger; -import io.deephaven.plugin.PluginCallback; +import io.deephaven.plugin.Plugin; +import io.deephaven.plugin.Registration; +import io.deephaven.plugin.Registration.Callback; import io.deephaven.plugin.type.ObjectType; -import io.deephaven.plugin.type.ObjectTypeCallback; import io.deephaven.server.console.ConsoleServiceGrpcImpl; import io.deephaven.server.plugin.java.JavaServiceLoader; import io.deephaven.server.plugin.python.PythonModuleLoader; @@ -16,23 +17,21 @@ import java.util.Objects; /** - * Provides a {@link #registerAll()} entrypoint for {@link io.deephaven.plugin.Plugin} auto-discovery. Logs - * auto-discovered details. + * Provides a {@link #registerAll()} entrypoint for {@link Registration} auto-discovery. Logs auto-discovered details. */ public final class PluginsAutoDiscovery { private static final Logger log = LoggerFactory.getLogger(PluginsAutoDiscovery.class); - private final ObjectTypeCallback types; + private final Registration.Callback callback; @Inject - public PluginsAutoDiscovery(ObjectTypeCallback types) { - this.types = Objects.requireNonNull(types); + public PluginsAutoDiscovery(Registration.Callback callback) { + this.callback = Objects.requireNonNull(callback); } /** - * Registers {@link io.deephaven.plugin.Plugin plugins} via - * {@link JavaServiceLoader#allRegisterInto(PluginCallback)} and - * {@link PythonModuleLoader#allRegisterInto(PluginCallback)} (if python is enabled). + * Registers {@link Registration plugins} via {@link JavaServiceLoader#allRegisterInto(Callback)} and + * {@link PythonModuleLoader#allRegisterInto(Callback)} (if python is enabled). */ public void registerAll() { registerAll(ConsoleServiceGrpcImpl.isPythonSession()); @@ -54,18 +53,24 @@ public void registerAll(boolean includePython) { } } - private class Counting implements PluginCallback, LogOutputAppendable { + private class Counting implements Registration.Callback, LogOutputAppendable, Plugin.Visitor { private int objectTypeCount = 0; @Override - public void registerObjectType(ObjectType objectType) { + public void register(Plugin plugin) { + plugin.walk(this); + } + + @Override + public Counting visit(ObjectType objectType) { log.info().append("Registering object type: ") .append(objectType.name()).append(" / ") .append(objectType.toString()) .endl(); - types.registerObjectType(objectType); + callback.register(objectType); ++objectTypeCount; + return this; } @Override diff --git a/server/src/main/java/io/deephaven/server/plugin/PluginsModule.java b/server/src/main/java/io/deephaven/server/plugin/PluginsModule.java index 3d001d1a0db..40d0a2d7f09 100644 --- a/server/src/main/java/io/deephaven/server/plugin/PluginsModule.java +++ b/server/src/main/java/io/deephaven/server/plugin/PluginsModule.java @@ -1,19 +1,23 @@ package io.deephaven.server.plugin; +import dagger.Binds; import dagger.Module; +import io.deephaven.plugin.Registration; +import io.deephaven.plugin.Registration.Callback; import io.deephaven.server.plugin.type.ObjectTypesModule; /** * Includes the {@link Module modules} necessary to provide {@link PluginsAutoDiscovery}. * *

- * Note: runtime plugin registration is not currently supported - ie, no {@link io.deephaven.plugin.PluginCallback} is - * provided. See deephaven-core#1809 for the - * feature request. + * Note: runtime plugin registration is not currently supported - ie, no {@link Callback} is provided. See + * deephaven-core#1809 for the feature request. * * @see ObjectTypesModule */ @Module(includes = {ObjectTypesModule.class}) public interface PluginsModule { + @Binds + Registration.Callback bindPluginRegistrationCallback(PluginRegistrationVisitor visitor); } diff --git a/server/src/main/java/io/deephaven/server/plugin/java/JavaServiceLoader.java b/server/src/main/java/io/deephaven/server/plugin/java/JavaServiceLoader.java index dcc5fc0b00d..78ccc5c5f7b 100644 --- a/server/src/main/java/io/deephaven/server/plugin/java/JavaServiceLoader.java +++ b/server/src/main/java/io/deephaven/server/plugin/java/JavaServiceLoader.java @@ -1,19 +1,19 @@ package io.deephaven.server.plugin.java; -import io.deephaven.plugin.Plugin; -import io.deephaven.plugin.PluginCallback; +import io.deephaven.plugin.Registration; +import io.deephaven.plugin.Registration.Callback; import java.util.ServiceLoader; public final class JavaServiceLoader { /** - * Registers all {@link Plugin plugins} found via {@link ServiceLoader#load(Class)}. + * Registers all {@link Registration plugins} found via {@link ServiceLoader#load(Class)}. * * @param callback the plugin callback */ - public static void allRegisterInto(PluginCallback callback) { - for (Plugin provider : ServiceLoader.load(Plugin.class)) { + public static void allRegisterInto(Callback callback) { + for (Registration provider : ServiceLoader.load(Registration.class)) { provider.registerInto(callback); } } diff --git a/server/src/main/java/io/deephaven/server/plugin/python/CallbackAdapter.java b/server/src/main/java/io/deephaven/server/plugin/python/CallbackAdapter.java index 7594f945857..e7767399e9d 100644 --- a/server/src/main/java/io/deephaven/server/plugin/python/CallbackAdapter.java +++ b/server/src/main/java/io/deephaven/server/plugin/python/CallbackAdapter.java @@ -1,18 +1,18 @@ package io.deephaven.server.plugin.python; -import io.deephaven.plugin.PluginCallback; +import io.deephaven.plugin.Registration.Callback; import org.jpy.PyObject; class CallbackAdapter { - private final PluginCallback callback; + private final Callback callback; - public CallbackAdapter(PluginCallback callback) { + public CallbackAdapter(Callback callback) { this.callback = callback; } @SuppressWarnings("unused") public void registerObjectType(String name, PyObject objectTypeAdapter) { - callback.registerObjectType(new ObjectTypeAdapter(name, objectTypeAdapter)); + callback.register(new ObjectTypeAdapter(name, objectTypeAdapter)); } } diff --git a/server/src/main/java/io/deephaven/server/plugin/python/PythonModuleLoader.java b/server/src/main/java/io/deephaven/server/plugin/python/PythonModuleLoader.java index 95ce994d0e9..dd89c4a9192 100644 --- a/server/src/main/java/io/deephaven/server/plugin/python/PythonModuleLoader.java +++ b/server/src/main/java/io/deephaven/server/plugin/python/PythonModuleLoader.java @@ -1,17 +1,17 @@ package io.deephaven.server.plugin.python; -import io.deephaven.plugin.Plugin; -import io.deephaven.plugin.PluginCallback; +import io.deephaven.plugin.Registration; +import io.deephaven.plugin.Registration.Callback; public final class PythonModuleLoader { /** - * Registers all {@link Plugin plugins} found via python entrypoints "deephaven.plugin". See the deephaven-plugin - * python package for more information. + * Registers all {@link Registration plugins} found via python entrypoints "deephaven.plugin". See the + * deephaven-plugin python package for more information. * * @param callback the plugin callback */ - public static void allRegisterInto(PluginCallback callback) { + public static void allRegisterInto(Callback callback) { try (final Module module = Module.of()) { module.all_plugins_register_into(new CallbackAdapter(callback)); } diff --git a/server/src/main/java/io/deephaven/server/plugin/type/ObjectTypes.java b/server/src/main/java/io/deephaven/server/plugin/type/ObjectTypes.java index e4bab851520..6f1cd948abd 100644 --- a/server/src/main/java/io/deephaven/server/plugin/type/ObjectTypes.java +++ b/server/src/main/java/io/deephaven/server/plugin/type/ObjectTypes.java @@ -1,7 +1,7 @@ package io.deephaven.server.plugin.type; import io.deephaven.plugin.type.ObjectType; -import io.deephaven.plugin.type.ObjectTypeCallback; +import io.deephaven.plugin.type.ObjectTypeRegistration; import io.deephaven.plugin.type.ObjectTypeClassBase; import io.deephaven.plugin.type.ObjectTypeLookup; @@ -18,14 +18,14 @@ import java.util.Set; /** - * Provides synchronized object type {@link ObjectTypeCallback registration} and {@link ObjectTypeLookup lookup}. + * Provides synchronized object type {@link ObjectTypeRegistration registration} and {@link ObjectTypeLookup lookup}. * *

* Object type registration that is an instances of {@link ObjectTypeClassBase} receives special consideration, and * these objects have more efficient lookups. */ @Singleton -public final class ObjectTypes implements ObjectTypeLookup, ObjectTypeCallback { +public final class ObjectTypes implements ObjectTypeLookup, ObjectTypeRegistration { private static final Set RESERVED_TYPE_NAMES_LOWERCASE = Set.of("table", "tablemap", "treetable", ""); @@ -55,7 +55,7 @@ public synchronized Optional findObjectType(Object object) { } @Override - public synchronized void registerObjectType(ObjectType objectType) { + public synchronized void register(ObjectType objectType) { final String name = objectType.name(); final String nameLowercase = name.toLowerCase(Locale.ENGLISH); if (SourceVersion.isKeyword(nameLowercase)) { diff --git a/server/src/main/java/io/deephaven/server/plugin/type/ObjectTypesModule.java b/server/src/main/java/io/deephaven/server/plugin/type/ObjectTypesModule.java index a51e7befce0..62009212ad8 100644 --- a/server/src/main/java/io/deephaven/server/plugin/type/ObjectTypesModule.java +++ b/server/src/main/java/io/deephaven/server/plugin/type/ObjectTypesModule.java @@ -2,11 +2,11 @@ import dagger.Binds; import dagger.Module; -import io.deephaven.plugin.type.ObjectTypeCallback; +import io.deephaven.plugin.type.ObjectTypeRegistration; import io.deephaven.plugin.type.ObjectTypeLookup; /** - * Binds {@link ObjectTypes} as {@link ObjectTypeLookup} and {@link ObjectTypeCallback}. + * Binds {@link ObjectTypes} as {@link ObjectTypeLookup} and {@link ObjectTypeRegistration}. */ @Module public interface ObjectTypesModule { @@ -15,5 +15,5 @@ public interface ObjectTypesModule { ObjectTypeLookup bindsLookup(ObjectTypes types); @Binds - ObjectTypeCallback bindsCallback(ObjectTypes types); + ObjectTypeRegistration bindsCallback(ObjectTypes types); } diff --git a/server/src/test/java/io/deephaven/server/object/ObjectServiceTest.java b/server/src/test/java/io/deephaven/server/object/ObjectServiceTest.java index 89c8b627359..2e741799a2e 100644 --- a/server/src/test/java/io/deephaven/server/object/ObjectServiceTest.java +++ b/server/src/test/java/io/deephaven/server/object/ObjectServiceTest.java @@ -2,9 +2,8 @@ import io.deephaven.engine.table.Table; import io.deephaven.engine.util.TableTools; -import io.deephaven.plugin.PluginBase; +import io.deephaven.plugin.Registration; import io.deephaven.plugin.type.ObjectType.Exporter.Reference; -import io.deephaven.plugin.type.ObjectTypeCallback; import io.deephaven.plugin.type.ObjectTypeClassBase; import io.deephaven.proto.backplane.grpc.FetchObjectRequest; import io.deephaven.proto.backplane.grpc.FetchObjectResponse; @@ -73,13 +72,13 @@ private void fetchMyObject(Ticket ticket, String expectedSomeString, int expecte assertThat(someTableTicket).containsExactly(response.getExportId(0).toByteArray()); } - public static class MyObjectPlugin extends PluginBase { + public static class MyObjectPlugin implements Registration { public static final String MY_OBJECT_TYPE_NAME = MyObject.class.getName(); @Override - public void registerInto(ObjectTypeCallback callback) { - callback.registerObjectType(new MyObjectType(MY_OBJECT_TYPE_NAME)); + public void registerInto(Callback callback) { + callback.register(new MyObjectType(MY_OBJECT_TYPE_NAME)); } } diff --git a/server/src/test/resources/META-INF/services/io.deephaven.plugin.Plugin b/server/src/test/resources/META-INF/services/io.deephaven.plugin.Registration similarity index 100% rename from server/src/test/resources/META-INF/services/io.deephaven.plugin.Plugin rename to server/src/test/resources/META-INF/services/io.deephaven.plugin.Registration From 965337b41e230d8c648a845fc8533e55dd8e9ae4 Mon Sep 17 00:00:00 2001 From: Devin Smith Date: Mon, 10 Jan 2022 09:07:21 -0800 Subject: [PATCH 20/62] Fix python, remove png --- m_figure.png | Bin 22382 -> 0 bytes .../deephaven2/server/plugin/__init__.py | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) delete mode 100644 m_figure.png diff --git a/m_figure.png b/m_figure.png deleted file mode 100644 index 3bbd156ce8b6130688a249660a1aa3414f101119..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22382 zcmd?Rhdh%YxO$xD>C|x?pW{7V^Z9(f-*FcVbtuVL$Pfgf)YHWnBM5#Ng5XV% z5X0Zd_K!@%4+ZZt=H3_GoV@+)Jg*|>?7ZD?x_RHcZqMm^)zj;`o9iiYS#c>*&THP@ z?p}%#61V>Q25~n}XNe)ZUk&gOQg_|UUI;>MhyIIKq*izxK}>(>VKhwqpRA1f1@&xC z9a|q9<@5Ur^?p`f@e(Jooko=lb*fBoPQV{7Ipx8^XiF zpCaEXgpQV$R*!<56MiJORsP@eYclEP=4R{qWNUk((N*aTiZ9R3(JN_Jr=PyX;wYUl zBz5wxloNlRKr6m3X1gxnxA3!bk7L@}+V*D4EUL-8W_yZ%8(=Ud!RAQZysBA+b^F%B zm&-^T)_~!EmXbN+?cnuH1ux=*z3te{O!g<4nH%3M-EyBkolah|sddLY*!>-O|33Zm z=g-%BPW4Ts*@X1>jlXoJekAKcj4(;r6FN#W!#@wjuiWun8J>jKo7?Z6`2FQze}8M~ zh75~ArsDD6OM|gz3nFT2RL~FE1~zGUQ-)@8SLT zj!bf{Y^UAE;wvj9i%f*0Vq&<(#aA1zZm*5sbNcwGxupdk4-e1$)itBk#)rih3tL7; z*y`%)wm$|Q{2rW~m{@OGTYzzsW*EfWJs~kB=l0=&&;{YtTAw9GWa6IMq58X!gNdoB z{G-PDgFioNgZKVuZC-VBoPW1{WcvO0BeQa=W|4||d_OQfNg&oxN@Q~`b$3gAv>?~^ennES;PuuSArHvMH2~K%=rtF|!q^gHI4)uq-OV_?U zqeOCGZHg`yQvKT8^!WShYS89KIRs&4Wktda3$^;PRH{OcLeMvpP*G_c8`CxZon?KZ zb&h6Wr|L*~_D*JXa3Kkg>_~w?icSnh%5{kP$J8 zSwyib`P%;dHM9QfSHScxIA{02@hfkdzyiRowQk>5cxISM=I6Jq6C$P+OVuur9TXw! z^38Un)?;^}prF9~U5Lu=pA~X)^1EjTSH|C|p|)hZGF>4KG2e1E=9D|}TfHAhGN?M-)BmFJc`caTNQUhD*YEtiyQ^kln57)|?r@hpl9;mOp(w_L2%nZY6|9I1iONz5 zG)-4^>S4kQbN|^!dLUzCV`B#kwL3@8Z$N{Pgzj&|hFEB5gioxkN$mXnOKMSON<*k2 z?>UV{)XiTwz7MV#ZwT~j9vs|mT`Zsk`ofvU(f67>CrNfMPEp@ zsS>k%&0qokVmI88zzSaiw!l&6YGPs%eH|8)5g|F+8$a6ma(EyMg9RHVlg@aqx%yVk z(yySfP;Gr~Vtl+bnMa2#D=Vu7oL@wA`?J0T>7PG;b}1SHe$#1cX>siO&>DT560+sy zk@a03BI_Fu+B}CeRlrI&`Gg$&Hj{B1W9w7hdmi#AA%W65^uWi_(UFsnZzgUN_K>Q% zxtWBF41ML4#eNiD6d)udoX^(5V48Y+sZNMnA;`6Ai?+_re807^ z^^J{wi4$yW@#R$}%Q%*vx6tPQ`uwfD*A7zI;UR8$n%Qu*bV z#KNg$Fx8SR7ja=>be#PqmqbV+!lpX!nF-Cc!v9gSp3c#^canxMw`KdC%V2p|U*F)G z&9P(0tQv!ubrRWbFAnnM33TG?IzGiGAP`ZeCLsy464%kz?jRVf^WWfRIepWAd~0ID z_F!MY=Wze_6Gb1g^78WICn;HE5M+9KdfrA$Jk3nd6cPUTThb=vFW-|VPm64I#I2ZBNa=tqEu}1>tC6%^Be0d>fH2Pe~?DSOsdJr$(`M$3X#mUm6a=H6@L3W9>K-B zXV11Yg%fbp^>T#nhl6weteeYf-T%8exv)U$<>e)M`Nh-Ek7*dl&J_HhC7fJn8E@_H zr|nZaQZ_BOii1GUv@}=|tDWDR#HDqzt~@R6#PF-@k<~7PKM%IYJ9D*SlQJ^mzQ1%{ zO6$K-JwH-+%5|(hPVYWHm!KfYw{PESJ!i;bs5z)I4Y!+C)aISfmJXQuhxoB-#ZWX? z+O-N_5#Z*=Z^~3V-J7Ly7uKFjT%3ya^vxz1;KoKLhr{mH!oB@RaYX@8;V>6(&h@p9 zkJ}t6%gP>C%q(xYQg<}Fv~>5SbKjWUK~Ki1-M>w(-P4h?M1+JBZE^JTLse5+gWJD< zM?=i=hJHc)b0^=RL#e!Yc!_iY-7V`~g0BwF>LAY~Kb z)R5g2KK+vY;cZVJpJ>Rgz1eD^-Ufo(8AP0kN{*Wp{%gh}2>C-3SG9}w4 zB%b*cv2$NmJM6jb)vM7bRRZSc1o-$SA<&z@zR8S!^k6Gf$xqeuho2kw`|j>i$%Ap7 zJ8NSf%LZ=rLkQJz9ULBJAt0t`3d19~0O>` zJqnJVgPcl$KzXC=o(Z{f63QY-NI4-EMn<%Z64n%uO~Lt)+D&50k)w`KKkKW7lzZE2 z_rOIbVmU%;-Nsga)EGew;~IwniimE?N9vz{Btx2!k%5l3@o?7#LNpq_w<+Z|-N>Tx zA*i*`K97%&C-W0jql(rHhX7y?qv-1C`FdV0cvl7@aA|#JdOA~WZLRH}EQznLue*mwb7SzHumP-g zNc0?hCDaz}F_f%HPo4yg`>wLj&O-b>J}Z=Z7N!Qd;6ZAtiZng#CF+xSywb)C3kzuB zl$W3Hu|A=3P$`_iA{#KFcwgXr$9c7bC>U2fhuTR)Lql|apTB&mvTG&on(;g2r+`or z8A-q>Zbf2gX=!e0nSbUk;3(v2-Wz5%3 zKodd#8y^=4j!&Rwgs61}?B~(xTX$fb4iin`>1v^>P=KJpZh5$xytugd((aqkqXWO5 zY&DLHg@$MD^PfXT6e0%8uP6m=_3P~HZ}xH2x^AzIZu}m!;Zam%fi$aWXh_v~bQt)x z!iGcOd{$6=!_hsc2YJ9>ZVkU`PM31HU~OH_F;`ylLq<-nQ(vMXYOQgPiYz+sY~jl_ zPcJVm$mrx-oo zdDp)@8>(^R=mnb{_k8K}5jWkuGvxJuhFwTVNt-`Dmh)I1lG=xwsP^_If0&Zoy1&1F zj?dCJcR#;Q7~;mL-*|4|_9~P+Wxoc`Vb1H-vnIvO>y5CN@bK}S@!x1aK?Ez_43QOT z)+g>TPO|R9Kqe*)ny6Q=WG35B*f6lMu@OR%lY4t}wgt+l)xb>1#w6gu5g8emqjS~C z$jPHMB8f?JbXw7QGpSXDpBfLK6yn&G9x3S7D#&05TOq|Yuv^ep^TJ} zS5hK}D5VKI8l|5muHwnWRBa))v%5=n?vV`bhYufwdjj`XYKZEr#MzYn*K_yQjtbp}BeM*4iF3O_WmWXYa+YdT6y`Wn~pLXdQS??dit`t$LG( zb+xtTP=`IWb#s##8XhKtj^u==r>F3N^;KtQa)-{u3e@>Dk$q z_VzQ&@+RjDpU8)U*-nKX?Qz6Vu?zdMaZ7vD6DMK2kp1;mYSj9(RfF3SH8FHeF3>h% zwl@3JU>k`bV|CPeObL%PX<$q)LU#o(%|3QRi^|bAK2!4k7!wzN%75J|nzZ0goE;u7 z+SM{K{`+1W)LL}iXR-I!>zgVFX6Lq z3xijdm(lTI;{*F6~&N%9wd?#ixaZTDcdRy1U8G z7NqDrFA3))5fl?U0|f*GA6h0R!S5Q%FqSL^a$8CvF)_$gkx)B9kJOgvU@R&oX6Ndf z2y2`7>Jf?-D2Xcd$Y#3XOMhU_iVhd5&pmyADS%VQ6TmxrGHc zCns{ssV9t+#9oK~(p%pZNxK%p120GlkSldwDZ?;L4tN78Czijztg>y!M?0$A++6v9 zEkW&gCcMDFK!}yr%l^buUCBI^uV0t<4+;tiH5VD>CnY6?eJMOY^>;42bN1t7mn~VC z!&8G7MC(vFU@EK|K0yhO_$7KDK)9C=+Ntb%PjR=j)Ft6vjA<#FOTqc>L9zFBX9>30 zq7`kT;f{D=&$qiB;$MFTN4 z^}R>C##n3@miJ0;=jP@g9@#?mWkG(u7ewyArr-N76r|BGFc5-MVYIdFTcSvr!1W0R z;}R008yXr8Cs$Su%qxUQ@bBn%yBrve4$2y4tFnV*cD}za&|hXLM{!b_NzQGI5SgBt zfdYvN46O~iF4_|(Vwab1Zmo^Kvp7XVo4oMmlF1z-5xOMLa|v#K1$WpxdG-D;?2WZBeB36Eic>5S=f*>4hpl(&H!Qz^mHgz?^U0H-nLjqf^c2PiN{c zJu`Em(ltw!pdEJ#HhCIE(rebBCsXMJbSK*0-ZG7Qt4ipEW_vPrXV6{+e28_fH&Y93 z;>3>8(q^12Gi=%!==9)QJH7v;Z2kJ0WED>a?|a6k?Xke~p$s%gOKYpg#?Ld*+^AL} zB__f}CMCo1*OR~|w~hd@hyknwf)nJj)W*PV*P)@Iks50Y3lB>tc<#a4b5&ZBUzPL<$qVq%<^KF* zs(Z_)c6N3+Wn>sS?{Rbv+Jq*US>G<`u)fHD|I$*ixz^XGdh|DkD)B->LL^U}TB%6I zVoT2N{^mBYx=(^IjeVeQ;90`5cD3pK;ZK6hgJz;ONVGK2_V|qlpFmqFr=D~!Uzz;V zzRTt#^|$E>j#0HikC*iDVa(2sKU!s4l>G@`DtP*oQ%Z^!i~ZErN9J<;(OZy>hg+c!o)t0oJrOioEiNI=_*K$)PKCVmA_ zq6sK^=jZ2RLqgnYTu0quOAa=>x^$7GeSw!Wv>A#TG?G^x=z5(_G!2+WuN{*M|7`H0 zv+zcOBRS_KSAac^XE{4Mn)q8^=IVw5bX{3el7>~zHR$=^!S)hZri|#pDFREn3QexG z$vus86Ryr&zPx(2?fkIOMr`kEiKeC<1kL6vhOMWL`Nz~RLD+AD9=}~hNJuWMYC1NH%Tf7<5RUZaoG62 z@6YiK#*zpTrZ3{i6-^b4A@3E@FxlzV&Vu6*oS(GGjE+_u9hxgb>@-+Rk&d@W4*PM{ zLfLYhXwCb&Ak1w_Z<{6Wg5bo&MA(xjY)DvY>TwD8GU5o%oZ4C@1qB6nclR(&qlRoR zzzzq_7t*iy4%6$tvyM`vdYG;xNk^tIPT$@JDM49zm2J4u62Ev?US58FTY{FB`884C zm&#LotY@RyHeo03R~s+urgXx40U%UXQJI{bjd}4xx@sz&0s_v-zdYR1bfHiB+Rc=D z@e$R9<9D>jsD2W2Bcfr|nzX`y8Y09pzdQ6lLO#ZXPMzaKWG?FL@VB?a}S7n7s-h3QXrnBafPf104Zu9pf;jm+) zYKvfb`qFz=5eCFP!9sLC>}BxKqZU9>VaBu5Gs;2rzZsB;QE|!*D+04*dZVlVHr8T9 zRJeWqc;^L+a;-vJzj#+xPG8;t1eekSZdhc7!9Y7x>wm0!y>1yKVA1Gp&Z1<*ZMsTz zgSCH9vAjCAv$r|2}sbyyChRUGLQs zEjX``4X=x+ZZTh1Is;R@ck6vP#eUFF;ht&f9*z-0S6|4rd7VwT`QMvy-#yo}|62x` zIB;#gHao}b$sJ%N8iua-RfR>m_$xjXGm3aBthenjE^1Xg{q(kIF_9-M^korsh-t=a zpFWK;zTAz`;-9kZ>%jiojp>&*hEwzHmX((>>|p-pLLXtt&;NVzRyTg77} zi!0Ic_Lh~>?pF9_5g02*)oQ^MkHbh=I2Z8e=jM)O z82FAmEDu%L>+o=Mm-wi$_qILCPvcC(+ax}%aYaW2eN6I}b1j>KCn3OxN6HEc%+Q}` z1160zfbBHdGqn29`c&p^f8$(g@&&<3d267_GcD zDr%lTPAWLC_(`FSJ^u$WmObu9`cv|W2B`5+4A|g_JgxNQnMf-D@2|-B>yj+7e&4bXr2g};jr7dD)d?Y6ME{{^_~XZ{Z~WH8eHp-fSnwfWj2>T+~S?Ix4J zUtSeeX{QDQHGS@!^BajH+Hqnd*kz$>$SDBwiiv=#AjJD5;RGBk&D7h;P_c>+- z09pEH9eHhxTHjm5{ng6Lk-ms!ze~Y{M#tpjy@hqY=lZo2brk7xl5{?7qF{@}iMV-S z`K&**LgoNx^1X%q_8WDkjxgLyx}$<$ZMW_aKDgmC&$5` zV`3zIR1TkV8tY4LR69y>vGr8azM#Th|3R5&68Z3L3(ldEt6PTKbJUp}UqMW$DZcnz$9lQRz+ z;bZi;aO;?Jw%dp4r8M3kxjyZ*-Q6KoT6FG2xYZ8d-AZF%>+Xpxi)KdmzQ7n9K$;e3 z7sS`5s=9Z^o9`lF3Ir^zeeD+07{{}?WuY+ma7lJ-`~eg?KU)4{@P1<}$T@v!|3+>0& zigykSs7xU8v(XV96Da_z!ThtDuu*3(N#{WYq^Yo>mBzHw8V2(LHyDiXf|C^gbHgZ3 zB+_Ch$L69Nd|@1JUFeMTG8o-N&#NDS|lZ+-&i?C$N&pu_^7tn@6Saw}I%bot9yG)fe5~nqD-j;R6 z>6Y+XA`(`$VMOGNoKT=|Y-}*81jwL`^VRN$D(;y>L*_$2ek^f}jjPf&KIknjZcTA4?8pj{&yq3EQYS`~mYrSJ#e5bEb9;Ai8W^pp zj8o3s0R00(&;q$l3YxB}d~n}5`E*}`mp^+EL^VK_(5R8^Mm$BNBe^Z0m6g}O@S~73 z2|0NyK=YE$y=>5)n=fC3c!6I&Gu}~qsWWGQbe{h5F|F)LW`1e5lm^nLitF6Quq*M; ztnQ{UamY&(lmpI?4O+@1@B7pJ;c2 zoU5Z+VR>V(*{NQ|L#slAx_JLZsNW3Cz1Y%R$6{*k^UYFRqo}ju_Z7`MhV$}(vtFTU z_rP6qrSCg5PYBAJ3qc6qx`6ZX^LE=AY(a0Al#z*-Ct7H6evG+?i*H*|(rye>WdogD zBux{Hs{T?Xn#_G;D6Ao9?H^C3KdnixbRJ-iaz~fT)5!NsgO}gZ#tW;Ha{axB)T znEj3u78uLzZ<*>AuC&U_qLOa5^yxx7ul1gVtG$QXAl1Bn4ga-(bF&p!>ps`H zi5sPKN_0lmxUbwzQ@dE<;5)*MGz?B9`MLHNADDUO* zRmFP^bDpR%LZ$W37)?abE!Is5QM(U_SLQLKCy0wJ*ZL0x@)8x?#}rPuG1#>%Vvwd! z&O!ZhCFQl@*c-T(Q18Qvv6yz5Jh6|S0(UUmdjBSxQ%ZbrA7chfJUEB5#1pK1v(&Em z1)u{X_UaOT^&TB_+vygHiSSLwqEiVU$LU;0Y8O zyeHB5N#Cv`g4~f2CS4ZhI(gE+?3@bBJ?;)#yBJv1nZ|mQCURMpX@r%^s)kn4I!aUh zG5G96M- z1r!@V=xg6!@Yy>!OioQ*TzJ8fK+KY$ePmT;s`mW^0CKV=IZr9vp6jZ66f=q~DNHq# zQ$iSWyb!-il9Qj$17JNNg1viJtI#kL8DSo|SURBk?KQ|M!hsn9g%TBjwCVu?iYUn( z5fO1V?cRS-SC1Mj*eXf}td%Lnk=LDBuYB25uaPWyk!kb?yHP?4X#^*h{ijDfs~iZKcFw;=R+%oFCg-G9S0lJ{$=F0PBD0*^3k zraNuwyK{ClaP#8U^(098DQBwJH^2Wf|8X0*y(+&oYmkXdzzEyOCF&8NY{LnTeZ$;@ z1jqHr6B=~on8#-dNH$)zI!i=(R66IyO1{Cb1v&t2dI5Ov>hAtBz5|l5Fa@t!eM0gcLezgA&Y}UBah42xhFK>6Eh#TAFX1WY zUd-B9gPn`ZU3vk-9P5SvT|+}{pe5WvCt=aua#uGF+g9^uo^RjzK(EWODKu72YcIwX z+?=3u+l@yVKRqiev8$_V?^&sdFvIcVaVVzMmJ-Cr!QpC1j2O%hh0WY6x&!X8ySK+9 zCAHDG;Njr`(ysCYb#R_LmS+mk_Ml)!(VN7x^)dV6UG})HYfPh8nqW9>pn5SfHpbVW zao<_DLrVs1LP9&}9|V1sVWo%w$*TFr`}0@Xk9Ch1Epi8}THsVQ_q2as zB@rbzgKg}97V?tf0SMqaf!1(QpoEq_=7_x>d#^8eoS;NpddekcK~1abmv z1+-O{B;Z;1ZM_S_czAe3MhLk{@L#-mk@WcS-M^c2chlpc_`R5ci^x2M>XEyyr_&GY z+qB&9dGkt6y}<_o!WvoMjHd#qZ2Ey>CnO?@qrZcqq01}I?(zrxH%*+(<$0l8$Peu1 zmNwVkes_KGYq7l!jF;ulW?boxN2nq)(H%ltwC2R)$<6)6o`L8B5K*@;7bni2!#D~9 zq-gs&<~|Z;bc=w7eO3s4j{^hIr{?C#p?_03QuSG+ZA_PN6K&OeE6Eo3PJ^@*?>?Jjgub=TCc36ar`Xs$~m{B}oR*r2qbK z=%Hd`yc#)@K75KWp@F@P665$2oMm=)*1io(3n?S8VDmOmw8MJ1)B#iClThYue@Aa8wfwVQ^C2@Ac{9rk-z>`5)?{TxhrC!CCg zG#i#B^Zl5hCM+S+_9I;19uMt&C}#QT)%A;AGoHY*=XuTbLa(58^QI^cb;5wB!6@o{t%NDri-2k3V&51gh8QGD{R z!s%G|eSt2ABZO99c({7A8oYAdL99`Et)JVf&Xb7zgm_e;z%g<@ZfRn@w9SplhmJ_o zk4%=FD_Us%qj$GI6F+3Bti~M(Uc^t8Q5;klsIJYpxD7b`c1lpi-SaLjVnF@sl~rt_ zhAY!xVu#x=xYG*0(qTsb2VP*`_0q4s{k1#SdAlND~rT_5xNUGLOKsBcvR<4LZ`s}9{kT= z0@!GSEM;bB$29%@<^QaXioi?UZ(=z~P*lzN1sND`3jl#RGN%@6PJ*YuIwGfLlMj<} z=xBoW5>>yLn=^&{ojFnE09&o{@E{{xEY2)9se64iN4NIJWq@n3woy}vVTLpjhyyx6 zaob<#bd+Tjo&IgeEG20OP{3n|5P$%uzdH{r0&7wRIS|r{t zo0l7DlioYpcXHD0*22A! zrnCbVuBHKPDF02E8JpgHd?ZT_qIOg&t3*bdY^3=3QkdS-d3;2>hFsk{Jr+8Xc@1*} z4@JH~1MwCJcx-uNL-n`{CY<=EvweAxGis}O4>&a@cVdAmtqQtZ8tv_NSOk~9HAVq%mv1})!* zi?`gMhMFI1P*U_+-0He2%R>3}hEMb{coJzu*vrdAJMQ|@zRw)Bijy1;q3-`t)Rw4? zxo7KL%F4aAyuxWM&s`#&!ATM^#Ff=i<g@?oMK$xEkz&I33h6PK2>Hi1Tr*w03 zo1U9%?d>feZUn+p%eZ`C(!Jwcn}9R=iEa~Qif2bn^$fTE7 zR`?DMZ+Yt=Yd#P(mPhL7mHbwtG;`H~qD6JxNl7$8hkxh%!6-r9rKyPzRQV@hpbuoq zOz(omZ4&CgNWg?NbBihy;bg$s_KU0-$6es_FjicIGtDdJA)xMUG$Nn2wp3 zq<-ZxPt2OQspIGk^|kHg%gnD`NAK|IKeX*kWQXFYskEZ;4(Os5EcZcfzy3j_Vgi5{ z>JdW?4Lm3n&FzMGO(q^P+o>TD6ey=f7EV`_4KQhm_EF>#G zRY5VfmPfIN0NQn1yK?`ohgb^M@plR9BsqnJ0^W-3#8hn9)>!I%Sk!H?FOW@u0#)`_ z0$sp%sgj-h0I_G#oShu}<>t^?e6x+ud9q@Q_0y==$*%EsmMdB+ z=u@zYf0DXypW{dtl74fsDJCj5DXz=>sf~oDl_%p*!>f~R1@&Z`n#wCQ?7oFtL~p*Y zYg0+z4mvvB!UK-GbuEIEbLNpn=-le}W&8u>3<~To4~%#Eu{SXRO+VhBZF`F0B}O|$ z`rI$1D2}mFxXQNh)_e1HNLGeb%tO3hEY+s^9F1S?chwzf7VduyvG#L=($-v{G}4|# zvkQIi65DZpZcOf_kVWo&2A-`*T-Q2QvPdvPpL`t!SEQwD^s9&bR8MS#-s>+E7aHt) zc_|~;VLel7H_K&$OoT7=BYpqD&f{=w7s>Rv_}f$3HlB=svbx(>UW9hcdsP|bd39wz zmbduk74td1wVI~C6@>_xi$?G%eV>i|?HN`3Ql4+H*Ox;HNdIp+56oXh&E`o9?7S2T z2{0#h*W95EUF>b@(GeeOYas9$@O!DTHSVw#9q`?wmXSNa9&Nk1^*;)Iy4Rl;bmoek zHRej7H)Vs@(~8E&3A&_lT_Dt=qaBdeph5X&FkY-$YV@lS?gQmI3LsFowsk6R=OjiJ zVD;j2LUn>Q72d2%hC&E8uz<{| zeR1VfRUlWo_`)N<$V9F0Y_a;=m~x;Y!vAQvR=%8I3dWcOqVFy-N`A%`*f+y1u0Z|{ z%sO{ATWWV%>|?*s5PQGf$!qlU_~c&E=)-Zyc9yZVhfs)8uycH)TJN0Z#quwGUN0}@ zE{*%Gp5FG0sEcseqD{tuRaxplL@60wMFRtsbuC`mYW9Xj(39sh^t0jR@L;P!JkP{_ z9Sku_T@>9B9~1mMUKc2Os-mTyliKnixe@-0dp!YOpT`3V?fde(&UyV_sJkP`HhF^C zXb!fSf&vK?3?}ZOpqrd{Lt_yHdX5b zR;d@Pb+DxIl!+5t{ynV034qWtUa>~A?E5ORf(<|%BPbXK1KoU8^J%>9$Jaqx+#7KK zzd`Rn{ST~~&s^^)53`&{A5C!4oPEN4B?M9JuhnzzVi;aMSO7=5&z|J8p~B=F@H`KN zcP;gmioWwKo^!f3!E&q*Rk>4?!8xVR0wVPFQuU$k_}?d*s1sjXT*8*a@a9$=`C!)E zt>^(UZLLyzchSv6(=X6S+TG+ zy$?jKBt!@LUP`9rUm=jg#NN&cPGSXfIs@zOs0{1gHG#?y#_O!wvOjdV6}~jOU|gQ< z>|z(w+q^nYw;2AK(#o!Q8YYCfha!Fynjs#{zM1c}_aWS>q}@$<5gOy-QDu~?U!;_$ zr2?DlEcj90iX7ldltJmAW_V!h`~e~X)w5CczbaGJUwvL-Q0F|eE3e5lm-!azi)eW6 zje&y4?Yl~T^wMq`wP4J|tEaJ4ztsmNsiXXdQ7_J8LFFB?XK4tZ^a)|m*m(Zx7E-Nl@&_IbIbQ2#DdFFyfB~nYPc+0D*}? zDNf(L-0SAhpr$LyRfhGR* z=|a%{Mkh8dj#iE-S@(0ri3M=o`Uhrq)|G{sU{SE%s26l$_1++mbx)w>FQ8K3<sB>>+kuKz_xEM+{rn*Ie%Y;F+2F=rob%@`^3z8Jc1{Yw zpCC|7L)kRVlXj_ept7b$2Q+1HsN@D0d;ga&3xsU%ywRK#L})qt(f&aBR2>E2n*Ds} zK8;L*lneFwN6p)AaU6K{X`mNH&xM(oL_tkv`X(Og5AFPZHM7!zRB;_g?5{ieQhsK_ zuQTiKJc$SmNxbCbsXW+pNliODGS#^40TivQyf(=Fl$1{|uIfK{@Sv%qgBY++O@vnDeSS;_EUxi`% z`ufRmpaewP&jAroJKW)ccER#G>2n-JSM!vb>%QIFM}Djvw+uVVPbnZ_Xt&SC9(9`1 z3V1}=QQmXPL_PTa*@l^lsKx_oM)BmW0c zw|Q*rBnVL8qdEZEwkK+DnI}4qv`teABtNtyMCRFkCY}$7Zuv51 zJnaZA1?W|gBT%59UnaqvKXb)6=KGI6+Zme-1TnKbuDZZ{2P(o4V^DIcBt0ePOqRL} zIrm--FOOyL+@k?hopaVea=EPMjG^{F!|&>HEY+9v=@x3s{D6<_yft^2C7-;;JR#~S z4KrngXsfMRNME_z#nL60W-@s4<*qj8(8WhnX3(vn9E-FqfNr8=X)$&03iDoB9n<$B8e18rX|?>T(VTk) zi=8KhD9czYD2n_&D+!eO0dOwm{PGIWn*eygoo8Je8yW}s6;O6`cSfnn*O5*Fp{p^dC zzuPV$VL+q-iIOjsodG zJu{(1k*tfdX23ZNWe2b$G(WG$UJh=hH5$|yv4xHL1zF(6WgrQTPU?0JD)r?)H8_@< z!A7qr+f;gM->y9AE((?Kf`+1q5oKSd69kfj&QKyKB9tK!g(Ll8!+H5&($y0H-+6^7 z#d2&HLb|ebyPin>=2*Us$raqJt6>9*Vph~b*#WQ91dm6WHfgichj|#vUkfMS2X+)K zuLhC;{M=a{{9>N%&Wxa_()qyHT!+fHUGIUrUWDP6KnJz+cUsn9Jb+B@&RMSecoJ$; zcenE*ZS#MIDgbA|F`j@e=?5j>j{8MANcu#GjC+m7&1@2=9dT=i)3pq!m(s7li)7y6 zJ`@Fr>w@q!(_pTub~R<#=XkBRAYQZsa|k%={NihRJr`+Q+Ajq8xX(uWLjWJxj5bOz z%q@^QV$K&mHMqMLa=yK#;kw`;DXNh3tl^}%IZIIY1oxOp2=W2=p`gqVV!iJ^89YFG)-tNRCdMRt03o{SK%U=JJoeiNe-@UgESx2K9C!I&GZo7Tx)oQZYFtR+w}# z2M?jRxf=OiN(0prYPN9R1y6HozI+hZ@bMZS820|9>3Vk9Yid>?Db%domsSZxE z=+5utrWT2RP63LDc-IqQRVz!aEmmA8dYmT!Osh%U*C(0=-~H)yq+Rh4mfK3UzT@tM zw};|TyPIEtO&ZMyBq=)Z%lhbAF-XyD3rr?}J=yToR}++fMGlP<38Q-6JNEAS==ZFK zKdpSZkepyGvz~eOm^X>0+yban&RR5#_crKXf|x@YyQ!SiX%Jv$fwhguN~q_&zfr^i zPXT%><<*tKmm8o4vic~2hiu(4KEdHj9Rms^G|XURV~LV@g@A@#P|I$4eSZ)^#ta{( z|J9TSNg-~hQTc7kQwZrkq-h)9B?^;6-%@~J!{Tv3`ln(%(NtVycp45*nfjT)UH?vq z^q8?5f}n8VTQ|a%#i6_CoY6}RQr?RUF0M}t2G6P~ z*vA1yMs?}yfYC`oM1E>@kpQt6^y}z3(Sjq@Ay9E|R3a&Q!s23`sKWf{PazPeKtSwN z21;7Tmvp1?MfVqP@S(`*(~JPGM3$9_jf{+Zf@5h<;HdJl`PKu#<yDGZ~HE7zX>;&Nq7Ap2_2;4@GUAg|BPXIpo_FOmj^qaf62qLkg)$f_jTn5z>QlBtB(co!b&?S3{zDfFL06YmmE zs<8a1aqB!h*fRoP<7`^-e>3yl$t_t~emD6z`m{B+s#~jTQA4VeB<|I;=+`q7WZ}=! zsv}KsNT~AGkJHOPYSzMMs1Xz4<0itF#Q5_AQy*NH@*BJ@I_8H5V%pb?PU&>?@sPEE zXc=t)v%JK&fGo2JxrzU17ZeqPvxs= zMIpxkb41SsxID&Xz1IEF>uB&OGnr89*I@b;FTsFw$0BX;l52F(&QDY7$!A|AK|pyD z!`#q%p)=gimLB|!mr=dMhluYg8oD2Hydlv*tZqI)6G@+rzv_A~@P*tZs-j^gr2y|u z<$rwNWen?u@&m_4BPVSO{u!BfC1PCGB_!CqRVIWA>X4?v?_{TJNOYD^y%vP16bL^h zMiHF0qy61Gpn@yX|A6AS5Ig)!9XS6JJ9H`FdmNyoo;*mKRyfM=R=SKzZQlcL{LuI0BTshGo*Dl_FRl1%E5}YnTj7=tg!Z}vi){tU24m?_ zpyEWrPKS%{Jol3idQyf#131R73Nfx0gx~>UT)X$--t&Y_%^%n}e5f^`c)*3-XL!~!Qg@pzeE4TV6f~u$3T+^=S%G{qSOAPlvs0)ys z`y>u?(uVf$q|i(W%YC`5w)fqCkub(XLo{s#l%K|JLY@Hh{M2a6U-P!tVWW}!(;^{g zVkaYAo9D;BvU)1S`ohsUX;avRVnB+fU>CY-jVKU+JDaw$a@}9Pq(Oa}Rz(aplk;6I zMfSm?h-w`P0%T;xB)wmR0(S@lU0$>k1)hI+Che(9`fFLDL2_9njH_=4HO|VHk|z|{ z;W3v47}Z;#``_``mj>{G0D+*<@w|~1r?f|%xP(+RjPBVNQuB?$GpL`ODX>8OJwdktZJK)JkfscGl)<=srK|!HdP4U*H zzJXRtb^<%QUNom+u|%JqT6KxFJxI{ofwmRl%qv#`y))0(Zfjf`chogU&Zz@0+P)_~ z@#D&zkwtlAK^;B_;=?A(_HCd2D?+gp6y!O{(6`2-MTLPW9+Gn|huo==hRRJq1ZTR* zx%PN6#%G|YsGAafc$k5wfv}bJYbgtMXNDjL#hy#T+p7aPd;*UH>ej{^+N`xdY%5Lb4omLab?E%jR|Q})5P$c#Xq)o#xMgm9 zC8?jSr;miw;8hMLC03=a zq0~>OmNMr+KppwnAdxf^e*+@Yf81${0s1bEwEt<1Wq&EYH~S@ZdrFVjrtal|^P&RR z>+^*BSDw2}|Au|hweS~Qkb*;UEg;1|g0rXP$%B_YISJmIeFc+mU2dG*S*Uh4KZLgy z4X=|-IHXHoCF3`IQiMz6PYFXlsW3TtGLJ0`Lpov{XbgrCr<`VN>ID6Mj`6_0c_19l z=n0X^>#&K1XFQE742y%GyxO025I7{A{OD0hC|oj<*w%)TS5Ro~?9^#<1f#;pLb_Rp z)x9>}*l_rFbZHL`)yIJB=FS6P!?8t9fK$A78KgpWG?D0Em~Q<4pVNh+7#-37I=1_N z{xx|^AY8fZZ8mqFY3Uh5Xwxv4e71uvKV%bk;O{Vyk-^1XAY9@WK#%HnUb=7r0cB~G z16Gq?x9(7tFVipc~j^Kuw91vEaXJdzwDL%uE2cPnFsQqu>*5JQy2lpx1>qzTX zRaIU4_M91xiKB(%SVJHxnYHhfHb+HL!2E@*e+SeCy{ZTP(jV}p2m^k!ylYFePXfM& zIK#knl9qvi*H<*s2Tu4?FiR8m_Vz;Ag8>>g@uZ5duju_2{A;%Vx!%AYR1YZo#v*$o z3T}1a77)-`zD8UKtUKJH&;sL@@MVa64RWG*b|psOeOus803%b=7|=iE6cy>hdy8R> z(`8*4>FDU(x8{w!ftiN;URr?aYfE&h1XeEsrVKl+xhzO52FEht#)B_va3d1vJ0iW8 zzKOkZ9c2MI0;*m!Ha13eHR!DX%h&j$Tbr2D;f|#oIJ&d5`gRQ&`CD%XOkMro*~jV1 zw_kKEP^7`!VbW+_UzN{PKQdxfTUTcXdL#eUx;Z#Z%>XyOtiuUTTabL&>qyB*M@L`# z{FHRIFZ&)`48Z_*GIhZ94Q+{6-Qg)QaH|0*h>T#IZg3=6-hBc&+?k@T%1@U$i6_HZ zP*4B}mpW+Jw!TbzDgYH41;px|^mqe3z~aJ`3Sv$gmJZkhn<*$Ptl9lgtUb{o3GE=z zn*nwj&ZH`Z9x6kOLvIH_PYc6!8|Z#p*0`R5YoGcnY}8=vT+-5XYWwSvLsbS;j*vCP*!a?-P8wOBFnOEB4!D00NXXjWM7#OhZA1C1MBs|o{ z0Ir1VJfs4)uA!G^z&z-c9_dNZDSg>j zkA=^C^}oMa0^=$G_vyeUtb-_V>nIV6RR>@WJ;e$a$^7~p5!%1teQo%akW=pyQUs1m zV>~^j;UW$!NX+7%^m+ruhzH{YW>g*AH+tdw_wVcL>oh{gGwuM{Xa{n?p@u-Y#cyRI zzHE`tOoWZzg#=^HoZ*6o54BtnVu^qYq`;YVINT|7{WGDHlM@{HMMo*+w`v8)`Zdrq z{{1-$^73$*6tV8PbH~BcH@3Fw|DRg!HKwUEj05<|*eI!JhnJv}OQnKqWr0D0lU6Fo zWr`C=1e_Y7zyu^HactvK?iAV#*}{T41eO6CNMX=yB*M6c2#hwPwqw)}!eFvdxye={ z)*|~qn0?#)wvPmw9?p5s`<(N>|L3>#X$v%=8n4z1?s?XMw@$eT1Z*VMbYXg9nxQ?} zzExbi&&}o~kO?L4-1M2kO;WP)Qc_xmM*iSBJ7KZE(V*g$mzP5sYRsh&K1ND#Y^)1Z zDTCeSGZM)jolf_w(a6U|(PJ(4X>pV9$BPaKCB@*Jt2`uWW6LdYbu_4~CS1j-t zk~A<&d`4|zz`vsKi2|iksa3^=NU)oY5zMBBy@|}ZH&k&u>wzxWpvV=3-`b98i)Xvj z^YF%HyVh?8N+5%J_m9wlP66~(UwLcG3-O5;S26l+rW~f*VYkosczA>n@i6u;lYD6a zUB%{tl*GrVV}*rvF?igUOB8JhfKk)$Qi0hN}_8j8olscTNF?k{A;VS>8-m^V7!{GJth%<;X} z%t=h>ySy(DpJeFD@b>cZ@|3PVY8dH+NkID@tMlKDrkYJjbj6*sO?DVx=+Xk!N67&BLqi9kVMyZQ>T;!KV*`G+ zVr-rL925#gB9dm*pMw)Dx|@vGBR*|K3V@>BM(zp`37k!*4hz0Rm9v%!w@3m2(T2kb zK{?J7zTbi!0i@vuKuS@64o%&C)pI5R@49+_Rk-zHRdA0I5grB(ix`~1yX%P04g#29 z7+^L22u%Yc$j91DUGDlbQgxiOqF==^K#OvzBZqL$k>VJjQgoE(vsWVay1JqtX(4}( zC@UCqzSGmwZ5PJ`U6w!9=8S}&s`^nAJ(GWNPtVG-V(_?N*4n~S8y*=c;M$n=!}y2I zPZk#!DeEfRWG`??vK$Z!g}4*R7wY@OqenhFn@B1Gf}Iifb_527(Y9piAj?@wP8!h^ zK0ZFHh+!`ynG%C(oO5mnP6t-V27#Cq0T_t`pJdMP^Yg=OaO1#br{Jrv$sRn22cG!b zSGyo(l%ULSglh2blCJ^H3dx-ly&6bAZ-OgCgB1Bm2&vC{#ot}?h%Uo^loje?`fMjg@*qSgEovqv z+}Q>q6OFpBNwx|I2%xhjeKK>Mb3ZaQ)sr4Eux98)wFndBGM--|PybHF65_>jq;gvcpGp2+}YcU1M3D;hr1A|Sn(0b)O>|5q2a=PCJ#1#Au6EFsH diff --git a/pyintegration/deephaven2/server/plugin/__init__.py b/pyintegration/deephaven2/server/plugin/__init__.py index c24ae55f97b..90eeef82b74 100644 --- a/pyintegration/deephaven2/server/plugin/__init__.py +++ b/pyintegration/deephaven2/server/plugin/__init__.py @@ -1,6 +1,6 @@ import jpy -PluginCallback = jpy.get_type('io.deephaven.plugin.PluginCallback') +RegistrationCallback = jpy.get_type('io.deephaven.plugin.Registration$Callback') Exporter = jpy.get_type('io.deephaven.plugin.type.ObjectType$Exporter') DEEPHAVEN_PLUGIN_ENTRY_KEY = 'deephaven.plugin' @@ -19,7 +19,7 @@ def get_plugin_entrypoints(name: str): from importlib.metadata import entry_points return entry_points(group=DEEPHAVEN_PLUGIN_ENTRY_KEY, name=name) or [] -def all_plugins_register_into(callback: PluginCallback): +def all_plugins_register_into(callback: RegistrationCallback): callback_adapter = CallbackAdapter(callback) for entrypoint in get_plugin_entrypoints(DEEPHAVEN_PLUGIN_REGISTER_NAME): plugin_register_into = entrypoint.load() @@ -27,7 +27,7 @@ def all_plugins_register_into(callback: PluginCallback): # TODO(deephaven-core#1791): CallbackAdapter implements CallbackABC class CallbackAdapter: - def __init__(self, callback: PluginCallback): + def __init__(self, callback: RegistrationCallback): self._callback = callback # TODO(deephaven-core#1791): type hint object_type as ObjectTypeABC From e12c2f8e1409c775deddf20cbc07983237f1e9b6 Mon Sep 17 00:00:00 2001 From: Devin Smith Date: Mon, 10 Jan 2022 09:22:17 -0800 Subject: [PATCH 21/62] Ryan's suggestions --- .../main/java/io/deephaven/client/impl/FetchedObject.java | 7 +++++++ .../main/java/io/deephaven/plugin/type/ObjectTypeBase.java | 4 ++-- .../java/io/deephaven/plugin/type/ObjectTypeClassBase.java | 2 +- .../deephaven/server/plugin/python/ObjectTypeAdapter.java | 2 +- 4 files changed, 11 insertions(+), 4 deletions(-) diff --git a/java-client/session/src/main/java/io/deephaven/client/impl/FetchedObject.java b/java-client/session/src/main/java/io/deephaven/client/impl/FetchedObject.java index 13a4582732c..404caf435fc 100644 --- a/java-client/session/src/main/java/io/deephaven/client/impl/FetchedObject.java +++ b/java-client/session/src/main/java/io/deephaven/client/impl/FetchedObject.java @@ -13,6 +13,13 @@ public final class FetchedObject { private final ByteString bytes; private final List exportIds; + /** + * Constructs a new instance. Callers should not modify {@code exportIds} after construction. + * + * @param type the type + * @param bytes the bytes + * @param exportIds the export ids + */ FetchedObject(String type, ByteString bytes, List exportIds) { this.type = Objects.requireNonNull(type); this.bytes = Objects.requireNonNull(bytes); diff --git a/plugin/src/main/java/io/deephaven/plugin/type/ObjectTypeBase.java b/plugin/src/main/java/io/deephaven/plugin/type/ObjectTypeBase.java index a42ab13e879..4437e878837 100644 --- a/plugin/src/main/java/io/deephaven/plugin/type/ObjectTypeBase.java +++ b/plugin/src/main/java/io/deephaven/plugin/type/ObjectTypeBase.java @@ -5,14 +5,14 @@ public abstract class ObjectTypeBase implements ObjectType { - public abstract void writeToCompatibleObject(Exporter exporter, Object object, OutputStream out) throws IOException; + public abstract void writeCompatibleObjectTo(Exporter exporter, Object object, OutputStream out) throws IOException; @Override public final void writeTo(Exporter exporter, Object object, OutputStream out) throws IOException { if (!isType(object)) { throw new IllegalArgumentException("Can't serialize object, wrong type: " + this + " / " + object); } - writeToCompatibleObject(exporter, object, out); + writeCompatibleObjectTo(exporter, object, out); } @Override diff --git a/plugin/src/main/java/io/deephaven/plugin/type/ObjectTypeClassBase.java b/plugin/src/main/java/io/deephaven/plugin/type/ObjectTypeClassBase.java index ba165af0481..4ee6b6e5ee4 100644 --- a/plugin/src/main/java/io/deephaven/plugin/type/ObjectTypeClassBase.java +++ b/plugin/src/main/java/io/deephaven/plugin/type/ObjectTypeClassBase.java @@ -35,7 +35,7 @@ public final boolean isType(Object object) { } @Override - public final void writeToCompatibleObject(Exporter exporter, Object object, OutputStream out) throws IOException { + public final void writeCompatibleObjectTo(Exporter exporter, Object object, OutputStream out) throws IOException { // noinspection unchecked writeToImpl(exporter, (T) object, out); } diff --git a/server/src/main/java/io/deephaven/server/plugin/python/ObjectTypeAdapter.java b/server/src/main/java/io/deephaven/server/plugin/python/ObjectTypeAdapter.java index bcdcf3b1bb2..3a1ca066ee9 100644 --- a/server/src/main/java/io/deephaven/server/plugin/python/ObjectTypeAdapter.java +++ b/server/src/main/java/io/deephaven/server/plugin/python/ObjectTypeAdapter.java @@ -31,7 +31,7 @@ public boolean isType(Object object) { } @Override - public void writeToCompatibleObject(Exporter exporter, Object object, OutputStream out) throws IOException { + public void writeCompatibleObjectTo(Exporter exporter, Object object, OutputStream out) throws IOException { final byte[] bytes = objectTypeAdapter.call(byte[].class, "to_bytes", Exporter.class, exporter, PyObject.class, (PyObject) object); From f66297a492149e2c74fae13c3376fa77de07450f Mon Sep 17 00:00:00 2001 From: Devin Smith Date: Mon, 10 Jan 2022 09:22:49 -0800 Subject: [PATCH 22/62] Remove matplotlib plugin installation --- docker/server/src/main/docker/Dockerfile | 6 ------ 1 file changed, 6 deletions(-) diff --git a/docker/server/src/main/docker/Dockerfile b/docker/server/src/main/docker/Dockerfile index ba65b3aea6e..7a3aaa67914 100644 --- a/docker/server/src/main/docker/Dockerfile +++ b/docker/server/src/main/docker/Dockerfile @@ -1,12 +1,6 @@ ARG BASE FROM $BASE as install -# To test out the deephaven-plugin-matplotlib, uncomment the following: -RUN set -eux; \ - python3 -m pip install -q --no-cache-dir \ - importlib-metadata \ - https://github.com/deephaven/deephaven-plugin-matplotlib/releases/download/v0.0.1.dev2/deephaven_plugin_matplotlib-0.0.1.dev2-py3-none-any.whl - COPY licenses/ / # Note: all of the pip installs have the --no-index flag, with the expectation that all external dependencies are From 7dbc3b0e4d10374acc5254657581009543bc21d8 Mon Sep 17 00:00:00 2001 From: Devin Smith Date: Mon, 10 Jan 2022 11:59:01 -0800 Subject: [PATCH 23/62] Implement support for the ABC released deephaven-plugin. In your environment, you can run `pip install deephaven-plugin-matplotlib` --- .../deephaven2/server/plugin/__init__.py | 74 +++---------------- .../server/plugin/object/__init__.py | 32 ++++++++ .../deephaven2/server/plugin/register.py | 28 +++++++ .../server/plugin/python/Module.java | 2 +- .../plugin/python/PythonModuleLoader.java | 4 +- 5 files changed, 75 insertions(+), 65 deletions(-) create mode 100644 pyintegration/deephaven2/server/plugin/object/__init__.py create mode 100644 pyintegration/deephaven2/server/plugin/register.py diff --git a/pyintegration/deephaven2/server/plugin/__init__.py b/pyintegration/deephaven2/server/plugin/__init__.py index 90eeef82b74..d0388a66b98 100644 --- a/pyintegration/deephaven2/server/plugin/__init__.py +++ b/pyintegration/deephaven2/server/plugin/__init__.py @@ -1,64 +1,14 @@ import jpy -RegistrationCallback = jpy.get_type('io.deephaven.plugin.Registration$Callback') -Exporter = jpy.get_type('io.deephaven.plugin.type.ObjectType$Exporter') - -DEEPHAVEN_PLUGIN_ENTRY_KEY = 'deephaven.plugin' -DEEPHAVEN_PLUGIN_REGISTER_NAME = 'register_into' - -def get_plugin_entrypoints(name: str): - import sys - if sys.version_info < (3, 8): - # TODO(deephaven-base-images#6): Add importlib-metadata backport install for future server plugin support - # We can remove the exception handling once above gets merged in - try: - from importlib_metadata import entry_points - except ImportError: - return [] - else: - from importlib.metadata import entry_points - return entry_points(group=DEEPHAVEN_PLUGIN_ENTRY_KEY, name=name) or [] - -def all_plugins_register_into(callback: RegistrationCallback): - callback_adapter = CallbackAdapter(callback) - for entrypoint in get_plugin_entrypoints(DEEPHAVEN_PLUGIN_REGISTER_NAME): - plugin_register_into = entrypoint.load() - plugin_register_into(callback_adapter) - -# TODO(deephaven-core#1791): CallbackAdapter implements CallbackABC -class CallbackAdapter: - def __init__(self, callback: RegistrationCallback): - self._callback = callback - - # TODO(deephaven-core#1791): type hint object_type as ObjectTypeABC - def register_object_type(self, object_type): - self._callback.registerObjectType(object_type.name, ObjectTypeAdapter(object_type)) - - def __str__(self): - return str(self._callback) - -# TODO(deephaven-core#1791): ExporterAdapter implements ExporterABC -class ExporterAdapter: - def __init__(self, exporter: Exporter): - self._exporter = exporter - - def new_server_side_reference(self, object): - # TODO(deephaven-core#1791): define and use ReferenceABC - raise NotImplementedError - - def __str__(self): - return str(self._exporter) - -class ObjectTypeAdapter: - # TODO(deephaven-core#1791): type hint user_object_type as ObjectTypeABC - def __init__(self, user_object_type): - self._user_object_type = user_object_type - - def is_type(self, object): - return self._user_object_type.is_type(object) - - def to_bytes(self, exporter: Exporter, object): - return self._user_object_type.to_bytes(ExporterAdapter(exporter), object) - - def __str__(self): - return str(self._user_object_type) +_JCallbackAdapter = jpy.get_type('io.deephaven.server.plugin.python.CallbackAdapter') + +def register_all_into(callback: _JCallbackAdapter): + try: + from .register import register_all_into + except ModuleNotFoundError as e: + # deephaven.plugin is an optional dependency, so if it can't be found, there are no Deephaven python plugins + # to register + if e.name == 'deephaven.plugin': + return + raise e + register_all_into(callback) diff --git a/pyintegration/deephaven2/server/plugin/object/__init__.py b/pyintegration/deephaven2/server/plugin/object/__init__.py new file mode 100644 index 00000000000..1291418d740 --- /dev/null +++ b/pyintegration/deephaven2/server/plugin/object/__init__.py @@ -0,0 +1,32 @@ +# todo handle gracefully when not present + +import jpy +from deephaven.plugin.object import Exporter, ObjectType, Reference + +_JExporter = jpy.get_type('io.deephaven.plugin.type.ObjectType$Exporter') + +class ExporterAdapter(Exporter): + def __init__(self, exporter: _JExporter): + self._exporter = exporter + + def new_server_side_reference(self, object) -> Reference: + # todo: unwrap_to_java_type(object)? + _reference = self._exporter.newServerSideReference(object) + return Reference(_reference.id().toByteArray()) + + def __str__(self): + return str(self._exporter) + +# see io.deephaven.server.plugin.python.ObjectTypeAdapter for calling details +class ObjectTypeAdapter: + def __init__(self, user_object_type: ObjectType): + self._user_object_type = user_object_type + + def is_type(self, object): + return self._user_object_type.is_type(object) + + def to_bytes(self, exporter: _JExporter, object): + return self._user_object_type.to_bytes(ExporterAdapter(exporter), object) + + def __str__(self): + return str(self._user_object_type) diff --git a/pyintegration/deephaven2/server/plugin/register.py b/pyintegration/deephaven2/server/plugin/register.py new file mode 100644 index 00000000000..1599de6606f --- /dev/null +++ b/pyintegration/deephaven2/server/plugin/register.py @@ -0,0 +1,28 @@ +import jpy +import deephaven.plugin + +from typing import Union, Type +from deephaven.plugin import Plugin, Registration +from deephaven.plugin.object import ObjectType +from .object import ObjectTypeAdapter + +_JCallbackAdapter = jpy.get_type('io.deephaven.server.plugin.python.CallbackAdapter') + +def register_all_into(callback: _JCallbackAdapter): + deephaven.plugin.register_all_into(RegistrationAdapter(callback)) + +class RegistrationAdapter(Registration.Callback): + def __init__(self, callback: _JCallbackAdapter): + self._callback = callback + + def register(self, plugin: Union[Plugin, Type[Plugin]]): + if isinstance(plugin, type): + # If registering a class, instantiate it before adapting it and passing to java + plugin = plugin() + if isinstance(plugin, ObjectType): + self._callback.registerObjectType(plugin.name, ObjectTypeAdapter(plugin)) + else: + raise NotImplementedError + + def __str__(self): + return str(self._callback) diff --git a/server/src/main/java/io/deephaven/server/plugin/python/Module.java b/server/src/main/java/io/deephaven/server/plugin/python/Module.java index b455713fc2c..7f7c27330cb 100644 --- a/server/src/main/java/io/deephaven/server/plugin/python/Module.java +++ b/server/src/main/java/io/deephaven/server/plugin/python/Module.java @@ -15,7 +15,7 @@ static Module of() { return (Module) module.createProxy(CallableKind.FUNCTION, Module.class); } - void all_plugins_register_into(CallbackAdapter callback); + void register_all_into(CallbackAdapter callback); @Override void close(); diff --git a/server/src/main/java/io/deephaven/server/plugin/python/PythonModuleLoader.java b/server/src/main/java/io/deephaven/server/plugin/python/PythonModuleLoader.java index dd89c4a9192..932f1b0ecff 100644 --- a/server/src/main/java/io/deephaven/server/plugin/python/PythonModuleLoader.java +++ b/server/src/main/java/io/deephaven/server/plugin/python/PythonModuleLoader.java @@ -6,14 +6,14 @@ public final class PythonModuleLoader { /** - * Registers all {@link Registration plugins} found via python entrypoints "deephaven.plugin". See the + * Registers all {@link Registration plugins} found via python method "deephaven.plugin:register_all_into". See the * deephaven-plugin python package for more information. * * @param callback the plugin callback */ public static void allRegisterInto(Callback callback) { try (final Module module = Module.of()) { - module.all_plugins_register_into(new CallbackAdapter(callback)); + module.register_all_into(new CallbackAdapter(callback)); } } } From de915100306cb5b538c6966f1e0cfabaaa0305e4 Mon Sep 17 00:00:00 2001 From: Devin Smith Date: Tue, 11 Jan 2022 08:32:41 -0800 Subject: [PATCH 24/62] remove old comment --- pyintegration/deephaven2/server/plugin/object/__init__.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/pyintegration/deephaven2/server/plugin/object/__init__.py b/pyintegration/deephaven2/server/plugin/object/__init__.py index 1291418d740..1b822071ae8 100644 --- a/pyintegration/deephaven2/server/plugin/object/__init__.py +++ b/pyintegration/deephaven2/server/plugin/object/__init__.py @@ -1,5 +1,3 @@ -# todo handle gracefully when not present - import jpy from deephaven.plugin.object import Exporter, ObjectType, Reference From 49577a0820aa1d3342713aac07228f86206bb40f Mon Sep 17 00:00:00 2001 From: Devin Smith Date: Tue, 11 Jan 2022 11:21:20 -0800 Subject: [PATCH 25/62] Use python native array, not java byte array --- pyintegration/deephaven2/server/plugin/object/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyintegration/deephaven2/server/plugin/object/__init__.py b/pyintegration/deephaven2/server/plugin/object/__init__.py index 1b822071ae8..e5828aeda81 100644 --- a/pyintegration/deephaven2/server/plugin/object/__init__.py +++ b/pyintegration/deephaven2/server/plugin/object/__init__.py @@ -10,7 +10,7 @@ def __init__(self, exporter: _JExporter): def new_server_side_reference(self, object) -> Reference: # todo: unwrap_to_java_type(object)? _reference = self._exporter.newServerSideReference(object) - return Reference(_reference.id().toByteArray()) + return Reference(bytes(_reference.id().toByteArray())) def __str__(self): return str(self._exporter) From 3f0e0dfffd5a96ddc626cf8ab2baa0a6d4b62ac2 Mon Sep 17 00:00:00 2001 From: Devin Smith Date: Mon, 1 Nov 2021 14:25:23 -0700 Subject: [PATCH 26/62] Ensure that python native objects can be exported --- .../server/plugin/object/__init__.py | 12 +++++---- .../server/plugin/python/ExporterAdapter.java | 25 +++++++++++++++++++ .../plugin/python/ObjectTypeAdapter.java | 2 +- 3 files changed, 33 insertions(+), 6 deletions(-) create mode 100644 server/src/main/java/io/deephaven/server/plugin/python/ExporterAdapter.java diff --git a/pyintegration/deephaven2/server/plugin/object/__init__.py b/pyintegration/deephaven2/server/plugin/object/__init__.py index e5828aeda81..2900bb89fed 100644 --- a/pyintegration/deephaven2/server/plugin/object/__init__.py +++ b/pyintegration/deephaven2/server/plugin/object/__init__.py @@ -1,15 +1,17 @@ import jpy from deephaven.plugin.object import Exporter, ObjectType, Reference -_JExporter = jpy.get_type('io.deephaven.plugin.type.ObjectType$Exporter') +_JExporterAdapter = jpy.get_type('io.deephaven.server.plugin.python.ExporterAdapter') class ExporterAdapter(Exporter): - def __init__(self, exporter: _JExporter): + def __init__(self, exporter: _JExporterAdapter): self._exporter = exporter def new_server_side_reference(self, object) -> Reference: - # todo: unwrap_to_java_type(object)? - _reference = self._exporter.newServerSideReference(object) + if isinstance(object, jpy.JType): + _reference = self._exporter.newServerSideReference(object) + else: + _reference = self._exporter.newServerSideReferencePyObject(object) return Reference(bytes(_reference.id().toByteArray())) def __str__(self): @@ -23,7 +25,7 @@ def __init__(self, user_object_type: ObjectType): def is_type(self, object): return self._user_object_type.is_type(object) - def to_bytes(self, exporter: _JExporter, object): + def to_bytes(self, exporter: _JExporterAdapter, object): return self._user_object_type.to_bytes(ExporterAdapter(exporter), object) def __str__(self): diff --git a/server/src/main/java/io/deephaven/server/plugin/python/ExporterAdapter.java b/server/src/main/java/io/deephaven/server/plugin/python/ExporterAdapter.java new file mode 100644 index 00000000000..fee29772a98 --- /dev/null +++ b/server/src/main/java/io/deephaven/server/plugin/python/ExporterAdapter.java @@ -0,0 +1,25 @@ +package io.deephaven.server.plugin.python; + +import io.deephaven.plugin.type.ObjectType.Exporter; +import io.deephaven.plugin.type.ObjectType.Exporter.Reference; +import org.jpy.PyObject; + +import java.util.Objects; + +final class ExporterAdapter { + + private final Exporter exporter; + + public ExporterAdapter(Exporter exporter) { + this.exporter = Objects.requireNonNull(exporter); + } + + public Reference newServerSideReference(Object object) { + return exporter.newServerSideReference(object); + } + + // TODO(deephaven-core#1775): multivariate jpy (unwrapped) call into java + public Reference newServerSideReferencePyObject(PyObject object) { + return exporter.newServerSideReference(object); + } +} diff --git a/server/src/main/java/io/deephaven/server/plugin/python/ObjectTypeAdapter.java b/server/src/main/java/io/deephaven/server/plugin/python/ObjectTypeAdapter.java index 3a1ca066ee9..535d39190fe 100644 --- a/server/src/main/java/io/deephaven/server/plugin/python/ObjectTypeAdapter.java +++ b/server/src/main/java/io/deephaven/server/plugin/python/ObjectTypeAdapter.java @@ -33,7 +33,7 @@ public boolean isType(Object object) { @Override public void writeCompatibleObjectTo(Exporter exporter, Object object, OutputStream out) throws IOException { final byte[] bytes = objectTypeAdapter.call(byte[].class, "to_bytes", - Exporter.class, exporter, + ExporterAdapter.class, new ExporterAdapter(exporter), PyObject.class, (PyObject) object); out.write(bytes); } From 8d3b2e1deeb210940fd5a830743b88d9906a390b Mon Sep 17 00:00:00 2001 From: Devin Smith Date: Tue, 11 Jan 2022 15:41:46 -0800 Subject: [PATCH 27/62] Rename --- .../java/io/deephaven/server/object/ObjectServiceTest.java | 4 ++-- .../META-INF/services/io.deephaven.plugin.Registration | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/server/src/test/java/io/deephaven/server/object/ObjectServiceTest.java b/server/src/test/java/io/deephaven/server/object/ObjectServiceTest.java index 2e741799a2e..b1d90daea71 100644 --- a/server/src/test/java/io/deephaven/server/object/ObjectServiceTest.java +++ b/server/src/test/java/io/deephaven/server/object/ObjectServiceTest.java @@ -58,7 +58,7 @@ private void fetchMyObject(Ticket ticket, String expectedSomeString, int expecte final FetchObjectRequest request = FetchObjectRequest.newBuilder().setSourceId(ticket).build(); final FetchObjectResponse response = channel().objectBlocking().fetchObject(request); - assertThat(response.getType()).isEqualTo(MyObjectPlugin.MY_OBJECT_TYPE_NAME); + assertThat(response.getType()).isEqualTo(MyObjectRegistration.MY_OBJECT_TYPE_NAME); assertThat(response.getExportIdCount()).isEqualTo(1); final DataInputStream dis = new DataInputStream(response.getData().newInput()); @@ -72,7 +72,7 @@ private void fetchMyObject(Ticket ticket, String expectedSomeString, int expecte assertThat(someTableTicket).containsExactly(response.getExportId(0).toByteArray()); } - public static class MyObjectPlugin implements Registration { + public static class MyObjectRegistration implements Registration { public static final String MY_OBJECT_TYPE_NAME = MyObject.class.getName(); diff --git a/server/src/test/resources/META-INF/services/io.deephaven.plugin.Registration b/server/src/test/resources/META-INF/services/io.deephaven.plugin.Registration index ebcc4d3cb0a..124a00df6b2 100644 --- a/server/src/test/resources/META-INF/services/io.deephaven.plugin.Registration +++ b/server/src/test/resources/META-INF/services/io.deephaven.plugin.Registration @@ -1 +1 @@ -io.deephaven.server.object.ObjectServiceTest$MyObjectPlugin +io.deephaven.server.object.ObjectServiceTest$MyObjectRegistration From 45970fd4720454f890b9926926f8cf5bf55e45f7 Mon Sep 17 00:00:00 2001 From: Devin Smith Date: Tue, 11 Jan 2022 15:49:24 -0800 Subject: [PATCH 28/62] recursive fetch --- .../client/examples/FetchObject.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/java-client/session-examples/src/main/java/io/deephaven/client/examples/FetchObject.java b/java-client/session-examples/src/main/java/io/deephaven/client/examples/FetchObject.java index 8152ddd29ab..1132c04220a 100644 --- a/java-client/session-examples/src/main/java/io/deephaven/client/examples/FetchObject.java +++ b/java-client/session-examples/src/main/java/io/deephaven/client/examples/FetchObject.java @@ -2,6 +2,7 @@ import io.deephaven.client.impl.ExportId; import io.deephaven.client.impl.FetchedObject; +import io.deephaven.client.impl.HasTicketId; import io.deephaven.client.impl.Session; import picocli.CommandLine; import picocli.CommandLine.ArgGroup; @@ -9,9 +10,11 @@ import picocli.CommandLine.Option; import java.io.BufferedOutputStream; +import java.io.IOException; import java.io.OutputStream; import java.nio.file.Files; import java.nio.file.Path; +import java.util.concurrent.ExecutionException; @Command(name = "fetch-object", mixinStandardHelpOptions = true, description = "Fetch object", version = "0.1.0") @@ -23,9 +26,20 @@ class FetchObject extends SingleSessionExampleBase { @Option(names = {"-f", "--file"}, description = "The output file, otherwise goes to STDOUT.") Path file; + @Option(names = {"-r", "--recursive"}, description = "If the program should recursively fetch.") + boolean recursive; + @Override protected void execute(Session session) throws Exception { + show(session, ticket); + } + + private void show(Session session, HasTicketId ticket) throws IOException, ExecutionException, InterruptedException { final FetchedObject customObject = session.fetchObject(ticket).get(); + show(session, customObject); + } + + private void show(Session session, FetchedObject customObject) throws IOException, ExecutionException, InterruptedException { final String type = customObject.type(); System.err.println("type: " + type); System.err.println("size: " + customObject.size()); @@ -39,6 +53,16 @@ protected void execute(Session session) throws Exception { } else { customObject.writeTo(System.out); } + if (recursive) { + for (ExportId exportId : customObject.exportIds()) { + try { + show(session, exportId); + } catch (ExecutionException e) { + // ignore + // TODO: better RPC return around fetchObject when exportId is not fetchable + } + } + } } public static void main(String[] args) { From 2941ea90c61bd55ae02d3c2bbb2aaee12ae349ab Mon Sep 17 00:00:00 2001 From: Devin Smith Date: Wed, 12 Jan 2022 06:56:38 -0800 Subject: [PATCH 29/62] Add init method --- .../client/examples/FetchObject.java | 6 ++-- .../FigureWidgetPluginRegistration.java | 11 +++++-- .../io/deephaven/plugin/Registration.java | 14 +++++++++ .../io/deephaven/plugin/RegistrationBase.java | 30 +++++++++++++++++++ .../deephaven2/server/plugin/__init__.py | 6 ++-- .../deephaven2/server/plugin/register.py | 5 +++- .../server/plugin/PluginsAutoDiscovery.java | 4 +-- .../server/plugin/java/JavaServiceLoader.java | 24 ++++++++++++--- .../server/plugin/python/Module.java | 2 +- .../plugin/python/PythonModuleLoader.java | 2 +- .../server/object/ObjectServiceTest.java | 11 +++++-- 11 files changed, 95 insertions(+), 20 deletions(-) create mode 100644 plugin/src/main/java/io/deephaven/plugin/RegistrationBase.java diff --git a/java-client/session-examples/src/main/java/io/deephaven/client/examples/FetchObject.java b/java-client/session-examples/src/main/java/io/deephaven/client/examples/FetchObject.java index 1132c04220a..9495e45a805 100644 --- a/java-client/session-examples/src/main/java/io/deephaven/client/examples/FetchObject.java +++ b/java-client/session-examples/src/main/java/io/deephaven/client/examples/FetchObject.java @@ -34,12 +34,14 @@ protected void execute(Session session) throws Exception { show(session, ticket); } - private void show(Session session, HasTicketId ticket) throws IOException, ExecutionException, InterruptedException { + private void show(Session session, HasTicketId ticket) + throws IOException, ExecutionException, InterruptedException { final FetchedObject customObject = session.fetchObject(ticket).get(); show(session, customObject); } - private void show(Session session, FetchedObject customObject) throws IOException, ExecutionException, InterruptedException { + private void show(Session session, FetchedObject customObject) + throws IOException, ExecutionException, InterruptedException { final String type = customObject.type(); System.err.println("type: " + type); System.err.println("size: " + customObject.size()); diff --git a/plugin/figure/src/main/java/io/deephaven/figure/FigureWidgetPluginRegistration.java b/plugin/figure/src/main/java/io/deephaven/figure/FigureWidgetPluginRegistration.java index 4a60f0733fa..b47e157c43b 100644 --- a/plugin/figure/src/main/java/io/deephaven/figure/FigureWidgetPluginRegistration.java +++ b/plugin/figure/src/main/java/io/deephaven/figure/FigureWidgetPluginRegistration.java @@ -1,14 +1,19 @@ package io.deephaven.figure; -import io.deephaven.plugin.Registration; +import io.deephaven.plugin.RegistrationBase; /** * Registers the object type plugin {@link FigureWidgetTypePlugin}. */ -public final class FigureWidgetPluginRegistration implements Registration { +public final class FigureWidgetPluginRegistration extends RegistrationBase { @Override - public void registerInto(Callback callback) { + protected void initImpl() { + + } + + @Override + protected void registerIntoImpl(Callback callback) { callback.register(FigureWidgetTypePlugin.instance()); } } diff --git a/plugin/src/main/java/io/deephaven/plugin/Registration.java b/plugin/src/main/java/io/deephaven/plugin/Registration.java index 384c2492d13..c8820e0784a 100644 --- a/plugin/src/main/java/io/deephaven/plugin/Registration.java +++ b/plugin/src/main/java/io/deephaven/plugin/Registration.java @@ -5,9 +5,23 @@ */ public interface Registration { + /** + * Initialize the registration. + * + *

+ * Should not be called more than once. + */ + void init(); + /** * The registration entrypoint. * + *

+ * May be called multiple times. + * + *

+ * The registration must be {@link #init() initialized} before calling this. + * * @param callback the callback. */ void registerInto(Callback callback); diff --git a/plugin/src/main/java/io/deephaven/plugin/RegistrationBase.java b/plugin/src/main/java/io/deephaven/plugin/RegistrationBase.java new file mode 100644 index 00000000000..f7b3b57168f --- /dev/null +++ b/plugin/src/main/java/io/deephaven/plugin/RegistrationBase.java @@ -0,0 +1,30 @@ +package io.deephaven.plugin; + +/** + * A base registration which enforces the restrictions on {@link #init()} and {@link #registerInto(Callback)}. + */ +public abstract class RegistrationBase implements Registration { + + private boolean initialized; + + protected abstract void initImpl(); + + protected abstract void registerIntoImpl(Callback callback); + + @Override + public final synchronized void init() { + if (initialized) { + throw new IllegalStateException("The registration is already initialized"); + } + initialized = true; + initImpl(); + } + + @Override + public final synchronized void registerInto(Callback callback) { + if (!initialized) { + throw new IllegalStateException("The registration must be initialized first"); + } + registerIntoImpl(callback); + } +} diff --git a/pyintegration/deephaven2/server/plugin/__init__.py b/pyintegration/deephaven2/server/plugin/__init__.py index d0388a66b98..04c741426b5 100644 --- a/pyintegration/deephaven2/server/plugin/__init__.py +++ b/pyintegration/deephaven2/server/plugin/__init__.py @@ -2,13 +2,13 @@ _JCallbackAdapter = jpy.get_type('io.deephaven.server.plugin.python.CallbackAdapter') -def register_all_into(callback: _JCallbackAdapter): +def initialize_all_and_register_into(callback: _JCallbackAdapter): try: - from .register import register_all_into + from . import register except ModuleNotFoundError as e: # deephaven.plugin is an optional dependency, so if it can't be found, there are no Deephaven python plugins # to register if e.name == 'deephaven.plugin': return raise e - register_all_into(callback) + register.initialize_all_and_register_into(callback) diff --git a/pyintegration/deephaven2/server/plugin/register.py b/pyintegration/deephaven2/server/plugin/register.py index 1599de6606f..9b5ff29b952 100644 --- a/pyintegration/deephaven2/server/plugin/register.py +++ b/pyintegration/deephaven2/server/plugin/register.py @@ -8,9 +8,12 @@ _JCallbackAdapter = jpy.get_type('io.deephaven.server.plugin.python.CallbackAdapter') -def register_all_into(callback: _JCallbackAdapter): + +def initialize_all_and_register_into(callback: _JCallbackAdapter): + deephaven.plugin.initialize_all() deephaven.plugin.register_all_into(RegistrationAdapter(callback)) + class RegistrationAdapter(Registration.Callback): def __init__(self, callback: _JCallbackAdapter): self._callback = callback diff --git a/server/src/main/java/io/deephaven/server/plugin/PluginsAutoDiscovery.java b/server/src/main/java/io/deephaven/server/plugin/PluginsAutoDiscovery.java index 92e4fdcd4ca..3213e64fe29 100644 --- a/server/src/main/java/io/deephaven/server/plugin/PluginsAutoDiscovery.java +++ b/server/src/main/java/io/deephaven/server/plugin/PluginsAutoDiscovery.java @@ -30,7 +30,7 @@ public PluginsAutoDiscovery(Registration.Callback callback) { } /** - * Registers {@link Registration plugins} via {@link JavaServiceLoader#allRegisterInto(Callback)} and + * Registers {@link Registration plugins} via {@link JavaServiceLoader#initializeAllAndRegisterInto(Callback)} and * {@link PythonModuleLoader#allRegisterInto(Callback)} (if python is enabled). */ public void registerAll() { @@ -42,7 +42,7 @@ public void registerAll(boolean includePython) { log.info().append("Registering plugins...").endl(); // TODO(deephaven-core#1810): Use service loader to abstract the different plugin auto-discovery methods final Counting serviceLoaderCount = new Counting(); - JavaServiceLoader.allRegisterInto(serviceLoaderCount); + JavaServiceLoader.initializeAllAndRegisterInto(serviceLoaderCount); final Counting pythonModuleCount = new Counting(); if (includePython) { PythonModuleLoader.allRegisterInto(pythonModuleCount); diff --git a/server/src/main/java/io/deephaven/server/plugin/java/JavaServiceLoader.java b/server/src/main/java/io/deephaven/server/plugin/java/JavaServiceLoader.java index 78ccc5c5f7b..9213737dc91 100644 --- a/server/src/main/java/io/deephaven/server/plugin/java/JavaServiceLoader.java +++ b/server/src/main/java/io/deephaven/server/plugin/java/JavaServiceLoader.java @@ -3,18 +3,34 @@ import io.deephaven.plugin.Registration; import io.deephaven.plugin.Registration.Callback; +import java.util.List; import java.util.ServiceLoader; +import java.util.ServiceLoader.Provider; +import java.util.stream.Collectors; public final class JavaServiceLoader { /** - * Registers all {@link Registration plugins} found via {@link ServiceLoader#load(Class)}. + * Initializes all {@link Registration registrations} found via {@link ServiceLoader#load(Class)}, and register them + * into {@code callback}. * * @param callback the plugin callback */ - public static void allRegisterInto(Callback callback) { - for (Registration provider : ServiceLoader.load(Registration.class)) { - provider.registerInto(callback); + public static void initializeAllAndRegisterInto(Callback callback) { + final List registrations = loadFromServiceLoader(); + for (Registration registration : registrations) { + registration.init(); } + for (Registration registration : registrations) { + registration.registerInto(callback); + } + } + + private static List loadFromServiceLoader() { + return ServiceLoader + .load(Registration.class) + .stream() + .map(Provider::get) + .collect(Collectors.toList()); } } diff --git a/server/src/main/java/io/deephaven/server/plugin/python/Module.java b/server/src/main/java/io/deephaven/server/plugin/python/Module.java index 7f7c27330cb..f4ec5a03887 100644 --- a/server/src/main/java/io/deephaven/server/plugin/python/Module.java +++ b/server/src/main/java/io/deephaven/server/plugin/python/Module.java @@ -15,7 +15,7 @@ static Module of() { return (Module) module.createProxy(CallableKind.FUNCTION, Module.class); } - void register_all_into(CallbackAdapter callback); + void initialize_all_and_register_into(CallbackAdapter callback); @Override void close(); diff --git a/server/src/main/java/io/deephaven/server/plugin/python/PythonModuleLoader.java b/server/src/main/java/io/deephaven/server/plugin/python/PythonModuleLoader.java index 932f1b0ecff..beecb4e3585 100644 --- a/server/src/main/java/io/deephaven/server/plugin/python/PythonModuleLoader.java +++ b/server/src/main/java/io/deephaven/server/plugin/python/PythonModuleLoader.java @@ -13,7 +13,7 @@ public final class PythonModuleLoader { */ public static void allRegisterInto(Callback callback) { try (final Module module = Module.of()) { - module.register_all_into(new CallbackAdapter(callback)); + module.initialize_all_and_register_into(new CallbackAdapter(callback)); } } } diff --git a/server/src/test/java/io/deephaven/server/object/ObjectServiceTest.java b/server/src/test/java/io/deephaven/server/object/ObjectServiceTest.java index b1d90daea71..1d752768807 100644 --- a/server/src/test/java/io/deephaven/server/object/ObjectServiceTest.java +++ b/server/src/test/java/io/deephaven/server/object/ObjectServiceTest.java @@ -2,7 +2,7 @@ import io.deephaven.engine.table.Table; import io.deephaven.engine.util.TableTools; -import io.deephaven.plugin.Registration; +import io.deephaven.plugin.RegistrationBase; import io.deephaven.plugin.type.ObjectType.Exporter.Reference; import io.deephaven.plugin.type.ObjectTypeClassBase; import io.deephaven.proto.backplane.grpc.FetchObjectRequest; @@ -72,12 +72,17 @@ private void fetchMyObject(Ticket ticket, String expectedSomeString, int expecte assertThat(someTableTicket).containsExactly(response.getExportId(0).toByteArray()); } - public static class MyObjectRegistration implements Registration { + public static class MyObjectRegistration extends RegistrationBase { public static final String MY_OBJECT_TYPE_NAME = MyObject.class.getName(); @Override - public void registerInto(Callback callback) { + protected void initImpl() { + + } + + @Override + protected void registerIntoImpl(Callback callback) { callback.register(new MyObjectType(MY_OBJECT_TYPE_NAME)); } } From 5804556dabc18220dc7b132d0b3bc5b9f5ac0bf6 Mon Sep 17 00:00:00 2001 From: Devin Smith Date: Wed, 12 Jan 2022 07:53:55 -0800 Subject: [PATCH 30/62] Fix reference id bytes --- pyintegration/deephaven2/server/plugin/object/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyintegration/deephaven2/server/plugin/object/__init__.py b/pyintegration/deephaven2/server/plugin/object/__init__.py index 2900bb89fed..71f3c2197e1 100644 --- a/pyintegration/deephaven2/server/plugin/object/__init__.py +++ b/pyintegration/deephaven2/server/plugin/object/__init__.py @@ -12,7 +12,7 @@ def new_server_side_reference(self, object) -> Reference: _reference = self._exporter.newServerSideReference(object) else: _reference = self._exporter.newServerSideReferencePyObject(object) - return Reference(bytes(_reference.id().toByteArray())) + return Reference(bytes(_reference.id().getTicket().toByteArray())) def __str__(self): return str(self._exporter) From b0afabf6f91e02e2980664eed7fb48110c638307 Mon Sep 17 00:00:00 2001 From: Devin Smith Date: Wed, 12 Jan 2022 14:57:46 -0800 Subject: [PATCH 31/62] Cleanup and consolidate to TypedTicket --- .../deephaven/appmode/ApplicationState.java | 9 --- .../io/deephaven/appmode/CustomField.java | 63 ----------------- .../client/examples/ConsoleExampleBase.java | 14 ++-- .../client/examples/SubscribeToFields.java | 22 +++--- .../client/impl/ApplicationService.java | 5 +- .../java/io/deephaven/client/impl/Export.java | 4 +- .../io/deephaven/client/impl/ExportId.java | 12 +++- .../deephaven/client/impl/FieldChanges.java | 36 ++++++++++ .../io/deephaven/client/impl/FieldInfo.java | 49 +++++++++++++ .../io/deephaven/client/impl/SessionImpl.java | 28 +++----- .../deephaven/client/impl/script/Changes.java | 27 ++------ .../figure/FigureWidgetTranslator.java | 3 +- .../proto/deephaven/proto/application.proto | 44 +----------- .../main/proto/deephaven/proto/console.proto | 19 ++--- .../main/proto/deephaven/proto/object.proto | 2 +- .../main/proto/deephaven/proto/ticket.proto | 5 ++ .../appmode/ApplicationServiceGrpcImpl.java | 69 ++++--------------- .../appmode/ScriptApplicationState.java | 10 --- .../console/ConsoleServiceGrpcImpl.java | 37 +++++----- .../server/object/ObjectServiceGrpcImpl.java | 26 +++++-- .../server/session/SessionState.java | 1 + 21 files changed, 210 insertions(+), 275 deletions(-) delete mode 100644 application-mode/src/main/java/io/deephaven/appmode/CustomField.java create mode 100644 java-client/session/src/main/java/io/deephaven/client/impl/FieldChanges.java create mode 100644 java-client/session/src/main/java/io/deephaven/client/impl/FieldInfo.java diff --git a/application-mode/src/main/java/io/deephaven/appmode/ApplicationState.java b/application-mode/src/main/java/io/deephaven/appmode/ApplicationState.java index 15fb1a78bb8..b36f18994a3 100644 --- a/application-mode/src/main/java/io/deephaven/appmode/ApplicationState.java +++ b/application-mode/src/main/java/io/deephaven/appmode/ApplicationState.java @@ -65,15 +65,6 @@ public synchronized void setField(String name, T value, String description) setField(StandardField.of(name, value, description)); } - public synchronized void setCustomField(String type, String name, T value) { - setField(CustomField.builder(type).of(name, value)); - } - - public synchronized void setCustomField(String type, String name, T value, - String description) { - setField(CustomField.builder(type).of(name, value, description)); - } - public synchronized void setField(Field field) { Field oldField = fields.remove(field.name()); if (oldField != null) { diff --git a/application-mode/src/main/java/io/deephaven/appmode/CustomField.java b/application-mode/src/main/java/io/deephaven/appmode/CustomField.java deleted file mode 100644 index 2505ab62c10..00000000000 --- a/application-mode/src/main/java/io/deephaven/appmode/CustomField.java +++ /dev/null @@ -1,63 +0,0 @@ -package io.deephaven.appmode; - -import io.deephaven.annotations.BuildableStyle; -import org.immutables.value.Value.Check; -import org.immutables.value.Value.Immutable; - -import java.util.Optional; - -@Immutable -@BuildableStyle -public abstract class CustomField implements Field { - - public static Builder builder(String type) { - return ImmutableCustomField.builder().type(type); - } - - public abstract String name(); - - public abstract T value(); - - public abstract String type(); - - public abstract Optional description(); - - @Check - final void checkName() { - if (!ApplicationUtil.isAsciiPrintable(name())) { - throw new IllegalArgumentException("name() is invalid, must be printable ascii"); - } - } - - @Check - final void checkType() { - if (!ApplicationUtil.isAsciiPrintable(name())) { - throw new IllegalArgumentException("name() is invalid, must be printable ascii"); - } - } - - @Check - final void checkDescription() { - if (description().isPresent() && description().get().isEmpty()) { - throw new IllegalArgumentException("description(), when present, must not be empty"); - } - } - - public interface Builder { - default CustomField of(String name, T value) { - return name(name).value(value).build(); - } - - default CustomField of(String name, T value, String description) { - return name(name).value(value).description(description).build(); - } - - Builder name(String name); - - Builder value(T value); - - Builder description(String description); - - CustomField build(); - } -} diff --git a/java-client/session-examples/src/main/java/io/deephaven/client/examples/ConsoleExampleBase.java b/java-client/session-examples/src/main/java/io/deephaven/client/examples/ConsoleExampleBase.java index a97714e3a9b..08f147e1301 100644 --- a/java-client/session-examples/src/main/java/io/deephaven/client/examples/ConsoleExampleBase.java +++ b/java-client/session-examples/src/main/java/io/deephaven/client/examples/ConsoleExampleBase.java @@ -1,9 +1,9 @@ package io.deephaven.client.examples; import io.deephaven.client.impl.ConsoleSession; +import io.deephaven.client.impl.FieldInfo; import io.deephaven.client.impl.Session; import io.deephaven.client.impl.script.Changes; -import io.deephaven.client.impl.script.VariableDefinition; import picocli.CommandLine.ArgGroup; import picocli.CommandLine.Option; @@ -51,17 +51,17 @@ public static String toPrettyString(Changes changes) { if (changes.isEmpty()) { sb.append("No displayable variables updated").append(System.lineSeparator()); } else { - for (VariableDefinition variableDefinition : changes.created()) { - sb.append(variableDefinition.type()).append(' ').append(variableDefinition.title()).append(" = ") + for (FieldInfo fieldInfo : changes.changes().created()) { + sb.append(fieldInfo.type()).append(' ').append(fieldInfo.name()).append(" = ") .append(System.lineSeparator()); } - for (VariableDefinition variableDefinition : changes.updated()) { - sb.append(variableDefinition.type()).append(' ').append(variableDefinition.title()) + for (FieldInfo fieldInfo : changes.changes().updated()) { + sb.append(fieldInfo.type()).append(' ').append(fieldInfo.name()) .append(" = ") .append(System.lineSeparator()); } - for (VariableDefinition variableDefinition : changes.removed()) { - sb.append(variableDefinition.type()).append(' ').append(variableDefinition.title()).append(" ") + for (FieldInfo fieldInfo : changes.changes().removed()) { + sb.append(fieldInfo.type()).append(' ').append(fieldInfo.name()).append(" ") .append(System.lineSeparator()); } } diff --git a/java-client/session-examples/src/main/java/io/deephaven/client/examples/SubscribeToFields.java b/java-client/session-examples/src/main/java/io/deephaven/client/examples/SubscribeToFields.java index 30eeed42327..e7c3ecb040f 100644 --- a/java-client/session-examples/src/main/java/io/deephaven/client/examples/SubscribeToFields.java +++ b/java-client/session-examples/src/main/java/io/deephaven/client/examples/SubscribeToFields.java @@ -2,15 +2,16 @@ import io.deephaven.client.impl.ApplicationService.Cancel; import io.deephaven.client.impl.ApplicationService.Listener; +import io.deephaven.client.impl.FieldChanges; +import io.deephaven.client.impl.FieldInfo; import io.deephaven.client.impl.Session; -import io.deephaven.proto.backplane.grpc.FieldInfo; -import io.deephaven.proto.backplane.grpc.FieldsChangeUpdate; import io.grpc.Status.Code; import io.grpc.StatusException; import io.grpc.StatusRuntimeException; import picocli.CommandLine; import picocli.CommandLine.Command; +import java.util.List; import java.util.concurrent.CountDownLatch; @Command(name = "subscribe-fields", mixinStandardHelpOptions = true, @@ -21,17 +22,20 @@ protected void execute(Session session) throws Exception { final CountDownLatch latch = new CountDownLatch(1); final Cancel cancel = session.subscribeToFields(new Listener() { @Override - public void onNext(FieldsChangeUpdate fields) { - System.out.println("Created: " + fields.getCreatedCount()); - System.out.println("Updated: " + fields.getUpdatedCount()); - System.out.println("Removed: " + fields.getRemovedCount()); - for (FieldInfo fieldInfo : fields.getCreatedList()) { + public void onNext(FieldChanges fields) { + final List created = fields.created(); + final List updated = fields.updated(); + final List removed = fields.removed(); + System.out.println("Created: " + created.size()); + System.out.println("Updated: " + updated.size()); + System.out.println("Removed: " + removed.size()); + for (FieldInfo fieldInfo : created) { System.out.println("Created: " + fieldInfo); } - for (FieldInfo fieldInfo : fields.getUpdatedList()) { + for (FieldInfo fieldInfo : updated) { System.out.println("Updated: " + fieldInfo); } - for (FieldInfo fieldInfo : fields.getRemovedList()) { + for (FieldInfo fieldInfo : removed) { System.out.println("Removed: " + fieldInfo); } } diff --git a/java-client/session/src/main/java/io/deephaven/client/impl/ApplicationService.java b/java-client/session/src/main/java/io/deephaven/client/impl/ApplicationService.java index 56881f82c27..20fd6f90af5 100644 --- a/java-client/session/src/main/java/io/deephaven/client/impl/ApplicationService.java +++ b/java-client/session/src/main/java/io/deephaven/client/impl/ApplicationService.java @@ -1,13 +1,10 @@ package io.deephaven.client.impl; -import io.deephaven.proto.backplane.grpc.FieldsChangeUpdate; - public interface ApplicationService { interface Listener { - // TODO(deephaven-core#1783): Remove proto references from java client interface #1783 - void onNext(FieldsChangeUpdate fields); + void onNext(FieldChanges fields); void onError(Throwable t); diff --git a/java-client/session/src/main/java/io/deephaven/client/impl/Export.java b/java-client/session/src/main/java/io/deephaven/client/impl/Export.java index 3e8c9e9bb30..807eb9463a1 100644 --- a/java-client/session/src/main/java/io/deephaven/client/impl/Export.java +++ b/java-client/session/src/main/java/io/deephaven/client/impl/Export.java @@ -7,7 +7,7 @@ import java.util.Objects; /** - * An export represents a server-side object that is being kept alive. + * An export represents a server-side Table that is being kept alive. * *

* Callers must maintain ownership of their exports, and close them when no longer needed. @@ -28,7 +28,7 @@ public final class Export implements AutoCloseable, HasExportId { @Override public ExportId exportId() { - return new ExportId(state.exportId()); + return new ExportId("Table", state.exportId()); } @Override diff --git a/java-client/session/src/main/java/io/deephaven/client/impl/ExportId.java b/java-client/session/src/main/java/io/deephaven/client/impl/ExportId.java index 3fe0ea78633..4b4eb470abe 100644 --- a/java-client/session/src/main/java/io/deephaven/client/impl/ExportId.java +++ b/java-client/session/src/main/java/io/deephaven/client/impl/ExportId.java @@ -2,17 +2,25 @@ import io.deephaven.proto.util.ExportTicketHelper; +import java.util.Objects; + /** * An opaque holder for a session export ID. */ public final class ExportId implements HasExportId { + private final String type; private final int exportId; - ExportId(int exportId) { + ExportId(String type, int exportId) { + this.type = Objects.requireNonNull(type); this.exportId = exportId; } + public String type() { + return type; + } + @Override public ExportId exportId() { return this; @@ -30,7 +38,7 @@ public PathId pathId() { @Override public String toString() { - return ExportTicketHelper.toReadableString(exportId); + return type + ":" + ExportTicketHelper.toReadableString(exportId); } int id() { diff --git a/java-client/session/src/main/java/io/deephaven/client/impl/FieldChanges.java b/java-client/session/src/main/java/io/deephaven/client/impl/FieldChanges.java new file mode 100644 index 00000000000..44fa08bf7ea --- /dev/null +++ b/java-client/session/src/main/java/io/deephaven/client/impl/FieldChanges.java @@ -0,0 +1,36 @@ +package io.deephaven.client.impl; + +import io.deephaven.proto.backplane.grpc.FieldsChangeUpdate; + +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +public final class FieldChanges { + private final FieldsChangeUpdate changes; + + FieldChanges(FieldsChangeUpdate changes) { + this.changes = Objects.requireNonNull(changes); + } + + public boolean isEmpty() { + return changes.getCreatedCount() == 0 && changes.getUpdatedCount() == 0 && changes.getRemovedCount() == 0; + } + + public List created() { + return changes.getCreatedList().stream().map(FieldInfo::new).collect(Collectors.toList()); + } + + public List updated() { + return changes.getUpdatedList().stream().map(FieldInfo::new).collect(Collectors.toList()); + } + + public List removed() { + return changes.getRemovedList().stream().map(FieldInfo::new).collect(Collectors.toList()); + } + + @Override + public String toString() { + return changes.toString(); + } +} diff --git a/java-client/session/src/main/java/io/deephaven/client/impl/FieldInfo.java b/java-client/session/src/main/java/io/deephaven/client/impl/FieldInfo.java new file mode 100644 index 00000000000..42d6b276ca1 --- /dev/null +++ b/java-client/session/src/main/java/io/deephaven/client/impl/FieldInfo.java @@ -0,0 +1,49 @@ +package io.deephaven.client.impl; + +import io.deephaven.proto.backplane.grpc.TypedTicket; + +import java.util.Objects; +import java.util.Optional; + +public final class FieldInfo { + + private final io.deephaven.proto.backplane.grpc.FieldInfo fieldInfo; + + FieldInfo(io.deephaven.proto.backplane.grpc.FieldInfo fieldInfo) { + this.fieldInfo = Objects.requireNonNull(fieldInfo); + } + + public TypedTicket getTicket() { + return fieldInfo.getTicket(); + } + + public String type() { + return fieldInfo.getTicket().getType(); + } + + public TicketId ticket() { + return new TicketId(fieldInfo.getTicket().toByteArray()); + } + + public String name() { + return fieldInfo.getFieldName(); + } + + public Optional description() { + return fieldInfo.getFieldDescription().isEmpty() ? Optional.empty() + : Optional.of(fieldInfo.getFieldDescription()); + } + + public String applicationId() { + return fieldInfo.getApplicationId(); + } + + public String applicationName() { + return fieldInfo.getApplicationName(); + } + + @Override + public String toString() { + return fieldInfo.toString(); + } +} diff --git a/java-client/session/src/main/java/io/deephaven/client/impl/SessionImpl.java b/java-client/session/src/main/java/io/deephaven/client/impl/SessionImpl.java index de9f5444871..cfdc6405948 100644 --- a/java-client/session/src/main/java/io/deephaven/client/impl/SessionImpl.java +++ b/java-client/session/src/main/java/io/deephaven/client/impl/SessionImpl.java @@ -21,6 +21,7 @@ import io.deephaven.proto.backplane.grpc.ReleaseResponse; import io.deephaven.proto.backplane.grpc.SessionServiceGrpc.SessionServiceStub; import io.deephaven.proto.backplane.grpc.Ticket; +import io.deephaven.proto.backplane.grpc.TypedTicket; import io.deephaven.proto.backplane.script.grpc.BindTableToVariableRequest; import io.deephaven.proto.backplane.script.grpc.BindTableToVariableResponse; import io.deephaven.proto.backplane.script.grpc.ConsoleServiceGrpc.ConsoleServiceStub; @@ -234,7 +235,7 @@ public List export(ExportsRequest request) { @Override public CompletableFuture console(String type) { - final ExportId consoleId = new ExportId(exportTicketCreator.createExportId()); + final ExportId consoleId = new ExportId("Console", exportTicketCreator.createExportId()); final StartConsoleRequest request = StartConsoleRequest.newBuilder().setSessionType(type) .setResultId(consoleId.ticketId().ticket()).build(); final ConsoleHandler handler = new ConsoleHandler(request); @@ -311,7 +312,7 @@ public TableHandleManager serial() { @Override public ExportId newExportId() { - return new ExportId(exportTicketCreator.createExportId()); + return new ExportId("Table", exportTicketCreator.createExportId()); } @Override @@ -436,8 +437,10 @@ public void onNext(FetchObjectResponse value) { future.complete(new FetchedObject(type, data, exportIds)); } - private static ExportId toExportId(Ticket e) { - return new ExportId(ExportTicketHelper.ticketToExportId(e, "exportId")); + private static ExportId toExportId(TypedTicket e) { + final String type = e.getType(); + final int exportId = ExportTicketHelper.ticketToExportId(e.getTicket().asReadOnlyByteBuffer(), "exportId"); + return new ExportId(type, exportId); } @Override @@ -517,24 +520,15 @@ private static class ExecuteCommandHandler implements StreamObserver future = new CompletableFuture<>(); - private static VariableDefinition of(io.deephaven.proto.backplane.script.grpc.VariableDefinition d) { - return VariableDefinition.of(d.getType(), d.getTitle()); + private static VariableDefinition of(io.deephaven.proto.backplane.grpc.FieldInfo d) { + return VariableDefinition.of(d.getTicket().getType(), d.getFieldName()); } private static Changes of(ExecuteCommandResponse value) { - Changes.Builder builder = Changes.builder(); + Changes.Builder builder = Changes.builder().changes(new FieldChanges(value.getChanges())); if (!value.getErrorMessage().isEmpty()) { builder.errorMessage(value.getErrorMessage()); } - for (io.deephaven.proto.backplane.script.grpc.VariableDefinition d : value.getCreatedList()) { - builder.addCreated(of(d)); - } - for (io.deephaven.proto.backplane.script.grpc.VariableDefinition d : value.getUpdatedList()) { - builder.addUpdated(of(d)); - } - for (io.deephaven.proto.backplane.script.grpc.VariableDefinition d : value.getRemovedList()) { - builder.addRemoved(of(d)); - } return builder.build(); } @@ -801,7 +795,7 @@ public void beforeStart(ClientCallStreamObserver requestStrea @Override public void onNext(FieldsChangeUpdate value) { - listener.onNext(value); + listener.onNext(new FieldChanges(value)); } @Override diff --git a/java-client/session/src/main/java/io/deephaven/client/impl/script/Changes.java b/java-client/session/src/main/java/io/deephaven/client/impl/script/Changes.java index f292eaa3c4f..147888e4673 100644 --- a/java-client/session/src/main/java/io/deephaven/client/impl/script/Changes.java +++ b/java-client/session/src/main/java/io/deephaven/client/impl/script/Changes.java @@ -1,6 +1,7 @@ package io.deephaven.client.impl.script; import io.deephaven.annotations.BuildableStyle; +import io.deephaven.client.impl.FieldChanges; import org.immutables.value.Value.Immutable; import java.util.List; @@ -16,36 +17,16 @@ public static Builder builder() { public abstract Optional errorMessage(); - public abstract List created(); - - public abstract List updated(); - - public abstract List removed(); + public abstract FieldChanges changes(); public final boolean isEmpty() { - return created().isEmpty() && updated().isEmpty() && removed().isEmpty(); + return !errorMessage().isPresent() && changes().isEmpty(); } public interface Builder { Builder errorMessage(String errorMessage); - Builder addCreated(VariableDefinition element); - - Builder addCreated(VariableDefinition... elements); - - Builder addAllCreated(Iterable elements); - - Builder addUpdated(VariableDefinition element); - - Builder addUpdated(VariableDefinition... elements); - - Builder addAllUpdated(Iterable elements); - - Builder addRemoved(VariableDefinition element); - - Builder addRemoved(VariableDefinition... elements); - - Builder addAllRemoved(Iterable elements); + Builder changes(FieldChanges changes); Changes build(); } diff --git a/plugin/figure/src/main/java/io/deephaven/figure/FigureWidgetTranslator.java b/plugin/figure/src/main/java/io/deephaven/figure/FigureWidgetTranslator.java index b83d0eecf43..437e23dd1a6 100644 --- a/plugin/figure/src/main/java/io/deephaven/figure/FigureWidgetTranslator.java +++ b/plugin/figure/src/main/java/io/deephaven/figure/FigureWidgetTranslator.java @@ -123,8 +123,7 @@ private FigureDescriptor translateFigure(FigureWidget f, Exporter exporter) { } i++; - final Reference export = exporter.newServerSideReference(table); - clientFigure.addTables(ExportUtil.buildTableCreationResponse(export.id(), table)); + exporter.newServerSideReference(table); } // TODO (deephaven-core#62) implement once tablemaps are ready diff --git a/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/application.proto b/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/application.proto index 74e4188bf08..9907bfdf655 100644 --- a/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/application.proto +++ b/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/application.proto @@ -45,22 +45,12 @@ message FieldsChangeUpdate { * A lightweight object describing the exposed field. */ message FieldInfo { - Ticket ticket = 1; + TypedTicket ticket = 1; string field_name = 2; - FieldType field_type = 3; +// string field_type = 3; string field_description = 4; string application_name = 5; // display-friendly identification string application_id = 6; // computer-friendly identification - - message FieldType { - oneof field { - CustomInfo custom = 1; - TableInfo table = 2; - PluginTypeInfo plugin = 3; - - // use values above 4096 for custom client behavior - } - } } /* @@ -69,33 +59,3 @@ message FieldInfo { message RemovedField { // Intentionally empty and is here for backwards compatibility should this API change. } - -/* - * CustomInfo can be used to provide information about an exposed field in an unstructured way. - * - * Alternatively, one can extend FieldType and re-build with custom types of their own structure. - */ -message CustomInfo { - string type = 1; // application-specific type to identify the purpose of this custom field reference -} - -/* - * Plugin object type information, as installed from io.deephaven.plugin.type.ObjectTypePlugin - */ -message PluginTypeInfo { - string name = 1; -} - -/* - * Lightly describe a Table. - */ -message TableInfo { - // Schema as described in Arrow Message.fbs::Message. - bytes schema_header = 1; - - // Whether or not this table might change. - bool is_static = 2; - - // The current number of rows for this table. - sint64 size = 3 [jstype=JS_STRING]; -} diff --git a/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/console.proto b/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/console.proto index ddf89b6116a..5c5b2dcb6b3 100644 --- a/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/console.proto +++ b/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/console.proto @@ -11,6 +11,7 @@ option optimize_for = SPEED; import "deephaven/proto/table.proto"; import "deephaven/proto/ticket.proto"; +import "deephaven/proto/application.proto"; /* * Console interaction service @@ -86,14 +87,7 @@ message ExecuteCommandRequest { } message ExecuteCommandResponse { string error_message = 1; - repeated VariableDefinition created = 2; - repeated VariableDefinition updated = 3; - repeated VariableDefinition removed = 4; -} -message VariableDefinition { - string type = 1; - string title = 2; - io.deephaven.proto.backplane.grpc.Ticket id = 3; + io.deephaven.proto.backplane.grpc.FieldsChangeUpdate changes = 2; } message BindTableToVariableRequest { io.deephaven.proto.backplane.grpc.Ticket console_id = 1; @@ -216,10 +210,16 @@ message TextEdit { string text = 2; } +/** + * Deprecated: TODO(deephaven-core#1784): Remove fetchFigure RPC + */ message FetchFigureRequest { io.deephaven.proto.backplane.grpc.Ticket source_id = 1; } +/** + * Deprecated: TODO(deephaven-core#1784): Remove fetchFigure RPC + */ message FetchFigureResponse { FigureDescriptor figure_descriptor = 1; } @@ -236,7 +236,8 @@ message FigureDescriptor { repeated ChartDescriptor charts = 10; - repeated io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse tables = 11; + // Deprecated: not set by the server anymore. See tables (id 14). + reserved 11; // TODO (deephaven-core#62) implement once tablemaps are ready reserved 12;// reserved for tablemaps diff --git a/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/object.proto b/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/object.proto index aa5b2746c52..1a13078e2de 100644 --- a/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/object.proto +++ b/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/object.proto @@ -22,5 +22,5 @@ message FetchObjectRequest { message FetchObjectResponse { string type = 1; bytes data = 2; - repeated io.deephaven.proto.backplane.grpc.Ticket export_id = 3; + repeated io.deephaven.proto.backplane.grpc.TypedTicket export_id = 3; } diff --git a/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/ticket.proto b/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/ticket.proto index 8fb12e06993..3a0acac372c 100644 --- a/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/ticket.proto +++ b/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/ticket.proto @@ -23,4 +23,9 @@ option optimize_for = SPEED; */ message Ticket { bytes ticket = 1; +} + +message TypedTicket { + bytes ticket = 1; + string type = 2; } \ No newline at end of file diff --git a/server/src/main/java/io/deephaven/server/appmode/ApplicationServiceGrpcImpl.java b/server/src/main/java/io/deephaven/server/appmode/ApplicationServiceGrpcImpl.java index d7b0c30a979..2351cc982e1 100644 --- a/server/src/main/java/io/deephaven/server/appmode/ApplicationServiceGrpcImpl.java +++ b/server/src/main/java/io/deephaven/server/appmode/ApplicationServiceGrpcImpl.java @@ -2,27 +2,22 @@ import com.google.rpc.Code; import io.deephaven.appmode.ApplicationState; -import io.deephaven.appmode.CustomField; import io.deephaven.appmode.Field; import io.deephaven.engine.liveness.LivenessArtifact; import io.deephaven.engine.liveness.LivenessReferent; import io.deephaven.engine.table.Table; import io.deephaven.engine.updategraph.DynamicNode; import io.deephaven.engine.util.ScriptSession; -import io.deephaven.extensions.barrage.util.BarrageUtil; import io.deephaven.extensions.barrage.util.GrpcUtil; import io.deephaven.internal.log.LoggerFactory; import io.deephaven.io.logger.Logger; import io.deephaven.plugin.type.ObjectType; import io.deephaven.plugin.type.ObjectTypeLookup; import io.deephaven.proto.backplane.grpc.ApplicationServiceGrpc; -import io.deephaven.proto.backplane.grpc.CustomInfo; import io.deephaven.proto.backplane.grpc.FieldInfo; -import io.deephaven.proto.backplane.grpc.FieldInfo.FieldType; import io.deephaven.proto.backplane.grpc.FieldsChangeUpdate; import io.deephaven.proto.backplane.grpc.ListFieldsRequest; -import io.deephaven.proto.backplane.grpc.PluginTypeInfo; -import io.deephaven.proto.backplane.grpc.TableInfo; +import io.deephaven.proto.backplane.grpc.TypedTicket; import io.deephaven.server.session.SessionService; import io.deephaven.server.session.SessionState; import io.deephaven.server.util.Scheduler; @@ -203,7 +198,7 @@ private synchronized void propagateUpdates() { log.error().append("Removing old field but field not known; fieldId = ").append(id.toString()).endl(); } else { tracker.maybeUnmanage(oldField.value()); - builder.addRemoved(getRemovedFieldInfo(id)); + builder.addRemoved(getRemovedFieldInfo(id, oldField)); } }); removedFields.clear(); @@ -245,9 +240,12 @@ synchronized void remove(Subscription sub) { } } - private static FieldInfo getRemovedFieldInfo(final AppFieldId id) { + private FieldInfo getRemovedFieldInfo(final AppFieldId id, final Field field) { return FieldInfo.newBuilder() - .setTicket(id.getTicket()) + .setTicket(TypedTicket.newBuilder() + .setType(fieldType(field.value())) + .setTicket(id.getTicket().getTicket()) + .build()) .setFieldName(id.fieldName) .setApplicationId(id.applicationId()) .setApplicationName(id.applicationName()) @@ -255,63 +253,26 @@ private static FieldInfo getRemovedFieldInfo(final AppFieldId id) { } private FieldInfo getFieldInfo(final AppFieldId id, final Field field) { - if (field instanceof CustomField) { - return getCustomFieldInfo(id, (CustomField) field); - } - return getStandardFieldInfo(id, field); - } - - private static FieldInfo getCustomFieldInfo(final AppFieldId id, final CustomField field) { return FieldInfo.newBuilder() - .setTicket(id.getTicket()) - .setFieldName(id.fieldName) - .setFieldType(FieldType.newBuilder() - .setCustom(CustomInfo.newBuilder().setType(field.type()).build()) + .setTicket(TypedTicket.newBuilder() + .setType(fieldType(field.value())) + .setTicket(id.getTicket().getTicket()) .build()) - .setFieldDescription(field.description().orElse("")) - .setApplicationId(id.applicationId()) - .setApplicationName(id.applicationName()) - .build(); - } - - private FieldInfo getStandardFieldInfo(final AppFieldId id, final Field field) { - // Note that this method accepts any Field and not just StandardField - final FieldInfo.FieldType fieldType = fieldType(field.value()); - return FieldInfo.newBuilder() - .setTicket(id.getTicket()) .setFieldName(id.fieldName) - .setFieldType(fieldType) .setFieldDescription(field.description().orElse("")) .setApplicationId(id.applicationId()) .setApplicationName(id.applicationName()) .build(); } - private FieldInfo.FieldType fieldType(final Object object) { + // todo consolidate logic + private String fieldType(final Object object) { if (object instanceof Table) { - return tableFieldType((Table) object); + return "Table"; } return objectTypeLookup.findObjectType(object) - .map(ApplicationServiceGrpcImpl::pluginType) - .orElseGet(ApplicationServiceGrpcImpl::unknownType); - } - - private static FieldType tableFieldType(Table table) { - return FieldType.newBuilder().setTable(TableInfo.newBuilder() - .setSchemaHeader(BarrageUtil.schemaBytesFromTable(table)) - .setIsStatic(!table.isRefreshing()) - .setSize(table.size()) - .build()).build(); - } - - private static FieldType pluginType(ObjectType type) { - return FieldType.newBuilder() - .setPlugin(PluginTypeInfo.newBuilder().setName(type.name()).build()) - .build(); - } - - private static FieldType unknownType() { - return FieldType.getDefaultInstance(); + .map(ObjectType::name) + .orElse(""); } private static class ScopeField implements Field { diff --git a/server/src/main/java/io/deephaven/server/appmode/ScriptApplicationState.java b/server/src/main/java/io/deephaven/server/appmode/ScriptApplicationState.java index 1bd29604c1b..a67269ffc4c 100644 --- a/server/src/main/java/io/deephaven/server/appmode/ScriptApplicationState.java +++ b/server/src/main/java/io/deephaven/server/appmode/ScriptApplicationState.java @@ -20,16 +20,6 @@ public synchronized void setField(String name, T value, String description) super.setField(name, scriptSession.unwrapObject(value), description); } - @Override - public synchronized void setCustomField(String type, String name, T value) { - super.setCustomField(type, name, scriptSession.unwrapObject(value)); - } - - @Override - public synchronized void setCustomField(String type, String name, T value, String description) { - super.setCustomField(type, name, scriptSession.unwrapObject(value), description); - } - @Override public synchronized void setField(String name, T value) { super.setField(name, scriptSession.unwrapObject(value)); diff --git a/server/src/main/java/io/deephaven/server/console/ConsoleServiceGrpcImpl.java b/server/src/main/java/io/deephaven/server/console/ConsoleServiceGrpcImpl.java index 71e470c7d88..8d1b010810b 100644 --- a/server/src/main/java/io/deephaven/server/console/ConsoleServiceGrpcImpl.java +++ b/server/src/main/java/io/deephaven/server/console/ConsoleServiceGrpcImpl.java @@ -4,6 +4,7 @@ package io.deephaven.server.console; +import com.google.protobuf.ByteStringAccess; import com.google.rpc.Code; import io.deephaven.configuration.Configuration; import io.deephaven.engine.table.Table; @@ -27,7 +28,10 @@ import io.deephaven.lang.parse.ParsedDocument; import io.deephaven.lang.shared.lsp.CompletionCancelled; import io.deephaven.plot.FigureWidget; +import io.deephaven.proto.backplane.grpc.FieldInfo; +import io.deephaven.proto.backplane.grpc.FieldsChangeUpdate; import io.deephaven.proto.backplane.grpc.Ticket; +import io.deephaven.proto.backplane.grpc.TypedTicket; import io.deephaven.proto.backplane.script.grpc.AutoCompleteRequest; import io.deephaven.proto.backplane.script.grpc.AutoCompleteResponse; import io.deephaven.proto.backplane.script.grpc.BindTableToVariableRequest; @@ -52,8 +56,8 @@ import io.deephaven.proto.backplane.script.grpc.StartConsoleRequest; import io.deephaven.proto.backplane.script.grpc.StartConsoleResponse; import io.deephaven.proto.backplane.script.grpc.TextDocumentItem; -import io.deephaven.proto.backplane.script.grpc.VariableDefinition; import io.deephaven.proto.backplane.script.grpc.VersionedTextDocumentIdentifier; +import io.deephaven.proto.util.ScopeTicketHelper; import io.deephaven.server.object.ObjectServiceGrpcImpl.ExportCollector; import io.deephaven.server.session.SessionCloseableObserver; import io.deephaven.server.session.SessionService; @@ -217,34 +221,35 @@ public void executeCommand(ExecuteCommandRequest request, StreamObserver { ScriptSession scriptSession = exportedConsole.get(); - - // produce a diff - ExecuteCommandResponse.Builder diff = ExecuteCommandResponse.newBuilder(); - ScriptSession.Changes changes = scriptSession.evaluateScript(request.getCode()); - + ExecuteCommandResponse.Builder diff = ExecuteCommandResponse.newBuilder(); + FieldsChangeUpdate.Builder fieldChanges = FieldsChangeUpdate.newBuilder(); changes.created.entrySet() - .forEach(entry -> diff.addCreated(makeVariableDefinition(entry))); + .forEach(entry -> fieldChanges.addCreated(makeVariableDefinition(entry))); changes.updated.entrySet() - .forEach(entry -> diff.addUpdated(makeVariableDefinition(entry))); + .forEach(entry -> fieldChanges.addUpdated(makeVariableDefinition(entry))); changes.removed.entrySet() - .forEach(entry -> diff.addRemoved(makeVariableDefinition(entry))); - - responseObserver.onNext(diff.build()); + .forEach(entry -> fieldChanges.addRemoved(makeVariableDefinition(entry))); + responseObserver.onNext(diff.setChanges(fieldChanges).build()); responseObserver.onCompleted(); }); }); } - private static VariableDefinition makeVariableDefinition(Map.Entry entry) { + private static FieldInfo makeVariableDefinition(Map.Entry entry) { return makeVariableDefinition(entry.getKey(), entry.getValue()); } - private static VariableDefinition makeVariableDefinition(String title, String type) { - return VariableDefinition.newBuilder() - .setTitle(title) + private static FieldInfo makeVariableDefinition(String title, String type) { + final TypedTicket id = TypedTicket.newBuilder() .setType(type) - .setId(ScopeTicketResolver.ticketForName(title)) + .setTicket(ByteStringAccess.wrap(ScopeTicketHelper.nameToBytes(title))) + .build(); + return FieldInfo.newBuilder() + .setApplicationId("") + .setFieldName(title) + .setFieldDescription("query scope variable") + .setTicket(id) .build(); } diff --git a/server/src/main/java/io/deephaven/server/object/ObjectServiceGrpcImpl.java b/server/src/main/java/io/deephaven/server/object/ObjectServiceGrpcImpl.java index 64fa3525dcb..bd648750166 100644 --- a/server/src/main/java/io/deephaven/server/object/ObjectServiceGrpcImpl.java +++ b/server/src/main/java/io/deephaven/server/object/ObjectServiceGrpcImpl.java @@ -2,6 +2,7 @@ import com.google.protobuf.ByteStringAccess; import com.google.rpc.Code; +import io.deephaven.engine.table.Table; import io.deephaven.extensions.barrage.util.BarrageProtoUtil.ExposedByteArrayOutputStream; import io.deephaven.extensions.barrage.util.GrpcUtil; import io.deephaven.internal.log.LoggerFactory; @@ -15,6 +16,7 @@ import io.deephaven.proto.backplane.grpc.FetchObjectResponse.Builder; import io.deephaven.proto.backplane.grpc.ObjectServiceGrpc; import io.deephaven.proto.backplane.grpc.Ticket; +import io.deephaven.proto.backplane.grpc.TypedTicket; import io.deephaven.server.session.SessionService; import io.deephaven.server.session.SessionState; import io.deephaven.server.session.SessionState.ExportObject; @@ -66,15 +68,21 @@ public void fetchObject(FetchObjectRequest request, StreamObserver noTypeException(object)); + final ObjectType objectType = + objectTypeLookup.findObjectType(object).orElseThrow(() -> noTypeException(object)); final ExportCollector exportCollector = new ExportCollector(state); try { - type.writeTo(exportCollector, object, out); + objectType.writeTo(exportCollector, object, out); final Builder builder = FetchObjectResponse.newBuilder() - .setType(type.name()) - .setData(ByteStringAccess.wrap(out.peekBuffer(), 0, out.size()));; + .setType(objectType.name()) + .setData(ByteStringAccess.wrap(out.peekBuffer(), 0, out.size())); for (ExportObject export : exportCollector.exports()) { - builder.addExportId(export.getExportId()); + final String exportType = findType(export.get()); + final Ticket exportId = export.getExportId(); + builder.addExportId(TypedTicket.newBuilder() + .setType(exportType) + .setTicket(exportId.getTicket()) + .build()); } return builder.build(); } catch (Throwable t) { @@ -83,6 +91,14 @@ private FetchObjectResponse serialize(SessionState state, Object object) throws } } + // todo consolidate logic + private String findType(Object o) { + if (o instanceof Table) { + return "Table"; + } + return objectTypeLookup.findObjectType(o).map(ObjectType::name).orElse(""); + } + private static void cleanup(ExportCollector exportCollector, Throwable t) { for (ExportObject export : exportCollector.exports()) { try { diff --git a/server/src/main/java/io/deephaven/server/session/SessionState.java b/server/src/main/java/io/deephaven/server/session/SessionState.java index 7c16fdb4625..42223114e25 100644 --- a/server/src/main/java/io/deephaven/server/session/SessionState.java +++ b/server/src/main/java/io/deephaven/server/session/SessionState.java @@ -31,6 +31,7 @@ import io.deephaven.io.logger.Logger; import io.deephaven.proto.backplane.grpc.ExportNotification; import io.deephaven.proto.backplane.grpc.Ticket; +import io.deephaven.proto.backplane.grpc.TypedTicket; import io.deephaven.proto.flight.util.FlightExportTicketHelper; import io.deephaven.proto.util.ExportTicketHelper; import io.deephaven.server.util.Scheduler; From 14452e2e6d309071990ac306866cd4f5846012bf Mon Sep 17 00:00:00 2001 From: Devin Smith Date: Thu, 13 Jan 2022 06:18:31 -0800 Subject: [PATCH 32/62] auto service --- buildSrc/src/main/groovy/Classpaths.groovy | 12 ++++++++++++ plugin/figure/build.gradle | 2 ++ .../figure/FigureWidgetPluginRegistration.java | 3 +++ .../services/io.deephaven.plugin.Registration | 1 - server/build.gradle | 2 ++ .../deephaven/server/object/ObjectServiceTest.java | 7 +++++-- .../services/io.deephaven.plugin.Registration | 1 - 7 files changed, 24 insertions(+), 4 deletions(-) delete mode 100644 plugin/figure/src/main/resources/META-INF/services/io.deephaven.plugin.Registration delete mode 100644 server/src/test/resources/META-INF/services/io.deephaven.plugin.Registration diff --git a/buildSrc/src/main/groovy/Classpaths.groovy b/buildSrc/src/main/groovy/Classpaths.groovy index 631c8e28f85..38a11e389da 100644 --- a/buildSrc/src/main/groovy/Classpaths.groovy +++ b/buildSrc/src/main/groovy/Classpaths.groovy @@ -62,6 +62,11 @@ class Classpaths { static final String DAGGER_COMPILER = 'dagger-compiler' static final String DAGGER_VERSION = '2.31.1' + static final String AUTOSERVICE_GROUP = 'com.google.auto.service' + static final String AUTOSERVICE_NAME = 'auto-service-annotations' + static final String AUTOSERVICE_COMPILER = 'auto-service' + static final String AUTOSERVICE_VERSION = '1.0.1' + static final String IMMUTABLES_GROUP = 'org.immutables' static final String IMMUTABLES_NAME = 'value' static final String IMMUTABLES_VERSION = '2.8.1' @@ -168,6 +173,13 @@ class Classpaths { addDependency(ap, DAGGER_GROUP, DAGGER_COMPILER, DAGGER_VERSION) } + static void inheritAutoService(Project p, boolean test = false) { + Configuration ic = p.configurations.getByName(test ? 'testCompileOnly' : 'compileOnly') + addDependency(ic, AUTOSERVICE_GROUP, AUTOSERVICE_NAME, AUTOSERVICE_VERSION) + Configuration ap = p.configurations.getByName(test ? 'testAnnotationProcessor' : 'annotationProcessor') + addDependency(ap, AUTOSERVICE_GROUP, AUTOSERVICE_COMPILER, AUTOSERVICE_VERSION) + } + static void inheritImmutables(Project p) { Configuration ap = p.configurations.getByName('annotationProcessor') addDependency(ap, IMMUTABLES_GROUP, IMMUTABLES_NAME, IMMUTABLES_VERSION) diff --git a/plugin/figure/build.gradle b/plugin/figure/build.gradle index b344d107fb5..46d8ebc36fa 100644 --- a/plugin/figure/build.gradle +++ b/plugin/figure/build.gradle @@ -6,4 +6,6 @@ dependencies { implementation project(':plugin') implementation project(':Plot') implementation project(':extensions-barrage') + + Classpaths.inheritAutoService(project) } diff --git a/plugin/figure/src/main/java/io/deephaven/figure/FigureWidgetPluginRegistration.java b/plugin/figure/src/main/java/io/deephaven/figure/FigureWidgetPluginRegistration.java index b47e157c43b..32dd69506b4 100644 --- a/plugin/figure/src/main/java/io/deephaven/figure/FigureWidgetPluginRegistration.java +++ b/plugin/figure/src/main/java/io/deephaven/figure/FigureWidgetPluginRegistration.java @@ -1,10 +1,13 @@ package io.deephaven.figure; +import com.google.auto.service.AutoService; +import io.deephaven.plugin.Registration; import io.deephaven.plugin.RegistrationBase; /** * Registers the object type plugin {@link FigureWidgetTypePlugin}. */ +@AutoService(Registration.class) public final class FigureWidgetPluginRegistration extends RegistrationBase { @Override diff --git a/plugin/figure/src/main/resources/META-INF/services/io.deephaven.plugin.Registration b/plugin/figure/src/main/resources/META-INF/services/io.deephaven.plugin.Registration deleted file mode 100644 index 10d2126487d..00000000000 --- a/plugin/figure/src/main/resources/META-INF/services/io.deephaven.plugin.Registration +++ /dev/null @@ -1 +0,0 @@ -io.deephaven.figure.FigureWidgetPluginRegistration diff --git a/server/build.gradle b/server/build.gradle index f5f7067f709..b46a72015d7 100644 --- a/server/build.gradle +++ b/server/build.gradle @@ -26,6 +26,8 @@ dependencies { Classpaths.inheritDagger(project) Classpaths.inheritDagger(project, /* test */ true) + Classpaths.inheritAutoService(project, /* test */ true) + implementation project(':Plot') implementation project(':ClientSupport') diff --git a/server/src/test/java/io/deephaven/server/object/ObjectServiceTest.java b/server/src/test/java/io/deephaven/server/object/ObjectServiceTest.java index 1d752768807..09f411e7525 100644 --- a/server/src/test/java/io/deephaven/server/object/ObjectServiceTest.java +++ b/server/src/test/java/io/deephaven/server/object/ObjectServiceTest.java @@ -1,7 +1,9 @@ package io.deephaven.server.object; +import com.google.auto.service.AutoService; import io.deephaven.engine.table.Table; import io.deephaven.engine.util.TableTools; +import io.deephaven.plugin.Registration; import io.deephaven.plugin.RegistrationBase; import io.deephaven.plugin.type.ObjectType.Exporter.Reference; import io.deephaven.plugin.type.ObjectTypeClassBase; @@ -69,9 +71,10 @@ private void fetchMyObject(Ticket ticket, String expectedSomeString, int expecte assertThat(someString).isEqualTo(expectedSomeString); assertThat(someInt).isEqualTo(expectedSomeInt); - assertThat(someTableTicket).containsExactly(response.getExportId(0).toByteArray()); + assertThat(someTableTicket).containsExactly(response.getExportId(0).getTicket().toByteArray()); } + @AutoService(Registration.class) public static class MyObjectRegistration extends RegistrationBase { public static final String MY_OBJECT_TYPE_NAME = MyObject.class.getName(); @@ -115,7 +118,7 @@ public void writeToImpl(Exporter exporter, MyObject object, OutputStream out) th doas.writeInt(object.someInt); final Ticket id = tableReference.id(); - final byte[] idBytes = id.toByteArray(); + final byte[] idBytes = id.getTicket().toByteArray(); doas.writeByte((byte) idBytes.length); doas.write(idBytes); } diff --git a/server/src/test/resources/META-INF/services/io.deephaven.plugin.Registration b/server/src/test/resources/META-INF/services/io.deephaven.plugin.Registration deleted file mode 100644 index 124a00df6b2..00000000000 --- a/server/src/test/resources/META-INF/services/io.deephaven.plugin.Registration +++ /dev/null @@ -1 +0,0 @@ -io.deephaven.server.object.ObjectServiceTest$MyObjectRegistration From 72651048fa1463f35f3f9482c335013c8d18a751 Mon Sep 17 00:00:00 2001 From: Devin Smith Date: Thu, 13 Jan 2022 07:33:35 -0800 Subject: [PATCH 33/62] f --- .../java/io/deephaven/plugin/type/ObjectType.java | 4 ++++ .../server/object/ObjectServiceGrpcImpl.java | 10 ++++++++++ .../main/java/io/deephaven/server/object/Type.java | 14 ++++++++++++++ .../io/deephaven/server/session/SessionState.java | 7 +++++++ 4 files changed, 35 insertions(+) create mode 100644 server/src/main/java/io/deephaven/server/object/Type.java diff --git a/plugin/src/main/java/io/deephaven/plugin/type/ObjectType.java b/plugin/src/main/java/io/deephaven/plugin/type/ObjectType.java index 2a75d8bb961..5696ac1d12d 100644 --- a/plugin/src/main/java/io/deephaven/plugin/type/ObjectType.java +++ b/plugin/src/main/java/io/deephaven/plugin/type/ObjectType.java @@ -61,6 +61,10 @@ interface Exporter { */ interface Reference { + String type(); + + byte[] ticket(); + /** * The ticket id, should be used in the serialized representation for the object. * diff --git a/server/src/main/java/io/deephaven/server/object/ObjectServiceGrpcImpl.java b/server/src/main/java/io/deephaven/server/object/ObjectServiceGrpcImpl.java index bd648750166..402ad0613a2 100644 --- a/server/src/main/java/io/deephaven/server/object/ObjectServiceGrpcImpl.java +++ b/server/src/main/java/io/deephaven/server/object/ObjectServiceGrpcImpl.java @@ -150,6 +150,16 @@ public ReferenceImpl(ExportObject export) { this.export = Objects.requireNonNull(export); } + @Override + public String type() { + return null; + } + + @Override + public byte[] ticket() { + return export.getExportIdBytes(); + } + @Override public Ticket id() { return export.getExportId(); diff --git a/server/src/main/java/io/deephaven/server/object/Type.java b/server/src/main/java/io/deephaven/server/object/Type.java new file mode 100644 index 00000000000..c34a1e42ac4 --- /dev/null +++ b/server/src/main/java/io/deephaven/server/object/Type.java @@ -0,0 +1,14 @@ +package io.deephaven.server.object; + +import io.deephaven.plugin.type.ObjectTypeLookup; + +import java.util.Objects; + +public class Type { + + private final ObjectTypeLookup lookup; + + public Type(ObjectTypeLookup lookup) { + this.lookup = Objects.requireNonNull(lookup); + } +} diff --git a/server/src/main/java/io/deephaven/server/session/SessionState.java b/server/src/main/java/io/deephaven/server/session/SessionState.java index 42223114e25..ab0ee30cf13 100644 --- a/server/src/main/java/io/deephaven/server/session/SessionState.java +++ b/server/src/main/java/io/deephaven/server/session/SessionState.java @@ -679,6 +679,13 @@ public Ticket getExportId() { return ExportTicketHelper.wrapExportIdInTicket(exportId); } + /** + * @return the ticket bytes for this export; note if this is a non-export the returned ticket will not resolve to anything and is considered an invalid ticket + */ + public byte[] getExportIdBytes() { + return ExportTicketHelper.exportIdToBytes(exportId); + } + /** * Add dependency if object export has not yet completed. * From ce855b905ce8f40986f17317410ac12b353282c0 Mon Sep 17 00:00:00 2001 From: Devin Smith Date: Thu, 13 Jan 2022 12:31:29 -0800 Subject: [PATCH 34/62] Typing and Reference stuff --- .../engine/util/AbstractScriptSession.java | 1 + .../client/examples/ConsoleExampleBase.java | 6 +- .../io/deephaven/client/impl/ExportId.java | 9 +- .../io/deephaven/client/impl/FieldInfo.java | 13 +- .../io/deephaven/client/impl/SessionImpl.java | 12 +- .../impl/script/VariableDefinition.java | 20 --- plugin/build.gradle | 2 +- plugin/figure/build.gradle | 2 + .../FigureWidgetPluginRegistration.java | 10 +- .../figure/FigureWidgetTranslator.java | 20 +-- .../io/deephaven/plugin/Registration.java | 11 -- .../io/deephaven/plugin/RegistrationBase.java | 30 ----- .../io/deephaven/plugin/type/ObjectType.java | 57 +++++++-- .../main/proto/deephaven/proto/ticket.proto | 6 +- .../server/plugin/object/__init__.py | 22 +++- .../deephaven2/server/plugin/register.py | 1 - .../appmode/ApplicationServiceGrpcImpl.java | 33 ++--- .../console/ConsoleServiceGrpcImpl.java | 36 ------ .../server/object/ObjectServiceGrpcImpl.java | 120 ++++++++++++------ .../java/io/deephaven/server/object/Type.java | 14 -- .../deephaven/server/object/TypeLookup.java | 26 ++++ .../server/plugin/PluginsAutoDiscovery.java | 4 +- .../server/plugin/java/JavaServiceLoader.java | 9 +- .../server/plugin/python/ExporterAdapter.java | 17 ++- .../server/session/SessionState.java | 3 +- .../server/object/ObjectServiceTest.java | 113 +++++++++++++---- 26 files changed, 321 insertions(+), 276 deletions(-) delete mode 100644 java-client/session/src/main/java/io/deephaven/client/impl/script/VariableDefinition.java delete mode 100644 plugin/src/main/java/io/deephaven/plugin/RegistrationBase.java delete mode 100644 server/src/main/java/io/deephaven/server/object/Type.java create mode 100644 server/src/main/java/io/deephaven/server/object/TypeLookup.java diff --git a/engine/table/src/main/java/io/deephaven/engine/util/AbstractScriptSession.java b/engine/table/src/main/java/io/deephaven/engine/util/AbstractScriptSession.java index aa231baf066..d28801f2cd4 100644 --- a/engine/table/src/main/java/io/deephaven/engine/util/AbstractScriptSession.java +++ b/engine/table/src/main/java/io/deephaven/engine/util/AbstractScriptSession.java @@ -203,6 +203,7 @@ private Optional getTypeNameIfDisplayable(Object object) { if (object == null) { return Optional.empty(); } + // Should this be consolidated down into TypeLookup and brought into engine? if (object instanceof Table) { final Table table = (Table) object; if (table.hasAttribute(NON_DISPLAY_TABLE)) { diff --git a/java-client/session-examples/src/main/java/io/deephaven/client/examples/ConsoleExampleBase.java b/java-client/session-examples/src/main/java/io/deephaven/client/examples/ConsoleExampleBase.java index 08f147e1301..472a275bf0a 100644 --- a/java-client/session-examples/src/main/java/io/deephaven/client/examples/ConsoleExampleBase.java +++ b/java-client/session-examples/src/main/java/io/deephaven/client/examples/ConsoleExampleBase.java @@ -52,16 +52,16 @@ public static String toPrettyString(Changes changes) { sb.append("No displayable variables updated").append(System.lineSeparator()); } else { for (FieldInfo fieldInfo : changes.changes().created()) { - sb.append(fieldInfo.type()).append(' ').append(fieldInfo.name()).append(" = ") + sb.append(fieldInfo.type().orElse("?")).append(' ').append(fieldInfo.name()).append(" = ") .append(System.lineSeparator()); } for (FieldInfo fieldInfo : changes.changes().updated()) { - sb.append(fieldInfo.type()).append(' ').append(fieldInfo.name()) + sb.append(fieldInfo.type().orElse("?")).append(' ').append(fieldInfo.name()) .append(" = ") .append(System.lineSeparator()); } for (FieldInfo fieldInfo : changes.changes().removed()) { - sb.append(fieldInfo.type()).append(' ').append(fieldInfo.name()).append(" ") + sb.append(fieldInfo.type().orElse("?")).append(' ').append(fieldInfo.name()).append(" ") .append(System.lineSeparator()); } } diff --git a/java-client/session/src/main/java/io/deephaven/client/impl/ExportId.java b/java-client/session/src/main/java/io/deephaven/client/impl/ExportId.java index 4b4eb470abe..e6581f68b39 100644 --- a/java-client/session/src/main/java/io/deephaven/client/impl/ExportId.java +++ b/java-client/session/src/main/java/io/deephaven/client/impl/ExportId.java @@ -3,6 +3,7 @@ import io.deephaven.proto.util.ExportTicketHelper; import java.util.Objects; +import java.util.Optional; /** * An opaque holder for a session export ID. @@ -13,12 +14,12 @@ public final class ExportId implements HasExportId { private final int exportId; ExportId(String type, int exportId) { - this.type = Objects.requireNonNull(type); + this.type = type; this.exportId = exportId; } - public String type() { - return type; + public Optional type() { + return Optional.ofNullable(type); } @Override @@ -38,7 +39,7 @@ public PathId pathId() { @Override public String toString() { - return type + ":" + ExportTicketHelper.toReadableString(exportId); + return (type == null ? "?:" : type + ":") + ExportTicketHelper.toReadableString(exportId); } int id() { diff --git a/java-client/session/src/main/java/io/deephaven/client/impl/FieldInfo.java b/java-client/session/src/main/java/io/deephaven/client/impl/FieldInfo.java index 42d6b276ca1..50ae9d983ce 100644 --- a/java-client/session/src/main/java/io/deephaven/client/impl/FieldInfo.java +++ b/java-client/session/src/main/java/io/deephaven/client/impl/FieldInfo.java @@ -1,7 +1,5 @@ package io.deephaven.client.impl; -import io.deephaven.proto.backplane.grpc.TypedTicket; - import java.util.Objects; import java.util.Optional; @@ -13,12 +11,11 @@ public final class FieldInfo { this.fieldInfo = Objects.requireNonNull(fieldInfo); } - public TypedTicket getTicket() { - return fieldInfo.getTicket(); - } - - public String type() { - return fieldInfo.getTicket().getType(); + public Optional type() { + if (!fieldInfo.getTicket().hasType()) { + return Optional.empty(); + } + return Optional.of(fieldInfo.getTicket().getType()); } public TicketId ticket() { diff --git a/java-client/session/src/main/java/io/deephaven/client/impl/SessionImpl.java b/java-client/session/src/main/java/io/deephaven/client/impl/SessionImpl.java index cfdc6405948..dc3909c97ab 100644 --- a/java-client/session/src/main/java/io/deephaven/client/impl/SessionImpl.java +++ b/java-client/session/src/main/java/io/deephaven/client/impl/SessionImpl.java @@ -2,7 +2,6 @@ import com.google.protobuf.ByteString; import io.deephaven.client.impl.script.Changes; -import io.deephaven.client.impl.script.VariableDefinition; import io.deephaven.proto.backplane.grpc.AddTableRequest; import io.deephaven.proto.backplane.grpc.AddTableResponse; import io.deephaven.proto.backplane.grpc.ApplicationServiceGrpc.ApplicationServiceStub; @@ -438,7 +437,12 @@ public void onNext(FetchObjectResponse value) { } private static ExportId toExportId(TypedTicket e) { - final String type = e.getType(); + final String type; + if (!e.hasType()) { + type = null; + } else { + type = e.getType(); + } final int exportId = ExportTicketHelper.ticketToExportId(e.getTicket().asReadOnlyByteBuffer(), "exportId"); return new ExportId(type, exportId); } @@ -520,10 +524,6 @@ private static class ExecuteCommandHandler implements StreamObserver future = new CompletableFuture<>(); - private static VariableDefinition of(io.deephaven.proto.backplane.grpc.FieldInfo d) { - return VariableDefinition.of(d.getTicket().getType(), d.getFieldName()); - } - private static Changes of(ExecuteCommandResponse value) { Changes.Builder builder = Changes.builder().changes(new FieldChanges(value.getChanges())); if (!value.getErrorMessage().isEmpty()) { diff --git a/java-client/session/src/main/java/io/deephaven/client/impl/script/VariableDefinition.java b/java-client/session/src/main/java/io/deephaven/client/impl/script/VariableDefinition.java deleted file mode 100644 index 03382164c55..00000000000 --- a/java-client/session/src/main/java/io/deephaven/client/impl/script/VariableDefinition.java +++ /dev/null @@ -1,20 +0,0 @@ -package io.deephaven.client.impl.script; - -import io.deephaven.annotations.SimpleStyle; -import org.immutables.value.Value.Immutable; -import org.immutables.value.Value.Parameter; - -@Immutable -@SimpleStyle -public abstract class VariableDefinition { - - public static VariableDefinition of(String type, String title) { - return ImmutableVariableDefinition.of(type, title); - } - - @Parameter - public abstract String type(); - - @Parameter - public abstract String title(); -} diff --git a/plugin/build.gradle b/plugin/build.gradle index 0a7c774e28f..548707f1e21 100644 --- a/plugin/build.gradle +++ b/plugin/build.gradle @@ -5,7 +5,7 @@ plugins { description = 'The Deephaven plugin interface' dependencies { - api project(':proto:proto-backplane-grpc') + implementation project(':proto:proto-backplane-grpc') } apply plugin: 'io.deephaven.java-publishing-conventions' diff --git a/plugin/figure/build.gradle b/plugin/figure/build.gradle index 46d8ebc36fa..7f42dd7f1e7 100644 --- a/plugin/figure/build.gradle +++ b/plugin/figure/build.gradle @@ -4,6 +4,8 @@ plugins { dependencies { implementation project(':plugin') + implementation project(':proto:proto-backplane-grpc') + implementation project(':Plot') implementation project(':extensions-barrage') diff --git a/plugin/figure/src/main/java/io/deephaven/figure/FigureWidgetPluginRegistration.java b/plugin/figure/src/main/java/io/deephaven/figure/FigureWidgetPluginRegistration.java index 32dd69506b4..73bb5d3242f 100644 --- a/plugin/figure/src/main/java/io/deephaven/figure/FigureWidgetPluginRegistration.java +++ b/plugin/figure/src/main/java/io/deephaven/figure/FigureWidgetPluginRegistration.java @@ -2,21 +2,15 @@ import com.google.auto.service.AutoService; import io.deephaven.plugin.Registration; -import io.deephaven.plugin.RegistrationBase; /** * Registers the object type plugin {@link FigureWidgetTypePlugin}. */ @AutoService(Registration.class) -public final class FigureWidgetPluginRegistration extends RegistrationBase { +public final class FigureWidgetPluginRegistration implements Registration { @Override - protected void initImpl() { - - } - - @Override - protected void registerIntoImpl(Callback callback) { + public void registerInto(Callback callback) { callback.register(FigureWidgetTypePlugin.instance()); } } diff --git a/plugin/figure/src/main/java/io/deephaven/figure/FigureWidgetTranslator.java b/plugin/figure/src/main/java/io/deephaven/figure/FigureWidgetTranslator.java index 437e23dd1a6..7ad92cfa361 100644 --- a/plugin/figure/src/main/java/io/deephaven/figure/FigureWidgetTranslator.java +++ b/plugin/figure/src/main/java/io/deephaven/figure/FigureWidgetTranslator.java @@ -2,8 +2,6 @@ import io.deephaven.api.Selectable; import io.deephaven.engine.table.Table; -import io.deephaven.extensions.barrage.util.BarrageUtil; -import io.deephaven.extensions.barrage.util.ExportUtil; import io.deephaven.gui.shape.JShapes; import io.deephaven.gui.shape.NamedShape; import io.deephaven.gui.shape.Shape; @@ -41,8 +39,6 @@ import io.deephaven.plot.util.tables.TableMapHandle; import io.deephaven.plugin.type.ObjectType.Exporter; import io.deephaven.plugin.type.ObjectType.Exporter.Reference; -import io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse; -import io.deephaven.proto.backplane.grpc.TableReference; import io.deephaven.proto.backplane.script.grpc.FigureDescriptor; import io.deephaven.proto.backplane.script.grpc.FigureDescriptor.AxisDescriptor; import io.deephaven.proto.backplane.script.grpc.FigureDescriptor.BoolMapWithDefault; @@ -84,18 +80,6 @@ public class FigureWidgetTranslator { private static final DateTimeFormatter HOLIDAY_TIME_FORMAT = DateTimeFormat.forPattern("HH:mm"); - // Copied from TableServiceGrpcImpl - public static ExportedTableCreationResponse buildTableCreationResponse(final TableReference tableRef, - final Table table) { - return ExportedTableCreationResponse.newBuilder() - .setSuccess(true) - .setResultId(tableRef) - .setIsStatic(!table.isRefreshing()) - .setSize(table.size()) - .setSchemaHeader(BarrageUtil.schemaBytesFromTable(table)) - .build(); - } - private final List errorList = new ArrayList<>(); private final Map tablePositionMap = new HashMap<>(); private final Map tableMapPositionMap = new HashMap<>(); @@ -123,7 +107,9 @@ private FigureDescriptor translateFigure(FigureWidget f, Exporter exporter) { } i++; - exporter.newServerSideReference(table); + // noinspection unused + final Reference reference = exporter.newReference(table); + // relying on FetchObjectResponse.export_id for communicating exported tables to the client } // TODO (deephaven-core#62) implement once tablemaps are ready diff --git a/plugin/src/main/java/io/deephaven/plugin/Registration.java b/plugin/src/main/java/io/deephaven/plugin/Registration.java index c8820e0784a..7298f4532b8 100644 --- a/plugin/src/main/java/io/deephaven/plugin/Registration.java +++ b/plugin/src/main/java/io/deephaven/plugin/Registration.java @@ -5,23 +5,12 @@ */ public interface Registration { - /** - * Initialize the registration. - * - *

- * Should not be called more than once. - */ - void init(); - /** * The registration entrypoint. * *

* May be called multiple times. * - *

- * The registration must be {@link #init() initialized} before calling this. - * * @param callback the callback. */ void registerInto(Callback callback); diff --git a/plugin/src/main/java/io/deephaven/plugin/RegistrationBase.java b/plugin/src/main/java/io/deephaven/plugin/RegistrationBase.java deleted file mode 100644 index f7b3b57168f..00000000000 --- a/plugin/src/main/java/io/deephaven/plugin/RegistrationBase.java +++ /dev/null @@ -1,30 +0,0 @@ -package io.deephaven.plugin; - -/** - * A base registration which enforces the restrictions on {@link #init()} and {@link #registerInto(Callback)}. - */ -public abstract class RegistrationBase implements Registration { - - private boolean initialized; - - protected abstract void initImpl(); - - protected abstract void registerIntoImpl(Callback callback); - - @Override - public final synchronized void init() { - if (initialized) { - throw new IllegalStateException("The registration is already initialized"); - } - initialized = true; - initImpl(); - } - - @Override - public final synchronized void registerInto(Callback callback) { - if (!initialized) { - throw new IllegalStateException("The registration must be initialized first"); - } - registerIntoImpl(callback); - } -} diff --git a/plugin/src/main/java/io/deephaven/plugin/type/ObjectType.java b/plugin/src/main/java/io/deephaven/plugin/type/ObjectType.java index 5696ac1d12d..0f89048ce42 100644 --- a/plugin/src/main/java/io/deephaven/plugin/type/ObjectType.java +++ b/plugin/src/main/java/io/deephaven/plugin/type/ObjectType.java @@ -2,10 +2,11 @@ import io.deephaven.plugin.Plugin; import io.deephaven.plugin.type.ObjectType.Exporter.Reference; -import io.deephaven.proto.backplane.grpc.Ticket; import java.io.IOException; import java.io.OutputStream; +import java.util.Optional; +import java.util.function.BiPredicate; /** * An "object type" plugin. Useful for serializing custom objects between the server / client. @@ -29,9 +30,10 @@ public interface ObjectType extends Plugin { /** * Serializes {@code object} into {@code out}. Must only be called with a compatible object, see - * {@link #isType(Object)}. If the {@code object} references another server side object(s), the other server side - * object(s) should be referenced with the {@code exporter}, and the {@link Reference#id()} serialized as - * appropriate. + * {@link #isType(Object)}. + * + *

+ * Objects that {@code object} references may be serialized as {@link Reference}. * *

* Note: the implementation should not hold onto references nor create references outside the calling thread. @@ -44,33 +46,62 @@ public interface ObjectType extends Plugin { void writeTo(Exporter exporter, Object object, OutputStream out) throws IOException; /** - * The interface for objects to describe their relationship to other objects. + * The interface for creating new references during the {@link #writeTo(Exporter, Object, OutputStream)}. */ interface Exporter { /** - * Create a new server side reference. + * Gets the reference for {@code object} if it has already been created, otherwise creates a new one. Uses + * reference-based equality. + * + * @param object the object + * @return the reference + */ + Reference reference(Object object); + + /** + * Gets the reference for {@code object} if it has already been created, otherwise creates a new one. * * @param object the object + * @param equals the equals logic * @return the reference */ - Reference newServerSideReference(Object object); + Reference reference(Object object, BiPredicate equals); + + /** + * Create a new reference. + * + * @param object the object + * @return the reference + */ + Reference newReference(Object object); /** * A reference. */ interface Reference { + /** + * The index, which is defined by the order in which references are created. May be used in the output + * stream to refer to the reference from the client without needing to re-serialize the {@link #type()} and + * {@link #ticket()}. + * + * @return the index + */ + int index(); - String type(); - - byte[] ticket(); + /** + * The type. + * + * @return the type, if present + */ + Optional type(); /** - * The ticket id, should be used in the serialized representation for the object. + * The ticket. * - * @return the id + * @return the ticket */ - Ticket id(); + byte[] ticket(); } } } diff --git a/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/ticket.proto b/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/ticket.proto index 3a0acac372c..6654edae40b 100644 --- a/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/ticket.proto +++ b/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/ticket.proto @@ -27,5 +27,9 @@ message Ticket { message TypedTicket { bytes ticket = 1; - string type = 2; + + /* + * The type. Its absence means that it is not known, not that the server chose to not set it. + */ + optional string type = 2; } \ No newline at end of file diff --git a/pyintegration/deephaven2/server/plugin/object/__init__.py b/pyintegration/deephaven2/server/plugin/object/__init__.py index 71f3c2197e1..8f6822d33ed 100644 --- a/pyintegration/deephaven2/server/plugin/object/__init__.py +++ b/pyintegration/deephaven2/server/plugin/object/__init__.py @@ -1,22 +1,36 @@ import jpy from deephaven.plugin.object import Exporter, ObjectType, Reference +_JReference = jpy.get_type('io.deephaven.plugin.type.ObjectType$Exporter$Reference') _JExporterAdapter = jpy.get_type('io.deephaven.server.plugin.python.ExporterAdapter') + +def adapt_reference(ref: _JReference) -> Reference: + return Reference(ref.index(), ref.type().orElse(None), bytes(ref.ticket())) + + class ExporterAdapter(Exporter): def __init__(self, exporter: _JExporterAdapter): self._exporter = exporter - def new_server_side_reference(self, object) -> Reference: + def reference(self, object) -> Reference: if isinstance(object, jpy.JType): - _reference = self._exporter.newServerSideReference(object) + ref = self._exporter.reference(object) else: - _reference = self._exporter.newServerSideReferencePyObject(object) - return Reference(bytes(_reference.id().getTicket().toByteArray())) + ref = self._exporter.referencePyObject(object) + return adapt_reference(ref) + + def new_reference(self, object) -> Reference: + if isinstance(object, jpy.JType): + ref = self._exporter.newReference(object) + else: + ref = self._exporter.newReferencePyObject(object) + return adapt_reference(ref) def __str__(self): return str(self._exporter) + # see io.deephaven.server.plugin.python.ObjectTypeAdapter for calling details class ObjectTypeAdapter: def __init__(self, user_object_type: ObjectType): diff --git a/pyintegration/deephaven2/server/plugin/register.py b/pyintegration/deephaven2/server/plugin/register.py index 9b5ff29b952..9783459dfc3 100644 --- a/pyintegration/deephaven2/server/plugin/register.py +++ b/pyintegration/deephaven2/server/plugin/register.py @@ -10,7 +10,6 @@ def initialize_all_and_register_into(callback: _JCallbackAdapter): - deephaven.plugin.initialize_all() deephaven.plugin.register_all_into(RegistrationAdapter(callback)) diff --git a/server/src/main/java/io/deephaven/server/appmode/ApplicationServiceGrpcImpl.java b/server/src/main/java/io/deephaven/server/appmode/ApplicationServiceGrpcImpl.java index 2351cc982e1..1cce5ee98eb 100644 --- a/server/src/main/java/io/deephaven/server/appmode/ApplicationServiceGrpcImpl.java +++ b/server/src/main/java/io/deephaven/server/appmode/ApplicationServiceGrpcImpl.java @@ -5,19 +5,18 @@ import io.deephaven.appmode.Field; import io.deephaven.engine.liveness.LivenessArtifact; import io.deephaven.engine.liveness.LivenessReferent; -import io.deephaven.engine.table.Table; import io.deephaven.engine.updategraph.DynamicNode; import io.deephaven.engine.util.ScriptSession; import io.deephaven.extensions.barrage.util.GrpcUtil; import io.deephaven.internal.log.LoggerFactory; import io.deephaven.io.logger.Logger; -import io.deephaven.plugin.type.ObjectType; -import io.deephaven.plugin.type.ObjectTypeLookup; import io.deephaven.proto.backplane.grpc.ApplicationServiceGrpc; import io.deephaven.proto.backplane.grpc.FieldInfo; import io.deephaven.proto.backplane.grpc.FieldsChangeUpdate; import io.deephaven.proto.backplane.grpc.ListFieldsRequest; import io.deephaven.proto.backplane.grpc.TypedTicket; +import io.deephaven.proto.backplane.grpc.TypedTicket.Builder; +import io.deephaven.server.object.TypeLookup; import io.deephaven.server.session.SessionService; import io.deephaven.server.session.SessionState; import io.deephaven.server.util.Scheduler; @@ -43,7 +42,7 @@ public class ApplicationServiceGrpcImpl extends ApplicationServiceGrpc.Applicati private final AppMode mode; private final Scheduler scheduler; private final SessionService sessionService; - private final ObjectTypeLookup objectTypeLookup; + private final TypeLookup typeLookup; private final LivenessTracker tracker = new LivenessTracker(); @@ -66,11 +65,11 @@ public class ApplicationServiceGrpcImpl extends ApplicationServiceGrpc.Applicati public ApplicationServiceGrpcImpl(final AppMode mode, final Scheduler scheduler, final SessionService sessionService, - final ObjectTypeLookup objectTypeLookup) { + final TypeLookup typeLookup) { this.mode = mode; this.scheduler = scheduler; this.sessionService = sessionService; - this.objectTypeLookup = objectTypeLookup; + this.typeLookup = typeLookup; } @Override @@ -242,10 +241,7 @@ synchronized void remove(Subscription sub) { private FieldInfo getRemovedFieldInfo(final AppFieldId id, final Field field) { return FieldInfo.newBuilder() - .setTicket(TypedTicket.newBuilder() - .setType(fieldType(field.value())) - .setTicket(id.getTicket().getTicket()) - .build()) + .setTicket(typedTicket(id, field)) .setFieldName(id.fieldName) .setApplicationId(id.applicationId()) .setApplicationName(id.applicationName()) @@ -254,10 +250,7 @@ private FieldInfo getRemovedFieldInfo(final AppFieldId id, final Field field) private FieldInfo getFieldInfo(final AppFieldId id, final Field field) { return FieldInfo.newBuilder() - .setTicket(TypedTicket.newBuilder() - .setType(fieldType(field.value())) - .setTicket(id.getTicket().getTicket()) - .build()) + .setTicket(typedTicket(id, field)) .setFieldName(id.fieldName) .setFieldDescription(field.description().orElse("")) .setApplicationId(id.applicationId()) @@ -265,14 +258,10 @@ private FieldInfo getFieldInfo(final AppFieldId id, final Field field) { .build(); } - // todo consolidate logic - private String fieldType(final Object object) { - if (object instanceof Table) { - return "Table"; - } - return objectTypeLookup.findObjectType(object) - .map(ObjectType::name) - .orElse(""); + private TypedTicket typedTicket(AppFieldId id, Field field) { + final Builder ticket = TypedTicket.newBuilder().setTicket(id.getTicket().getTicket()); + typeLookup.type(field.value()).ifPresent(ticket::setType); + return ticket.build(); } private static class ScopeField implements Field { diff --git a/server/src/main/java/io/deephaven/server/console/ConsoleServiceGrpcImpl.java b/server/src/main/java/io/deephaven/server/console/ConsoleServiceGrpcImpl.java index 8d1b010810b..5db298d5b65 100644 --- a/server/src/main/java/io/deephaven/server/console/ConsoleServiceGrpcImpl.java +++ b/server/src/main/java/io/deephaven/server/console/ConsoleServiceGrpcImpl.java @@ -44,9 +44,6 @@ import io.deephaven.proto.backplane.script.grpc.ConsoleServiceGrpc; import io.deephaven.proto.backplane.script.grpc.ExecuteCommandRequest; import io.deephaven.proto.backplane.script.grpc.ExecuteCommandResponse; -import io.deephaven.proto.backplane.script.grpc.FetchFigureRequest; -import io.deephaven.proto.backplane.script.grpc.FetchFigureResponse; -import io.deephaven.proto.backplane.script.grpc.FigureDescriptor; import io.deephaven.proto.backplane.script.grpc.GetCompletionItemsRequest; import io.deephaven.proto.backplane.script.grpc.GetCompletionItemsResponse; import io.deephaven.proto.backplane.script.grpc.GetConsoleTypesRequest; @@ -58,7 +55,6 @@ import io.deephaven.proto.backplane.script.grpc.TextDocumentItem; import io.deephaven.proto.backplane.script.grpc.VersionedTextDocumentIdentifier; import io.deephaven.proto.util.ScopeTicketHelper; -import io.deephaven.server.object.ObjectServiceGrpcImpl.ExportCollector; import io.deephaven.server.session.SessionCloseableObserver; import io.deephaven.server.session.SessionService; import io.deephaven.server.session.SessionState; @@ -418,38 +414,6 @@ public void onCompleted() { }); } - // TODO(deephaven-core#1784): Remove fetchFigure RPC - @Deprecated - @Override - public void fetchFigure(FetchFigureRequest request, StreamObserver responseObserver) { - GrpcUtil.rpcWrapper(log, responseObserver, () -> { - final SessionState session = sessionService.getCurrentSession(); - if (request.getSourceId().getTicket().isEmpty()) { - throw GrpcUtil.statusRuntimeException(Code.FAILED_PRECONDITION, "No sourceId supplied"); - } - final SessionState.ExportObject figure = ticketRouter.resolve( - session, request.getSourceId(), "sourceId"); - - session.nonExport() - .require(figure) - .onError(responseObserver) - .submit(() -> { - Object result = figure.get(); - if (!(result instanceof FigureWidget)) { - final String name = ticketRouter.getLogNameFor(request.getSourceId(), "sourceId"); - throw GrpcUtil.statusRuntimeException(Code.NOT_FOUND, - "Value bound to ticket " + name + " is not a FigureWidget"); - } - FigureWidget widget = (FigureWidget) result; - final ExportCollector exportCollector = new ExportCollector(session); - FigureDescriptor translated = FigureWidgetTranslator.translate(widget, exportCollector); - responseObserver - .onNext(FetchFigureResponse.newBuilder().setFigureDescriptor(translated).build()); - responseObserver.onCompleted(); - }); - }); - } - private static class LogBufferStreamAdapter extends SessionCloseableObserver implements LogBufferRecordListener { private final LogSubscriptionRequest request; diff --git a/server/src/main/java/io/deephaven/server/object/ObjectServiceGrpcImpl.java b/server/src/main/java/io/deephaven/server/object/ObjectServiceGrpcImpl.java index 402ad0613a2..bbf06ca8375 100644 --- a/server/src/main/java/io/deephaven/server/object/ObjectServiceGrpcImpl.java +++ b/server/src/main/java/io/deephaven/server/object/ObjectServiceGrpcImpl.java @@ -1,5 +1,6 @@ package io.deephaven.server.object; +import com.google.protobuf.ByteString; import com.google.protobuf.ByteStringAccess; import com.google.rpc.Code; import io.deephaven.engine.table.Table; @@ -15,19 +16,22 @@ import io.deephaven.proto.backplane.grpc.FetchObjectResponse; import io.deephaven.proto.backplane.grpc.FetchObjectResponse.Builder; import io.deephaven.proto.backplane.grpc.ObjectServiceGrpc; -import io.deephaven.proto.backplane.grpc.Ticket; import io.deephaven.proto.backplane.grpc.TypedTicket; import io.deephaven.server.session.SessionService; import io.deephaven.server.session.SessionState; import io.deephaven.server.session.SessionState.ExportObject; import io.deephaven.server.session.TicketRouter; import io.grpc.stub.StreamObserver; +import org.jetbrains.annotations.NotNull; +import org.jpy.PyObject; import javax.inject.Inject; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Objects; +import java.util.Optional; +import java.util.function.BiPredicate; public class ObjectServiceGrpcImpl extends ObjectServiceGrpc.ObjectServiceImplBase { private static final Logger log = LoggerFactory.getLogger(ObjectServiceGrpcImpl.class); @@ -35,13 +39,15 @@ public class ObjectServiceGrpcImpl extends ObjectServiceGrpc.ObjectServiceImplBa private final SessionService sessionService; private final TicketRouter ticketRouter; private final ObjectTypeLookup objectTypeLookup; + private final TypeLookup typeLookup; @Inject public ObjectServiceGrpcImpl(SessionService sessionService, TicketRouter ticketRouter, - ObjectTypeLookup objectTypeLookup) { + ObjectTypeLookup objectTypeLookup, TypeLookup typeLookup) { this.sessionService = Objects.requireNonNull(sessionService); this.ticketRouter = Objects.requireNonNull(ticketRouter); this.objectTypeLookup = Objects.requireNonNull(objectTypeLookup); + this.typeLookup = Objects.requireNonNull(typeLookup); } @Override @@ -76,13 +82,8 @@ private FetchObjectResponse serialize(SessionState state, Object object) throws final Builder builder = FetchObjectResponse.newBuilder() .setType(objectType.name()) .setData(ByteStringAccess.wrap(out.peekBuffer(), 0, out.size())); - for (ExportObject export : exportCollector.exports()) { - final String exportType = findType(export.get()); - final Ticket exportId = export.getExportId(); - builder.addExportId(TypedTicket.newBuilder() - .setType(exportType) - .setTicket(exportId.getTicket()) - .build()); + for (ReferenceImpl ref : exportCollector.refs()) { + builder.addExportId(ref.typedTicket()); } return builder.build(); } catch (Throwable t) { @@ -91,18 +92,10 @@ private FetchObjectResponse serialize(SessionState state, Object object) throws } } - // todo consolidate logic - private String findType(Object o) { - if (o instanceof Table) { - return "Table"; - } - return objectTypeLookup.findObjectType(o).map(ObjectType::name).orElse(""); - } - private static void cleanup(ExportCollector exportCollector, Throwable t) { - for (ExportObject export : exportCollector.exports()) { + for (ReferenceImpl ref : exportCollector.refs()) { try { - export.release(); + ref.export.release(); } catch (Throwable inner) { t.addSuppressed(inner); } @@ -114,55 +107,110 @@ private static IllegalArgumentException noTypeException(Object o) { "No type registered for object class=" + o.getClass().getName() + ", value=" + o); } - // Make private after - // TODO(deephaven-core#1784): Remove fetchFigure RPC - public static final class ExportCollector implements Exporter { + private static boolean referenceEquality(Object t, Object u) { + return t == u; + } + + final class ExportCollector implements Exporter { private final SessionState sessionState; private final Thread thread; - private final List> exports; + private final List references; public ExportCollector(SessionState sessionState) { this.sessionState = Objects.requireNonNull(sessionState); this.thread = Thread.currentThread(); - this.exports = new ArrayList<>(); + this.references = new ArrayList<>(); + } + + public List refs() { + return references; + } + + public Reference reference(PyObject object) { + if (thread != Thread.currentThread()) { + throw new IllegalStateException("Should only create references on the calling thread"); + } + for (ReferenceImpl reference : references) { + // Need to check pointers for python + if (object.equals(reference.export.get())) { + return reference; + } + } + return newReferenceImpl(object); + } + + @Override + public Reference reference(Object object) { + if (object instanceof PyObject) { + throw new IllegalArgumentException("PyObject should be called using equals()-based equality"); + } + return reference(object, ObjectServiceGrpcImpl::referenceEquality); } - public List> exports() { - return exports; + @Override + public Reference reference(Object object, BiPredicate equals) { + if (thread != Thread.currentThread()) { + throw new IllegalStateException("Should only create references on the calling thread"); + } + for (ReferenceImpl reference : references) { + if (equals.test(object, reference.export.get())) { + return reference; + } + } + return newReferenceImpl(object); } @Override - public Reference newServerSideReference(Object object) { + public Reference newReference(Object object) { if (thread != Thread.currentThread()) { throw new IllegalStateException("Should only create new references on the calling thread"); } + return newReferenceImpl(object); + } + + private ReferenceImpl newReferenceImpl(Object object) { final ExportObject exportObject = sessionState.newServerSideExport(object); - exports.add(exportObject); - return new ReferenceImpl(exportObject); + final ReferenceImpl ref = + new ReferenceImpl(references.size(), typeLookup.type(object).orElse(null), exportObject); + references.add(ref); + return ref; } } private static final class ReferenceImpl implements Reference { + private final int index; + private final String type; private final ExportObject export; - public ReferenceImpl(ExportObject export) { + public ReferenceImpl(int index, String type, ExportObject export) { + this.index = index; + this.type = type; this.export = Objects.requireNonNull(export); } + public TypedTicket typedTicket() { + final ByteString ticket = ByteStringAccess.wrap(export.getExportIdBytes()); + final TypedTicket.Builder builder = TypedTicket.newBuilder().setTicket(ticket); + if (type != null) { + builder.setType(type); + } + return builder.build(); + } + @Override - public String type() { - return null; + public int index() { + return index; } @Override - public byte[] ticket() { - return export.getExportIdBytes(); + public Optional type() { + return Optional.ofNullable(type); } @Override - public Ticket id() { - return export.getExportId(); + public byte[] ticket() { + return export.getExportIdBytes(); } } } diff --git a/server/src/main/java/io/deephaven/server/object/Type.java b/server/src/main/java/io/deephaven/server/object/Type.java deleted file mode 100644 index c34a1e42ac4..00000000000 --- a/server/src/main/java/io/deephaven/server/object/Type.java +++ /dev/null @@ -1,14 +0,0 @@ -package io.deephaven.server.object; - -import io.deephaven.plugin.type.ObjectTypeLookup; - -import java.util.Objects; - -public class Type { - - private final ObjectTypeLookup lookup; - - public Type(ObjectTypeLookup lookup) { - this.lookup = Objects.requireNonNull(lookup); - } -} diff --git a/server/src/main/java/io/deephaven/server/object/TypeLookup.java b/server/src/main/java/io/deephaven/server/object/TypeLookup.java new file mode 100644 index 00000000000..cd95dd7f885 --- /dev/null +++ b/server/src/main/java/io/deephaven/server/object/TypeLookup.java @@ -0,0 +1,26 @@ +package io.deephaven.server.object; + +import io.deephaven.engine.table.Table; +import io.deephaven.plugin.type.ObjectType; +import io.deephaven.plugin.type.ObjectTypeLookup; + +import javax.inject.Inject; +import java.util.Objects; +import java.util.Optional; + +public final class TypeLookup { + + private final ObjectTypeLookup lookup; + + @Inject + public TypeLookup(ObjectTypeLookup lookup) { + this.lookup = Objects.requireNonNull(lookup); + } + + public Optional type(Object object) { + if (object instanceof Table) { + return Optional.of("Table"); + } + return lookup.findObjectType(object).map(ObjectType::name); + } +} diff --git a/server/src/main/java/io/deephaven/server/plugin/PluginsAutoDiscovery.java b/server/src/main/java/io/deephaven/server/plugin/PluginsAutoDiscovery.java index 3213e64fe29..7328fc8e875 100644 --- a/server/src/main/java/io/deephaven/server/plugin/PluginsAutoDiscovery.java +++ b/server/src/main/java/io/deephaven/server/plugin/PluginsAutoDiscovery.java @@ -30,7 +30,7 @@ public PluginsAutoDiscovery(Registration.Callback callback) { } /** - * Registers {@link Registration plugins} via {@link JavaServiceLoader#initializeAllAndRegisterInto(Callback)} and + * Registers {@link Registration plugins} via {@link JavaServiceLoader#loadAllAndRegisterInto(Callback)} and * {@link PythonModuleLoader#allRegisterInto(Callback)} (if python is enabled). */ public void registerAll() { @@ -42,7 +42,7 @@ public void registerAll(boolean includePython) { log.info().append("Registering plugins...").endl(); // TODO(deephaven-core#1810): Use service loader to abstract the different plugin auto-discovery methods final Counting serviceLoaderCount = new Counting(); - JavaServiceLoader.initializeAllAndRegisterInto(serviceLoaderCount); + JavaServiceLoader.loadAllAndRegisterInto(serviceLoaderCount); final Counting pythonModuleCount = new Counting(); if (includePython) { PythonModuleLoader.allRegisterInto(pythonModuleCount); diff --git a/server/src/main/java/io/deephaven/server/plugin/java/JavaServiceLoader.java b/server/src/main/java/io/deephaven/server/plugin/java/JavaServiceLoader.java index 9213737dc91..0d8a725e492 100644 --- a/server/src/main/java/io/deephaven/server/plugin/java/JavaServiceLoader.java +++ b/server/src/main/java/io/deephaven/server/plugin/java/JavaServiceLoader.java @@ -11,16 +11,13 @@ public final class JavaServiceLoader { /** - * Initializes all {@link Registration registrations} found via {@link ServiceLoader#load(Class)}, and register them - * into {@code callback}. + * Load all {@link Registration registrations} found via {@link ServiceLoader#load(Class)}, and register them into + * {@code callback}. * * @param callback the plugin callback */ - public static void initializeAllAndRegisterInto(Callback callback) { + public static void loadAllAndRegisterInto(Callback callback) { final List registrations = loadFromServiceLoader(); - for (Registration registration : registrations) { - registration.init(); - } for (Registration registration : registrations) { registration.registerInto(callback); } diff --git a/server/src/main/java/io/deephaven/server/plugin/python/ExporterAdapter.java b/server/src/main/java/io/deephaven/server/plugin/python/ExporterAdapter.java index fee29772a98..18bf1e08a1b 100644 --- a/server/src/main/java/io/deephaven/server/plugin/python/ExporterAdapter.java +++ b/server/src/main/java/io/deephaven/server/plugin/python/ExporterAdapter.java @@ -14,12 +14,21 @@ public ExporterAdapter(Exporter exporter) { this.exporter = Objects.requireNonNull(exporter); } - public Reference newServerSideReference(Object object) { - return exporter.newServerSideReference(object); + public Reference newReference(Object object) { + return exporter.newReference(object); } // TODO(deephaven-core#1775): multivariate jpy (unwrapped) call into java - public Reference newServerSideReferencePyObject(PyObject object) { - return exporter.newServerSideReference(object); + public Reference newReferencePyObject(PyObject object) { + return exporter.newReference(object); + } + + public Reference reference(Object object) { + return exporter.reference(object); + } + + // TODO(deephaven-core#1775): multivariate jpy (unwrapped) call into java + public Reference referencePyObject(PyObject object) { + return exporter.reference(object, Objects::equals); } } diff --git a/server/src/main/java/io/deephaven/server/session/SessionState.java b/server/src/main/java/io/deephaven/server/session/SessionState.java index ab0ee30cf13..2b016d4a4f4 100644 --- a/server/src/main/java/io/deephaven/server/session/SessionState.java +++ b/server/src/main/java/io/deephaven/server/session/SessionState.java @@ -680,7 +680,8 @@ public Ticket getExportId() { } /** - * @return the ticket bytes for this export; note if this is a non-export the returned ticket will not resolve to anything and is considered an invalid ticket + * @return the ticket bytes for this export; note if this is a non-export the returned ticket will not resolve + * to anything and is considered an invalid ticket */ public byte[] getExportIdBytes() { return ExportTicketHelper.exportIdToBytes(exportId); diff --git a/server/src/test/java/io/deephaven/server/object/ObjectServiceTest.java b/server/src/test/java/io/deephaven/server/object/ObjectServiceTest.java index 09f411e7525..e593bd0f313 100644 --- a/server/src/test/java/io/deephaven/server/object/ObjectServiceTest.java +++ b/server/src/test/java/io/deephaven/server/object/ObjectServiceTest.java @@ -4,7 +4,6 @@ import io.deephaven.engine.table.Table; import io.deephaven.engine.util.TableTools; import io.deephaven.plugin.Registration; -import io.deephaven.plugin.RegistrationBase; import io.deephaven.plugin.type.ObjectType.Exporter.Reference; import io.deephaven.plugin.type.ObjectTypeClassBase; import io.deephaven.proto.backplane.grpc.FetchObjectRequest; @@ -15,10 +14,13 @@ import io.grpc.StatusRuntimeException; import org.junit.Test; +import java.io.DataInput; import java.io.DataInputStream; +import java.io.DataOutput; import java.io.DataOutputStream; import java.io.IOException; import java.io.OutputStream; +import java.util.Objects; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.failBecauseExceptionWasNotThrown; @@ -27,10 +29,12 @@ public class ObjectServiceTest extends DeephavenApiServerSingleAuthenticatedBase private static final String MY_OBJECT_SOME_STRING = "some string"; private static final int MY_OBJECT_SOME_INT = 42; + private static final MyRefObject REF = new MyRefObject(); + private static final MyUnregisteredObject UNREG = new MyUnregisteredObject(); public static MyObject createMyObject() { return new MyObject(MY_OBJECT_SOME_STRING, MY_OBJECT_SOME_INT, - TableTools.emptyTable(MY_OBJECT_SOME_INT).view("I=i")); + TableTools.emptyTable(MY_OBJECT_SOME_INT).view("I=i"), REF, UNREG); } @Test @@ -61,32 +65,50 @@ private void fetchMyObject(Ticket ticket, String expectedSomeString, int expecte final FetchObjectResponse response = channel().objectBlocking().fetchObject(request); assertThat(response.getType()).isEqualTo(MyObjectRegistration.MY_OBJECT_TYPE_NAME); - assertThat(response.getExportIdCount()).isEqualTo(1); + assertThat(response.getExportIdCount()).isEqualTo(4); + assertThat(response.getExportId(0).getType()).isEqualTo("Table"); + assertThat(response.getExportId(1).getType()).isEqualTo(MyObjectRegistration.MY_REF_OBJECT_TYPE_NAME); + assertThat(response.getExportId(2).hasType()).isFalse(); + assertThat(response.getExportId(3).getType()).isEqualTo(MyObjectRegistration.MY_REF_OBJECT_TYPE_NAME); final DataInputStream dis = new DataInputStream(response.getData().newInput()); - final String someString = dis.readUTF(); - final int someInt = dis.readInt(); - final byte ticketLen = dis.readByte(); - final byte[] someTableTicket = dis.readNBytes(ticketLen); - - assertThat(someString).isEqualTo(expectedSomeString); - assertThat(someInt).isEqualTo(expectedSomeInt); - assertThat(someTableTicket).containsExactly(response.getExportId(0).getTicket().toByteArray()); + + // the original, out of order + readRef(dis, 2); + readRef(dis, 1); + readRef(dis, 0); + + // the extras + readRef(dis, 0); // our extra ref to table + readRef(dis, 3); // our new extra ref + + readString(dis, expectedSomeString); + readInt(dis, expectedSomeInt); + } + + private void readRef(DataInputStream in, int expectedIndex) throws IOException { + assertThat((int) in.readByte()).isEqualTo(expectedIndex); + } + + private void readString(DataInput in, String expected) throws IOException { + assertThat(in.readUTF()).isEqualTo(expected); + } + + private void readInt(DataInput in, int expected) throws IOException { + assertThat(in.readInt()).isEqualTo(expected); } @AutoService(Registration.class) - public static class MyObjectRegistration extends RegistrationBase { + public static class MyObjectRegistration implements Registration { public static final String MY_OBJECT_TYPE_NAME = MyObject.class.getName(); - @Override - protected void initImpl() { - - } + public static final String MY_REF_OBJECT_TYPE_NAME = MyRefObject.class.getName(); @Override - protected void registerIntoImpl(Callback callback) { - callback.register(new MyObjectType(MY_OBJECT_TYPE_NAME)); + public void registerInto(Callback callback) { + callback.register(new MyObjectType()); + callback.register(new MyRefObjectType()); } } @@ -94,33 +116,68 @@ public static class MyObject { private final String someString; private final int someInt; private final Table someTable; + private final MyRefObject someObj; + private final MyUnregisteredObject someUnknown; - public MyObject(String someString, int someInt, Table someTable) { - this.someString = someString; + public MyObject(String someString, int someInt, Table someTable, MyRefObject someObj, + MyUnregisteredObject someUnknown) { + this.someString = Objects.requireNonNull(someString); this.someInt = someInt; - this.someTable = someTable; + this.someTable = Objects.requireNonNull(someTable); + this.someObj = Objects.requireNonNull(someObj); + this.someUnknown = Objects.requireNonNull(someUnknown); } } + public static class MyRefObject { + + } + public static class MyUnregisteredObject { } private static class MyObjectType extends ObjectTypeClassBase { - public MyObjectType(String name) { - super(name, MyObject.class); + public MyObjectType() { + super(MyObjectRegistration.MY_OBJECT_TYPE_NAME, MyObject.class); } @Override public void writeToImpl(Exporter exporter, MyObject object, OutputStream out) throws IOException { - final Reference tableReference = exporter.newServerSideReference(object.someTable); + final Reference tableRef = exporter.reference(object.someTable); + final Reference objRef = exporter.reference(object.someObj); + final Reference unknownRef = exporter.reference(object.someUnknown); + + final Reference extraTableRef = exporter.reference(object.someTable); + final Reference extraNewObjRef = exporter.newReference(object.someObj); + final DataOutputStream doas = new DataOutputStream(out); + + // let's write them out of order + writeRef(doas, unknownRef); + writeRef(doas, objRef); + writeRef(doas, tableRef); + + // and then write the extras + writeRef(doas, extraTableRef); + writeRef(doas, extraNewObjRef); + doas.writeUTF(object.someString); doas.writeInt(object.someInt); + } - final Ticket id = tableReference.id(); - final byte[] idBytes = id.getTicket().toByteArray(); - doas.writeByte((byte) idBytes.length); - doas.write(idBytes); + private static void writeRef(DataOutput out, Reference reference) throws IOException { + out.writeByte(reference.index()); + } + } + + private static class MyRefObjectType extends ObjectTypeClassBase { + public MyRefObjectType() { + super(MyObjectRegistration.MY_REF_OBJECT_TYPE_NAME, MyRefObject.class); + } + + @Override + public void writeToImpl(Exporter exporter, MyRefObject object, OutputStream out) throws IOException { + // no-op } } } From a7fc020d58401ba231f8fcf81f27d9b50fe9e43b Mon Sep 17 00:00:00 2001 From: Devin Smith Date: Thu, 13 Jan 2022 13:45:11 -0800 Subject: [PATCH 35/62] Remove FetchFigure --- .../main/proto/deephaven/proto/console.proto | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/console.proto b/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/console.proto index 5c5b2dcb6b3..aae935f554c 100644 --- a/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/console.proto +++ b/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/console.proto @@ -44,11 +44,6 @@ service ConsoleService { * Other half of the browser-based implementation for AutoCompleteStream. */ rpc NextAutoCompleteStream(AutoCompleteRequest) returns (BrowserNextResponse) {} - - /** - * Deprecated: TODO(deephaven-core#1784): Remove fetchFigure RPC - */ - rpc FetchFigure(FetchFigureRequest) returns (FetchFigureResponse) {} } @@ -210,20 +205,6 @@ message TextEdit { string text = 2; } -/** - * Deprecated: TODO(deephaven-core#1784): Remove fetchFigure RPC - */ -message FetchFigureRequest { - io.deephaven.proto.backplane.grpc.Ticket source_id = 1; -} - -/** - * Deprecated: TODO(deephaven-core#1784): Remove fetchFigure RPC - */ -message FetchFigureResponse { - FigureDescriptor figure_descriptor = 1; -} - message FigureDescriptor { optional string title = 1; string title_font = 2; From d905b372725527e0aebbad24608828bcb0e935cc Mon Sep 17 00:00:00 2001 From: Colin Alworth Date: Fri, 14 Jan 2022 09:59:06 -0600 Subject: [PATCH 36/62] Update generated gwt bindings, new code doesn't work in api yet --- .../proto/application_pb/CustomInfo.java | 62 - .../proto/application_pb/FieldInfo.java | 261 +- .../application_pb/FieldsChangeUpdate.java | 250 +- .../proto/application_pb/FigureInfo.java | 25 - .../application_pb/fieldinfo/FieldType.java | 283 --- .../fieldinfo/fieldtype/FieldCase.java | 15 - .../console_pb/ExecuteCommandResponse.java | 410 +-- .../proto/console_pb/FetchFigureResponse.java | 2214 ----------------- .../proto/console_pb/FigureDescriptor.java | 384 --- .../proto/console_pb/VariableDefinition.java | 214 -- .../console_pb_service/ConsoleService.java | 45 - .../ConsoleServiceClient.java | 145 -- .../FetchObjectRequest.java} | 58 +- .../proto/object_pb/FetchObjectResponse.java | 402 +++ .../BidirectionalStream.java | 19 + .../object_pb_service/ObjectService.java | 61 + .../ObjectServiceClient.java | 167 ++ .../object_pb_service/RequestStream.java | 55 + .../object_pb_service/ResponseStream.java | 15 + .../object_pb_service/UnaryResponse.java | 12 + .../proto/session_pb/ExportNotification.java | 2 +- .../SessionServiceClient.java | 1 - .../comboaggregaterequest/AggTypeMap.java | 12 +- .../TypedTicket.java} | 114 +- 24 files changed, 1061 insertions(+), 4165 deletions(-) delete mode 100644 web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/application_pb/CustomInfo.java delete mode 100644 web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/application_pb/FigureInfo.java delete mode 100644 web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/application_pb/fieldinfo/FieldType.java delete mode 100644 web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/application_pb/fieldinfo/fieldtype/FieldCase.java delete mode 100644 web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/console_pb/FetchFigureResponse.java delete mode 100644 web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/console_pb/VariableDefinition.java rename web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/{console_pb/FetchFigureRequest.java => object_pb/FetchObjectRequest.java} (72%) create mode 100644 web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/object_pb/FetchObjectResponse.java create mode 100644 web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/object_pb_service/BidirectionalStream.java create mode 100644 web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/object_pb_service/ObjectService.java create mode 100644 web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/object_pb_service/ObjectServiceClient.java create mode 100644 web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/object_pb_service/RequestStream.java create mode 100644 web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/object_pb_service/ResponseStream.java create mode 100644 web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/object_pb_service/UnaryResponse.java rename web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/{application_pb/TableInfo.java => ticket_pb/TypedTicket.java} (51%) diff --git a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/application_pb/CustomInfo.java b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/application_pb/CustomInfo.java deleted file mode 100644 index 70a4c5552ba..00000000000 --- a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/application_pb/CustomInfo.java +++ /dev/null @@ -1,62 +0,0 @@ -package io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.application_pb; - -import elemental2.core.Uint8Array; -import jsinterop.annotations.JsOverlay; -import jsinterop.annotations.JsPackage; -import jsinterop.annotations.JsProperty; -import jsinterop.annotations.JsType; -import jsinterop.base.Js; -import jsinterop.base.JsPropertyMap; - -@JsType( - isNative = true, - name = "dhinternal.io.deephaven.proto.application_pb.CustomInfo", - namespace = JsPackage.GLOBAL) -public class CustomInfo { - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface ToObjectReturnType { - @JsOverlay - static CustomInfo.ToObjectReturnType create() { - return Js.uncheckedCast(JsPropertyMap.of()); - } - - @JsProperty - String getType(); - - @JsProperty - void setType(String type); - } - - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface ToObjectReturnType0 { - @JsOverlay - static CustomInfo.ToObjectReturnType0 create() { - return Js.uncheckedCast(JsPropertyMap.of()); - } - - @JsProperty - String getType(); - - @JsProperty - void setType(String type); - } - - public static native CustomInfo deserializeBinary(Uint8Array bytes); - - public static native CustomInfo deserializeBinaryFromReader(CustomInfo message, Object reader); - - public static native void serializeBinaryToWriter(CustomInfo message, Object writer); - - public static native CustomInfo.ToObjectReturnType toObject( - boolean includeInstance, CustomInfo msg); - - public native String getType(); - - public native Uint8Array serializeBinary(); - - public native void setType(String value); - - public native CustomInfo.ToObjectReturnType0 toObject(); - - public native CustomInfo.ToObjectReturnType0 toObject(boolean includeInstance); -} diff --git a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/application_pb/FieldInfo.java b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/application_pb/FieldInfo.java index c1f0a81b169..ed2ae15f951 100644 --- a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/application_pb/FieldInfo.java +++ b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/application_pb/FieldInfo.java @@ -1,8 +1,7 @@ package io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.application_pb; import elemental2.core.Uint8Array; -import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.application_pb.fieldinfo.FieldType; -import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.ticket_pb.Ticket; +import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.ticket_pb.TypedTicket; import jsinterop.annotations.JsOverlay; import jsinterop.annotations.JsPackage; import jsinterop.annotations.JsProperty; @@ -17,116 +16,6 @@ public class FieldInfo { @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) public interface ToObjectReturnType { - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface FieldFieldType { - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface CustomFieldType { - @JsOverlay - static FieldInfo.ToObjectReturnType.FieldFieldType.CustomFieldType create() { - return Js.uncheckedCast(JsPropertyMap.of()); - } - - @JsProperty - String getType(); - - @JsProperty - void setType(String type); - } - - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface TableFieldType { - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface GetSchemaHeaderUnionType { - @JsOverlay - static FieldInfo.ToObjectReturnType.FieldFieldType.TableFieldType.GetSchemaHeaderUnionType of( - Object o) { - return Js.cast(o); - } - - @JsOverlay - default String asString() { - return Js.asString(this); - } - - @JsOverlay - default Uint8Array asUint8Array() { - return Js.cast(this); - } - - @JsOverlay - default boolean isString() { - return (Object) this instanceof String; - } - - @JsOverlay - default boolean isUint8Array() { - return (Object) this instanceof Uint8Array; - } - } - - @JsOverlay - static FieldInfo.ToObjectReturnType.FieldFieldType.TableFieldType create() { - return Js.uncheckedCast(JsPropertyMap.of()); - } - - @JsProperty - FieldInfo.ToObjectReturnType.FieldFieldType.TableFieldType.GetSchemaHeaderUnionType getSchemaHeader(); - - @JsProperty - String getSize(); - - @JsProperty - boolean isIsStatic(); - - @JsProperty - void setIsStatic(boolean isStatic); - - @JsProperty - void setSchemaHeader( - FieldInfo.ToObjectReturnType.FieldFieldType.TableFieldType.GetSchemaHeaderUnionType schemaHeader); - - @JsOverlay - default void setSchemaHeader(String schemaHeader) { - setSchemaHeader( - Js.uncheckedCast( - schemaHeader)); - } - - @JsOverlay - default void setSchemaHeader(Uint8Array schemaHeader) { - setSchemaHeader( - Js.uncheckedCast( - schemaHeader)); - } - - @JsProperty - void setSize(String size); - } - - @JsOverlay - static FieldInfo.ToObjectReturnType.FieldFieldType create() { - return Js.uncheckedCast(JsPropertyMap.of()); - } - - @JsProperty - FieldInfo.ToObjectReturnType.FieldFieldType.CustomFieldType getCustom(); - - @JsProperty - Object getFigure(); - - @JsProperty - FieldInfo.ToObjectReturnType.FieldFieldType.TableFieldType getTable(); - - @JsProperty - void setCustom(FieldInfo.ToObjectReturnType.FieldFieldType.CustomFieldType custom); - - @JsProperty - void setFigure(Object figure); - - @JsProperty - void setTable(FieldInfo.ToObjectReturnType.FieldFieldType.TableFieldType table); - } - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) public interface TicketFieldType { @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) @@ -165,6 +54,9 @@ static FieldInfo.ToObjectReturnType.TicketFieldType create() { @JsProperty FieldInfo.ToObjectReturnType.TicketFieldType.GetTicketUnionType getTicket(); + @JsProperty + String getType(); + @JsProperty void setTicket(FieldInfo.ToObjectReturnType.TicketFieldType.GetTicketUnionType ticket); @@ -181,6 +73,9 @@ default void setTicket(Uint8Array ticket) { Js.uncheckedCast( ticket)); } + + @JsProperty + void setType(String type); } @JsOverlay @@ -200,9 +95,6 @@ static FieldInfo.ToObjectReturnType create() { @JsProperty String getFieldName(); - @JsProperty - FieldInfo.ToObjectReturnType.FieldFieldType getFieldType(); - @JsProperty FieldInfo.ToObjectReturnType.TicketFieldType getTicket(); @@ -218,125 +110,12 @@ static FieldInfo.ToObjectReturnType create() { @JsProperty void setFieldName(String fieldName); - @JsProperty - void setFieldType(FieldInfo.ToObjectReturnType.FieldFieldType fieldType); - @JsProperty void setTicket(FieldInfo.ToObjectReturnType.TicketFieldType ticket); } @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) public interface ToObjectReturnType0 { - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface FieldFieldType { - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface CustomFieldType { - @JsOverlay - static FieldInfo.ToObjectReturnType0.FieldFieldType.CustomFieldType create() { - return Js.uncheckedCast(JsPropertyMap.of()); - } - - @JsProperty - String getType(); - - @JsProperty - void setType(String type); - } - - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface TableFieldType { - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface GetSchemaHeaderUnionType { - @JsOverlay - static FieldInfo.ToObjectReturnType0.FieldFieldType.TableFieldType.GetSchemaHeaderUnionType of( - Object o) { - return Js.cast(o); - } - - @JsOverlay - default String asString() { - return Js.asString(this); - } - - @JsOverlay - default Uint8Array asUint8Array() { - return Js.cast(this); - } - - @JsOverlay - default boolean isString() { - return (Object) this instanceof String; - } - - @JsOverlay - default boolean isUint8Array() { - return (Object) this instanceof Uint8Array; - } - } - - @JsOverlay - static FieldInfo.ToObjectReturnType0.FieldFieldType.TableFieldType create() { - return Js.uncheckedCast(JsPropertyMap.of()); - } - - @JsProperty - FieldInfo.ToObjectReturnType0.FieldFieldType.TableFieldType.GetSchemaHeaderUnionType getSchemaHeader(); - - @JsProperty - String getSize(); - - @JsProperty - boolean isIsStatic(); - - @JsProperty - void setIsStatic(boolean isStatic); - - @JsProperty - void setSchemaHeader( - FieldInfo.ToObjectReturnType0.FieldFieldType.TableFieldType.GetSchemaHeaderUnionType schemaHeader); - - @JsOverlay - default void setSchemaHeader(String schemaHeader) { - setSchemaHeader( - Js.uncheckedCast( - schemaHeader)); - } - - @JsOverlay - default void setSchemaHeader(Uint8Array schemaHeader) { - setSchemaHeader( - Js.uncheckedCast( - schemaHeader)); - } - - @JsProperty - void setSize(String size); - } - - @JsOverlay - static FieldInfo.ToObjectReturnType0.FieldFieldType create() { - return Js.uncheckedCast(JsPropertyMap.of()); - } - - @JsProperty - FieldInfo.ToObjectReturnType0.FieldFieldType.CustomFieldType getCustom(); - - @JsProperty - Object getFigure(); - - @JsProperty - FieldInfo.ToObjectReturnType0.FieldFieldType.TableFieldType getTable(); - - @JsProperty - void setCustom(FieldInfo.ToObjectReturnType0.FieldFieldType.CustomFieldType custom); - - @JsProperty - void setFigure(Object figure); - - @JsProperty - void setTable(FieldInfo.ToObjectReturnType0.FieldFieldType.TableFieldType table); - } - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) public interface TicketFieldType { @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) @@ -375,6 +154,9 @@ static FieldInfo.ToObjectReturnType0.TicketFieldType create() { @JsProperty FieldInfo.ToObjectReturnType0.TicketFieldType.GetTicketUnionType getTicket(); + @JsProperty + String getType(); + @JsProperty void setTicket(FieldInfo.ToObjectReturnType0.TicketFieldType.GetTicketUnionType ticket); @@ -391,6 +173,9 @@ default void setTicket(Uint8Array ticket) { Js.uncheckedCast( ticket)); } + + @JsProperty + void setType(String type); } @JsOverlay @@ -410,9 +195,6 @@ static FieldInfo.ToObjectReturnType0 create() { @JsProperty String getFieldName(); - @JsProperty - FieldInfo.ToObjectReturnType0.FieldFieldType getFieldType(); - @JsProperty FieldInfo.ToObjectReturnType0.TicketFieldType getTicket(); @@ -428,9 +210,6 @@ static FieldInfo.ToObjectReturnType0 create() { @JsProperty void setFieldName(String fieldName); - @JsProperty - void setFieldType(FieldInfo.ToObjectReturnType0.FieldFieldType fieldType); - @JsProperty void setTicket(FieldInfo.ToObjectReturnType0.TicketFieldType ticket); } @@ -444,8 +223,6 @@ static FieldInfo.ToObjectReturnType0 create() { public static native FieldInfo.ToObjectReturnType toObject( boolean includeInstance, FieldInfo msg); - public native void clearFieldType(); - public native void clearTicket(); public native String getApplicationId(); @@ -456,11 +233,7 @@ public static native FieldInfo.ToObjectReturnType toObject( public native String getFieldName(); - public native FieldType getFieldType(); - - public native Ticket getTicket(); - - public native boolean hasFieldType(); + public native TypedTicket getTicket(); public native boolean hasTicket(); @@ -474,13 +247,9 @@ public static native FieldInfo.ToObjectReturnType toObject( public native void setFieldName(String value); - public native void setFieldType(); - - public native void setFieldType(FieldType value); - public native void setTicket(); - public native void setTicket(Ticket value); + public native void setTicket(TypedTicket value); public native FieldInfo.ToObjectReturnType0 toObject(); diff --git a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/application_pb/FieldsChangeUpdate.java b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/application_pb/FieldsChangeUpdate.java index b78c551f087..753600f155e 100644 --- a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/application_pb/FieldsChangeUpdate.java +++ b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/application_pb/FieldsChangeUpdate.java @@ -18,118 +18,6 @@ public class FieldsChangeUpdate { public interface ToObjectReturnType { @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) public interface CreatedListFieldType { - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface FieldFieldType { - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface CustomFieldType { - @JsOverlay - static FieldsChangeUpdate.ToObjectReturnType.CreatedListFieldType.FieldFieldType.CustomFieldType create() { - return Js.uncheckedCast(JsPropertyMap.of()); - } - - @JsProperty - String getType(); - - @JsProperty - void setType(String type); - } - - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface TableFieldType { - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface GetSchemaHeaderUnionType { - @JsOverlay - static FieldsChangeUpdate.ToObjectReturnType.CreatedListFieldType.FieldFieldType.TableFieldType.GetSchemaHeaderUnionType of( - Object o) { - return Js.cast(o); - } - - @JsOverlay - default String asString() { - return Js.asString(this); - } - - @JsOverlay - default Uint8Array asUint8Array() { - return Js.cast(this); - } - - @JsOverlay - default boolean isString() { - return (Object) this instanceof String; - } - - @JsOverlay - default boolean isUint8Array() { - return (Object) this instanceof Uint8Array; - } - } - - @JsOverlay - static FieldsChangeUpdate.ToObjectReturnType.CreatedListFieldType.FieldFieldType.TableFieldType create() { - return Js.uncheckedCast(JsPropertyMap.of()); - } - - @JsProperty - FieldsChangeUpdate.ToObjectReturnType.CreatedListFieldType.FieldFieldType.TableFieldType.GetSchemaHeaderUnionType getSchemaHeader(); - - @JsProperty - String getSize(); - - @JsProperty - boolean isIsStatic(); - - @JsProperty - void setIsStatic(boolean isStatic); - - @JsProperty - void setSchemaHeader( - FieldsChangeUpdate.ToObjectReturnType.CreatedListFieldType.FieldFieldType.TableFieldType.GetSchemaHeaderUnionType schemaHeader); - - @JsOverlay - default void setSchemaHeader(String schemaHeader) { - setSchemaHeader( - Js.uncheckedCast( - schemaHeader)); - } - - @JsOverlay - default void setSchemaHeader(Uint8Array schemaHeader) { - setSchemaHeader( - Js.uncheckedCast( - schemaHeader)); - } - - @JsProperty - void setSize(String size); - } - - @JsOverlay - static FieldsChangeUpdate.ToObjectReturnType.CreatedListFieldType.FieldFieldType create() { - return Js.uncheckedCast(JsPropertyMap.of()); - } - - @JsProperty - FieldsChangeUpdate.ToObjectReturnType.CreatedListFieldType.FieldFieldType.CustomFieldType getCustom(); - - @JsProperty - Object getFigure(); - - @JsProperty - FieldsChangeUpdate.ToObjectReturnType.CreatedListFieldType.FieldFieldType.TableFieldType getTable(); - - @JsProperty - void setCustom( - FieldsChangeUpdate.ToObjectReturnType.CreatedListFieldType.FieldFieldType.CustomFieldType custom); - - @JsProperty - void setFigure(Object figure); - - @JsProperty - void setTable( - FieldsChangeUpdate.ToObjectReturnType.CreatedListFieldType.FieldFieldType.TableFieldType table); - } - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) public interface TicketFieldType { @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) @@ -169,6 +57,9 @@ static FieldsChangeUpdate.ToObjectReturnType.CreatedListFieldType.TicketFieldTyp @JsProperty FieldsChangeUpdate.ToObjectReturnType.CreatedListFieldType.TicketFieldType.GetTicketUnionType getTicket(); + @JsProperty + String getType(); + @JsProperty void setTicket( FieldsChangeUpdate.ToObjectReturnType.CreatedListFieldType.TicketFieldType.GetTicketUnionType ticket); @@ -186,6 +77,9 @@ default void setTicket(Uint8Array ticket) { Js.uncheckedCast( ticket)); } + + @JsProperty + void setType(String type); } @JsOverlay @@ -205,9 +99,6 @@ static FieldsChangeUpdate.ToObjectReturnType.CreatedListFieldType create() { @JsProperty String getFieldName(); - @JsProperty - FieldsChangeUpdate.ToObjectReturnType.CreatedListFieldType.FieldFieldType getFieldType(); - @JsProperty FieldsChangeUpdate.ToObjectReturnType.CreatedListFieldType.TicketFieldType getTicket(); @@ -223,10 +114,6 @@ static FieldsChangeUpdate.ToObjectReturnType.CreatedListFieldType create() { @JsProperty void setFieldName(String fieldName); - @JsProperty - void setFieldType( - FieldsChangeUpdate.ToObjectReturnType.CreatedListFieldType.FieldFieldType fieldType); - @JsProperty void setTicket( FieldsChangeUpdate.ToObjectReturnType.CreatedListFieldType.TicketFieldType ticket); @@ -279,118 +166,6 @@ default void setUpdatedList(Object[] updatedList) { public interface ToObjectReturnType0 { @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) public interface CreatedListFieldType { - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface FieldFieldType { - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface CustomFieldType { - @JsOverlay - static FieldsChangeUpdate.ToObjectReturnType0.CreatedListFieldType.FieldFieldType.CustomFieldType create() { - return Js.uncheckedCast(JsPropertyMap.of()); - } - - @JsProperty - String getType(); - - @JsProperty - void setType(String type); - } - - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface TableFieldType { - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface GetSchemaHeaderUnionType { - @JsOverlay - static FieldsChangeUpdate.ToObjectReturnType0.CreatedListFieldType.FieldFieldType.TableFieldType.GetSchemaHeaderUnionType of( - Object o) { - return Js.cast(o); - } - - @JsOverlay - default String asString() { - return Js.asString(this); - } - - @JsOverlay - default Uint8Array asUint8Array() { - return Js.cast(this); - } - - @JsOverlay - default boolean isString() { - return (Object) this instanceof String; - } - - @JsOverlay - default boolean isUint8Array() { - return (Object) this instanceof Uint8Array; - } - } - - @JsOverlay - static FieldsChangeUpdate.ToObjectReturnType0.CreatedListFieldType.FieldFieldType.TableFieldType create() { - return Js.uncheckedCast(JsPropertyMap.of()); - } - - @JsProperty - FieldsChangeUpdate.ToObjectReturnType0.CreatedListFieldType.FieldFieldType.TableFieldType.GetSchemaHeaderUnionType getSchemaHeader(); - - @JsProperty - String getSize(); - - @JsProperty - boolean isIsStatic(); - - @JsProperty - void setIsStatic(boolean isStatic); - - @JsProperty - void setSchemaHeader( - FieldsChangeUpdate.ToObjectReturnType0.CreatedListFieldType.FieldFieldType.TableFieldType.GetSchemaHeaderUnionType schemaHeader); - - @JsOverlay - default void setSchemaHeader(String schemaHeader) { - setSchemaHeader( - Js.uncheckedCast( - schemaHeader)); - } - - @JsOverlay - default void setSchemaHeader(Uint8Array schemaHeader) { - setSchemaHeader( - Js.uncheckedCast( - schemaHeader)); - } - - @JsProperty - void setSize(String size); - } - - @JsOverlay - static FieldsChangeUpdate.ToObjectReturnType0.CreatedListFieldType.FieldFieldType create() { - return Js.uncheckedCast(JsPropertyMap.of()); - } - - @JsProperty - FieldsChangeUpdate.ToObjectReturnType0.CreatedListFieldType.FieldFieldType.CustomFieldType getCustom(); - - @JsProperty - Object getFigure(); - - @JsProperty - FieldsChangeUpdate.ToObjectReturnType0.CreatedListFieldType.FieldFieldType.TableFieldType getTable(); - - @JsProperty - void setCustom( - FieldsChangeUpdate.ToObjectReturnType0.CreatedListFieldType.FieldFieldType.CustomFieldType custom); - - @JsProperty - void setFigure(Object figure); - - @JsProperty - void setTable( - FieldsChangeUpdate.ToObjectReturnType0.CreatedListFieldType.FieldFieldType.TableFieldType table); - } - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) public interface TicketFieldType { @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) @@ -430,6 +205,9 @@ static FieldsChangeUpdate.ToObjectReturnType0.CreatedListFieldType.TicketFieldTy @JsProperty FieldsChangeUpdate.ToObjectReturnType0.CreatedListFieldType.TicketFieldType.GetTicketUnionType getTicket(); + @JsProperty + String getType(); + @JsProperty void setTicket( FieldsChangeUpdate.ToObjectReturnType0.CreatedListFieldType.TicketFieldType.GetTicketUnionType ticket); @@ -447,6 +225,9 @@ default void setTicket(Uint8Array ticket) { Js.uncheckedCast( ticket)); } + + @JsProperty + void setType(String type); } @JsOverlay @@ -466,9 +247,6 @@ static FieldsChangeUpdate.ToObjectReturnType0.CreatedListFieldType create() { @JsProperty String getFieldName(); - @JsProperty - FieldsChangeUpdate.ToObjectReturnType0.CreatedListFieldType.FieldFieldType getFieldType(); - @JsProperty FieldsChangeUpdate.ToObjectReturnType0.CreatedListFieldType.TicketFieldType getTicket(); @@ -484,10 +262,6 @@ static FieldsChangeUpdate.ToObjectReturnType0.CreatedListFieldType create() { @JsProperty void setFieldName(String fieldName); - @JsProperty - void setFieldType( - FieldsChangeUpdate.ToObjectReturnType0.CreatedListFieldType.FieldFieldType fieldType); - @JsProperty void setTicket( FieldsChangeUpdate.ToObjectReturnType0.CreatedListFieldType.TicketFieldType ticket); diff --git a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/application_pb/FigureInfo.java b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/application_pb/FigureInfo.java deleted file mode 100644 index c36cdf06d00..00000000000 --- a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/application_pb/FigureInfo.java +++ /dev/null @@ -1,25 +0,0 @@ -package io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.application_pb; - -import elemental2.core.Uint8Array; -import jsinterop.annotations.JsPackage; -import jsinterop.annotations.JsType; - -@JsType( - isNative = true, - name = "dhinternal.io.deephaven.proto.application_pb.FigureInfo", - namespace = JsPackage.GLOBAL) -public class FigureInfo { - public static native FigureInfo deserializeBinary(Uint8Array bytes); - - public static native FigureInfo deserializeBinaryFromReader(FigureInfo message, Object reader); - - public static native void serializeBinaryToWriter(FigureInfo message, Object writer); - - public static native Object toObject(boolean includeInstance, FigureInfo msg); - - public native Uint8Array serializeBinary(); - - public native Object toObject(); - - public native Object toObject(boolean includeInstance); -} diff --git a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/application_pb/fieldinfo/FieldType.java b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/application_pb/fieldinfo/FieldType.java deleted file mode 100644 index 78cd9675dbd..00000000000 --- a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/application_pb/fieldinfo/FieldType.java +++ /dev/null @@ -1,283 +0,0 @@ -package io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.application_pb.fieldinfo; - -import elemental2.core.Uint8Array; -import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.application_pb.CustomInfo; -import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.application_pb.FigureInfo; -import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.application_pb.TableInfo; -import jsinterop.annotations.JsOverlay; -import jsinterop.annotations.JsPackage; -import jsinterop.annotations.JsProperty; -import jsinterop.annotations.JsType; -import jsinterop.base.Js; -import jsinterop.base.JsPropertyMap; - -@JsType( - isNative = true, - name = "dhinternal.io.deephaven.proto.application_pb.FieldInfo.FieldType", - namespace = JsPackage.GLOBAL) -public class FieldType { - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface ToObjectReturnType { - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface CustomFieldType { - @JsOverlay - static FieldType.ToObjectReturnType.CustomFieldType create() { - return Js.uncheckedCast(JsPropertyMap.of()); - } - - @JsProperty - String getType(); - - @JsProperty - void setType(String type); - } - - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface TableFieldType { - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface GetSchemaHeaderUnionType { - @JsOverlay - static FieldType.ToObjectReturnType.TableFieldType.GetSchemaHeaderUnionType of(Object o) { - return Js.cast(o); - } - - @JsOverlay - default String asString() { - return Js.asString(this); - } - - @JsOverlay - default Uint8Array asUint8Array() { - return Js.cast(this); - } - - @JsOverlay - default boolean isString() { - return (Object) this instanceof String; - } - - @JsOverlay - default boolean isUint8Array() { - return (Object) this instanceof Uint8Array; - } - } - - @JsOverlay - static FieldType.ToObjectReturnType.TableFieldType create() { - return Js.uncheckedCast(JsPropertyMap.of()); - } - - @JsProperty - FieldType.ToObjectReturnType.TableFieldType.GetSchemaHeaderUnionType getSchemaHeader(); - - @JsProperty - String getSize(); - - @JsProperty - boolean isIsStatic(); - - @JsProperty - void setIsStatic(boolean isStatic); - - @JsProperty - void setSchemaHeader( - FieldType.ToObjectReturnType.TableFieldType.GetSchemaHeaderUnionType schemaHeader); - - @JsOverlay - default void setSchemaHeader(String schemaHeader) { - setSchemaHeader( - Js.uncheckedCast( - schemaHeader)); - } - - @JsOverlay - default void setSchemaHeader(Uint8Array schemaHeader) { - setSchemaHeader( - Js.uncheckedCast( - schemaHeader)); - } - - @JsProperty - void setSize(String size); - } - - @JsOverlay - static FieldType.ToObjectReturnType create() { - return Js.uncheckedCast(JsPropertyMap.of()); - } - - @JsProperty - FieldType.ToObjectReturnType.CustomFieldType getCustom(); - - @JsProperty - Object getFigure(); - - @JsProperty - FieldType.ToObjectReturnType.TableFieldType getTable(); - - @JsProperty - void setCustom(FieldType.ToObjectReturnType.CustomFieldType custom); - - @JsProperty - void setFigure(Object figure); - - @JsProperty - void setTable(FieldType.ToObjectReturnType.TableFieldType table); - } - - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface ToObjectReturnType0 { - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface CustomFieldType { - @JsOverlay - static FieldType.ToObjectReturnType0.CustomFieldType create() { - return Js.uncheckedCast(JsPropertyMap.of()); - } - - @JsProperty - String getType(); - - @JsProperty - void setType(String type); - } - - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface TableFieldType { - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface GetSchemaHeaderUnionType { - @JsOverlay - static FieldType.ToObjectReturnType0.TableFieldType.GetSchemaHeaderUnionType of(Object o) { - return Js.cast(o); - } - - @JsOverlay - default String asString() { - return Js.asString(this); - } - - @JsOverlay - default Uint8Array asUint8Array() { - return Js.cast(this); - } - - @JsOverlay - default boolean isString() { - return (Object) this instanceof String; - } - - @JsOverlay - default boolean isUint8Array() { - return (Object) this instanceof Uint8Array; - } - } - - @JsOverlay - static FieldType.ToObjectReturnType0.TableFieldType create() { - return Js.uncheckedCast(JsPropertyMap.of()); - } - - @JsProperty - FieldType.ToObjectReturnType0.TableFieldType.GetSchemaHeaderUnionType getSchemaHeader(); - - @JsProperty - String getSize(); - - @JsProperty - boolean isIsStatic(); - - @JsProperty - void setIsStatic(boolean isStatic); - - @JsProperty - void setSchemaHeader( - FieldType.ToObjectReturnType0.TableFieldType.GetSchemaHeaderUnionType schemaHeader); - - @JsOverlay - default void setSchemaHeader(String schemaHeader) { - setSchemaHeader( - Js.uncheckedCast( - schemaHeader)); - } - - @JsOverlay - default void setSchemaHeader(Uint8Array schemaHeader) { - setSchemaHeader( - Js.uncheckedCast( - schemaHeader)); - } - - @JsProperty - void setSize(String size); - } - - @JsOverlay - static FieldType.ToObjectReturnType0 create() { - return Js.uncheckedCast(JsPropertyMap.of()); - } - - @JsProperty - FieldType.ToObjectReturnType0.CustomFieldType getCustom(); - - @JsProperty - Object getFigure(); - - @JsProperty - FieldType.ToObjectReturnType0.TableFieldType getTable(); - - @JsProperty - void setCustom(FieldType.ToObjectReturnType0.CustomFieldType custom); - - @JsProperty - void setFigure(Object figure); - - @JsProperty - void setTable(FieldType.ToObjectReturnType0.TableFieldType table); - } - - public static native FieldType deserializeBinary(Uint8Array bytes); - - public static native FieldType deserializeBinaryFromReader(FieldType message, Object reader); - - public static native void serializeBinaryToWriter(FieldType message, Object writer); - - public static native FieldType.ToObjectReturnType toObject( - boolean includeInstance, FieldType msg); - - public native void clearCustom(); - - public native void clearFigure(); - - public native void clearTable(); - - public native CustomInfo getCustom(); - - public native int getFieldCase(); - - public native FigureInfo getFigure(); - - public native TableInfo getTable(); - - public native boolean hasCustom(); - - public native boolean hasFigure(); - - public native boolean hasTable(); - - public native Uint8Array serializeBinary(); - - public native void setCustom(); - - public native void setCustom(CustomInfo value); - - public native void setFigure(); - - public native void setFigure(FigureInfo value); - - public native void setTable(); - - public native void setTable(TableInfo value); - - public native FieldType.ToObjectReturnType0 toObject(); - - public native FieldType.ToObjectReturnType0 toObject(boolean includeInstance); -} diff --git a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/application_pb/fieldinfo/fieldtype/FieldCase.java b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/application_pb/fieldinfo/fieldtype/FieldCase.java deleted file mode 100644 index d17f847a3fd..00000000000 --- a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/application_pb/fieldinfo/fieldtype/FieldCase.java +++ /dev/null @@ -1,15 +0,0 @@ -package io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.application_pb.fieldinfo.fieldtype; - -import jsinterop.annotations.JsPackage; -import jsinterop.annotations.JsType; - -@JsType( - isNative = true, - name = "dhinternal.io.deephaven.proto.application_pb.FieldInfo.FieldType.FieldCase", - namespace = JsPackage.GLOBAL) -public class FieldCase { - public static int CUSTOM, - FIELD_NOT_SET, - FIGURE, - TABLE; -} diff --git a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/console_pb/ExecuteCommandResponse.java b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/console_pb/ExecuteCommandResponse.java index c61b61fc5c0..a5361c95b39 100644 --- a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/console_pb/ExecuteCommandResponse.java +++ b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/console_pb/ExecuteCommandResponse.java @@ -2,6 +2,7 @@ import elemental2.core.JsArray; import elemental2.core.Uint8Array; +import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.application_pb.FieldsChangeUpdate; import jsinterop.annotations.JsOverlay; import jsinterop.annotations.JsPackage; import jsinterop.annotations.JsProperty; @@ -17,87 +18,151 @@ public class ExecuteCommandResponse { @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) public interface ToObjectReturnType { @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface CreatedListFieldType { + public interface ChangesFieldType { @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface IdFieldType { + public interface CreatedListFieldType { @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface GetTicketUnionType { - @JsOverlay - static ExecuteCommandResponse.ToObjectReturnType.CreatedListFieldType.IdFieldType.GetTicketUnionType of( - Object o) { - return Js.cast(o); + public interface TicketFieldType { + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface GetTicketUnionType { + @JsOverlay + static ExecuteCommandResponse.ToObjectReturnType.ChangesFieldType.CreatedListFieldType.TicketFieldType.GetTicketUnionType of( + Object o) { + return Js.cast(o); + } + + @JsOverlay + default String asString() { + return Js.asString(this); + } + + @JsOverlay + default Uint8Array asUint8Array() { + return Js.cast(this); + } + + @JsOverlay + default boolean isString() { + return (Object) this instanceof String; + } + + @JsOverlay + default boolean isUint8Array() { + return (Object) this instanceof Uint8Array; + } } @JsOverlay - default String asString() { - return Js.asString(this); + static ExecuteCommandResponse.ToObjectReturnType.ChangesFieldType.CreatedListFieldType.TicketFieldType create() { + return Js.uncheckedCast(JsPropertyMap.of()); } - @JsOverlay - default Uint8Array asUint8Array() { - return Js.cast(this); - } + @JsProperty + ExecuteCommandResponse.ToObjectReturnType.ChangesFieldType.CreatedListFieldType.TicketFieldType.GetTicketUnionType getTicket(); + + @JsProperty + String getType(); + + @JsProperty + void setTicket( + ExecuteCommandResponse.ToObjectReturnType.ChangesFieldType.CreatedListFieldType.TicketFieldType.GetTicketUnionType ticket); @JsOverlay - default boolean isString() { - return (Object) this instanceof String; + default void setTicket(String ticket) { + setTicket( + Js.uncheckedCast( + ticket)); } @JsOverlay - default boolean isUint8Array() { - return (Object) this instanceof Uint8Array; + default void setTicket(Uint8Array ticket) { + setTicket( + Js.uncheckedCast( + ticket)); } + + @JsProperty + void setType(String type); } @JsOverlay - static ExecuteCommandResponse.ToObjectReturnType.CreatedListFieldType.IdFieldType create() { + static ExecuteCommandResponse.ToObjectReturnType.ChangesFieldType.CreatedListFieldType create() { return Js.uncheckedCast(JsPropertyMap.of()); } @JsProperty - ExecuteCommandResponse.ToObjectReturnType.CreatedListFieldType.IdFieldType.GetTicketUnionType getTicket(); + String getApplicationId(); @JsProperty - void setTicket( - ExecuteCommandResponse.ToObjectReturnType.CreatedListFieldType.IdFieldType.GetTicketUnionType ticket); + String getApplicationName(); - @JsOverlay - default void setTicket(String ticket) { - setTicket( - Js.uncheckedCast( - ticket)); - } + @JsProperty + String getFieldDescription(); - @JsOverlay - default void setTicket(Uint8Array ticket) { - setTicket( - Js.uncheckedCast( - ticket)); - } + @JsProperty + String getFieldName(); + + @JsProperty + ExecuteCommandResponse.ToObjectReturnType.ChangesFieldType.CreatedListFieldType.TicketFieldType getTicket(); + + @JsProperty + void setApplicationId(String applicationId); + + @JsProperty + void setApplicationName(String applicationName); + + @JsProperty + void setFieldDescription(String fieldDescription); + + @JsProperty + void setFieldName(String fieldName); + + @JsProperty + void setTicket( + ExecuteCommandResponse.ToObjectReturnType.ChangesFieldType.CreatedListFieldType.TicketFieldType ticket); } @JsOverlay - static ExecuteCommandResponse.ToObjectReturnType.CreatedListFieldType create() { + static ExecuteCommandResponse.ToObjectReturnType.ChangesFieldType create() { return Js.uncheckedCast(JsPropertyMap.of()); } @JsProperty - ExecuteCommandResponse.ToObjectReturnType.CreatedListFieldType.IdFieldType getId(); + JsArray getCreatedList(); @JsProperty - String getTitle(); + JsArray getRemovedList(); @JsProperty - String getType(); + JsArray getUpdatedList(); + + @JsOverlay + default void setCreatedList( + ExecuteCommandResponse.ToObjectReturnType.ChangesFieldType.CreatedListFieldType[] createdList) { + setCreatedList( + Js.>uncheckedCast( + createdList)); + } @JsProperty - void setId(ExecuteCommandResponse.ToObjectReturnType.CreatedListFieldType.IdFieldType id); + void setCreatedList( + JsArray createdList); @JsProperty - void setTitle(String title); + void setRemovedList(JsArray removedList); + + @JsOverlay + default void setRemovedList(Object[] removedList) { + setRemovedList(Js.>uncheckedCast(removedList)); + } @JsProperty - void setType(String type); + void setUpdatedList(JsArray updatedList); + + @JsOverlay + default void setUpdatedList(Object[] updatedList) { + setUpdatedList(Js.>uncheckedCast(updatedList)); + } } @JsOverlay @@ -106,133 +171,166 @@ static ExecuteCommandResponse.ToObjectReturnType create() { } @JsProperty - JsArray getCreatedList(); + ExecuteCommandResponse.ToObjectReturnType.ChangesFieldType getChanges(); @JsProperty String getErrorMessage(); @JsProperty - JsArray getRemovedList(); - - @JsProperty - JsArray getUpdatedList(); - - @JsOverlay - default void setCreatedList( - ExecuteCommandResponse.ToObjectReturnType.CreatedListFieldType[] createdList) { - setCreatedList( - Js.>uncheckedCast( - createdList)); - } - - @JsProperty - void setCreatedList( - JsArray createdList); + void setChanges(ExecuteCommandResponse.ToObjectReturnType.ChangesFieldType changes); @JsProperty void setErrorMessage(String errorMessage); - - @JsProperty - void setRemovedList(JsArray removedList); - - @JsOverlay - default void setRemovedList(Object[] removedList) { - setRemovedList(Js.>uncheckedCast(removedList)); - } - - @JsProperty - void setUpdatedList(JsArray updatedList); - - @JsOverlay - default void setUpdatedList(Object[] updatedList) { - setUpdatedList(Js.>uncheckedCast(updatedList)); - } } @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) public interface ToObjectReturnType0 { @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface CreatedListFieldType { + public interface ChangesFieldType { @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface IdFieldType { + public interface CreatedListFieldType { @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface GetTicketUnionType { - @JsOverlay - static ExecuteCommandResponse.ToObjectReturnType0.CreatedListFieldType.IdFieldType.GetTicketUnionType of( - Object o) { - return Js.cast(o); + public interface TicketFieldType { + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface GetTicketUnionType { + @JsOverlay + static ExecuteCommandResponse.ToObjectReturnType0.ChangesFieldType.CreatedListFieldType.TicketFieldType.GetTicketUnionType of( + Object o) { + return Js.cast(o); + } + + @JsOverlay + default String asString() { + return Js.asString(this); + } + + @JsOverlay + default Uint8Array asUint8Array() { + return Js.cast(this); + } + + @JsOverlay + default boolean isString() { + return (Object) this instanceof String; + } + + @JsOverlay + default boolean isUint8Array() { + return (Object) this instanceof Uint8Array; + } } @JsOverlay - default String asString() { - return Js.asString(this); + static ExecuteCommandResponse.ToObjectReturnType0.ChangesFieldType.CreatedListFieldType.TicketFieldType create() { + return Js.uncheckedCast(JsPropertyMap.of()); } - @JsOverlay - default Uint8Array asUint8Array() { - return Js.cast(this); - } + @JsProperty + ExecuteCommandResponse.ToObjectReturnType0.ChangesFieldType.CreatedListFieldType.TicketFieldType.GetTicketUnionType getTicket(); + + @JsProperty + String getType(); + + @JsProperty + void setTicket( + ExecuteCommandResponse.ToObjectReturnType0.ChangesFieldType.CreatedListFieldType.TicketFieldType.GetTicketUnionType ticket); @JsOverlay - default boolean isString() { - return (Object) this instanceof String; + default void setTicket(String ticket) { + setTicket( + Js.uncheckedCast( + ticket)); } @JsOverlay - default boolean isUint8Array() { - return (Object) this instanceof Uint8Array; + default void setTicket(Uint8Array ticket) { + setTicket( + Js.uncheckedCast( + ticket)); } + + @JsProperty + void setType(String type); } @JsOverlay - static ExecuteCommandResponse.ToObjectReturnType0.CreatedListFieldType.IdFieldType create() { + static ExecuteCommandResponse.ToObjectReturnType0.ChangesFieldType.CreatedListFieldType create() { return Js.uncheckedCast(JsPropertyMap.of()); } @JsProperty - ExecuteCommandResponse.ToObjectReturnType0.CreatedListFieldType.IdFieldType.GetTicketUnionType getTicket(); + String getApplicationId(); @JsProperty - void setTicket( - ExecuteCommandResponse.ToObjectReturnType0.CreatedListFieldType.IdFieldType.GetTicketUnionType ticket); + String getApplicationName(); - @JsOverlay - default void setTicket(String ticket) { - setTicket( - Js.uncheckedCast( - ticket)); - } + @JsProperty + String getFieldDescription(); - @JsOverlay - default void setTicket(Uint8Array ticket) { - setTicket( - Js.uncheckedCast( - ticket)); - } + @JsProperty + String getFieldName(); + + @JsProperty + ExecuteCommandResponse.ToObjectReturnType0.ChangesFieldType.CreatedListFieldType.TicketFieldType getTicket(); + + @JsProperty + void setApplicationId(String applicationId); + + @JsProperty + void setApplicationName(String applicationName); + + @JsProperty + void setFieldDescription(String fieldDescription); + + @JsProperty + void setFieldName(String fieldName); + + @JsProperty + void setTicket( + ExecuteCommandResponse.ToObjectReturnType0.ChangesFieldType.CreatedListFieldType.TicketFieldType ticket); } @JsOverlay - static ExecuteCommandResponse.ToObjectReturnType0.CreatedListFieldType create() { + static ExecuteCommandResponse.ToObjectReturnType0.ChangesFieldType create() { return Js.uncheckedCast(JsPropertyMap.of()); } @JsProperty - ExecuteCommandResponse.ToObjectReturnType0.CreatedListFieldType.IdFieldType getId(); + JsArray getCreatedList(); @JsProperty - String getTitle(); + JsArray getRemovedList(); @JsProperty - String getType(); + JsArray getUpdatedList(); + + @JsOverlay + default void setCreatedList( + ExecuteCommandResponse.ToObjectReturnType0.ChangesFieldType.CreatedListFieldType[] createdList) { + setCreatedList( + Js.>uncheckedCast( + createdList)); + } @JsProperty - void setId(ExecuteCommandResponse.ToObjectReturnType0.CreatedListFieldType.IdFieldType id); + void setCreatedList( + JsArray createdList); @JsProperty - void setTitle(String title); + void setRemovedList(JsArray removedList); + + @JsOverlay + default void setRemovedList(Object[] removedList) { + setRemovedList(Js.>uncheckedCast(removedList)); + } @JsProperty - void setType(String type); + void setUpdatedList(JsArray updatedList); + + @JsOverlay + default void setUpdatedList(Object[] updatedList) { + setUpdatedList(Js.>uncheckedCast(updatedList)); + } } @JsOverlay @@ -241,47 +339,16 @@ static ExecuteCommandResponse.ToObjectReturnType0 create() { } @JsProperty - JsArray getCreatedList(); + ExecuteCommandResponse.ToObjectReturnType0.ChangesFieldType getChanges(); @JsProperty String getErrorMessage(); @JsProperty - JsArray getRemovedList(); - - @JsProperty - JsArray getUpdatedList(); - - @JsOverlay - default void setCreatedList( - ExecuteCommandResponse.ToObjectReturnType0.CreatedListFieldType[] createdList) { - setCreatedList( - Js.>uncheckedCast( - createdList)); - } - - @JsProperty - void setCreatedList( - JsArray createdList); + void setChanges(ExecuteCommandResponse.ToObjectReturnType0.ChangesFieldType changes); @JsProperty void setErrorMessage(String errorMessage); - - @JsProperty - void setRemovedList(JsArray removedList); - - @JsOverlay - default void setRemovedList(Object[] removedList) { - setRemovedList(Js.>uncheckedCast(removedList)); - } - - @JsProperty - void setUpdatedList(JsArray updatedList); - - @JsOverlay - default void setUpdatedList(Object[] updatedList) { - setUpdatedList(Js.>uncheckedCast(updatedList)); - } } public static native ExecuteCommandResponse deserializeBinary(Uint8Array bytes); @@ -294,63 +361,22 @@ public static native ExecuteCommandResponse deserializeBinaryFromReader( public static native ExecuteCommandResponse.ToObjectReturnType toObject( boolean includeInstance, ExecuteCommandResponse msg); - public native VariableDefinition addCreated(); - - public native VariableDefinition addCreated(VariableDefinition value, double index); - - public native VariableDefinition addCreated(VariableDefinition value); - - public native VariableDefinition addRemoved(); - - public native VariableDefinition addRemoved(VariableDefinition value, double index); + public native void clearChanges(); - public native VariableDefinition addRemoved(VariableDefinition value); - - public native VariableDefinition addUpdated(); - - public native VariableDefinition addUpdated(VariableDefinition value, double index); - - public native VariableDefinition addUpdated(VariableDefinition value); - - public native void clearCreatedList(); - - public native void clearRemovedList(); - - public native void clearUpdatedList(); - - public native JsArray getCreatedList(); + public native FieldsChangeUpdate getChanges(); public native String getErrorMessage(); - public native JsArray getRemovedList(); - - public native JsArray getUpdatedList(); + public native boolean hasChanges(); public native Uint8Array serializeBinary(); - public native void setCreatedList(JsArray value); + public native void setChanges(); - @JsOverlay - public final void setCreatedList(VariableDefinition[] value) { - setCreatedList(Js.>uncheckedCast(value)); - } + public native void setChanges(FieldsChangeUpdate value); public native void setErrorMessage(String value); - public native void setRemovedList(JsArray value); - - @JsOverlay - public final void setRemovedList(VariableDefinition[] value) { - setRemovedList(Js.>uncheckedCast(value)); - } - - public native void setUpdatedList(JsArray value); - - @JsOverlay - public final void setUpdatedList(VariableDefinition[] value) { - setUpdatedList(Js.>uncheckedCast(value)); - } - public native ExecuteCommandResponse.ToObjectReturnType0 toObject(); public native ExecuteCommandResponse.ToObjectReturnType0 toObject(boolean includeInstance); diff --git a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/console_pb/FetchFigureResponse.java b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/console_pb/FetchFigureResponse.java deleted file mode 100644 index 765da46c220..00000000000 --- a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/console_pb/FetchFigureResponse.java +++ /dev/null @@ -1,2214 +0,0 @@ -package io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.console_pb; - -import elemental2.core.JsArray; -import elemental2.core.Uint8Array; -import jsinterop.annotations.JsOverlay; -import jsinterop.annotations.JsPackage; -import jsinterop.annotations.JsProperty; -import jsinterop.annotations.JsType; -import jsinterop.base.Js; -import jsinterop.base.JsPropertyMap; - -@JsType( - isNative = true, - name = "dhinternal.io.deephaven.proto.console_pb.FetchFigureResponse", - namespace = JsPackage.GLOBAL) -public class FetchFigureResponse { - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface ToObjectReturnType { - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface FigureDescriptorFieldType { - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface ChartsListFieldType { - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface AxesListFieldType { - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface BusinessCalendarDescriptorFieldType { - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface BusinessPeriodsListFieldType { - @JsOverlay - static FetchFigureResponse.ToObjectReturnType.FigureDescriptorFieldType.ChartsListFieldType.AxesListFieldType.BusinessCalendarDescriptorFieldType.BusinessPeriodsListFieldType create() { - return Js.uncheckedCast(JsPropertyMap.of()); - } - - @JsProperty - String getClose(); - - @JsProperty - String getOpen(); - - @JsProperty - void setClose(String close); - - @JsProperty - void setOpen(String open); - } - - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface HolidaysListFieldType { - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface DateFieldType { - @JsOverlay - static FetchFigureResponse.ToObjectReturnType.FigureDescriptorFieldType.ChartsListFieldType.AxesListFieldType.BusinessCalendarDescriptorFieldType.HolidaysListFieldType.DateFieldType create() { - return Js.uncheckedCast(JsPropertyMap.of()); - } - - @JsProperty - double getDay(); - - @JsProperty - double getMonth(); - - @JsProperty - double getYear(); - - @JsProperty - void setDay(double day); - - @JsProperty - void setMonth(double month); - - @JsProperty - void setYear(double year); - } - - @JsOverlay - static FetchFigureResponse.ToObjectReturnType.FigureDescriptorFieldType.ChartsListFieldType.AxesListFieldType.BusinessCalendarDescriptorFieldType.HolidaysListFieldType create() { - return Js.uncheckedCast(JsPropertyMap.of()); - } - - @JsProperty - JsArray getBusinessPeriodsList(); - - @JsProperty - FetchFigureResponse.ToObjectReturnType.FigureDescriptorFieldType.ChartsListFieldType.AxesListFieldType.BusinessCalendarDescriptorFieldType.HolidaysListFieldType.DateFieldType getDate(); - - @JsProperty - void setBusinessPeriodsList(JsArray businessPeriodsList); - - @JsOverlay - default void setBusinessPeriodsList(Object[] businessPeriodsList) { - setBusinessPeriodsList(Js.>uncheckedCast(businessPeriodsList)); - } - - @JsProperty - void setDate( - FetchFigureResponse.ToObjectReturnType.FigureDescriptorFieldType.ChartsListFieldType.AxesListFieldType.BusinessCalendarDescriptorFieldType.HolidaysListFieldType.DateFieldType date); - } - - @JsOverlay - static FetchFigureResponse.ToObjectReturnType.FigureDescriptorFieldType.ChartsListFieldType.AxesListFieldType.BusinessCalendarDescriptorFieldType create() { - return Js.uncheckedCast(JsPropertyMap.of()); - } - - @JsProperty - JsArray getBusinessDaysList(); - - @JsProperty - JsArray getBusinessPeriodsList(); - - @JsProperty - JsArray getHolidaysList(); - - @JsProperty - String getName(); - - @JsProperty - String getTimeZone(); - - @JsProperty - void setBusinessDaysList(JsArray businessDaysList); - - @JsOverlay - default void setBusinessDaysList(double[] businessDaysList) { - setBusinessDaysList(Js.>uncheckedCast(businessDaysList)); - } - - @JsOverlay - default void setBusinessPeriodsList( - FetchFigureResponse.ToObjectReturnType.FigureDescriptorFieldType.ChartsListFieldType.AxesListFieldType.BusinessCalendarDescriptorFieldType.BusinessPeriodsListFieldType[] businessPeriodsList) { - setBusinessPeriodsList( - Js.>uncheckedCast( - businessPeriodsList)); - } - - @JsProperty - void setBusinessPeriodsList( - JsArray businessPeriodsList); - - @JsOverlay - default void setHolidaysList( - FetchFigureResponse.ToObjectReturnType.FigureDescriptorFieldType.ChartsListFieldType.AxesListFieldType.BusinessCalendarDescriptorFieldType.HolidaysListFieldType[] holidaysList) { - setHolidaysList( - Js.>uncheckedCast( - holidaysList)); - } - - @JsProperty - void setHolidaysList( - JsArray holidaysList); - - @JsProperty - void setName(String name); - - @JsProperty - void setTimeZone(String timeZone); - } - - @JsOverlay - static FetchFigureResponse.ToObjectReturnType.FigureDescriptorFieldType.ChartsListFieldType.AxesListFieldType create() { - return Js.uncheckedCast(JsPropertyMap.of()); - } - - @JsProperty - FetchFigureResponse.ToObjectReturnType.FigureDescriptorFieldType.ChartsListFieldType.AxesListFieldType.BusinessCalendarDescriptorFieldType getBusinessCalendarDescriptor(); - - @JsProperty - String getColor(); - - @JsProperty - String getFormatPattern(); - - @JsProperty - double getFormatType(); - - @JsProperty - double getGapBetweenMajorTicks(); - - @JsProperty - String getId(); - - @JsProperty - String getLabel(); - - @JsProperty - String getLabelFont(); - - @JsProperty - JsArray getMajorTickLocationsList(); - - @JsProperty - double getMaxRange(); - - @JsProperty - double getMinRange(); - - @JsProperty - double getMinorTickCount(); - - @JsProperty - double getPosition(); - - @JsProperty - double getTickLabelAngle(); - - @JsProperty - String getTicksFont(); - - @JsProperty - double getType(); - - @JsProperty - boolean isInvert(); - - @JsProperty - boolean isIsTimeAxis(); - - @JsProperty - boolean isLog(); - - @JsProperty - boolean isMajorTicksVisible(); - - @JsProperty - boolean isMinorTicksVisible(); - - @JsProperty - void setBusinessCalendarDescriptor( - FetchFigureResponse.ToObjectReturnType.FigureDescriptorFieldType.ChartsListFieldType.AxesListFieldType.BusinessCalendarDescriptorFieldType businessCalendarDescriptor); - - @JsProperty - void setColor(String color); - - @JsProperty - void setFormatPattern(String formatPattern); - - @JsProperty - void setFormatType(double formatType); - - @JsProperty - void setGapBetweenMajorTicks(double gapBetweenMajorTicks); - - @JsProperty - void setId(String id); - - @JsProperty - void setInvert(boolean invert); - - @JsProperty - void setIsTimeAxis(boolean isTimeAxis); - - @JsProperty - void setLabel(String label); - - @JsProperty - void setLabelFont(String labelFont); - - @JsProperty - void setLog(boolean log); - - @JsProperty - void setMajorTickLocationsList(JsArray majorTickLocationsList); - - @JsOverlay - default void setMajorTickLocationsList(double[] majorTickLocationsList) { - setMajorTickLocationsList(Js.>uncheckedCast(majorTickLocationsList)); - } - - @JsProperty - void setMajorTicksVisible(boolean majorTicksVisible); - - @JsProperty - void setMaxRange(double maxRange); - - @JsProperty - void setMinRange(double minRange); - - @JsProperty - void setMinorTickCount(double minorTickCount); - - @JsProperty - void setMinorTicksVisible(boolean minorTicksVisible); - - @JsProperty - void setPosition(double position); - - @JsProperty - void setTickLabelAngle(double tickLabelAngle); - - @JsProperty - void setTicksFont(String ticksFont); - - @JsProperty - void setType(double type); - } - - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface MultiSeriesListFieldType { - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface DataSourcesListFieldType { - @JsOverlay - static FetchFigureResponse.ToObjectReturnType.FigureDescriptorFieldType.ChartsListFieldType.MultiSeriesListFieldType.DataSourcesListFieldType create() { - return Js.uncheckedCast(JsPropertyMap.of()); - } - - @JsProperty - String getAxisId(); - - @JsProperty - String getColumnName(); - - @JsProperty - double getTableMapId(); - - @JsProperty - double getType(); - - @JsProperty - void setAxisId(String axisId); - - @JsProperty - void setColumnName(String columnName); - - @JsProperty - void setTableMapId(double tableMapId); - - @JsProperty - void setType(double type); - } - - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface LineColorFieldType { - @JsOverlay - static FetchFigureResponse.ToObjectReturnType.FigureDescriptorFieldType.ChartsListFieldType.MultiSeriesListFieldType.LineColorFieldType create() { - return Js.uncheckedCast(JsPropertyMap.of()); - } - - @JsProperty - String getDefaultString(); - - @JsProperty - JsArray getKeysList(); - - @JsProperty - JsArray getValuesList(); - - @JsProperty - void setDefaultString(String defaultString); - - @JsProperty - void setKeysList(JsArray keysList); - - @JsOverlay - default void setKeysList(String[] keysList) { - setKeysList(Js.>uncheckedCast(keysList)); - } - - @JsProperty - void setValuesList(JsArray valuesList); - - @JsOverlay - default void setValuesList(String[] valuesList) { - setValuesList(Js.>uncheckedCast(valuesList)); - } - } - - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface LinesVisibleFieldType { - @JsOverlay - static FetchFigureResponse.ToObjectReturnType.FigureDescriptorFieldType.ChartsListFieldType.MultiSeriesListFieldType.LinesVisibleFieldType create() { - return Js.uncheckedCast(JsPropertyMap.of()); - } - - @JsProperty - JsArray getKeysList(); - - @JsProperty - JsArray getValuesList(); - - @JsProperty - boolean isDefaultBool(); - - @JsProperty - void setDefaultBool(boolean defaultBool); - - @JsProperty - void setKeysList(JsArray keysList); - - @JsOverlay - default void setKeysList(String[] keysList) { - setKeysList(Js.>uncheckedCast(keysList)); - } - - @JsProperty - void setValuesList(JsArray valuesList); - - @JsOverlay - default void setValuesList(boolean[] valuesList) { - setValuesList(Js.>uncheckedCast(valuesList)); - } - } - - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface PointSizeFieldType { - @JsOverlay - static FetchFigureResponse.ToObjectReturnType.FigureDescriptorFieldType.ChartsListFieldType.MultiSeriesListFieldType.PointSizeFieldType create() { - return Js.uncheckedCast(JsPropertyMap.of()); - } - - @JsProperty - double getDefaultDouble(); - - @JsProperty - JsArray getKeysList(); - - @JsProperty - JsArray getValuesList(); - - @JsProperty - void setDefaultDouble(double defaultDouble); - - @JsProperty - void setKeysList(JsArray keysList); - - @JsOverlay - default void setKeysList(String[] keysList) { - setKeysList(Js.>uncheckedCast(keysList)); - } - - @JsProperty - void setValuesList(JsArray valuesList); - - @JsOverlay - default void setValuesList(double[] valuesList) { - setValuesList(Js.>uncheckedCast(valuesList)); - } - } - - @JsOverlay - static FetchFigureResponse.ToObjectReturnType.FigureDescriptorFieldType.ChartsListFieldType.MultiSeriesListFieldType create() { - return Js.uncheckedCast(JsPropertyMap.of()); - } - - @JsProperty - JsArray getDataSourcesList(); - - @JsProperty - Object getGradientVisible(); - - @JsProperty - FetchFigureResponse.ToObjectReturnType.FigureDescriptorFieldType.ChartsListFieldType.MultiSeriesListFieldType.LineColorFieldType getLineColor(); - - @JsProperty - FetchFigureResponse.ToObjectReturnType.FigureDescriptorFieldType.ChartsListFieldType.MultiSeriesListFieldType.LinesVisibleFieldType getLinesVisible(); - - @JsProperty - String getName(); - - @JsProperty - double getPlotStyle(); - - @JsProperty - Object getPointColor(); - - @JsProperty - Object getPointLabel(); - - @JsProperty - Object getPointLabelFormat(); - - @JsProperty - Object getPointShape(); - - @JsProperty - FetchFigureResponse.ToObjectReturnType.FigureDescriptorFieldType.ChartsListFieldType.MultiSeriesListFieldType.PointSizeFieldType getPointSize(); - - @JsProperty - Object getPointsVisible(); - - @JsProperty - Object getXToolTipPattern(); - - @JsProperty - Object getYToolTipPattern(); - - @JsOverlay - default void setDataSourcesList( - FetchFigureResponse.ToObjectReturnType.FigureDescriptorFieldType.ChartsListFieldType.MultiSeriesListFieldType.DataSourcesListFieldType[] dataSourcesList) { - setDataSourcesList( - Js.>uncheckedCast( - dataSourcesList)); - } - - @JsProperty - void setDataSourcesList( - JsArray dataSourcesList); - - @JsProperty - void setGradientVisible(Object gradientVisible); - - @JsProperty - void setLineColor( - FetchFigureResponse.ToObjectReturnType.FigureDescriptorFieldType.ChartsListFieldType.MultiSeriesListFieldType.LineColorFieldType lineColor); - - @JsProperty - void setLinesVisible( - FetchFigureResponse.ToObjectReturnType.FigureDescriptorFieldType.ChartsListFieldType.MultiSeriesListFieldType.LinesVisibleFieldType linesVisible); - - @JsProperty - void setName(String name); - - @JsProperty - void setPlotStyle(double plotStyle); - - @JsProperty - void setPointColor(Object pointColor); - - @JsProperty - void setPointLabel(Object pointLabel); - - @JsProperty - void setPointLabelFormat(Object pointLabelFormat); - - @JsProperty - void setPointShape(Object pointShape); - - @JsProperty - void setPointSize( - FetchFigureResponse.ToObjectReturnType.FigureDescriptorFieldType.ChartsListFieldType.MultiSeriesListFieldType.PointSizeFieldType pointSize); - - @JsProperty - void setPointsVisible(Object pointsVisible); - - @JsProperty - void setXToolTipPattern(Object xToolTipPattern); - - @JsProperty - void setYToolTipPattern(Object yToolTipPattern); - } - - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface SeriesListFieldType { - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface DataSourcesListFieldType { - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface OneClickFieldType { - @JsOverlay - static FetchFigureResponse.ToObjectReturnType.FigureDescriptorFieldType.ChartsListFieldType.SeriesListFieldType.DataSourcesListFieldType.OneClickFieldType create() { - return Js.uncheckedCast(JsPropertyMap.of()); - } - - @JsProperty - JsArray getColumnTypesList(); - - @JsProperty - JsArray getColumnsList(); - - @JsProperty - boolean isRequireAllFiltersToDisplay(); - - @JsProperty - void setColumnTypesList(JsArray columnTypesList); - - @JsOverlay - default void setColumnTypesList(String[] columnTypesList) { - setColumnTypesList(Js.>uncheckedCast(columnTypesList)); - } - - @JsProperty - void setColumnsList(JsArray columnsList); - - @JsOverlay - default void setColumnsList(String[] columnsList) { - setColumnsList(Js.>uncheckedCast(columnsList)); - } - - @JsProperty - void setRequireAllFiltersToDisplay(boolean requireAllFiltersToDisplay); - } - - @JsOverlay - static FetchFigureResponse.ToObjectReturnType.FigureDescriptorFieldType.ChartsListFieldType.SeriesListFieldType.DataSourcesListFieldType create() { - return Js.uncheckedCast(JsPropertyMap.of()); - } - - @JsProperty - String getAxisId(); - - @JsProperty - String getColumnName(); - - @JsProperty - String getColumnType(); - - @JsProperty - FetchFigureResponse.ToObjectReturnType.FigureDescriptorFieldType.ChartsListFieldType.SeriesListFieldType.DataSourcesListFieldType.OneClickFieldType getOneClick(); - - @JsProperty - double getTableId(); - - @JsProperty - double getTableMapId(); - - @JsProperty - double getType(); - - @JsProperty - void setAxisId(String axisId); - - @JsProperty - void setColumnName(String columnName); - - @JsProperty - void setColumnType(String columnType); - - @JsProperty - void setOneClick( - FetchFigureResponse.ToObjectReturnType.FigureDescriptorFieldType.ChartsListFieldType.SeriesListFieldType.DataSourcesListFieldType.OneClickFieldType oneClick); - - @JsProperty - void setTableId(double tableId); - - @JsProperty - void setTableMapId(double tableMapId); - - @JsProperty - void setType(double type); - } - - @JsOverlay - static FetchFigureResponse.ToObjectReturnType.FigureDescriptorFieldType.ChartsListFieldType.SeriesListFieldType create() { - return Js.uncheckedCast(JsPropertyMap.of()); - } - - @JsProperty - JsArray getDataSourcesList(); - - @JsProperty - String getLineColor(); - - @JsProperty - String getName(); - - @JsProperty - double getPlotStyle(); - - @JsProperty - String getPointLabelFormat(); - - @JsProperty - String getShape(); - - @JsProperty - String getShapeColor(); - - @JsProperty - String getShapeLabel(); - - @JsProperty - double getShapeSize(); - - @JsProperty - String getXToolTipPattern(); - - @JsProperty - String getYToolTipPattern(); - - @JsProperty - boolean isGradientVisible(); - - @JsProperty - boolean isLinesVisible(); - - @JsProperty - boolean isShapesVisible(); - - @JsOverlay - default void setDataSourcesList( - FetchFigureResponse.ToObjectReturnType.FigureDescriptorFieldType.ChartsListFieldType.SeriesListFieldType.DataSourcesListFieldType[] dataSourcesList) { - setDataSourcesList( - Js.>uncheckedCast( - dataSourcesList)); - } - - @JsProperty - void setDataSourcesList( - JsArray dataSourcesList); - - @JsProperty - void setGradientVisible(boolean gradientVisible); - - @JsProperty - void setLineColor(String lineColor); - - @JsProperty - void setLinesVisible(boolean linesVisible); - - @JsProperty - void setName(String name); - - @JsProperty - void setPlotStyle(double plotStyle); - - @JsProperty - void setPointLabelFormat(String pointLabelFormat); - - @JsProperty - void setShape(String shape); - - @JsProperty - void setShapeColor(String shapeColor); - - @JsProperty - void setShapeLabel(String shapeLabel); - - @JsProperty - void setShapeSize(double shapeSize); - - @JsProperty - void setShapesVisible(boolean shapesVisible); - - @JsProperty - void setXToolTipPattern(String xToolTipPattern); - - @JsProperty - void setYToolTipPattern(String yToolTipPattern); - } - - @JsOverlay - static FetchFigureResponse.ToObjectReturnType.FigureDescriptorFieldType.ChartsListFieldType create() { - return Js.uncheckedCast(JsPropertyMap.of()); - } - - @JsProperty - JsArray getAxesList(); - - @JsProperty - double getChartType(); - - @JsProperty - double getColspan(); - - @JsProperty - String getLegendColor(); - - @JsProperty - String getLegendFont(); - - @JsProperty - JsArray getMultiSeriesList(); - - @JsProperty - double getRowspan(); - - @JsProperty - JsArray getSeriesList(); - - @JsProperty - String getTitle(); - - @JsProperty - String getTitleColor(); - - @JsProperty - String getTitleFont(); - - @JsProperty - boolean isIs3d(); - - @JsProperty - boolean isShowLegend(); - - @JsOverlay - default void setAxesList( - FetchFigureResponse.ToObjectReturnType.FigureDescriptorFieldType.ChartsListFieldType.AxesListFieldType[] axesList) { - setAxesList( - Js.>uncheckedCast( - axesList)); - } - - @JsProperty - void setAxesList( - JsArray axesList); - - @JsProperty - void setChartType(double chartType); - - @JsProperty - void setColspan(double colspan); - - @JsProperty - void setIs3d(boolean is3d); - - @JsProperty - void setLegendColor(String legendColor); - - @JsProperty - void setLegendFont(String legendFont); - - @JsProperty - void setMultiSeriesList( - JsArray multiSeriesList); - - @JsOverlay - default void setMultiSeriesList( - FetchFigureResponse.ToObjectReturnType.FigureDescriptorFieldType.ChartsListFieldType.MultiSeriesListFieldType[] multiSeriesList) { - setMultiSeriesList( - Js.>uncheckedCast( - multiSeriesList)); - } - - @JsProperty - void setRowspan(double rowspan); - - @JsProperty - void setSeriesList( - JsArray seriesList); - - @JsOverlay - default void setSeriesList( - FetchFigureResponse.ToObjectReturnType.FigureDescriptorFieldType.ChartsListFieldType.SeriesListFieldType[] seriesList) { - setSeriesList( - Js.>uncheckedCast( - seriesList)); - } - - @JsProperty - void setShowLegend(boolean showLegend); - - @JsProperty - void setTitle(String title); - - @JsProperty - void setTitleColor(String titleColor); - - @JsProperty - void setTitleFont(String titleFont); - } - - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface TablesListFieldType { - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface GetSchemaHeaderUnionType { - @JsOverlay - static FetchFigureResponse.ToObjectReturnType.FigureDescriptorFieldType.TablesListFieldType.GetSchemaHeaderUnionType of( - Object o) { - return Js.cast(o); - } - - @JsOverlay - default String asString() { - return Js.asString(this); - } - - @JsOverlay - default Uint8Array asUint8Array() { - return Js.cast(this); - } - - @JsOverlay - default boolean isString() { - return (Object) this instanceof String; - } - - @JsOverlay - default boolean isUint8Array() { - return (Object) this instanceof Uint8Array; - } - } - - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface ResultIdFieldType { - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface TicketFieldType { - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface GetTicketUnionType { - @JsOverlay - static FetchFigureResponse.ToObjectReturnType.FigureDescriptorFieldType.TablesListFieldType.ResultIdFieldType.TicketFieldType.GetTicketUnionType of( - Object o) { - return Js.cast(o); - } - - @JsOverlay - default String asString() { - return Js.asString(this); - } - - @JsOverlay - default Uint8Array asUint8Array() { - return Js.cast(this); - } - - @JsOverlay - default boolean isString() { - return (Object) this instanceof String; - } - - @JsOverlay - default boolean isUint8Array() { - return (Object) this instanceof Uint8Array; - } - } - - @JsOverlay - static FetchFigureResponse.ToObjectReturnType.FigureDescriptorFieldType.TablesListFieldType.ResultIdFieldType.TicketFieldType create() { - return Js.uncheckedCast(JsPropertyMap.of()); - } - - @JsProperty - FetchFigureResponse.ToObjectReturnType.FigureDescriptorFieldType.TablesListFieldType.ResultIdFieldType.TicketFieldType.GetTicketUnionType getTicket(); - - @JsProperty - void setTicket( - FetchFigureResponse.ToObjectReturnType.FigureDescriptorFieldType.TablesListFieldType.ResultIdFieldType.TicketFieldType.GetTicketUnionType ticket); - - @JsOverlay - default void setTicket(String ticket) { - setTicket( - Js.uncheckedCast( - ticket)); - } - - @JsOverlay - default void setTicket(Uint8Array ticket) { - setTicket( - Js.uncheckedCast( - ticket)); - } - } - - @JsOverlay - static FetchFigureResponse.ToObjectReturnType.FigureDescriptorFieldType.TablesListFieldType.ResultIdFieldType create() { - return Js.uncheckedCast(JsPropertyMap.of()); - } - - @JsProperty - double getBatchOffset(); - - @JsProperty - FetchFigureResponse.ToObjectReturnType.FigureDescriptorFieldType.TablesListFieldType.ResultIdFieldType.TicketFieldType getTicket(); - - @JsProperty - void setBatchOffset(double batchOffset); - - @JsProperty - void setTicket( - FetchFigureResponse.ToObjectReturnType.FigureDescriptorFieldType.TablesListFieldType.ResultIdFieldType.TicketFieldType ticket); - } - - @JsOverlay - static FetchFigureResponse.ToObjectReturnType.FigureDescriptorFieldType.TablesListFieldType create() { - return Js.uncheckedCast(JsPropertyMap.of()); - } - - @JsProperty - String getErrorInfo(); - - @JsProperty - FetchFigureResponse.ToObjectReturnType.FigureDescriptorFieldType.TablesListFieldType.ResultIdFieldType getResultId(); - - @JsProperty - FetchFigureResponse.ToObjectReturnType.FigureDescriptorFieldType.TablesListFieldType.GetSchemaHeaderUnionType getSchemaHeader(); - - @JsProperty - String getSize(); - - @JsProperty - boolean isIsStatic(); - - @JsProperty - boolean isSuccess(); - - @JsProperty - void setErrorInfo(String errorInfo); - - @JsProperty - void setIsStatic(boolean isStatic); - - @JsProperty - void setResultId( - FetchFigureResponse.ToObjectReturnType.FigureDescriptorFieldType.TablesListFieldType.ResultIdFieldType resultId); - - @JsProperty - void setSchemaHeader( - FetchFigureResponse.ToObjectReturnType.FigureDescriptorFieldType.TablesListFieldType.GetSchemaHeaderUnionType schemaHeader); - - @JsOverlay - default void setSchemaHeader(String schemaHeader) { - setSchemaHeader( - Js.uncheckedCast( - schemaHeader)); - } - - @JsOverlay - default void setSchemaHeader(Uint8Array schemaHeader) { - setSchemaHeader( - Js.uncheckedCast( - schemaHeader)); - } - - @JsProperty - void setSize(String size); - - @JsProperty - void setSuccess(boolean success); - } - - @JsOverlay - static FetchFigureResponse.ToObjectReturnType.FigureDescriptorFieldType create() { - return Js.uncheckedCast(JsPropertyMap.of()); - } - - @JsProperty - JsArray getChartsList(); - - @JsProperty - double getCols(); - - @JsProperty - JsArray getErrorsList(); - - @JsProperty - double getRows(); - - @JsProperty - JsArray getTablesList(); - - @JsProperty - String getTitle(); - - @JsProperty - String getTitleColor(); - - @JsProperty - String getTitleFont(); - - @JsProperty - double getUpdateInterval(); - - @JsOverlay - default void setChartsList( - FetchFigureResponse.ToObjectReturnType.FigureDescriptorFieldType.ChartsListFieldType[] chartsList) { - setChartsList( - Js.>uncheckedCast( - chartsList)); - } - - @JsProperty - void setChartsList( - JsArray chartsList); - - @JsProperty - void setCols(double cols); - - @JsProperty - void setErrorsList(JsArray errorsList); - - @JsOverlay - default void setErrorsList(String[] errorsList) { - setErrorsList(Js.>uncheckedCast(errorsList)); - } - - @JsProperty - void setRows(double rows); - - @JsProperty - void setTablesList( - JsArray tablesList); - - @JsOverlay - default void setTablesList( - FetchFigureResponse.ToObjectReturnType.FigureDescriptorFieldType.TablesListFieldType[] tablesList) { - setTablesList( - Js.>uncheckedCast( - tablesList)); - } - - @JsProperty - void setTitle(String title); - - @JsProperty - void setTitleColor(String titleColor); - - @JsProperty - void setTitleFont(String titleFont); - - @JsProperty - void setUpdateInterval(double updateInterval); - } - - @JsOverlay - static FetchFigureResponse.ToObjectReturnType create() { - return Js.uncheckedCast(JsPropertyMap.of()); - } - - @JsProperty - FetchFigureResponse.ToObjectReturnType.FigureDescriptorFieldType getFigureDescriptor(); - - @JsProperty - void setFigureDescriptor( - FetchFigureResponse.ToObjectReturnType.FigureDescriptorFieldType figureDescriptor); - } - - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface ToObjectReturnType0 { - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface FigureDescriptorFieldType { - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface ChartsListFieldType { - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface AxesListFieldType { - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface BusinessCalendarDescriptorFieldType { - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface BusinessPeriodsListFieldType { - @JsOverlay - static FetchFigureResponse.ToObjectReturnType0.FigureDescriptorFieldType.ChartsListFieldType.AxesListFieldType.BusinessCalendarDescriptorFieldType.BusinessPeriodsListFieldType create() { - return Js.uncheckedCast(JsPropertyMap.of()); - } - - @JsProperty - String getClose(); - - @JsProperty - String getOpen(); - - @JsProperty - void setClose(String close); - - @JsProperty - void setOpen(String open); - } - - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface HolidaysListFieldType { - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface DateFieldType { - @JsOverlay - static FetchFigureResponse.ToObjectReturnType0.FigureDescriptorFieldType.ChartsListFieldType.AxesListFieldType.BusinessCalendarDescriptorFieldType.HolidaysListFieldType.DateFieldType create() { - return Js.uncheckedCast(JsPropertyMap.of()); - } - - @JsProperty - double getDay(); - - @JsProperty - double getMonth(); - - @JsProperty - double getYear(); - - @JsProperty - void setDay(double day); - - @JsProperty - void setMonth(double month); - - @JsProperty - void setYear(double year); - } - - @JsOverlay - static FetchFigureResponse.ToObjectReturnType0.FigureDescriptorFieldType.ChartsListFieldType.AxesListFieldType.BusinessCalendarDescriptorFieldType.HolidaysListFieldType create() { - return Js.uncheckedCast(JsPropertyMap.of()); - } - - @JsProperty - JsArray getBusinessPeriodsList(); - - @JsProperty - FetchFigureResponse.ToObjectReturnType0.FigureDescriptorFieldType.ChartsListFieldType.AxesListFieldType.BusinessCalendarDescriptorFieldType.HolidaysListFieldType.DateFieldType getDate(); - - @JsProperty - void setBusinessPeriodsList(JsArray businessPeriodsList); - - @JsOverlay - default void setBusinessPeriodsList(Object[] businessPeriodsList) { - setBusinessPeriodsList(Js.>uncheckedCast(businessPeriodsList)); - } - - @JsProperty - void setDate( - FetchFigureResponse.ToObjectReturnType0.FigureDescriptorFieldType.ChartsListFieldType.AxesListFieldType.BusinessCalendarDescriptorFieldType.HolidaysListFieldType.DateFieldType date); - } - - @JsOverlay - static FetchFigureResponse.ToObjectReturnType0.FigureDescriptorFieldType.ChartsListFieldType.AxesListFieldType.BusinessCalendarDescriptorFieldType create() { - return Js.uncheckedCast(JsPropertyMap.of()); - } - - @JsProperty - JsArray getBusinessDaysList(); - - @JsProperty - JsArray getBusinessPeriodsList(); - - @JsProperty - JsArray getHolidaysList(); - - @JsProperty - String getName(); - - @JsProperty - String getTimeZone(); - - @JsProperty - void setBusinessDaysList(JsArray businessDaysList); - - @JsOverlay - default void setBusinessDaysList(double[] businessDaysList) { - setBusinessDaysList(Js.>uncheckedCast(businessDaysList)); - } - - @JsOverlay - default void setBusinessPeriodsList( - FetchFigureResponse.ToObjectReturnType0.FigureDescriptorFieldType.ChartsListFieldType.AxesListFieldType.BusinessCalendarDescriptorFieldType.BusinessPeriodsListFieldType[] businessPeriodsList) { - setBusinessPeriodsList( - Js.>uncheckedCast( - businessPeriodsList)); - } - - @JsProperty - void setBusinessPeriodsList( - JsArray businessPeriodsList); - - @JsOverlay - default void setHolidaysList( - FetchFigureResponse.ToObjectReturnType0.FigureDescriptorFieldType.ChartsListFieldType.AxesListFieldType.BusinessCalendarDescriptorFieldType.HolidaysListFieldType[] holidaysList) { - setHolidaysList( - Js.>uncheckedCast( - holidaysList)); - } - - @JsProperty - void setHolidaysList( - JsArray holidaysList); - - @JsProperty - void setName(String name); - - @JsProperty - void setTimeZone(String timeZone); - } - - @JsOverlay - static FetchFigureResponse.ToObjectReturnType0.FigureDescriptorFieldType.ChartsListFieldType.AxesListFieldType create() { - return Js.uncheckedCast(JsPropertyMap.of()); - } - - @JsProperty - FetchFigureResponse.ToObjectReturnType0.FigureDescriptorFieldType.ChartsListFieldType.AxesListFieldType.BusinessCalendarDescriptorFieldType getBusinessCalendarDescriptor(); - - @JsProperty - String getColor(); - - @JsProperty - String getFormatPattern(); - - @JsProperty - double getFormatType(); - - @JsProperty - double getGapBetweenMajorTicks(); - - @JsProperty - String getId(); - - @JsProperty - String getLabel(); - - @JsProperty - String getLabelFont(); - - @JsProperty - JsArray getMajorTickLocationsList(); - - @JsProperty - double getMaxRange(); - - @JsProperty - double getMinRange(); - - @JsProperty - double getMinorTickCount(); - - @JsProperty - double getPosition(); - - @JsProperty - double getTickLabelAngle(); - - @JsProperty - String getTicksFont(); - - @JsProperty - double getType(); - - @JsProperty - boolean isInvert(); - - @JsProperty - boolean isIsTimeAxis(); - - @JsProperty - boolean isLog(); - - @JsProperty - boolean isMajorTicksVisible(); - - @JsProperty - boolean isMinorTicksVisible(); - - @JsProperty - void setBusinessCalendarDescriptor( - FetchFigureResponse.ToObjectReturnType0.FigureDescriptorFieldType.ChartsListFieldType.AxesListFieldType.BusinessCalendarDescriptorFieldType businessCalendarDescriptor); - - @JsProperty - void setColor(String color); - - @JsProperty - void setFormatPattern(String formatPattern); - - @JsProperty - void setFormatType(double formatType); - - @JsProperty - void setGapBetweenMajorTicks(double gapBetweenMajorTicks); - - @JsProperty - void setId(String id); - - @JsProperty - void setInvert(boolean invert); - - @JsProperty - void setIsTimeAxis(boolean isTimeAxis); - - @JsProperty - void setLabel(String label); - - @JsProperty - void setLabelFont(String labelFont); - - @JsProperty - void setLog(boolean log); - - @JsProperty - void setMajorTickLocationsList(JsArray majorTickLocationsList); - - @JsOverlay - default void setMajorTickLocationsList(double[] majorTickLocationsList) { - setMajorTickLocationsList(Js.>uncheckedCast(majorTickLocationsList)); - } - - @JsProperty - void setMajorTicksVisible(boolean majorTicksVisible); - - @JsProperty - void setMaxRange(double maxRange); - - @JsProperty - void setMinRange(double minRange); - - @JsProperty - void setMinorTickCount(double minorTickCount); - - @JsProperty - void setMinorTicksVisible(boolean minorTicksVisible); - - @JsProperty - void setPosition(double position); - - @JsProperty - void setTickLabelAngle(double tickLabelAngle); - - @JsProperty - void setTicksFont(String ticksFont); - - @JsProperty - void setType(double type); - } - - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface MultiSeriesListFieldType { - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface DataSourcesListFieldType { - @JsOverlay - static FetchFigureResponse.ToObjectReturnType0.FigureDescriptorFieldType.ChartsListFieldType.MultiSeriesListFieldType.DataSourcesListFieldType create() { - return Js.uncheckedCast(JsPropertyMap.of()); - } - - @JsProperty - String getAxisId(); - - @JsProperty - String getColumnName(); - - @JsProperty - double getTableMapId(); - - @JsProperty - double getType(); - - @JsProperty - void setAxisId(String axisId); - - @JsProperty - void setColumnName(String columnName); - - @JsProperty - void setTableMapId(double tableMapId); - - @JsProperty - void setType(double type); - } - - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface LineColorFieldType { - @JsOverlay - static FetchFigureResponse.ToObjectReturnType0.FigureDescriptorFieldType.ChartsListFieldType.MultiSeriesListFieldType.LineColorFieldType create() { - return Js.uncheckedCast(JsPropertyMap.of()); - } - - @JsProperty - String getDefaultString(); - - @JsProperty - JsArray getKeysList(); - - @JsProperty - JsArray getValuesList(); - - @JsProperty - void setDefaultString(String defaultString); - - @JsProperty - void setKeysList(JsArray keysList); - - @JsOverlay - default void setKeysList(String[] keysList) { - setKeysList(Js.>uncheckedCast(keysList)); - } - - @JsProperty - void setValuesList(JsArray valuesList); - - @JsOverlay - default void setValuesList(String[] valuesList) { - setValuesList(Js.>uncheckedCast(valuesList)); - } - } - - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface LinesVisibleFieldType { - @JsOverlay - static FetchFigureResponse.ToObjectReturnType0.FigureDescriptorFieldType.ChartsListFieldType.MultiSeriesListFieldType.LinesVisibleFieldType create() { - return Js.uncheckedCast(JsPropertyMap.of()); - } - - @JsProperty - JsArray getKeysList(); - - @JsProperty - JsArray getValuesList(); - - @JsProperty - boolean isDefaultBool(); - - @JsProperty - void setDefaultBool(boolean defaultBool); - - @JsProperty - void setKeysList(JsArray keysList); - - @JsOverlay - default void setKeysList(String[] keysList) { - setKeysList(Js.>uncheckedCast(keysList)); - } - - @JsProperty - void setValuesList(JsArray valuesList); - - @JsOverlay - default void setValuesList(boolean[] valuesList) { - setValuesList(Js.>uncheckedCast(valuesList)); - } - } - - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface PointSizeFieldType { - @JsOverlay - static FetchFigureResponse.ToObjectReturnType0.FigureDescriptorFieldType.ChartsListFieldType.MultiSeriesListFieldType.PointSizeFieldType create() { - return Js.uncheckedCast(JsPropertyMap.of()); - } - - @JsProperty - double getDefaultDouble(); - - @JsProperty - JsArray getKeysList(); - - @JsProperty - JsArray getValuesList(); - - @JsProperty - void setDefaultDouble(double defaultDouble); - - @JsProperty - void setKeysList(JsArray keysList); - - @JsOverlay - default void setKeysList(String[] keysList) { - setKeysList(Js.>uncheckedCast(keysList)); - } - - @JsProperty - void setValuesList(JsArray valuesList); - - @JsOverlay - default void setValuesList(double[] valuesList) { - setValuesList(Js.>uncheckedCast(valuesList)); - } - } - - @JsOverlay - static FetchFigureResponse.ToObjectReturnType0.FigureDescriptorFieldType.ChartsListFieldType.MultiSeriesListFieldType create() { - return Js.uncheckedCast(JsPropertyMap.of()); - } - - @JsProperty - JsArray getDataSourcesList(); - - @JsProperty - Object getGradientVisible(); - - @JsProperty - FetchFigureResponse.ToObjectReturnType0.FigureDescriptorFieldType.ChartsListFieldType.MultiSeriesListFieldType.LineColorFieldType getLineColor(); - - @JsProperty - FetchFigureResponse.ToObjectReturnType0.FigureDescriptorFieldType.ChartsListFieldType.MultiSeriesListFieldType.LinesVisibleFieldType getLinesVisible(); - - @JsProperty - String getName(); - - @JsProperty - double getPlotStyle(); - - @JsProperty - Object getPointColor(); - - @JsProperty - Object getPointLabel(); - - @JsProperty - Object getPointLabelFormat(); - - @JsProperty - Object getPointShape(); - - @JsProperty - FetchFigureResponse.ToObjectReturnType0.FigureDescriptorFieldType.ChartsListFieldType.MultiSeriesListFieldType.PointSizeFieldType getPointSize(); - - @JsProperty - Object getPointsVisible(); - - @JsProperty - Object getXToolTipPattern(); - - @JsProperty - Object getYToolTipPattern(); - - @JsOverlay - default void setDataSourcesList( - FetchFigureResponse.ToObjectReturnType0.FigureDescriptorFieldType.ChartsListFieldType.MultiSeriesListFieldType.DataSourcesListFieldType[] dataSourcesList) { - setDataSourcesList( - Js.>uncheckedCast( - dataSourcesList)); - } - - @JsProperty - void setDataSourcesList( - JsArray dataSourcesList); - - @JsProperty - void setGradientVisible(Object gradientVisible); - - @JsProperty - void setLineColor( - FetchFigureResponse.ToObjectReturnType0.FigureDescriptorFieldType.ChartsListFieldType.MultiSeriesListFieldType.LineColorFieldType lineColor); - - @JsProperty - void setLinesVisible( - FetchFigureResponse.ToObjectReturnType0.FigureDescriptorFieldType.ChartsListFieldType.MultiSeriesListFieldType.LinesVisibleFieldType linesVisible); - - @JsProperty - void setName(String name); - - @JsProperty - void setPlotStyle(double plotStyle); - - @JsProperty - void setPointColor(Object pointColor); - - @JsProperty - void setPointLabel(Object pointLabel); - - @JsProperty - void setPointLabelFormat(Object pointLabelFormat); - - @JsProperty - void setPointShape(Object pointShape); - - @JsProperty - void setPointSize( - FetchFigureResponse.ToObjectReturnType0.FigureDescriptorFieldType.ChartsListFieldType.MultiSeriesListFieldType.PointSizeFieldType pointSize); - - @JsProperty - void setPointsVisible(Object pointsVisible); - - @JsProperty - void setXToolTipPattern(Object xToolTipPattern); - - @JsProperty - void setYToolTipPattern(Object yToolTipPattern); - } - - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface SeriesListFieldType { - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface DataSourcesListFieldType { - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface OneClickFieldType { - @JsOverlay - static FetchFigureResponse.ToObjectReturnType0.FigureDescriptorFieldType.ChartsListFieldType.SeriesListFieldType.DataSourcesListFieldType.OneClickFieldType create() { - return Js.uncheckedCast(JsPropertyMap.of()); - } - - @JsProperty - JsArray getColumnTypesList(); - - @JsProperty - JsArray getColumnsList(); - - @JsProperty - boolean isRequireAllFiltersToDisplay(); - - @JsProperty - void setColumnTypesList(JsArray columnTypesList); - - @JsOverlay - default void setColumnTypesList(String[] columnTypesList) { - setColumnTypesList(Js.>uncheckedCast(columnTypesList)); - } - - @JsProperty - void setColumnsList(JsArray columnsList); - - @JsOverlay - default void setColumnsList(String[] columnsList) { - setColumnsList(Js.>uncheckedCast(columnsList)); - } - - @JsProperty - void setRequireAllFiltersToDisplay(boolean requireAllFiltersToDisplay); - } - - @JsOverlay - static FetchFigureResponse.ToObjectReturnType0.FigureDescriptorFieldType.ChartsListFieldType.SeriesListFieldType.DataSourcesListFieldType create() { - return Js.uncheckedCast(JsPropertyMap.of()); - } - - @JsProperty - String getAxisId(); - - @JsProperty - String getColumnName(); - - @JsProperty - String getColumnType(); - - @JsProperty - FetchFigureResponse.ToObjectReturnType0.FigureDescriptorFieldType.ChartsListFieldType.SeriesListFieldType.DataSourcesListFieldType.OneClickFieldType getOneClick(); - - @JsProperty - double getTableId(); - - @JsProperty - double getTableMapId(); - - @JsProperty - double getType(); - - @JsProperty - void setAxisId(String axisId); - - @JsProperty - void setColumnName(String columnName); - - @JsProperty - void setColumnType(String columnType); - - @JsProperty - void setOneClick( - FetchFigureResponse.ToObjectReturnType0.FigureDescriptorFieldType.ChartsListFieldType.SeriesListFieldType.DataSourcesListFieldType.OneClickFieldType oneClick); - - @JsProperty - void setTableId(double tableId); - - @JsProperty - void setTableMapId(double tableMapId); - - @JsProperty - void setType(double type); - } - - @JsOverlay - static FetchFigureResponse.ToObjectReturnType0.FigureDescriptorFieldType.ChartsListFieldType.SeriesListFieldType create() { - return Js.uncheckedCast(JsPropertyMap.of()); - } - - @JsProperty - JsArray getDataSourcesList(); - - @JsProperty - String getLineColor(); - - @JsProperty - String getName(); - - @JsProperty - double getPlotStyle(); - - @JsProperty - String getPointLabelFormat(); - - @JsProperty - String getShape(); - - @JsProperty - String getShapeColor(); - - @JsProperty - String getShapeLabel(); - - @JsProperty - double getShapeSize(); - - @JsProperty - String getXToolTipPattern(); - - @JsProperty - String getYToolTipPattern(); - - @JsProperty - boolean isGradientVisible(); - - @JsProperty - boolean isLinesVisible(); - - @JsProperty - boolean isShapesVisible(); - - @JsOverlay - default void setDataSourcesList( - FetchFigureResponse.ToObjectReturnType0.FigureDescriptorFieldType.ChartsListFieldType.SeriesListFieldType.DataSourcesListFieldType[] dataSourcesList) { - setDataSourcesList( - Js.>uncheckedCast( - dataSourcesList)); - } - - @JsProperty - void setDataSourcesList( - JsArray dataSourcesList); - - @JsProperty - void setGradientVisible(boolean gradientVisible); - - @JsProperty - void setLineColor(String lineColor); - - @JsProperty - void setLinesVisible(boolean linesVisible); - - @JsProperty - void setName(String name); - - @JsProperty - void setPlotStyle(double plotStyle); - - @JsProperty - void setPointLabelFormat(String pointLabelFormat); - - @JsProperty - void setShape(String shape); - - @JsProperty - void setShapeColor(String shapeColor); - - @JsProperty - void setShapeLabel(String shapeLabel); - - @JsProperty - void setShapeSize(double shapeSize); - - @JsProperty - void setShapesVisible(boolean shapesVisible); - - @JsProperty - void setXToolTipPattern(String xToolTipPattern); - - @JsProperty - void setYToolTipPattern(String yToolTipPattern); - } - - @JsOverlay - static FetchFigureResponse.ToObjectReturnType0.FigureDescriptorFieldType.ChartsListFieldType create() { - return Js.uncheckedCast(JsPropertyMap.of()); - } - - @JsProperty - JsArray getAxesList(); - - @JsProperty - double getChartType(); - - @JsProperty - double getColspan(); - - @JsProperty - String getLegendColor(); - - @JsProperty - String getLegendFont(); - - @JsProperty - JsArray getMultiSeriesList(); - - @JsProperty - double getRowspan(); - - @JsProperty - JsArray getSeriesList(); - - @JsProperty - String getTitle(); - - @JsProperty - String getTitleColor(); - - @JsProperty - String getTitleFont(); - - @JsProperty - boolean isIs3d(); - - @JsProperty - boolean isShowLegend(); - - @JsOverlay - default void setAxesList( - FetchFigureResponse.ToObjectReturnType0.FigureDescriptorFieldType.ChartsListFieldType.AxesListFieldType[] axesList) { - setAxesList( - Js.>uncheckedCast( - axesList)); - } - - @JsProperty - void setAxesList( - JsArray axesList); - - @JsProperty - void setChartType(double chartType); - - @JsProperty - void setColspan(double colspan); - - @JsProperty - void setIs3d(boolean is3d); - - @JsProperty - void setLegendColor(String legendColor); - - @JsProperty - void setLegendFont(String legendFont); - - @JsProperty - void setMultiSeriesList( - JsArray multiSeriesList); - - @JsOverlay - default void setMultiSeriesList( - FetchFigureResponse.ToObjectReturnType0.FigureDescriptorFieldType.ChartsListFieldType.MultiSeriesListFieldType[] multiSeriesList) { - setMultiSeriesList( - Js.>uncheckedCast( - multiSeriesList)); - } - - @JsProperty - void setRowspan(double rowspan); - - @JsProperty - void setSeriesList( - JsArray seriesList); - - @JsOverlay - default void setSeriesList( - FetchFigureResponse.ToObjectReturnType0.FigureDescriptorFieldType.ChartsListFieldType.SeriesListFieldType[] seriesList) { - setSeriesList( - Js.>uncheckedCast( - seriesList)); - } - - @JsProperty - void setShowLegend(boolean showLegend); - - @JsProperty - void setTitle(String title); - - @JsProperty - void setTitleColor(String titleColor); - - @JsProperty - void setTitleFont(String titleFont); - } - - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface TablesListFieldType { - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface GetSchemaHeaderUnionType { - @JsOverlay - static FetchFigureResponse.ToObjectReturnType0.FigureDescriptorFieldType.TablesListFieldType.GetSchemaHeaderUnionType of( - Object o) { - return Js.cast(o); - } - - @JsOverlay - default String asString() { - return Js.asString(this); - } - - @JsOverlay - default Uint8Array asUint8Array() { - return Js.cast(this); - } - - @JsOverlay - default boolean isString() { - return (Object) this instanceof String; - } - - @JsOverlay - default boolean isUint8Array() { - return (Object) this instanceof Uint8Array; - } - } - - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface ResultIdFieldType { - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface TicketFieldType { - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface GetTicketUnionType { - @JsOverlay - static FetchFigureResponse.ToObjectReturnType0.FigureDescriptorFieldType.TablesListFieldType.ResultIdFieldType.TicketFieldType.GetTicketUnionType of( - Object o) { - return Js.cast(o); - } - - @JsOverlay - default String asString() { - return Js.asString(this); - } - - @JsOverlay - default Uint8Array asUint8Array() { - return Js.cast(this); - } - - @JsOverlay - default boolean isString() { - return (Object) this instanceof String; - } - - @JsOverlay - default boolean isUint8Array() { - return (Object) this instanceof Uint8Array; - } - } - - @JsOverlay - static FetchFigureResponse.ToObjectReturnType0.FigureDescriptorFieldType.TablesListFieldType.ResultIdFieldType.TicketFieldType create() { - return Js.uncheckedCast(JsPropertyMap.of()); - } - - @JsProperty - FetchFigureResponse.ToObjectReturnType0.FigureDescriptorFieldType.TablesListFieldType.ResultIdFieldType.TicketFieldType.GetTicketUnionType getTicket(); - - @JsProperty - void setTicket( - FetchFigureResponse.ToObjectReturnType0.FigureDescriptorFieldType.TablesListFieldType.ResultIdFieldType.TicketFieldType.GetTicketUnionType ticket); - - @JsOverlay - default void setTicket(String ticket) { - setTicket( - Js.uncheckedCast( - ticket)); - } - - @JsOverlay - default void setTicket(Uint8Array ticket) { - setTicket( - Js.uncheckedCast( - ticket)); - } - } - - @JsOverlay - static FetchFigureResponse.ToObjectReturnType0.FigureDescriptorFieldType.TablesListFieldType.ResultIdFieldType create() { - return Js.uncheckedCast(JsPropertyMap.of()); - } - - @JsProperty - double getBatchOffset(); - - @JsProperty - FetchFigureResponse.ToObjectReturnType0.FigureDescriptorFieldType.TablesListFieldType.ResultIdFieldType.TicketFieldType getTicket(); - - @JsProperty - void setBatchOffset(double batchOffset); - - @JsProperty - void setTicket( - FetchFigureResponse.ToObjectReturnType0.FigureDescriptorFieldType.TablesListFieldType.ResultIdFieldType.TicketFieldType ticket); - } - - @JsOverlay - static FetchFigureResponse.ToObjectReturnType0.FigureDescriptorFieldType.TablesListFieldType create() { - return Js.uncheckedCast(JsPropertyMap.of()); - } - - @JsProperty - String getErrorInfo(); - - @JsProperty - FetchFigureResponse.ToObjectReturnType0.FigureDescriptorFieldType.TablesListFieldType.ResultIdFieldType getResultId(); - - @JsProperty - FetchFigureResponse.ToObjectReturnType0.FigureDescriptorFieldType.TablesListFieldType.GetSchemaHeaderUnionType getSchemaHeader(); - - @JsProperty - String getSize(); - - @JsProperty - boolean isIsStatic(); - - @JsProperty - boolean isSuccess(); - - @JsProperty - void setErrorInfo(String errorInfo); - - @JsProperty - void setIsStatic(boolean isStatic); - - @JsProperty - void setResultId( - FetchFigureResponse.ToObjectReturnType0.FigureDescriptorFieldType.TablesListFieldType.ResultIdFieldType resultId); - - @JsProperty - void setSchemaHeader( - FetchFigureResponse.ToObjectReturnType0.FigureDescriptorFieldType.TablesListFieldType.GetSchemaHeaderUnionType schemaHeader); - - @JsOverlay - default void setSchemaHeader(String schemaHeader) { - setSchemaHeader( - Js.uncheckedCast( - schemaHeader)); - } - - @JsOverlay - default void setSchemaHeader(Uint8Array schemaHeader) { - setSchemaHeader( - Js.uncheckedCast( - schemaHeader)); - } - - @JsProperty - void setSize(String size); - - @JsProperty - void setSuccess(boolean success); - } - - @JsOverlay - static FetchFigureResponse.ToObjectReturnType0.FigureDescriptorFieldType create() { - return Js.uncheckedCast(JsPropertyMap.of()); - } - - @JsProperty - JsArray getChartsList(); - - @JsProperty - double getCols(); - - @JsProperty - JsArray getErrorsList(); - - @JsProperty - double getRows(); - - @JsProperty - JsArray getTablesList(); - - @JsProperty - String getTitle(); - - @JsProperty - String getTitleColor(); - - @JsProperty - String getTitleFont(); - - @JsProperty - double getUpdateInterval(); - - @JsOverlay - default void setChartsList( - FetchFigureResponse.ToObjectReturnType0.FigureDescriptorFieldType.ChartsListFieldType[] chartsList) { - setChartsList( - Js.>uncheckedCast( - chartsList)); - } - - @JsProperty - void setChartsList( - JsArray chartsList); - - @JsProperty - void setCols(double cols); - - @JsProperty - void setErrorsList(JsArray errorsList); - - @JsOverlay - default void setErrorsList(String[] errorsList) { - setErrorsList(Js.>uncheckedCast(errorsList)); - } - - @JsProperty - void setRows(double rows); - - @JsProperty - void setTablesList( - JsArray tablesList); - - @JsOverlay - default void setTablesList( - FetchFigureResponse.ToObjectReturnType0.FigureDescriptorFieldType.TablesListFieldType[] tablesList) { - setTablesList( - Js.>uncheckedCast( - tablesList)); - } - - @JsProperty - void setTitle(String title); - - @JsProperty - void setTitleColor(String titleColor); - - @JsProperty - void setTitleFont(String titleFont); - - @JsProperty - void setUpdateInterval(double updateInterval); - } - - @JsOverlay - static FetchFigureResponse.ToObjectReturnType0 create() { - return Js.uncheckedCast(JsPropertyMap.of()); - } - - @JsProperty - FetchFigureResponse.ToObjectReturnType0.FigureDescriptorFieldType getFigureDescriptor(); - - @JsProperty - void setFigureDescriptor( - FetchFigureResponse.ToObjectReturnType0.FigureDescriptorFieldType figureDescriptor); - } - - public static native FetchFigureResponse deserializeBinary(Uint8Array bytes); - - public static native FetchFigureResponse deserializeBinaryFromReader( - FetchFigureResponse message, Object reader); - - public static native void serializeBinaryToWriter(FetchFigureResponse message, Object writer); - - public static native FetchFigureResponse.ToObjectReturnType toObject( - boolean includeInstance, FetchFigureResponse msg); - - public native void clearFigureDescriptor(); - - public native FigureDescriptor getFigureDescriptor(); - - public native boolean hasFigureDescriptor(); - - public native Uint8Array serializeBinary(); - - public native void setFigureDescriptor(); - - public native void setFigureDescriptor(FigureDescriptor value); - - public native FetchFigureResponse.ToObjectReturnType0 toObject(); - - public native FetchFigureResponse.ToObjectReturnType0 toObject(boolean includeInstance); -} diff --git a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/console_pb/FigureDescriptor.java b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/console_pb/FigureDescriptor.java index 4319a6db1cc..5b1708ec2e2 100644 --- a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/console_pb/FigureDescriptor.java +++ b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/console_pb/FigureDescriptor.java @@ -5,7 +5,6 @@ import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.console_pb.figuredescriptor.ChartDescriptor; import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.console_pb.figuredescriptor.SeriesPlotStyleMap; import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.console_pb.figuredescriptor.SourceTypeMap; -import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.table_pb.ExportedTableCreationResponse; import jsinterop.annotations.JsOverlay; import jsinterop.annotations.JsPackage; import jsinterop.annotations.JsProperty; @@ -838,174 +837,6 @@ default void setSeriesList( void setTitleFont(String titleFont); } - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface TablesListFieldType { - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface GetSchemaHeaderUnionType { - @JsOverlay - static FigureDescriptor.ToObjectReturnType.TablesListFieldType.GetSchemaHeaderUnionType of( - Object o) { - return Js.cast(o); - } - - @JsOverlay - default String asString() { - return Js.asString(this); - } - - @JsOverlay - default Uint8Array asUint8Array() { - return Js.cast(this); - } - - @JsOverlay - default boolean isString() { - return (Object) this instanceof String; - } - - @JsOverlay - default boolean isUint8Array() { - return (Object) this instanceof Uint8Array; - } - } - - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface ResultIdFieldType { - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface TicketFieldType { - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface GetTicketUnionType { - @JsOverlay - static FigureDescriptor.ToObjectReturnType.TablesListFieldType.ResultIdFieldType.TicketFieldType.GetTicketUnionType of( - Object o) { - return Js.cast(o); - } - - @JsOverlay - default String asString() { - return Js.asString(this); - } - - @JsOverlay - default Uint8Array asUint8Array() { - return Js.cast(this); - } - - @JsOverlay - default boolean isString() { - return (Object) this instanceof String; - } - - @JsOverlay - default boolean isUint8Array() { - return (Object) this instanceof Uint8Array; - } - } - - @JsOverlay - static FigureDescriptor.ToObjectReturnType.TablesListFieldType.ResultIdFieldType.TicketFieldType create() { - return Js.uncheckedCast(JsPropertyMap.of()); - } - - @JsProperty - FigureDescriptor.ToObjectReturnType.TablesListFieldType.ResultIdFieldType.TicketFieldType.GetTicketUnionType getTicket(); - - @JsProperty - void setTicket( - FigureDescriptor.ToObjectReturnType.TablesListFieldType.ResultIdFieldType.TicketFieldType.GetTicketUnionType ticket); - - @JsOverlay - default void setTicket(String ticket) { - setTicket( - Js.uncheckedCast( - ticket)); - } - - @JsOverlay - default void setTicket(Uint8Array ticket) { - setTicket( - Js.uncheckedCast( - ticket)); - } - } - - @JsOverlay - static FigureDescriptor.ToObjectReturnType.TablesListFieldType.ResultIdFieldType create() { - return Js.uncheckedCast(JsPropertyMap.of()); - } - - @JsProperty - double getBatchOffset(); - - @JsProperty - FigureDescriptor.ToObjectReturnType.TablesListFieldType.ResultIdFieldType.TicketFieldType getTicket(); - - @JsProperty - void setBatchOffset(double batchOffset); - - @JsProperty - void setTicket( - FigureDescriptor.ToObjectReturnType.TablesListFieldType.ResultIdFieldType.TicketFieldType ticket); - } - - @JsOverlay - static FigureDescriptor.ToObjectReturnType.TablesListFieldType create() { - return Js.uncheckedCast(JsPropertyMap.of()); - } - - @JsProperty - String getErrorInfo(); - - @JsProperty - FigureDescriptor.ToObjectReturnType.TablesListFieldType.ResultIdFieldType getResultId(); - - @JsProperty - FigureDescriptor.ToObjectReturnType.TablesListFieldType.GetSchemaHeaderUnionType getSchemaHeader(); - - @JsProperty - String getSize(); - - @JsProperty - boolean isIsStatic(); - - @JsProperty - boolean isSuccess(); - - @JsProperty - void setErrorInfo(String errorInfo); - - @JsProperty - void setIsStatic(boolean isStatic); - - @JsProperty - void setResultId( - FigureDescriptor.ToObjectReturnType.TablesListFieldType.ResultIdFieldType resultId); - - @JsProperty - void setSchemaHeader( - FigureDescriptor.ToObjectReturnType.TablesListFieldType.GetSchemaHeaderUnionType schemaHeader); - - @JsOverlay - default void setSchemaHeader(String schemaHeader) { - setSchemaHeader( - Js.uncheckedCast( - schemaHeader)); - } - - @JsOverlay - default void setSchemaHeader(Uint8Array schemaHeader) { - setSchemaHeader( - Js.uncheckedCast( - schemaHeader)); - } - - @JsProperty - void setSize(String size); - - @JsProperty - void setSuccess(boolean success); - } - @JsOverlay static FigureDescriptor.ToObjectReturnType create() { return Js.uncheckedCast(JsPropertyMap.of()); @@ -1023,9 +854,6 @@ static FigureDescriptor.ToObjectReturnType create() { @JsProperty double getRows(); - @JsProperty - JsArray getTablesList(); - @JsProperty String getTitle(); @@ -1063,17 +891,6 @@ default void setErrorsList(String[] errorsList) { @JsProperty void setRows(double rows); - @JsProperty - void setTablesList(JsArray tablesList); - - @JsOverlay - default void setTablesList( - FigureDescriptor.ToObjectReturnType.TablesListFieldType[] tablesList) { - setTablesList( - Js.>uncheckedCast( - tablesList)); - } - @JsProperty void setTitle(String title); @@ -1907,174 +1724,6 @@ default void setSeriesList( void setTitleFont(String titleFont); } - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface TablesListFieldType { - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface GetSchemaHeaderUnionType { - @JsOverlay - static FigureDescriptor.ToObjectReturnType0.TablesListFieldType.GetSchemaHeaderUnionType of( - Object o) { - return Js.cast(o); - } - - @JsOverlay - default String asString() { - return Js.asString(this); - } - - @JsOverlay - default Uint8Array asUint8Array() { - return Js.cast(this); - } - - @JsOverlay - default boolean isString() { - return (Object) this instanceof String; - } - - @JsOverlay - default boolean isUint8Array() { - return (Object) this instanceof Uint8Array; - } - } - - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface ResultIdFieldType { - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface TicketFieldType { - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface GetTicketUnionType { - @JsOverlay - static FigureDescriptor.ToObjectReturnType0.TablesListFieldType.ResultIdFieldType.TicketFieldType.GetTicketUnionType of( - Object o) { - return Js.cast(o); - } - - @JsOverlay - default String asString() { - return Js.asString(this); - } - - @JsOverlay - default Uint8Array asUint8Array() { - return Js.cast(this); - } - - @JsOverlay - default boolean isString() { - return (Object) this instanceof String; - } - - @JsOverlay - default boolean isUint8Array() { - return (Object) this instanceof Uint8Array; - } - } - - @JsOverlay - static FigureDescriptor.ToObjectReturnType0.TablesListFieldType.ResultIdFieldType.TicketFieldType create() { - return Js.uncheckedCast(JsPropertyMap.of()); - } - - @JsProperty - FigureDescriptor.ToObjectReturnType0.TablesListFieldType.ResultIdFieldType.TicketFieldType.GetTicketUnionType getTicket(); - - @JsProperty - void setTicket( - FigureDescriptor.ToObjectReturnType0.TablesListFieldType.ResultIdFieldType.TicketFieldType.GetTicketUnionType ticket); - - @JsOverlay - default void setTicket(String ticket) { - setTicket( - Js.uncheckedCast( - ticket)); - } - - @JsOverlay - default void setTicket(Uint8Array ticket) { - setTicket( - Js.uncheckedCast( - ticket)); - } - } - - @JsOverlay - static FigureDescriptor.ToObjectReturnType0.TablesListFieldType.ResultIdFieldType create() { - return Js.uncheckedCast(JsPropertyMap.of()); - } - - @JsProperty - double getBatchOffset(); - - @JsProperty - FigureDescriptor.ToObjectReturnType0.TablesListFieldType.ResultIdFieldType.TicketFieldType getTicket(); - - @JsProperty - void setBatchOffset(double batchOffset); - - @JsProperty - void setTicket( - FigureDescriptor.ToObjectReturnType0.TablesListFieldType.ResultIdFieldType.TicketFieldType ticket); - } - - @JsOverlay - static FigureDescriptor.ToObjectReturnType0.TablesListFieldType create() { - return Js.uncheckedCast(JsPropertyMap.of()); - } - - @JsProperty - String getErrorInfo(); - - @JsProperty - FigureDescriptor.ToObjectReturnType0.TablesListFieldType.ResultIdFieldType getResultId(); - - @JsProperty - FigureDescriptor.ToObjectReturnType0.TablesListFieldType.GetSchemaHeaderUnionType getSchemaHeader(); - - @JsProperty - String getSize(); - - @JsProperty - boolean isIsStatic(); - - @JsProperty - boolean isSuccess(); - - @JsProperty - void setErrorInfo(String errorInfo); - - @JsProperty - void setIsStatic(boolean isStatic); - - @JsProperty - void setResultId( - FigureDescriptor.ToObjectReturnType0.TablesListFieldType.ResultIdFieldType resultId); - - @JsProperty - void setSchemaHeader( - FigureDescriptor.ToObjectReturnType0.TablesListFieldType.GetSchemaHeaderUnionType schemaHeader); - - @JsOverlay - default void setSchemaHeader(String schemaHeader) { - setSchemaHeader( - Js.uncheckedCast( - schemaHeader)); - } - - @JsOverlay - default void setSchemaHeader(Uint8Array schemaHeader) { - setSchemaHeader( - Js.uncheckedCast( - schemaHeader)); - } - - @JsProperty - void setSize(String size); - - @JsProperty - void setSuccess(boolean success); - } - @JsOverlay static FigureDescriptor.ToObjectReturnType0 create() { return Js.uncheckedCast(JsPropertyMap.of()); @@ -2092,9 +1741,6 @@ static FigureDescriptor.ToObjectReturnType0 create() { @JsProperty double getRows(); - @JsProperty - JsArray getTablesList(); - @JsProperty String getTitle(); @@ -2133,18 +1779,6 @@ default void setErrorsList(String[] errorsList) { @JsProperty void setRows(double rows); - @JsProperty - void setTablesList( - JsArray tablesList); - - @JsOverlay - default void setTablesList( - FigureDescriptor.ToObjectReturnType0.TablesListFieldType[] tablesList) { - setTablesList( - Js.>uncheckedCast( - tablesList)); - } - @JsProperty void setTitle(String title); @@ -2181,19 +1815,10 @@ public static native FigureDescriptor.ToObjectReturnType toObject( public native String addErrors(String value); - public native ExportedTableCreationResponse addTables(); - - public native ExportedTableCreationResponse addTables( - ExportedTableCreationResponse value, double index); - - public native ExportedTableCreationResponse addTables(ExportedTableCreationResponse value); - public native void clearChartsList(); public native void clearErrorsList(); - public native void clearTablesList(); - public native void clearTitle(); public native JsArray getChartsList(); @@ -2204,8 +1829,6 @@ public native ExportedTableCreationResponse addTables( public native int getRows(); - public native JsArray getTablesList(); - public native String getTitle(); public native String getTitleColor(); @@ -2236,13 +1859,6 @@ public final void setErrorsList(String[] value) { public native void setRows(int value); - @JsOverlay - public final void setTablesList(ExportedTableCreationResponse[] value) { - setTablesList(Js.>uncheckedCast(value)); - } - - public native void setTablesList(JsArray value); - public native void setTitle(String value); public native void setTitleColor(String value); diff --git a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/console_pb/VariableDefinition.java b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/console_pb/VariableDefinition.java deleted file mode 100644 index a805093eaab..00000000000 --- a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/console_pb/VariableDefinition.java +++ /dev/null @@ -1,214 +0,0 @@ -package io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.console_pb; - -import elemental2.core.Uint8Array; -import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.ticket_pb.Ticket; -import jsinterop.annotations.JsOverlay; -import jsinterop.annotations.JsPackage; -import jsinterop.annotations.JsProperty; -import jsinterop.annotations.JsType; -import jsinterop.base.Js; -import jsinterop.base.JsPropertyMap; - -@JsType( - isNative = true, - name = "dhinternal.io.deephaven.proto.console_pb.VariableDefinition", - namespace = JsPackage.GLOBAL) -public class VariableDefinition { - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface ToObjectReturnType { - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface IdFieldType { - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface GetTicketUnionType { - @JsOverlay - static VariableDefinition.ToObjectReturnType.IdFieldType.GetTicketUnionType of(Object o) { - return Js.cast(o); - } - - @JsOverlay - default String asString() { - return Js.asString(this); - } - - @JsOverlay - default Uint8Array asUint8Array() { - return Js.cast(this); - } - - @JsOverlay - default boolean isString() { - return (Object) this instanceof String; - } - - @JsOverlay - default boolean isUint8Array() { - return (Object) this instanceof Uint8Array; - } - } - - @JsOverlay - static VariableDefinition.ToObjectReturnType.IdFieldType create() { - return Js.uncheckedCast(JsPropertyMap.of()); - } - - @JsProperty - VariableDefinition.ToObjectReturnType.IdFieldType.GetTicketUnionType getTicket(); - - @JsProperty - void setTicket(VariableDefinition.ToObjectReturnType.IdFieldType.GetTicketUnionType ticket); - - @JsOverlay - default void setTicket(String ticket) { - setTicket( - Js.uncheckedCast( - ticket)); - } - - @JsOverlay - default void setTicket(Uint8Array ticket) { - setTicket( - Js.uncheckedCast( - ticket)); - } - } - - @JsOverlay - static VariableDefinition.ToObjectReturnType create() { - return Js.uncheckedCast(JsPropertyMap.of()); - } - - @JsProperty - VariableDefinition.ToObjectReturnType.IdFieldType getId(); - - @JsProperty - String getTitle(); - - @JsProperty - String getType(); - - @JsProperty - void setId(VariableDefinition.ToObjectReturnType.IdFieldType id); - - @JsProperty - void setTitle(String title); - - @JsProperty - void setType(String type); - } - - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface ToObjectReturnType0 { - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface IdFieldType { - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface GetTicketUnionType { - @JsOverlay - static VariableDefinition.ToObjectReturnType0.IdFieldType.GetTicketUnionType of(Object o) { - return Js.cast(o); - } - - @JsOverlay - default String asString() { - return Js.asString(this); - } - - @JsOverlay - default Uint8Array asUint8Array() { - return Js.cast(this); - } - - @JsOverlay - default boolean isString() { - return (Object) this instanceof String; - } - - @JsOverlay - default boolean isUint8Array() { - return (Object) this instanceof Uint8Array; - } - } - - @JsOverlay - static VariableDefinition.ToObjectReturnType0.IdFieldType create() { - return Js.uncheckedCast(JsPropertyMap.of()); - } - - @JsProperty - VariableDefinition.ToObjectReturnType0.IdFieldType.GetTicketUnionType getTicket(); - - @JsProperty - void setTicket(VariableDefinition.ToObjectReturnType0.IdFieldType.GetTicketUnionType ticket); - - @JsOverlay - default void setTicket(String ticket) { - setTicket( - Js.uncheckedCast( - ticket)); - } - - @JsOverlay - default void setTicket(Uint8Array ticket) { - setTicket( - Js.uncheckedCast( - ticket)); - } - } - - @JsOverlay - static VariableDefinition.ToObjectReturnType0 create() { - return Js.uncheckedCast(JsPropertyMap.of()); - } - - @JsProperty - VariableDefinition.ToObjectReturnType0.IdFieldType getId(); - - @JsProperty - String getTitle(); - - @JsProperty - String getType(); - - @JsProperty - void setId(VariableDefinition.ToObjectReturnType0.IdFieldType id); - - @JsProperty - void setTitle(String title); - - @JsProperty - void setType(String type); - } - - public static native VariableDefinition deserializeBinary(Uint8Array bytes); - - public static native VariableDefinition deserializeBinaryFromReader( - VariableDefinition message, Object reader); - - public static native void serializeBinaryToWriter(VariableDefinition message, Object writer); - - public static native VariableDefinition.ToObjectReturnType toObject( - boolean includeInstance, VariableDefinition msg); - - public native void clearId(); - - public native Ticket getId(); - - public native String getTitle(); - - public native String getType(); - - public native boolean hasId(); - - public native Uint8Array serializeBinary(); - - public native void setId(); - - public native void setId(Ticket value); - - public native void setTitle(String value); - - public native void setType(String value); - - public native VariableDefinition.ToObjectReturnType0 toObject(); - - public native VariableDefinition.ToObjectReturnType0 toObject(boolean includeInstance); -} diff --git a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/console_pb_service/ConsoleService.java b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/console_pb_service/ConsoleService.java index b47c5d4505e..36020a75934 100644 --- a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/console_pb_service/ConsoleService.java +++ b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/console_pb_service/ConsoleService.java @@ -188,50 +188,6 @@ static ConsoleService.ExecuteCommandType create() { void setService(Object service); } - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface FetchFigureType { - @JsOverlay - static ConsoleService.FetchFigureType create() { - return Js.uncheckedCast(JsPropertyMap.of()); - } - - @JsProperty - String getMethodName(); - - @JsProperty - Object getRequestType(); - - @JsProperty - Object getResponseType(); - - @JsProperty - Object getService(); - - @JsProperty - boolean isRequestStream(); - - @JsProperty - boolean isResponseStream(); - - @JsProperty - void setMethodName(String methodName); - - @JsProperty - void setRequestStream(boolean requestStream); - - @JsProperty - void setRequestType(Object requestType); - - @JsProperty - void setResponseStream(boolean responseStream); - - @JsProperty - void setResponseType(Object responseType); - - @JsProperty - void setService(Object service); - } - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) public interface GetConsoleTypesType { @JsOverlay @@ -456,7 +412,6 @@ static ConsoleService.SubscribeToLogsType create() { public static ConsoleService.BindTableToVariableType BindTableToVariable; public static ConsoleService.CancelCommandType CancelCommand; public static ConsoleService.ExecuteCommandType ExecuteCommand; - public static ConsoleService.FetchFigureType FetchFigure; public static ConsoleService.GetConsoleTypesType GetConsoleTypes; public static ConsoleService.NextAutoCompleteStreamType NextAutoCompleteStream; public static ConsoleService.OpenAutoCompleteStreamType OpenAutoCompleteStream; diff --git a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/console_pb_service/ConsoleServiceClient.java b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/console_pb_service/ConsoleServiceClient.java index 602352894f4..087770688b2 100644 --- a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/console_pb_service/ConsoleServiceClient.java +++ b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/console_pb_service/ConsoleServiceClient.java @@ -10,8 +10,6 @@ import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.console_pb.CancelCommandResponse; import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.console_pb.ExecuteCommandRequest; import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.console_pb.ExecuteCommandResponse; -import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.console_pb.FetchFigureRequest; -import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.console_pb.FetchFigureResponse; import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.console_pb.GetConsoleTypesRequest; import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.console_pb.GetConsoleTypesResponse; import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.console_pb.LogSubscriptionData; @@ -310,97 +308,6 @@ default boolean isExecuteCommandMetadata_or_callbackFn() { } } - @JsFunction - public interface FetchFigureCallbackFn { - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface P0Type { - @JsOverlay - static ConsoleServiceClient.FetchFigureCallbackFn.P0Type create() { - return Js.uncheckedCast(JsPropertyMap.of()); - } - - @JsProperty - double getCode(); - - @JsProperty - String getMessage(); - - @JsProperty - BrowserHeaders getMetadata(); - - @JsProperty - void setCode(double code); - - @JsProperty - void setMessage(String message); - - @JsProperty - void setMetadata(BrowserHeaders metadata); - } - - void onInvoke(ConsoleServiceClient.FetchFigureCallbackFn.P0Type p0, FetchFigureResponse p1); - } - - @JsFunction - public interface FetchFigureMetadata_or_callbackFn { - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface P0Type { - @JsOverlay - static ConsoleServiceClient.FetchFigureMetadata_or_callbackFn.P0Type create() { - return Js.uncheckedCast(JsPropertyMap.of()); - } - - @JsProperty - double getCode(); - - @JsProperty - String getMessage(); - - @JsProperty - BrowserHeaders getMetadata(); - - @JsProperty - void setCode(double code); - - @JsProperty - void setMessage(String message); - - @JsProperty - void setMetadata(BrowserHeaders metadata); - } - - void onInvoke( - ConsoleServiceClient.FetchFigureMetadata_or_callbackFn.P0Type p0, FetchFigureResponse p1); - } - - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface FetchFigureMetadata_or_callbackUnionType { - @JsOverlay - static ConsoleServiceClient.FetchFigureMetadata_or_callbackUnionType of(Object o) { - return Js.cast(o); - } - - @JsOverlay - default BrowserHeaders asBrowserHeaders() { - return Js.cast(this); - } - - @JsOverlay - default ConsoleServiceClient.FetchFigureMetadata_or_callbackFn asFetchFigureMetadata_or_callbackFn() { - return Js.cast(this); - } - - @JsOverlay - default boolean isBrowserHeaders() { - return (Object) this instanceof BrowserHeaders; - } - - @JsOverlay - default boolean isFetchFigureMetadata_or_callbackFn() { - return (Object) this instanceof ConsoleServiceClient.FetchFigureMetadata_or_callbackFn; - } - } - @JsFunction public interface GetConsoleTypesCallbackFn { @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) @@ -845,58 +752,6 @@ public native UnaryResponse executeCommand( ExecuteCommandRequest requestMessage, ConsoleServiceClient.ExecuteCommandMetadata_or_callbackUnionType metadata_or_callback); - @JsOverlay - public final UnaryResponse fetchFigure( - FetchFigureRequest requestMessage, - BrowserHeaders metadata_or_callback, - ConsoleServiceClient.FetchFigureCallbackFn callback) { - return fetchFigure( - requestMessage, - Js.uncheckedCast( - metadata_or_callback), - callback); - } - - @JsOverlay - public final UnaryResponse fetchFigure( - FetchFigureRequest requestMessage, BrowserHeaders metadata_or_callback) { - return fetchFigure( - requestMessage, - Js.uncheckedCast( - metadata_or_callback)); - } - - @JsOverlay - public final UnaryResponse fetchFigure( - FetchFigureRequest requestMessage, - ConsoleServiceClient.FetchFigureMetadata_or_callbackFn metadata_or_callback, - ConsoleServiceClient.FetchFigureCallbackFn callback) { - return fetchFigure( - requestMessage, - Js.uncheckedCast( - metadata_or_callback), - callback); - } - - @JsOverlay - public final UnaryResponse fetchFigure( - FetchFigureRequest requestMessage, - ConsoleServiceClient.FetchFigureMetadata_or_callbackFn metadata_or_callback) { - return fetchFigure( - requestMessage, - Js.uncheckedCast( - metadata_or_callback)); - } - - public native UnaryResponse fetchFigure( - FetchFigureRequest requestMessage, - ConsoleServiceClient.FetchFigureMetadata_or_callbackUnionType metadata_or_callback, - ConsoleServiceClient.FetchFigureCallbackFn callback); - - public native UnaryResponse fetchFigure( - FetchFigureRequest requestMessage, - ConsoleServiceClient.FetchFigureMetadata_or_callbackUnionType metadata_or_callback); - @JsOverlay public final UnaryResponse getConsoleTypes( GetConsoleTypesRequest requestMessage, diff --git a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/console_pb/FetchFigureRequest.java b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/object_pb/FetchObjectRequest.java similarity index 72% rename from web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/console_pb/FetchFigureRequest.java rename to web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/object_pb/FetchObjectRequest.java index 77804fea44c..a669f253b9a 100644 --- a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/console_pb/FetchFigureRequest.java +++ b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/object_pb/FetchObjectRequest.java @@ -1,4 +1,4 @@ -package io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.console_pb; +package io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.object_pb; import elemental2.core.Uint8Array; import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.ticket_pb.Ticket; @@ -11,9 +11,9 @@ @JsType( isNative = true, - name = "dhinternal.io.deephaven.proto.console_pb.FetchFigureRequest", + name = "dhinternal.io.deephaven.proto.object_pb.FetchObjectRequest", namespace = JsPackage.GLOBAL) -public class FetchFigureRequest { +public class FetchObjectRequest { @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) public interface ToObjectReturnType { @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) @@ -21,7 +21,7 @@ public interface SourceIdFieldType { @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) public interface GetTicketUnionType { @JsOverlay - static FetchFigureRequest.ToObjectReturnType.SourceIdFieldType.GetTicketUnionType of( + static FetchObjectRequest.ToObjectReturnType.SourceIdFieldType.GetTicketUnionType of( Object o) { return Js.cast(o); } @@ -48,42 +48,42 @@ default boolean isUint8Array() { } @JsOverlay - static FetchFigureRequest.ToObjectReturnType.SourceIdFieldType create() { + static FetchObjectRequest.ToObjectReturnType.SourceIdFieldType create() { return Js.uncheckedCast(JsPropertyMap.of()); } @JsProperty - FetchFigureRequest.ToObjectReturnType.SourceIdFieldType.GetTicketUnionType getTicket(); + FetchObjectRequest.ToObjectReturnType.SourceIdFieldType.GetTicketUnionType getTicket(); @JsProperty void setTicket( - FetchFigureRequest.ToObjectReturnType.SourceIdFieldType.GetTicketUnionType ticket); + FetchObjectRequest.ToObjectReturnType.SourceIdFieldType.GetTicketUnionType ticket); @JsOverlay default void setTicket(String ticket) { setTicket( - Js.uncheckedCast( + Js.uncheckedCast( ticket)); } @JsOverlay default void setTicket(Uint8Array ticket) { setTicket( - Js.uncheckedCast( + Js.uncheckedCast( ticket)); } } @JsOverlay - static FetchFigureRequest.ToObjectReturnType create() { + static FetchObjectRequest.ToObjectReturnType create() { return Js.uncheckedCast(JsPropertyMap.of()); } @JsProperty - FetchFigureRequest.ToObjectReturnType.SourceIdFieldType getSourceId(); + FetchObjectRequest.ToObjectReturnType.SourceIdFieldType getSourceId(); @JsProperty - void setSourceId(FetchFigureRequest.ToObjectReturnType.SourceIdFieldType sourceId); + void setSourceId(FetchObjectRequest.ToObjectReturnType.SourceIdFieldType sourceId); } @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) @@ -93,7 +93,7 @@ public interface SourceIdFieldType { @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) public interface GetTicketUnionType { @JsOverlay - static FetchFigureRequest.ToObjectReturnType0.SourceIdFieldType.GetTicketUnionType of( + static FetchObjectRequest.ToObjectReturnType0.SourceIdFieldType.GetTicketUnionType of( Object o) { return Js.cast(o); } @@ -120,53 +120,53 @@ default boolean isUint8Array() { } @JsOverlay - static FetchFigureRequest.ToObjectReturnType0.SourceIdFieldType create() { + static FetchObjectRequest.ToObjectReturnType0.SourceIdFieldType create() { return Js.uncheckedCast(JsPropertyMap.of()); } @JsProperty - FetchFigureRequest.ToObjectReturnType0.SourceIdFieldType.GetTicketUnionType getTicket(); + FetchObjectRequest.ToObjectReturnType0.SourceIdFieldType.GetTicketUnionType getTicket(); @JsProperty void setTicket( - FetchFigureRequest.ToObjectReturnType0.SourceIdFieldType.GetTicketUnionType ticket); + FetchObjectRequest.ToObjectReturnType0.SourceIdFieldType.GetTicketUnionType ticket); @JsOverlay default void setTicket(String ticket) { setTicket( - Js.uncheckedCast( + Js.uncheckedCast( ticket)); } @JsOverlay default void setTicket(Uint8Array ticket) { setTicket( - Js.uncheckedCast( + Js.uncheckedCast( ticket)); } } @JsOverlay - static FetchFigureRequest.ToObjectReturnType0 create() { + static FetchObjectRequest.ToObjectReturnType0 create() { return Js.uncheckedCast(JsPropertyMap.of()); } @JsProperty - FetchFigureRequest.ToObjectReturnType0.SourceIdFieldType getSourceId(); + FetchObjectRequest.ToObjectReturnType0.SourceIdFieldType getSourceId(); @JsProperty - void setSourceId(FetchFigureRequest.ToObjectReturnType0.SourceIdFieldType sourceId); + void setSourceId(FetchObjectRequest.ToObjectReturnType0.SourceIdFieldType sourceId); } - public static native FetchFigureRequest deserializeBinary(Uint8Array bytes); + public static native FetchObjectRequest deserializeBinary(Uint8Array bytes); - public static native FetchFigureRequest deserializeBinaryFromReader( - FetchFigureRequest message, Object reader); + public static native FetchObjectRequest deserializeBinaryFromReader( + FetchObjectRequest message, Object reader); - public static native void serializeBinaryToWriter(FetchFigureRequest message, Object writer); + public static native void serializeBinaryToWriter(FetchObjectRequest message, Object writer); - public static native FetchFigureRequest.ToObjectReturnType toObject( - boolean includeInstance, FetchFigureRequest msg); + public static native FetchObjectRequest.ToObjectReturnType toObject( + boolean includeInstance, FetchObjectRequest msg); public native void clearSourceId(); @@ -180,7 +180,7 @@ public static native FetchFigureRequest.ToObjectReturnType toObject( public native void setSourceId(Ticket value); - public native FetchFigureRequest.ToObjectReturnType0 toObject(); + public native FetchObjectRequest.ToObjectReturnType0 toObject(); - public native FetchFigureRequest.ToObjectReturnType0 toObject(boolean includeInstance); + public native FetchObjectRequest.ToObjectReturnType0 toObject(boolean includeInstance); } diff --git a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/object_pb/FetchObjectResponse.java b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/object_pb/FetchObjectResponse.java new file mode 100644 index 00000000000..adaac078a7b --- /dev/null +++ b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/object_pb/FetchObjectResponse.java @@ -0,0 +1,402 @@ +package io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.object_pb; + +import elemental2.core.JsArray; +import elemental2.core.Uint8Array; +import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.ticket_pb.TypedTicket; +import jsinterop.annotations.JsOverlay; +import jsinterop.annotations.JsPackage; +import jsinterop.annotations.JsProperty; +import jsinterop.annotations.JsType; +import jsinterop.base.Js; +import jsinterop.base.JsPropertyMap; + +@JsType( + isNative = true, + name = "dhinternal.io.deephaven.proto.object_pb.FetchObjectResponse", + namespace = JsPackage.GLOBAL) +public class FetchObjectResponse { + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface GetDataUnionType { + @JsOverlay + static FetchObjectResponse.GetDataUnionType of(Object o) { + return Js.cast(o); + } + + @JsOverlay + default String asString() { + return Js.asString(this); + } + + @JsOverlay + default Uint8Array asUint8Array() { + return Js.cast(this); + } + + @JsOverlay + default boolean isString() { + return (Object) this instanceof String; + } + + @JsOverlay + default boolean isUint8Array() { + return (Object) this instanceof Uint8Array; + } + } + + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface SetDataValueUnionType { + @JsOverlay + static FetchObjectResponse.SetDataValueUnionType of(Object o) { + return Js.cast(o); + } + + @JsOverlay + default String asString() { + return Js.asString(this); + } + + @JsOverlay + default Uint8Array asUint8Array() { + return Js.cast(this); + } + + @JsOverlay + default boolean isString() { + return (Object) this instanceof String; + } + + @JsOverlay + default boolean isUint8Array() { + return (Object) this instanceof Uint8Array; + } + } + + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface ToObjectReturnType { + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface ExportIdListFieldType { + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface GetTicketUnionType { + @JsOverlay + static FetchObjectResponse.ToObjectReturnType.ExportIdListFieldType.GetTicketUnionType of( + Object o) { + return Js.cast(o); + } + + @JsOverlay + default String asString() { + return Js.asString(this); + } + + @JsOverlay + default Uint8Array asUint8Array() { + return Js.cast(this); + } + + @JsOverlay + default boolean isString() { + return (Object) this instanceof String; + } + + @JsOverlay + default boolean isUint8Array() { + return (Object) this instanceof Uint8Array; + } + } + + @JsOverlay + static FetchObjectResponse.ToObjectReturnType.ExportIdListFieldType create() { + return Js.uncheckedCast(JsPropertyMap.of()); + } + + @JsProperty + FetchObjectResponse.ToObjectReturnType.ExportIdListFieldType.GetTicketUnionType getTicket(); + + @JsProperty + String getType(); + + @JsProperty + void setTicket( + FetchObjectResponse.ToObjectReturnType.ExportIdListFieldType.GetTicketUnionType ticket); + + @JsOverlay + default void setTicket(String ticket) { + setTicket( + Js.uncheckedCast( + ticket)); + } + + @JsOverlay + default void setTicket(Uint8Array ticket) { + setTicket( + Js.uncheckedCast( + ticket)); + } + + @JsProperty + void setType(String type); + } + + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface GetDataUnionType { + @JsOverlay + static FetchObjectResponse.ToObjectReturnType.GetDataUnionType of(Object o) { + return Js.cast(o); + } + + @JsOverlay + default String asString() { + return Js.asString(this); + } + + @JsOverlay + default Uint8Array asUint8Array() { + return Js.cast(this); + } + + @JsOverlay + default boolean isString() { + return (Object) this instanceof String; + } + + @JsOverlay + default boolean isUint8Array() { + return (Object) this instanceof Uint8Array; + } + } + + @JsOverlay + static FetchObjectResponse.ToObjectReturnType create() { + return Js.uncheckedCast(JsPropertyMap.of()); + } + + @JsProperty + FetchObjectResponse.ToObjectReturnType.GetDataUnionType getData(); + + @JsProperty + JsArray getExportIdList(); + + @JsProperty + String getType(); + + @JsProperty + void setData(FetchObjectResponse.ToObjectReturnType.GetDataUnionType data); + + @JsOverlay + default void setData(String data) { + setData(Js.uncheckedCast(data)); + } + + @JsOverlay + default void setData(Uint8Array data) { + setData(Js.uncheckedCast(data)); + } + + @JsOverlay + default void setExportIdList( + FetchObjectResponse.ToObjectReturnType.ExportIdListFieldType[] exportIdList) { + setExportIdList( + Js.>uncheckedCast( + exportIdList)); + } + + @JsProperty + void setExportIdList( + JsArray exportIdList); + + @JsProperty + void setType(String type); + } + + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface ToObjectReturnType0 { + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface ExportIdListFieldType { + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface GetTicketUnionType { + @JsOverlay + static FetchObjectResponse.ToObjectReturnType0.ExportIdListFieldType.GetTicketUnionType of( + Object o) { + return Js.cast(o); + } + + @JsOverlay + default String asString() { + return Js.asString(this); + } + + @JsOverlay + default Uint8Array asUint8Array() { + return Js.cast(this); + } + + @JsOverlay + default boolean isString() { + return (Object) this instanceof String; + } + + @JsOverlay + default boolean isUint8Array() { + return (Object) this instanceof Uint8Array; + } + } + + @JsOverlay + static FetchObjectResponse.ToObjectReturnType0.ExportIdListFieldType create() { + return Js.uncheckedCast(JsPropertyMap.of()); + } + + @JsProperty + FetchObjectResponse.ToObjectReturnType0.ExportIdListFieldType.GetTicketUnionType getTicket(); + + @JsProperty + String getType(); + + @JsProperty + void setTicket( + FetchObjectResponse.ToObjectReturnType0.ExportIdListFieldType.GetTicketUnionType ticket); + + @JsOverlay + default void setTicket(String ticket) { + setTicket( + Js.uncheckedCast( + ticket)); + } + + @JsOverlay + default void setTicket(Uint8Array ticket) { + setTicket( + Js.uncheckedCast( + ticket)); + } + + @JsProperty + void setType(String type); + } + + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface GetDataUnionType { + @JsOverlay + static FetchObjectResponse.ToObjectReturnType0.GetDataUnionType of(Object o) { + return Js.cast(o); + } + + @JsOverlay + default String asString() { + return Js.asString(this); + } + + @JsOverlay + default Uint8Array asUint8Array() { + return Js.cast(this); + } + + @JsOverlay + default boolean isString() { + return (Object) this instanceof String; + } + + @JsOverlay + default boolean isUint8Array() { + return (Object) this instanceof Uint8Array; + } + } + + @JsOverlay + static FetchObjectResponse.ToObjectReturnType0 create() { + return Js.uncheckedCast(JsPropertyMap.of()); + } + + @JsProperty + FetchObjectResponse.ToObjectReturnType0.GetDataUnionType getData(); + + @JsProperty + JsArray getExportIdList(); + + @JsProperty + String getType(); + + @JsProperty + void setData(FetchObjectResponse.ToObjectReturnType0.GetDataUnionType data); + + @JsOverlay + default void setData(String data) { + setData(Js.uncheckedCast(data)); + } + + @JsOverlay + default void setData(Uint8Array data) { + setData(Js.uncheckedCast(data)); + } + + @JsOverlay + default void setExportIdList( + FetchObjectResponse.ToObjectReturnType0.ExportIdListFieldType[] exportIdList) { + setExportIdList( + Js.>uncheckedCast( + exportIdList)); + } + + @JsProperty + void setExportIdList( + JsArray exportIdList); + + @JsProperty + void setType(String type); + } + + public static native FetchObjectResponse deserializeBinary(Uint8Array bytes); + + public static native FetchObjectResponse deserializeBinaryFromReader( + FetchObjectResponse message, Object reader); + + public static native void serializeBinaryToWriter(FetchObjectResponse message, Object writer); + + public static native FetchObjectResponse.ToObjectReturnType toObject( + boolean includeInstance, FetchObjectResponse msg); + + public native TypedTicket addExportId(); + + public native TypedTicket addExportId(TypedTicket value, double index); + + public native TypedTicket addExportId(TypedTicket value); + + public native void clearExportIdList(); + + public native FetchObjectResponse.GetDataUnionType getData(); + + public native String getData_asB64(); + + public native Uint8Array getData_asU8(); + + public native JsArray getExportIdList(); + + public native String getType(); + + public native Uint8Array serializeBinary(); + + public native void setData(FetchObjectResponse.SetDataValueUnionType value); + + @JsOverlay + public final void setData(String value) { + setData(Js.uncheckedCast(value)); + } + + @JsOverlay + public final void setData(Uint8Array value) { + setData(Js.uncheckedCast(value)); + } + + public native void setExportIdList(JsArray value); + + @JsOverlay + public final void setExportIdList(TypedTicket[] value) { + setExportIdList(Js.>uncheckedCast(value)); + } + + public native void setType(String value); + + public native FetchObjectResponse.ToObjectReturnType0 toObject(); + + public native FetchObjectResponse.ToObjectReturnType0 toObject(boolean includeInstance); +} diff --git a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/object_pb_service/BidirectionalStream.java b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/object_pb_service/BidirectionalStream.java new file mode 100644 index 00000000000..c40ab5a42fd --- /dev/null +++ b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/object_pb_service/BidirectionalStream.java @@ -0,0 +1,19 @@ +package io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.object_pb_service; + +import elemental2.core.Function; +import jsinterop.annotations.JsPackage; +import jsinterop.annotations.JsType; + +@JsType( + isNative = true, + name = "dhinternal.io.deephaven.proto.object_pb_service.BidirectionalStream", + namespace = JsPackage.GLOBAL) +public interface BidirectionalStream { + void cancel(); + + void end(); + + BidirectionalStream on(String type, Function handler); + + BidirectionalStream write(ReqT message); +} diff --git a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/object_pb_service/ObjectService.java b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/object_pb_service/ObjectService.java new file mode 100644 index 00000000000..0cc3a98387b --- /dev/null +++ b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/object_pb_service/ObjectService.java @@ -0,0 +1,61 @@ +package io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.object_pb_service; + +import jsinterop.annotations.JsOverlay; +import jsinterop.annotations.JsPackage; +import jsinterop.annotations.JsProperty; +import jsinterop.annotations.JsType; +import jsinterop.base.Js; +import jsinterop.base.JsPropertyMap; + +@JsType( + isNative = true, + name = "dhinternal.io.deephaven.proto.object_pb_service.ObjectService", + namespace = JsPackage.GLOBAL) +public class ObjectService { + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface FetchObjectType { + @JsOverlay + static ObjectService.FetchObjectType create() { + return Js.uncheckedCast(JsPropertyMap.of()); + } + + @JsProperty + String getMethodName(); + + @JsProperty + Object getRequestType(); + + @JsProperty + Object getResponseType(); + + @JsProperty + Object getService(); + + @JsProperty + boolean isRequestStream(); + + @JsProperty + boolean isResponseStream(); + + @JsProperty + void setMethodName(String methodName); + + @JsProperty + void setRequestStream(boolean requestStream); + + @JsProperty + void setRequestType(Object requestType); + + @JsProperty + void setResponseStream(boolean responseStream); + + @JsProperty + void setResponseType(Object responseType); + + @JsProperty + void setService(Object service); + } + + public static ObjectService.FetchObjectType FetchObject; + public static String serviceName; +} diff --git a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/object_pb_service/ObjectServiceClient.java b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/object_pb_service/ObjectServiceClient.java new file mode 100644 index 00000000000..2b1544c654f --- /dev/null +++ b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/object_pb_service/ObjectServiceClient.java @@ -0,0 +1,167 @@ +package io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.object_pb_service; + +import io.deephaven.javascript.proto.dhinternal.browserheaders.BrowserHeaders; +import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.object_pb.FetchObjectRequest; +import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.object_pb.FetchObjectResponse; +import jsinterop.annotations.JsFunction; +import jsinterop.annotations.JsOverlay; +import jsinterop.annotations.JsPackage; +import jsinterop.annotations.JsProperty; +import jsinterop.annotations.JsType; +import jsinterop.base.Js; +import jsinterop.base.JsPropertyMap; + +@JsType( + isNative = true, + name = "dhinternal.io.deephaven.proto.object_pb_service.ObjectServiceClient", + namespace = JsPackage.GLOBAL) +public class ObjectServiceClient { + @JsFunction + public interface FetchObjectCallbackFn { + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface P0Type { + @JsOverlay + static ObjectServiceClient.FetchObjectCallbackFn.P0Type create() { + return Js.uncheckedCast(JsPropertyMap.of()); + } + + @JsProperty + double getCode(); + + @JsProperty + String getMessage(); + + @JsProperty + BrowserHeaders getMetadata(); + + @JsProperty + void setCode(double code); + + @JsProperty + void setMessage(String message); + + @JsProperty + void setMetadata(BrowserHeaders metadata); + } + + void onInvoke(ObjectServiceClient.FetchObjectCallbackFn.P0Type p0, FetchObjectResponse p1); + } + + @JsFunction + public interface FetchObjectMetadata_or_callbackFn { + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface P0Type { + @JsOverlay + static ObjectServiceClient.FetchObjectMetadata_or_callbackFn.P0Type create() { + return Js.uncheckedCast(JsPropertyMap.of()); + } + + @JsProperty + double getCode(); + + @JsProperty + String getMessage(); + + @JsProperty + BrowserHeaders getMetadata(); + + @JsProperty + void setCode(double code); + + @JsProperty + void setMessage(String message); + + @JsProperty + void setMetadata(BrowserHeaders metadata); + } + + void onInvoke( + ObjectServiceClient.FetchObjectMetadata_or_callbackFn.P0Type p0, FetchObjectResponse p1); + } + + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface FetchObjectMetadata_or_callbackUnionType { + @JsOverlay + static ObjectServiceClient.FetchObjectMetadata_or_callbackUnionType of(Object o) { + return Js.cast(o); + } + + @JsOverlay + default BrowserHeaders asBrowserHeaders() { + return Js.cast(this); + } + + @JsOverlay + default ObjectServiceClient.FetchObjectMetadata_or_callbackFn asFetchObjectMetadata_or_callbackFn() { + return Js.cast(this); + } + + @JsOverlay + default boolean isBrowserHeaders() { + return (Object) this instanceof BrowserHeaders; + } + + @JsOverlay + default boolean isFetchObjectMetadata_or_callbackFn() { + return (Object) this instanceof ObjectServiceClient.FetchObjectMetadata_or_callbackFn; + } + } + + public String serviceHost; + + public ObjectServiceClient(String serviceHost, Object options) {} + + public ObjectServiceClient(String serviceHost) {} + + @JsOverlay + public final UnaryResponse fetchObject( + FetchObjectRequest requestMessage, + BrowserHeaders metadata_or_callback, + ObjectServiceClient.FetchObjectCallbackFn callback) { + return fetchObject( + requestMessage, + Js.uncheckedCast( + metadata_or_callback), + callback); + } + + @JsOverlay + public final UnaryResponse fetchObject( + FetchObjectRequest requestMessage, BrowserHeaders metadata_or_callback) { + return fetchObject( + requestMessage, + Js.uncheckedCast( + metadata_or_callback)); + } + + @JsOverlay + public final UnaryResponse fetchObject( + FetchObjectRequest requestMessage, + ObjectServiceClient.FetchObjectMetadata_or_callbackFn metadata_or_callback, + ObjectServiceClient.FetchObjectCallbackFn callback) { + return fetchObject( + requestMessage, + Js.uncheckedCast( + metadata_or_callback), + callback); + } + + @JsOverlay + public final UnaryResponse fetchObject( + FetchObjectRequest requestMessage, + ObjectServiceClient.FetchObjectMetadata_or_callbackFn metadata_or_callback) { + return fetchObject( + requestMessage, + Js.uncheckedCast( + metadata_or_callback)); + } + + public native UnaryResponse fetchObject( + FetchObjectRequest requestMessage, + ObjectServiceClient.FetchObjectMetadata_or_callbackUnionType metadata_or_callback, + ObjectServiceClient.FetchObjectCallbackFn callback); + + public native UnaryResponse fetchObject( + FetchObjectRequest requestMessage, + ObjectServiceClient.FetchObjectMetadata_or_callbackUnionType metadata_or_callback); +} diff --git a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/object_pb_service/RequestStream.java b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/object_pb_service/RequestStream.java new file mode 100644 index 00000000000..f941df69a8b --- /dev/null +++ b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/object_pb_service/RequestStream.java @@ -0,0 +1,55 @@ +package io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.object_pb_service; + +import io.deephaven.javascript.proto.dhinternal.browserheaders.BrowserHeaders; +import jsinterop.annotations.JsFunction; +import jsinterop.annotations.JsOverlay; +import jsinterop.annotations.JsPackage; +import jsinterop.annotations.JsProperty; +import jsinterop.annotations.JsType; +import jsinterop.base.Js; +import jsinterop.base.JsPropertyMap; + +@JsType( + isNative = true, + name = "dhinternal.io.deephaven.proto.object_pb_service.RequestStream", + namespace = JsPackage.GLOBAL) +public interface RequestStream { + @JsFunction + public interface OnHandlerFn { + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface P0Type { + @JsOverlay + static RequestStream.OnHandlerFn.P0Type create() { + return Js.uncheckedCast(JsPropertyMap.of()); + } + + @JsProperty + double getCode(); + + @JsProperty + String getDetails(); + + @JsProperty + BrowserHeaders getMetadata(); + + @JsProperty + void setCode(double code); + + @JsProperty + void setDetails(String details); + + @JsProperty + void setMetadata(BrowserHeaders metadata); + } + + void onInvoke(RequestStream.OnHandlerFn.P0Type p0); + } + + void cancel(); + + void end(); + + RequestStream on(String type, RequestStream.OnHandlerFn handler); + + RequestStream write(T message); +} diff --git a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/object_pb_service/ResponseStream.java b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/object_pb_service/ResponseStream.java new file mode 100644 index 00000000000..90b33edacfe --- /dev/null +++ b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/object_pb_service/ResponseStream.java @@ -0,0 +1,15 @@ +package io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.object_pb_service; + +import elemental2.core.Function; +import jsinterop.annotations.JsPackage; +import jsinterop.annotations.JsType; + +@JsType( + isNative = true, + name = "dhinternal.io.deephaven.proto.object_pb_service.ResponseStream", + namespace = JsPackage.GLOBAL) +public interface ResponseStream { + void cancel(); + + ResponseStream on(String type, Function handler); +} diff --git a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/object_pb_service/UnaryResponse.java b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/object_pb_service/UnaryResponse.java new file mode 100644 index 00000000000..bbd026a7b09 --- /dev/null +++ b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/object_pb_service/UnaryResponse.java @@ -0,0 +1,12 @@ +package io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.object_pb_service; + +import jsinterop.annotations.JsPackage; +import jsinterop.annotations.JsType; + +@JsType( + isNative = true, + name = "dhinternal.io.deephaven.proto.object_pb_service.UnaryResponse", + namespace = JsPackage.GLOBAL) +public interface UnaryResponse { + void cancel(); +} diff --git a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/session_pb/ExportNotification.java b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/session_pb/ExportNotification.java index 8ecb6da69c4..65ec55458ff 100644 --- a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/session_pb/ExportNotification.java +++ b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/session_pb/ExportNotification.java @@ -1,8 +1,8 @@ package io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.session_pb; import elemental2.core.Uint8Array; -import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.ticket_pb.Ticket; import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.session_pb.exportnotification.StateMap; +import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.ticket_pb.Ticket; import jsinterop.annotations.JsOverlay; import jsinterop.annotations.JsPackage; import jsinterop.annotations.JsProperty; diff --git a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/session_pb_service/SessionServiceClient.java b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/session_pb_service/SessionServiceClient.java index c2ff4543a64..182c442907f 100644 --- a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/session_pb_service/SessionServiceClient.java +++ b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/session_pb_service/SessionServiceClient.java @@ -1,6 +1,5 @@ package io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.session_pb_service; -import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.ticket_pb.Ticket; import io.deephaven.javascript.proto.dhinternal.browserheaders.BrowserHeaders; import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.session_pb.CloseSessionResponse; import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.session_pb.ExportNotification; diff --git a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/table_pb/comboaggregaterequest/AggTypeMap.java b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/table_pb/comboaggregaterequest/AggTypeMap.java index 8b2ad8c7e72..1b15020c8b8 100644 --- a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/table_pb/comboaggregaterequest/AggTypeMap.java +++ b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/table_pb/comboaggregaterequest/AggTypeMap.java @@ -20,9 +20,6 @@ static AggTypeMap create() { @JsProperty(name = "ABS_SUM") double getABS_SUM(); - @JsProperty(name = "ARRAY") - double getARRAY(); - @JsProperty(name = "AVG") double getAVG(); @@ -32,6 +29,9 @@ static AggTypeMap create() { @JsProperty(name = "FIRST") double getFIRST(); + @JsProperty(name = "GROUP") + double getGROUP(); + @JsProperty(name = "LAST") double getLAST(); @@ -62,9 +62,6 @@ static AggTypeMap create() { @JsProperty(name = "ABS_SUM") void setABS_SUM(double ABS_SUM); - @JsProperty(name = "ARRAY") - void setARRAY(double ARRAY); - @JsProperty(name = "AVG") void setAVG(double AVG); @@ -74,6 +71,9 @@ static AggTypeMap create() { @JsProperty(name = "FIRST") void setFIRST(double FIRST); + @JsProperty(name = "GROUP") + void setGROUP(double GROUP); + @JsProperty(name = "LAST") void setLAST(double LAST); diff --git a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/application_pb/TableInfo.java b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/ticket_pb/TypedTicket.java similarity index 51% rename from web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/application_pb/TableInfo.java rename to web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/ticket_pb/TypedTicket.java index 99e18c5dcbb..07b826673cf 100644 --- a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/application_pb/TableInfo.java +++ b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/ticket_pb/TypedTicket.java @@ -1,4 +1,4 @@ -package io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.application_pb; +package io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.ticket_pb; import elemental2.core.Uint8Array; import jsinterop.annotations.JsOverlay; @@ -10,13 +10,13 @@ @JsType( isNative = true, - name = "dhinternal.io.deephaven.proto.application_pb.TableInfo", + name = "dhinternal.io.deephaven.proto.ticket_pb.TypedTicket", namespace = JsPackage.GLOBAL) -public class TableInfo { +public class TypedTicket { @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface GetSchemaHeaderUnionType { + public interface GetTicketUnionType { @JsOverlay - static TableInfo.GetSchemaHeaderUnionType of(Object o) { + static TypedTicket.GetTicketUnionType of(Object o) { return Js.cast(o); } @@ -42,9 +42,9 @@ default boolean isUint8Array() { } @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface SetSchemaHeaderValueUnionType { + public interface SetTicketValueUnionType { @JsOverlay - static TableInfo.SetSchemaHeaderValueUnionType of(Object o) { + static TypedTicket.SetTicketValueUnionType of(Object o) { return Js.cast(o); } @@ -72,9 +72,9 @@ default boolean isUint8Array() { @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) public interface ToObjectReturnType { @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface GetSchemaHeaderUnionType { + public interface GetTicketUnionType { @JsOverlay - static TableInfo.ToObjectReturnType.GetSchemaHeaderUnionType of(Object o) { + static TypedTicket.ToObjectReturnType.GetTicketUnionType of(Object o) { return Js.cast(o); } @@ -100,47 +100,39 @@ default boolean isUint8Array() { } @JsOverlay - static TableInfo.ToObjectReturnType create() { + static TypedTicket.ToObjectReturnType create() { return Js.uncheckedCast(JsPropertyMap.of()); } @JsProperty - TableInfo.ToObjectReturnType.GetSchemaHeaderUnionType getSchemaHeader(); + TypedTicket.ToObjectReturnType.GetTicketUnionType getTicket(); @JsProperty - String getSize(); + String getType(); @JsProperty - boolean isIsStatic(); - - @JsProperty - void setIsStatic(boolean isStatic); - - @JsProperty - void setSchemaHeader(TableInfo.ToObjectReturnType.GetSchemaHeaderUnionType schemaHeader); + void setTicket(TypedTicket.ToObjectReturnType.GetTicketUnionType ticket); @JsOverlay - default void setSchemaHeader(String schemaHeader) { - setSchemaHeader( - Js.uncheckedCast(schemaHeader)); + default void setTicket(String ticket) { + setTicket(Js.uncheckedCast(ticket)); } @JsOverlay - default void setSchemaHeader(Uint8Array schemaHeader) { - setSchemaHeader( - Js.uncheckedCast(schemaHeader)); + default void setTicket(Uint8Array ticket) { + setTicket(Js.uncheckedCast(ticket)); } @JsProperty - void setSize(String size); + void setType(String type); } @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) public interface ToObjectReturnType0 { @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface GetSchemaHeaderUnionType { + public interface GetTicketUnionType { @JsOverlay - static TableInfo.ToObjectReturnType0.GetSchemaHeaderUnionType of(Object o) { + static TypedTicket.ToObjectReturnType0.GetTicketUnionType of(Object o) { return Js.cast(o); } @@ -166,79 +158,71 @@ default boolean isUint8Array() { } @JsOverlay - static TableInfo.ToObjectReturnType0 create() { + static TypedTicket.ToObjectReturnType0 create() { return Js.uncheckedCast(JsPropertyMap.of()); } @JsProperty - TableInfo.ToObjectReturnType0.GetSchemaHeaderUnionType getSchemaHeader(); - - @JsProperty - String getSize(); - - @JsProperty - boolean isIsStatic(); + TypedTicket.ToObjectReturnType0.GetTicketUnionType getTicket(); @JsProperty - void setIsStatic(boolean isStatic); + String getType(); @JsProperty - void setSchemaHeader(TableInfo.ToObjectReturnType0.GetSchemaHeaderUnionType schemaHeader); + void setTicket(TypedTicket.ToObjectReturnType0.GetTicketUnionType ticket); @JsOverlay - default void setSchemaHeader(String schemaHeader) { - setSchemaHeader( - Js.uncheckedCast(schemaHeader)); + default void setTicket(String ticket) { + setTicket(Js.uncheckedCast(ticket)); } @JsOverlay - default void setSchemaHeader(Uint8Array schemaHeader) { - setSchemaHeader( - Js.uncheckedCast(schemaHeader)); + default void setTicket(Uint8Array ticket) { + setTicket(Js.uncheckedCast(ticket)); } @JsProperty - void setSize(String size); + void setType(String type); } - public static native TableInfo deserializeBinary(Uint8Array bytes); + public static native TypedTicket deserializeBinary(Uint8Array bytes); - public static native TableInfo deserializeBinaryFromReader(TableInfo message, Object reader); + public static native TypedTicket deserializeBinaryFromReader(TypedTicket message, Object reader); - public static native void serializeBinaryToWriter(TableInfo message, Object writer); + public static native void serializeBinaryToWriter(TypedTicket message, Object writer); - public static native TableInfo.ToObjectReturnType toObject( - boolean includeInstance, TableInfo msg); + public static native TypedTicket.ToObjectReturnType toObject( + boolean includeInstance, TypedTicket msg); - public native boolean getIsStatic(); + public native void clearType(); - public native TableInfo.GetSchemaHeaderUnionType getSchemaHeader(); + public native TypedTicket.GetTicketUnionType getTicket(); - public native String getSchemaHeader_asB64(); + public native String getTicket_asB64(); - public native Uint8Array getSchemaHeader_asU8(); + public native Uint8Array getTicket_asU8(); - public native String getSize(); + public native String getType(); - public native Uint8Array serializeBinary(); + public native boolean hasType(); - public native void setIsStatic(boolean value); + public native Uint8Array serializeBinary(); - public native void setSchemaHeader(TableInfo.SetSchemaHeaderValueUnionType value); + public native void setTicket(TypedTicket.SetTicketValueUnionType value); @JsOverlay - public final void setSchemaHeader(String value) { - setSchemaHeader(Js.uncheckedCast(value)); + public final void setTicket(String value) { + setTicket(Js.uncheckedCast(value)); } @JsOverlay - public final void setSchemaHeader(Uint8Array value) { - setSchemaHeader(Js.uncheckedCast(value)); + public final void setTicket(Uint8Array value) { + setTicket(Js.uncheckedCast(value)); } - public native void setSize(String value); + public native void setType(String value); - public native TableInfo.ToObjectReturnType0 toObject(); + public native TypedTicket.ToObjectReturnType0 toObject(); - public native TableInfo.ToObjectReturnType0 toObject(boolean includeInstance); + public native TypedTicket.ToObjectReturnType0 toObject(boolean includeInstance); } From e342fe163e14d08459258f59660df64787438995 Mon Sep 17 00:00:00 2001 From: Devin Smith Date: Fri, 14 Jan 2022 10:08:21 -0800 Subject: [PATCH 37/62] Updated Exporter interface to allow caller to be more explicit about expectations --- .../figure/FigureWidgetTranslator.java | 2 +- .../io/deephaven/plugin/type/ObjectType.java | 26 +++++----- .../server/plugin/object/__init__.py | 28 +++++----- .../server/object/ObjectServiceGrpcImpl.java | 52 ++++++------------- .../server/plugin/python/ExporterAdapter.java | 17 ++---- .../server/object/ObjectServiceTest.java | 10 ++-- 6 files changed, 55 insertions(+), 80 deletions(-) diff --git a/plugin/figure/src/main/java/io/deephaven/figure/FigureWidgetTranslator.java b/plugin/figure/src/main/java/io/deephaven/figure/FigureWidgetTranslator.java index 7ad92cfa361..fe942d9ad15 100644 --- a/plugin/figure/src/main/java/io/deephaven/figure/FigureWidgetTranslator.java +++ b/plugin/figure/src/main/java/io/deephaven/figure/FigureWidgetTranslator.java @@ -108,7 +108,7 @@ private FigureDescriptor translateFigure(FigureWidget f, Exporter exporter) { i++; // noinspection unused - final Reference reference = exporter.newReference(table); + final Reference reference = exporter.reference(table, false, true).orElseThrow(); // relying on FetchObjectResponse.export_id for communicating exported tables to the client } diff --git a/plugin/src/main/java/io/deephaven/plugin/type/ObjectType.java b/plugin/src/main/java/io/deephaven/plugin/type/ObjectType.java index 0f89048ce42..03a5b12d31d 100644 --- a/plugin/src/main/java/io/deephaven/plugin/type/ObjectType.java +++ b/plugin/src/main/java/io/deephaven/plugin/type/ObjectType.java @@ -51,30 +51,30 @@ public interface ObjectType extends Plugin { interface Exporter { /** - * Gets the reference for {@code object} if it has already been created, otherwise creates a new one. Uses - * reference-based equality. + * Gets the reference for {@code object} if it has already been created and {@code forceNew} is {@code false}, + * otherwise creates a new one. If {@code allowUnknownType} is {@code false}, and no type can be found, no + * reference will be created. Uses reference-based equality. * * @param object the object + * @param allowUnknownType if an unknown-typed reference can be created + * @param forceNew if a new reference should be created * @return the reference */ - Reference reference(Object object); + Optional reference(Object object, boolean allowUnknownType, boolean forceNew); /** - * Gets the reference for {@code object} if it has already been created, otherwise creates a new one. + * Gets the reference for {@code object} if it has already been created and {@code forceNew} is {@code false}, + * otherwise creates a new one. If {@code allowUnknownType} is {@code false}, and no type can be found, no + * reference will be created. * * @param object the object + * @param allowUnknownType if an unknown-typed reference can be created + * @param forceNew if a new reference should be created * @param equals the equals logic * @return the reference */ - Reference reference(Object object, BiPredicate equals); - - /** - * Create a new reference. - * - * @param object the object - * @return the reference - */ - Reference newReference(Object object); + Optional reference(Object object, boolean allowUnknownType, boolean forceNew, + BiPredicate equals); /** * A reference. diff --git a/pyintegration/deephaven2/server/plugin/object/__init__.py b/pyintegration/deephaven2/server/plugin/object/__init__.py index 8f6822d33ed..73348ce9c72 100644 --- a/pyintegration/deephaven2/server/plugin/object/__init__.py +++ b/pyintegration/deephaven2/server/plugin/object/__init__.py @@ -1,31 +1,35 @@ import jpy + +from typing import Optional from deephaven.plugin.object import Exporter, ObjectType, Reference +from deephaven.Plot.figure_wrapper import FigureWrapper _JReference = jpy.get_type('io.deephaven.plugin.type.ObjectType$Exporter$Reference') _JExporterAdapter = jpy.get_type('io.deephaven.server.plugin.python.ExporterAdapter') -def adapt_reference(ref: _JReference) -> Reference: +def _adapt_reference(ref: _JReference) -> Reference: return Reference(ref.index(), ref.type().orElse(None), bytes(ref.ticket())) +def _unwrap(object): + # todo: we should have generic unwrapping code ABC + if isinstance(object, FigureWrapper): + return object.figure + return object + + class ExporterAdapter(Exporter): def __init__(self, exporter: _JExporterAdapter): self._exporter = exporter - def reference(self, object) -> Reference: - if isinstance(object, jpy.JType): - ref = self._exporter.reference(object) - else: - ref = self._exporter.referencePyObject(object) - return adapt_reference(ref) - - def new_reference(self, object) -> Reference: + def reference(self, object, allow_unknown_type : bool = False, force_new : bool = False) -> Optional[Reference]: + object = _unwrap(object) if isinstance(object, jpy.JType): - ref = self._exporter.newReference(object) + ref = self._exporter.reference(object, allow_unknown_type, force_new) else: - ref = self._exporter.newReferencePyObject(object) - return adapt_reference(ref) + ref = self._exporter.referencePyObject(object, allow_unknown_type, force_new) + return _adapt_reference(ref) if ref else None def __str__(self): return str(self._exporter) diff --git a/server/src/main/java/io/deephaven/server/object/ObjectServiceGrpcImpl.java b/server/src/main/java/io/deephaven/server/object/ObjectServiceGrpcImpl.java index bbf06ca8375..de129d759a8 100644 --- a/server/src/main/java/io/deephaven/server/object/ObjectServiceGrpcImpl.java +++ b/server/src/main/java/io/deephaven/server/object/ObjectServiceGrpcImpl.java @@ -3,7 +3,6 @@ import com.google.protobuf.ByteString; import com.google.protobuf.ByteStringAccess; import com.google.rpc.Code; -import io.deephaven.engine.table.Table; import io.deephaven.extensions.barrage.util.BarrageProtoUtil.ExposedByteArrayOutputStream; import io.deephaven.extensions.barrage.util.GrpcUtil; import io.deephaven.internal.log.LoggerFactory; @@ -22,7 +21,6 @@ import io.deephaven.server.session.SessionState.ExportObject; import io.deephaven.server.session.TicketRouter; import io.grpc.stub.StreamObserver; -import org.jetbrains.annotations.NotNull; import org.jpy.PyObject; import javax.inject.Inject; @@ -127,54 +125,36 @@ public List refs() { return references; } - public Reference reference(PyObject object) { - if (thread != Thread.currentThread()) { - throw new IllegalStateException("Should only create references on the calling thread"); - } - for (ReferenceImpl reference : references) { - // Need to check pointers for python - if (object.equals(reference.export.get())) { - return reference; - } - } - return newReferenceImpl(object); - } - @Override - public Reference reference(Object object) { - if (object instanceof PyObject) { - throw new IllegalArgumentException("PyObject should be called using equals()-based equality"); - } - return reference(object, ObjectServiceGrpcImpl::referenceEquality); + public Optional reference(Object object, boolean allowUnknownType, boolean forceNew) { + return reference(object, allowUnknownType, forceNew, ObjectServiceGrpcImpl::referenceEquality); } @Override - public Reference reference(Object object, BiPredicate equals) { + public Optional reference(Object object, boolean allowUnknownType, boolean forceNew, + BiPredicate equals) { if (thread != Thread.currentThread()) { throw new IllegalStateException("Should only create references on the calling thread"); } - for (ReferenceImpl reference : references) { - if (equals.test(object, reference.export.get())) { - return reference; + if (!forceNew) { + for (ReferenceImpl reference : references) { + if (equals.test(object, reference.export.get())) { + return Optional.of(reference); + } } } - return newReferenceImpl(object); + return newReferenceImpl(object, allowUnknownType); } - @Override - public Reference newReference(Object object) { - if (thread != Thread.currentThread()) { - throw new IllegalStateException("Should only create new references on the calling thread"); + private Optional newReferenceImpl(Object object, boolean allowUnknownType) { + final String type = typeLookup.type(object).orElse(null); + if (!allowUnknownType && type == null) { + return Optional.empty(); } - return newReferenceImpl(object); - } - - private ReferenceImpl newReferenceImpl(Object object) { final ExportObject exportObject = sessionState.newServerSideExport(object); - final ReferenceImpl ref = - new ReferenceImpl(references.size(), typeLookup.type(object).orElse(null), exportObject); + final ReferenceImpl ref = new ReferenceImpl(references.size(), type, exportObject); references.add(ref); - return ref; + return Optional.of(ref); } } diff --git a/server/src/main/java/io/deephaven/server/plugin/python/ExporterAdapter.java b/server/src/main/java/io/deephaven/server/plugin/python/ExporterAdapter.java index 18bf1e08a1b..7a4e6c61116 100644 --- a/server/src/main/java/io/deephaven/server/plugin/python/ExporterAdapter.java +++ b/server/src/main/java/io/deephaven/server/plugin/python/ExporterAdapter.java @@ -14,21 +14,12 @@ public ExporterAdapter(Exporter exporter) { this.exporter = Objects.requireNonNull(exporter); } - public Reference newReference(Object object) { - return exporter.newReference(object); + public Reference reference(Object object, boolean allowUnknownType, boolean forceNew) { + return exporter.reference(object, allowUnknownType, forceNew).orElse(null); } // TODO(deephaven-core#1775): multivariate jpy (unwrapped) call into java - public Reference newReferencePyObject(PyObject object) { - return exporter.newReference(object); - } - - public Reference reference(Object object) { - return exporter.reference(object); - } - - // TODO(deephaven-core#1775): multivariate jpy (unwrapped) call into java - public Reference referencePyObject(PyObject object) { - return exporter.reference(object, Objects::equals); + public Reference referencePyObject(PyObject object, boolean allowUnknownType, boolean forceNew) { + return exporter.reference(object, allowUnknownType, forceNew, Objects::equals).orElse(null); } } diff --git a/server/src/test/java/io/deephaven/server/object/ObjectServiceTest.java b/server/src/test/java/io/deephaven/server/object/ObjectServiceTest.java index e593bd0f313..f0133e45495 100644 --- a/server/src/test/java/io/deephaven/server/object/ObjectServiceTest.java +++ b/server/src/test/java/io/deephaven/server/object/ObjectServiceTest.java @@ -143,12 +143,12 @@ public MyObjectType() { @Override public void writeToImpl(Exporter exporter, MyObject object, OutputStream out) throws IOException { - final Reference tableRef = exporter.reference(object.someTable); - final Reference objRef = exporter.reference(object.someObj); - final Reference unknownRef = exporter.reference(object.someUnknown); + final Reference tableRef = exporter.reference(object.someTable, false).orElseThrow(); + final Reference objRef = exporter.reference(object.someObj, false).orElseThrow(); + final Reference unknownRef = exporter.reference(object.someUnknown, true).orElseThrow(); - final Reference extraTableRef = exporter.reference(object.someTable); - final Reference extraNewObjRef = exporter.newReference(object.someObj); + final Reference extraTableRef = exporter.reference(object.someTable, false).orElseThrow(); + final Reference extraNewObjRef = exporter.newReference(object.someObj, false).orElseThrow(); final DataOutputStream doas = new DataOutputStream(out); From 5c3beb2ad2dedf265dfe36e02cc992f1e9ee7c8e Mon Sep 17 00:00:00 2001 From: Devin Smith Date: Fri, 14 Jan 2022 10:36:45 -0800 Subject: [PATCH 38/62] Update console js layer --- .../io/deephaven/ide/shared/IdeSession.java | 16 +------------ .../client/api/console/JsVariableChanges.java | 24 +++++++++++-------- .../api/console/JsVariableDefinition.java | 4 +--- 3 files changed, 16 insertions(+), 28 deletions(-) diff --git a/web/client-api/src/main/java/io/deephaven/ide/shared/IdeSession.java b/web/client-api/src/main/java/io/deephaven/ide/shared/IdeSession.java index ac2dcd0b4b8..8eccf179f01 100644 --- a/web/client-api/src/main/java/io/deephaven/ide/shared/IdeSession.java +++ b/web/client-api/src/main/java/io/deephaven/ide/shared/IdeSession.java @@ -220,10 +220,7 @@ public CancellablePromise runCode(String code) { connection.consoleServiceClient().executeCommand(request, connection.metadata(), c::apply); }); runCodePromise.then(response -> { - JsVariableChanges changes = new JsVariableChanges( - copyVariables(response.getCreatedList()), - copyVariables(response.getUpdatedList()), - copyVariables(response.getRemovedList())); + JsVariableChanges changes = JsVariableChanges.from(response.getChanges()); promise.succeed(new JsCommandResult(changes, response.getErrorMessage())); return null; }, err -> { @@ -248,17 +245,6 @@ public CancellablePromise runCode(String code) { return result; } - private JsVariableDefinition[] copyVariables( - JsArray list) { - JsVariableDefinition[] array = new JsVariableDefinition[0]; - list.forEach((item, p1, p2) -> { - // noinspection ConstantConditions - return array[array.length] = - new JsVariableDefinition(item.getType(), item.getTitle(), item.getId().getTicket_asB64(), ""); - }); - return array; - } - public JsRunnable onLogMessage(JsConsumer callback) { return connection.subscribeToLogs(callback); } diff --git a/web/client-api/src/main/java/io/deephaven/web/client/api/console/JsVariableChanges.java b/web/client-api/src/main/java/io/deephaven/web/client/api/console/JsVariableChanges.java index 1fc07bc94cf..5f302bc3d58 100644 --- a/web/client-api/src/main/java/io/deephaven/web/client/api/console/JsVariableChanges.java +++ b/web/client-api/src/main/java/io/deephaven/web/client/api/console/JsVariableChanges.java @@ -2,6 +2,8 @@ import elemental2.core.JsArray; import elemental2.core.JsObject; +import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.application_pb.FieldInfo; +import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.application_pb.FieldsChangeUpdate; import jsinterop.annotations.JsProperty; import jsinterop.base.Js; @@ -13,21 +15,23 @@ public class JsVariableChanges { FIGURE = "Figure", OTHERWIDGET = "OtherWidget", PANDAS = "Pandas"; - private static final String[] WidgetTypeLookup = {OTHERWIDGET, TABLE, TREETABLE, TABLEMAP, FIGURE, PANDAS}; - - public static String getVariableTypeFromFieldCase(int fieldCase) { - if (fieldCase >= 1 && fieldCase <= WidgetTypeLookup.length) { - return WidgetTypeLookup[fieldCase - 1]; - } - - // otherwise, no idea what this is yet - return OTHERWIDGET; - } private final JsVariableDefinition[] created; private final JsVariableDefinition[] updated; private final JsVariableDefinition[] removed; + public static JsVariableChanges from(FieldsChangeUpdate update) { + // Colin: do we need a copyVariables like thing here? + final JsVariableDefinition[] created = update.getCreatedList().map(JsVariableChanges::map); + final JsVariableDefinition[] updated = update.getUpdatedList().map(JsVariableChanges::map); + final JsVariableDefinition[] removed = update.getRemovedList().map(JsVariableChanges::map); + return new JsVariableChanges(created, updated, removed); + } + + private static JsVariableDefinition map(FieldInfo p0, int p1, FieldInfo[] p2) { + return new JsVariableDefinition(p0); + } + public JsVariableChanges(JsVariableDefinition[] created, JsVariableDefinition[] updated, JsVariableDefinition[] removed) { this.created = JsObject.freeze(created); diff --git a/web/client-api/src/main/java/io/deephaven/web/client/api/console/JsVariableDefinition.java b/web/client-api/src/main/java/io/deephaven/web/client/api/console/JsVariableDefinition.java index f9ec40326e4..0b7b9cb3ffb 100644 --- a/web/client-api/src/main/java/io/deephaven/web/client/api/console/JsVariableDefinition.java +++ b/web/client-api/src/main/java/io/deephaven/web/client/api/console/JsVariableDefinition.java @@ -2,8 +2,6 @@ import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.application_pb.FieldInfo; import jsinterop.annotations.JsProperty; -import jsinterop.base.Js; -import jsinterop.base.JsPropertyMap; public class JsVariableDefinition { private static final String JS_UNAVAILABLE = "js-constructed-not-available"; @@ -25,7 +23,7 @@ public JsVariableDefinition(String type, String title, String id, String descrip } public JsVariableDefinition(FieldInfo field) { - this.type = JsVariableChanges.getVariableTypeFromFieldCase(field.getFieldType().getFieldCase()); + this.type = field.getTicket().getType(); this.id = field.getTicket().getTicket_asB64(); this.title = field.getFieldName(); this.description = field.getFieldDescription(); From 75763573d1c505cc2424610296999966aa563561 Mon Sep 17 00:00:00 2001 From: Devin Smith Date: Fri, 14 Jan 2022 14:59:15 -0800 Subject: [PATCH 39/62] fix test --- .../io/deephaven/server/object/ObjectServiceTest.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/server/src/test/java/io/deephaven/server/object/ObjectServiceTest.java b/server/src/test/java/io/deephaven/server/object/ObjectServiceTest.java index f0133e45495..eed16f05f94 100644 --- a/server/src/test/java/io/deephaven/server/object/ObjectServiceTest.java +++ b/server/src/test/java/io/deephaven/server/object/ObjectServiceTest.java @@ -143,12 +143,12 @@ public MyObjectType() { @Override public void writeToImpl(Exporter exporter, MyObject object, OutputStream out) throws IOException { - final Reference tableRef = exporter.reference(object.someTable, false).orElseThrow(); - final Reference objRef = exporter.reference(object.someObj, false).orElseThrow(); - final Reference unknownRef = exporter.reference(object.someUnknown, true).orElseThrow(); + final Reference tableRef = exporter.reference(object.someTable, false, false).orElseThrow(); + final Reference objRef = exporter.reference(object.someObj, false, false).orElseThrow(); + final Reference unknownRef = exporter.reference(object.someUnknown, true, false).orElseThrow(); - final Reference extraTableRef = exporter.reference(object.someTable, false).orElseThrow(); - final Reference extraNewObjRef = exporter.newReference(object.someObj, false).orElseThrow(); + final Reference extraTableRef = exporter.reference(object.someTable, false, false).orElseThrow(); + final Reference extraNewObjRef = exporter.reference(object.someObj, false, true).orElseThrow(); final DataOutputStream doas = new DataOutputStream(out); From 8f4e8e3fd2e6e34e922e4641978f71d451e8710d Mon Sep 17 00:00:00 2001 From: Devin Smith Date: Fri, 14 Jan 2022 15:00:02 -0800 Subject: [PATCH 40/62] TypedTicket has Ticket --- .../src/main/java/io/deephaven/client/impl/SessionImpl.java | 2 +- .../src/main/proto/deephaven/proto/ticket.proto | 4 ++-- .../server/appmode/ApplicationServiceGrpcImpl.java | 2 +- .../io/deephaven/server/console/ConsoleServiceGrpcImpl.java | 6 +----- .../io/deephaven/server/object/ObjectServiceGrpcImpl.java | 5 +---- 5 files changed, 6 insertions(+), 13 deletions(-) diff --git a/java-client/session/src/main/java/io/deephaven/client/impl/SessionImpl.java b/java-client/session/src/main/java/io/deephaven/client/impl/SessionImpl.java index dc3909c97ab..066de8a814e 100644 --- a/java-client/session/src/main/java/io/deephaven/client/impl/SessionImpl.java +++ b/java-client/session/src/main/java/io/deephaven/client/impl/SessionImpl.java @@ -443,7 +443,7 @@ private static ExportId toExportId(TypedTicket e) { } else { type = e.getType(); } - final int exportId = ExportTicketHelper.ticketToExportId(e.getTicket().asReadOnlyByteBuffer(), "exportId"); + final int exportId = ExportTicketHelper.ticketToExportId(e.getTicket(), "exportId"); return new ExportId(type, exportId); } diff --git a/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/ticket.proto b/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/ticket.proto index 6654edae40b..3617a0147b7 100644 --- a/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/ticket.proto +++ b/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/ticket.proto @@ -26,10 +26,10 @@ message Ticket { } message TypedTicket { - bytes ticket = 1; + Ticket ticket = 1; /* * The type. Its absence means that it is not known, not that the server chose to not set it. */ optional string type = 2; -} \ No newline at end of file +} diff --git a/server/src/main/java/io/deephaven/server/appmode/ApplicationServiceGrpcImpl.java b/server/src/main/java/io/deephaven/server/appmode/ApplicationServiceGrpcImpl.java index 1cce5ee98eb..015a1c4206c 100644 --- a/server/src/main/java/io/deephaven/server/appmode/ApplicationServiceGrpcImpl.java +++ b/server/src/main/java/io/deephaven/server/appmode/ApplicationServiceGrpcImpl.java @@ -259,7 +259,7 @@ private FieldInfo getFieldInfo(final AppFieldId id, final Field field) { } private TypedTicket typedTicket(AppFieldId id, Field field) { - final Builder ticket = TypedTicket.newBuilder().setTicket(id.getTicket().getTicket()); + final Builder ticket = TypedTicket.newBuilder().setTicket(id.getTicket()); typeLookup.type(field.value()).ifPresent(ticket::setType); return ticket.build(); } diff --git a/server/src/main/java/io/deephaven/server/console/ConsoleServiceGrpcImpl.java b/server/src/main/java/io/deephaven/server/console/ConsoleServiceGrpcImpl.java index 5db298d5b65..a055ca0a130 100644 --- a/server/src/main/java/io/deephaven/server/console/ConsoleServiceGrpcImpl.java +++ b/server/src/main/java/io/deephaven/server/console/ConsoleServiceGrpcImpl.java @@ -4,7 +4,6 @@ package io.deephaven.server.console; -import com.google.protobuf.ByteStringAccess; import com.google.rpc.Code; import io.deephaven.configuration.Configuration; import io.deephaven.engine.table.Table; @@ -15,7 +14,6 @@ import io.deephaven.engine.util.VariableProvider; import io.deephaven.engine.util.jpy.JpyInit; import io.deephaven.extensions.barrage.util.GrpcUtil; -import io.deephaven.figure.FigureWidgetTranslator; import io.deephaven.internal.log.LoggerFactory; import io.deephaven.io.logger.LogBuffer; import io.deephaven.io.logger.LogBufferRecord; @@ -27,7 +25,6 @@ import io.deephaven.lang.parse.LspTools; import io.deephaven.lang.parse.ParsedDocument; import io.deephaven.lang.shared.lsp.CompletionCancelled; -import io.deephaven.plot.FigureWidget; import io.deephaven.proto.backplane.grpc.FieldInfo; import io.deephaven.proto.backplane.grpc.FieldsChangeUpdate; import io.deephaven.proto.backplane.grpc.Ticket; @@ -54,7 +51,6 @@ import io.deephaven.proto.backplane.script.grpc.StartConsoleResponse; import io.deephaven.proto.backplane.script.grpc.TextDocumentItem; import io.deephaven.proto.backplane.script.grpc.VersionedTextDocumentIdentifier; -import io.deephaven.proto.util.ScopeTicketHelper; import io.deephaven.server.session.SessionCloseableObserver; import io.deephaven.server.session.SessionService; import io.deephaven.server.session.SessionState; @@ -239,7 +235,7 @@ private static FieldInfo makeVariableDefinition(Map.Entry entry) private static FieldInfo makeVariableDefinition(String title, String type) { final TypedTicket id = TypedTicket.newBuilder() .setType(type) - .setTicket(ByteStringAccess.wrap(ScopeTicketHelper.nameToBytes(title))) + .setTicket(ScopeTicketResolver.ticketForName(title)) .build(); return FieldInfo.newBuilder() .setApplicationId("") diff --git a/server/src/main/java/io/deephaven/server/object/ObjectServiceGrpcImpl.java b/server/src/main/java/io/deephaven/server/object/ObjectServiceGrpcImpl.java index de129d759a8..746257b08f6 100644 --- a/server/src/main/java/io/deephaven/server/object/ObjectServiceGrpcImpl.java +++ b/server/src/main/java/io/deephaven/server/object/ObjectServiceGrpcImpl.java @@ -1,6 +1,5 @@ package io.deephaven.server.object; -import com.google.protobuf.ByteString; import com.google.protobuf.ByteStringAccess; import com.google.rpc.Code; import io.deephaven.extensions.barrage.util.BarrageProtoUtil.ExposedByteArrayOutputStream; @@ -21,7 +20,6 @@ import io.deephaven.server.session.SessionState.ExportObject; import io.deephaven.server.session.TicketRouter; import io.grpc.stub.StreamObserver; -import org.jpy.PyObject; import javax.inject.Inject; import java.io.IOException; @@ -170,8 +168,7 @@ public ReferenceImpl(int index, String type, ExportObject export) { } public TypedTicket typedTicket() { - final ByteString ticket = ByteStringAccess.wrap(export.getExportIdBytes()); - final TypedTicket.Builder builder = TypedTicket.newBuilder().setTicket(ticket); + final TypedTicket.Builder builder = TypedTicket.newBuilder().setTicket(export.getExportId()); if (type != null) { builder.setType(type); } From 9032e661eb5696fa28cf326830de9185761d105b Mon Sep 17 00:00:00 2001 From: Devin Smith Date: Fri, 14 Jan 2022 15:03:05 -0800 Subject: [PATCH 41/62] Use empty string instead of optional --- .../src/main/java/io/deephaven/client/impl/FieldInfo.java | 2 +- .../src/main/java/io/deephaven/client/impl/SessionImpl.java | 2 +- .../src/main/proto/deephaven/proto/ticket.proto | 4 ++-- .../java/io/deephaven/server/object/ObjectServiceTest.java | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/java-client/session/src/main/java/io/deephaven/client/impl/FieldInfo.java b/java-client/session/src/main/java/io/deephaven/client/impl/FieldInfo.java index 50ae9d983ce..9c869df4455 100644 --- a/java-client/session/src/main/java/io/deephaven/client/impl/FieldInfo.java +++ b/java-client/session/src/main/java/io/deephaven/client/impl/FieldInfo.java @@ -12,7 +12,7 @@ public final class FieldInfo { } public Optional type() { - if (!fieldInfo.getTicket().hasType()) { + if (fieldInfo.getTicket().getType().isEmpty()) { return Optional.empty(); } return Optional.of(fieldInfo.getTicket().getType()); diff --git a/java-client/session/src/main/java/io/deephaven/client/impl/SessionImpl.java b/java-client/session/src/main/java/io/deephaven/client/impl/SessionImpl.java index 066de8a814e..b97c5113bed 100644 --- a/java-client/session/src/main/java/io/deephaven/client/impl/SessionImpl.java +++ b/java-client/session/src/main/java/io/deephaven/client/impl/SessionImpl.java @@ -438,7 +438,7 @@ public void onNext(FetchObjectResponse value) { private static ExportId toExportId(TypedTicket e) { final String type; - if (!e.hasType()) { + if (e.getType().isEmpty()) { type = null; } else { type = e.getType(); diff --git a/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/ticket.proto b/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/ticket.proto index 3617a0147b7..febfc6f8c71 100644 --- a/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/ticket.proto +++ b/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/ticket.proto @@ -29,7 +29,7 @@ message TypedTicket { Ticket ticket = 1; /* - * The type. Its absence means that it is not known, not that the server chose to not set it. + * The type. An empty string means that it is not known, not that the server chose to not set it. */ - optional string type = 2; + string type = 2; } diff --git a/server/src/test/java/io/deephaven/server/object/ObjectServiceTest.java b/server/src/test/java/io/deephaven/server/object/ObjectServiceTest.java index eed16f05f94..c6307f04d3c 100644 --- a/server/src/test/java/io/deephaven/server/object/ObjectServiceTest.java +++ b/server/src/test/java/io/deephaven/server/object/ObjectServiceTest.java @@ -68,7 +68,7 @@ private void fetchMyObject(Ticket ticket, String expectedSomeString, int expecte assertThat(response.getExportIdCount()).isEqualTo(4); assertThat(response.getExportId(0).getType()).isEqualTo("Table"); assertThat(response.getExportId(1).getType()).isEqualTo(MyObjectRegistration.MY_REF_OBJECT_TYPE_NAME); - assertThat(response.getExportId(2).hasType()).isFalse(); + assertThat(response.getExportId(2).getType()).isEmpty(); assertThat(response.getExportId(3).getType()).isEqualTo(MyObjectRegistration.MY_REF_OBJECT_TYPE_NAME); final DataInputStream dis = new DataInputStream(response.getData().newInput()); From 366151c44329be02d8586695b5d50a16835eb996 Mon Sep 17 00:00:00 2001 From: Colin Alworth Date: Tue, 18 Jan 2022 09:11:47 -0600 Subject: [PATCH 42/62] Fix js vars, and plumb object service for figures doesn't work yet for server-side figures --- proto/raw-js-openapi/src/index.js | 4 ++ .../web/client/api/WorkerConnection.java | 13 +++- .../client/api/console/JsVariableChanges.java | 10 +-- .../web/client/api/widget/plot/JsFigure.java | 70 ++++++++++++------- .../api/widget/plot/JsFigureFactory.java | 10 +-- 5 files changed, 67 insertions(+), 40 deletions(-) diff --git a/proto/raw-js-openapi/src/index.js b/proto/raw-js-openapi/src/index.js index af785cab82e..0925a26476e 100644 --- a/proto/raw-js-openapi/src/index.js +++ b/proto/raw-js-openapi/src/index.js @@ -4,6 +4,7 @@ require("deephaven/proto/console_pb"); require("deephaven/proto/ticket_pb"); require("deephaven/proto/application_pb"); require("deephaven/proto/inputtable_pb"); +require("deephaven/proto/object_pb"); require("Flight_pb") require("BrowserFlight_pb") var sessionService = require("deephaven/proto/session_pb_service"); @@ -11,6 +12,7 @@ var tableService = require("deephaven/proto/table_pb_service"); var consoleService = require("deephaven/proto/console_pb_service"); var applicationService = require("deephaven/proto/application_pb_service"); var inputTableService = require("deephaven/proto/inputtable_pb_service"); +var objectService = require("deephaven/proto/object_pb_service"); var browserFlightService = require("BrowserFlight_pb_service"); var flightService = require("Flight_pb_service"); @@ -37,6 +39,8 @@ var io = { deephaven: { application_pb_service: applicationService, inputtable_pb: proto.io.deephaven.proto.backplane.grpc, inputtable_pb_service: inputTableService, + object_pb: proto.io.deephaven.proto.backplane.grpc, + object_pb_service: objectService, }, barrage: { "flatbuf": { diff --git a/web/client-api/src/main/java/io/deephaven/web/client/api/WorkerConnection.java b/web/client-api/src/main/java/io/deephaven/web/client/api/WorkerConnection.java index da286dc9931..72fa003aece 100644 --- a/web/client-api/src/main/java/io/deephaven/web/client/api/WorkerConnection.java +++ b/web/client-api/src/main/java/io/deephaven/web/client/api/WorkerConnection.java @@ -33,11 +33,12 @@ import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.application_pb.FieldsChangeUpdate; import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.application_pb.ListFieldsRequest; import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.application_pb_service.ApplicationServiceClient; -import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.console_pb.FetchFigureRequest; import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.console_pb.LogSubscriptionData; import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.console_pb.LogSubscriptionRequest; import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.console_pb_service.ConsoleServiceClient; import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.inputtable_pb_service.InputTableServiceClient; +import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.object_pb.FetchObjectRequest; +import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.object_pb_service.ObjectServiceClient; import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.session_pb.HandshakeRequest; import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.session_pb.HandshakeResponse; import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.session_pb.ReleaseRequest; @@ -171,6 +172,7 @@ private enum State { private FlightServiceClient flightServiceClient; private BrowserFlightServiceClient browserFlightServiceClient; private InputTableServiceClient inputTableServiceClient; + private ObjectServiceClient objectServiceClient; private final StateCache cache = new StateCache(); private final JsWeakMap batchers = new JsWeakMap<>(); @@ -213,6 +215,7 @@ public WorkerConnection(QueryConnectable info, Supplier new BrowserFlightServiceClient(info.getServerUrl(), JsPropertyMap.of("debug", debugGrpc)); inputTableServiceClient = new InputTableServiceClient(info.getServerUrl(), JsPropertyMap.of("debug", debugGrpc)); + objectServiceClient = new ObjectServiceClient(info.getServerUrl(), JsPropertyMap.of("debug", debugGrpc)); // builder.setConnectionErrorHandler(msg -> info.failureHandled(String.valueOf(msg))); @@ -818,9 +821,9 @@ public Promise getTreeTable(JsVariableDefinition varDef) { public Promise getFigure(JsVariableDefinition varDef) { return whenServerReady("get a figure") .then(server -> new JsFigure(this, c -> { - FetchFigureRequest request = new FetchFigureRequest(); + FetchObjectRequest request = new FetchObjectRequest(); request.setSourceId(TableTicket.createTicket(varDef)); - consoleServiceClient().fetchFigure(request, metadata(), c::apply); + objectServiceClient().fetchObject(request, metadata(), c::apply); }).refetch()); } @@ -853,6 +856,10 @@ public InputTableServiceClient inputTableServiceClient() { return inputTableServiceClient; } + public ObjectServiceClient objectServiceClient() { + return objectServiceClient; + } + public BrowserHeaders metadata() { return metadata; } diff --git a/web/client-api/src/main/java/io/deephaven/web/client/api/console/JsVariableChanges.java b/web/client-api/src/main/java/io/deephaven/web/client/api/console/JsVariableChanges.java index 5f302bc3d58..e40213941cd 100644 --- a/web/client-api/src/main/java/io/deephaven/web/client/api/console/JsVariableChanges.java +++ b/web/client-api/src/main/java/io/deephaven/web/client/api/console/JsVariableChanges.java @@ -7,6 +7,8 @@ import jsinterop.annotations.JsProperty; import jsinterop.base.Js; +import java.util.Arrays; + public class JsVariableChanges { @JsProperty(namespace = "dh.VariableType") public static final String TABLE = "Table", @@ -22,13 +24,13 @@ public class JsVariableChanges { public static JsVariableChanges from(FieldsChangeUpdate update) { // Colin: do we need a copyVariables like thing here? - final JsVariableDefinition[] created = update.getCreatedList().map(JsVariableChanges::map); - final JsVariableDefinition[] updated = update.getUpdatedList().map(JsVariableChanges::map); - final JsVariableDefinition[] removed = update.getRemovedList().map(JsVariableChanges::map); + final JsVariableDefinition[] created = update.getCreatedList().asList().stream().map(JsVariableChanges::map).toArray(JsVariableDefinition[]::new); + final JsVariableDefinition[] updated = update.getUpdatedList().asList().stream().map(JsVariableChanges::map).toArray(JsVariableDefinition[]::new); + final JsVariableDefinition[] removed = update.getRemovedList().asList().stream().map(JsVariableChanges::map).toArray(JsVariableDefinition[]::new); return new JsVariableChanges(created, updated, removed); } - private static JsVariableDefinition map(FieldInfo p0, int p1, FieldInfo[] p2) { + private static JsVariableDefinition map(FieldInfo p0) { return new JsVariableDefinition(p0); } diff --git a/web/client-api/src/main/java/io/deephaven/web/client/api/widget/plot/JsFigure.java b/web/client-api/src/main/java/io/deephaven/web/client/api/widget/plot/JsFigure.java index 5f37e3e7d3b..66efca293c5 100644 --- a/web/client-api/src/main/java/io/deephaven/web/client/api/widget/plot/JsFigure.java +++ b/web/client-api/src/main/java/io/deephaven/web/client/api/widget/plot/JsFigure.java @@ -4,17 +4,19 @@ import elemental2.core.JsObject; import elemental2.dom.CustomEventInit; import elemental2.promise.Promise; -import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.console_pb.FetchFigureResponse; import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.console_pb.FigureDescriptor; import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.console_pb.figuredescriptor.AxisDescriptor; +import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.object_pb.FetchObjectResponse; +import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.ticket_pb.Ticket; import io.deephaven.web.client.api.Callbacks; import io.deephaven.web.client.api.HasEventHandling; import io.deephaven.web.client.api.JsTable; import io.deephaven.web.client.api.TableMap; +import io.deephaven.web.client.api.TableTicket; import io.deephaven.web.client.api.WorkerConnection; import io.deephaven.web.client.fu.JsLog; +import io.deephaven.web.client.fu.JsPromise; import io.deephaven.web.client.fu.LazyPromise; -import io.deephaven.web.client.state.ClientTableState; import io.deephaven.web.shared.fu.JsBiConsumer; import jsinterop.annotations.JsIgnore; import jsinterop.annotations.JsOptional; @@ -45,11 +47,11 @@ private static native Throwable ofObject(Object obj) /*-{ EVENT_DOWNSAMPLENEEDED = "downsampleneeded"; public interface FigureFetch { - void fetch(JsBiConsumer callback); + void fetch(JsBiConsumer callback); } public interface FigureTableFetch { - Promise fetch(JsFigure figure, FigureDescriptor descriptor); + Promise fetch(JsFigure figure, FetchObjectResponse descriptor); } public interface FigureClose { @@ -124,13 +126,13 @@ public Promise refetch() { plotHandlesToTables = new HashMap<>(); return Callbacks.grpcUnaryPromise(fetch::fetch).then(response -> { - this.descriptor = response.getFigureDescriptor(); + this.descriptor = FigureDescriptor.deserializeBinary(response.getData_asU8()); charts = descriptor.getChartsList().asList().stream() .map(chartDescriptor -> new JsChart(chartDescriptor, this)).toArray(JsChart[]::new); JsObject.freeze(charts); - return this.tableFetch.fetch(this, descriptor); + return this.tableFetch.fetch(this, response); }).then(tableFetchData -> { // all tables are wired up, need to map them to the series instances tables = tableFetchData.tables; @@ -138,7 +140,7 @@ public Promise refetch() { plotHandlesToTableMaps = tableFetchData.plotHandlesToTableMaps; onClose = tableFetchData.onClose; - for (int i = 0; i < descriptor.getTablesList().length; i++) { + for (int i = 0; i < tables.length; i++) { JsTable table = tables[i]; registerTableWithId(table, Js.cast(JsArray.of((double) i))); } @@ -626,12 +628,37 @@ private static class DefaultFigureTableFetch implements FigureTableFetch { } @Override - public Promise fetch(JsFigure figure, FigureDescriptor descriptor) { - JsTable[] tables; + public Promise fetch(JsFigure figure, FetchObjectResponse response) { + int count = response.getExportIdList().length; + JsTable[] tables = new JsTable[count]; + TableMap[] tableMaps = new TableMap[count]; + + Promise[] promises = new Promise[count]; + + response.getExportIdList().forEach((p0, p1, p2) -> { + if (!p0.getType().equals("Table")) { + // TODO (deephaven-core#62) implement fetch for tablemaps + assert false : p0.getType() + " found in figure, not yet supported"; + return null; + } + + promises[p1] = connection.newState((c, newState, metadata) -> { + Ticket workaround = new TableTicket(p0.getTicket().asUint8Array()).makeTicket(); + connection.tableServiceClient().getExportedTableCreationResponse(workaround, metadata, c::apply); + }, "table for figure") + .refetch(null, connection.metadata()) + .then(cts -> { + JsTable table = new JsTable(connection, cts); + // never attempt a reconnect, since we might have a different figure schema entirely + table.addEventListener(JsTable.EVENT_DISCONNECT, ignore -> table.close()); + tables[p1] = table; + return Promise.resolve(table); + }); + return null; + }); // TODO (deephaven-core#62) implement fetch for tablemaps // // iterate through the tablemaps we're supposed to have, fetch keys for them, and construct them - TableMap[] tableMaps = new TableMap[0];// new TableMap[descriptor.getTableMapIdsList().length]; // Promise[] tableMapPromises = new Promise[descriptor.getTablemapsList().length]; Map plotHandlesToTableMaps = new HashMap<>(); // for (int i = 0; i < descriptor.getTablemapsList().length; i++) { @@ -659,23 +686,14 @@ public Promise fetch(JsFigure figure, FigureDescriptor descriptor) { // }); // } - // iterate through the table handles we're supposed to have and prep TableHandles for them - tables = new JsTable[descriptor.getTablesList().length]; - - for (int i = 0; i < descriptor.getTablesList().length; i++) { - ClientTableState clientTableState = connection - .newStateFromUnsolicitedTable(descriptor.getTablesList().getAt(i), "table " + i + " for plot"); - JsTable table = new JsTable(connection, clientTableState); - // never attempt a reconnect, since we might have a different figure schema entirely - table.addEventListener(JsTable.EVENT_DISCONNECT, ignore -> table.close()); - tables[i] = table; - } - - connection.registerFigure(figure); + return JsPromise.all(promises) + .then(ignore -> { + connection.registerFigure(figure); - return Promise.resolve( - new FigureTableFetchData(tables, tableMaps, plotHandlesToTableMaps, - f -> this.connection.releaseFigure(f))); + return Promise.resolve( + new FigureTableFetchData(tables, tableMaps, plotHandlesToTableMaps, + f -> this.connection.releaseFigure(f))); + }); } } } diff --git a/web/client-api/src/main/java/io/deephaven/web/client/api/widget/plot/JsFigureFactory.java b/web/client-api/src/main/java/io/deephaven/web/client/api/widget/plot/JsFigureFactory.java index 698a1a43842..6a860ada361 100644 --- a/web/client-api/src/main/java/io/deephaven/web/client/api/widget/plot/JsFigureFactory.java +++ b/web/client-api/src/main/java/io/deephaven/web/client/api/widget/plot/JsFigureFactory.java @@ -3,9 +3,9 @@ import elemental2.core.JsArray; import elemental2.dom.CustomEventInit; import elemental2.promise.Promise; -import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.console_pb.FetchFigureResponse; import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.console_pb.FigureDescriptor; import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.console_pb.figuredescriptor.*; +import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.object_pb.FetchObjectResponse; import io.deephaven.web.client.api.JsTable; import io.deephaven.web.client.api.TableMap; import io.deephaven.web.client.fu.JsPromise; @@ -38,8 +38,8 @@ private static Promise create(JsFigureDescriptor descriptor) { } FigureDescriptor figureDescriptor = convertJsFigureDescriptor(descriptor); - FetchFigureResponse response = new FetchFigureResponse(); - response.setFigureDescriptor(figureDescriptor); + FetchObjectResponse response = new FetchObjectResponse(); + response.setData(figureDescriptor.serializeBinary()); return JsPromise.all(tables.map((table, index, all) -> table.copy(false))) .then(tableCopies -> new JsFigure( c -> c.apply(null, response), @@ -109,10 +109,6 @@ private static FigureDescriptor convertJsFigureDescriptor(JsFigureDescriptor jsD descriptor.setRows(jsDescriptor.rows); JsArray tables = jsDescriptor.getTables(); - // The only thing used by the Figure with the tableIds (outside of the default fetchTables function) is the - // length of these tableIds. - descriptor.setTablesList(new JsArray<>()); - descriptor.getTablesList().length = tables.length; JsArray charts = jsDescriptor.charts; ChartDescriptor[] chartDescriptors = new ChartDescriptor[charts.length]; From 7bbf573180934d789911304d3746604092247e81 Mon Sep 17 00:00:00 2001 From: Colin Alworth Date: Tue, 18 Jan 2022 12:38:37 -0600 Subject: [PATCH 43/62] CHERRY-PICK always set an errorId --- .../io/deephaven/server/session/SessionState.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/server/src/main/java/io/deephaven/server/session/SessionState.java b/server/src/main/java/io/deephaven/server/session/SessionState.java index 2b016d4a4f4..445e208f277 100644 --- a/server/src/main/java/io/deephaven/server/session/SessionState.java +++ b/server/src/main/java/io/deephaven/server/session/SessionState.java @@ -737,6 +737,10 @@ private synchronized void setState(final ExportNotification.State state) { } if (isExportStateFailure(state) && errorHandler != null) { + Assert.neqNull(errorId, "errorId"); + if (errorId == null) { + assignErrorId(); + } safelyExecute(() -> errorHandler.onError(state, errorId, dependentHandle)); } @@ -789,7 +793,7 @@ private void onResolveOne(@Nullable final ExportObject parent) { break; } - errorId = UuidCreator.toString(UuidCreator.getRandomBased()); + assignErrorId(); dependentHandle = parent.logIdentity; log.error().append("Internal Error '").append(errorId).append("' ").append(errorDetails).endl(); } @@ -857,7 +861,7 @@ private void doExport() { exception = err; synchronized (this) { if (!isExportStateTerminal(state)) { - errorId = UuidCreator.toString(UuidCreator.getRandomBased()); + assignErrorId(); log.error().append("Internal Error '").append(errorId).append("' ").append(err).endl(); setState(ExportNotification.State.FAILED); } @@ -898,6 +902,10 @@ private void doExport() { } } + private void assignErrorId() { + errorId = UuidCreator.toString(UuidCreator.getRandomBased()); + } + /** * Sets the final result for this export. * From 30e92c2f94d56c2c477320b72403c4c43006d248 Mon Sep 17 00:00:00 2001 From: Colin Alworth Date: Tue, 18 Jan 2022 12:39:05 -0600 Subject: [PATCH 44/62] Figure shouldn't try to re-export, clean up console vars --- .../client/api/console/JsVariableChanges.java | 17 +++++------ .../web/client/api/widget/plot/JsFigure.java | 28 +++++++++++-------- 2 files changed, 26 insertions(+), 19 deletions(-) diff --git a/web/client-api/src/main/java/io/deephaven/web/client/api/console/JsVariableChanges.java b/web/client-api/src/main/java/io/deephaven/web/client/api/console/JsVariableChanges.java index e40213941cd..547d6e83f10 100644 --- a/web/client-api/src/main/java/io/deephaven/web/client/api/console/JsVariableChanges.java +++ b/web/client-api/src/main/java/io/deephaven/web/client/api/console/JsVariableChanges.java @@ -7,8 +7,6 @@ import jsinterop.annotations.JsProperty; import jsinterop.base.Js; -import java.util.Arrays; - public class JsVariableChanges { @JsProperty(namespace = "dh.VariableType") public static final String TABLE = "Table", @@ -23,15 +21,18 @@ public class JsVariableChanges { private final JsVariableDefinition[] removed; public static JsVariableChanges from(FieldsChangeUpdate update) { - // Colin: do we need a copyVariables like thing here? - final JsVariableDefinition[] created = update.getCreatedList().asList().stream().map(JsVariableChanges::map).toArray(JsVariableDefinition[]::new); - final JsVariableDefinition[] updated = update.getUpdatedList().asList().stream().map(JsVariableChanges::map).toArray(JsVariableDefinition[]::new); - final JsVariableDefinition[] removed = update.getRemovedList().asList().stream().map(JsVariableChanges::map).toArray(JsVariableDefinition[]::new); + final JsVariableDefinition[] created = toVariableDefinitions(update.getCreatedList()); + final JsVariableDefinition[] updated = toVariableDefinitions(update.getUpdatedList()); + final JsVariableDefinition[] removed = toVariableDefinitions(update.getRemovedList()); return new JsVariableChanges(created, updated, removed); } - private static JsVariableDefinition map(FieldInfo p0) { - return new JsVariableDefinition(p0); + private static JsVariableDefinition[] toVariableDefinitions(JsArray createdList) { + final JsVariableDefinition[] definitions = new JsVariableDefinition[createdList.length]; + for (int i = 0; i < createdList.length; i++) { + definitions[i] = new JsVariableDefinition(createdList.getAt(i)); + } + return definitions; } public JsVariableChanges(JsVariableDefinition[] created, JsVariableDefinition[] updated, diff --git a/web/client-api/src/main/java/io/deephaven/web/client/api/widget/plot/JsFigure.java b/web/client-api/src/main/java/io/deephaven/web/client/api/widget/plot/JsFigure.java index 66efca293c5..440c032f812 100644 --- a/web/client-api/src/main/java/io/deephaven/web/client/api/widget/plot/JsFigure.java +++ b/web/client-api/src/main/java/io/deephaven/web/client/api/widget/plot/JsFigure.java @@ -7,6 +7,8 @@ import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.console_pb.FigureDescriptor; import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.console_pb.figuredescriptor.AxisDescriptor; import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.object_pb.FetchObjectResponse; +import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.table_pb.ExportedTableCreationResponse; +import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.table_pb_service.TableServiceClient; import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.ticket_pb.Ticket; import io.deephaven.web.client.api.Callbacks; import io.deephaven.web.client.api.HasEventHandling; @@ -17,6 +19,7 @@ import io.deephaven.web.client.fu.JsLog; import io.deephaven.web.client.fu.JsPromise; import io.deephaven.web.client.fu.LazyPromise; +import io.deephaven.web.client.state.ClientTableState; import io.deephaven.web.shared.fu.JsBiConsumer; import jsinterop.annotations.JsIgnore; import jsinterop.annotations.JsOptional; @@ -642,18 +645,21 @@ public Promise fetch(JsFigure figure, FetchObjectResponse response) { return null; } - promises[p1] = connection.newState((c, newState, metadata) -> { + + // Note that creating a CTS like this means we can't actually refetch it, but that's okay, we can't + // reconnect in this way without refetching the entire figure anyway. + promises[p1] = Callbacks.grpcUnaryPromise(c -> { Ticket workaround = new TableTicket(p0.getTicket().asUint8Array()).makeTicket(); - connection.tableServiceClient().getExportedTableCreationResponse(workaround, metadata, c::apply); - }, "table for figure") - .refetch(null, connection.metadata()) - .then(cts -> { - JsTable table = new JsTable(connection, cts); - // never attempt a reconnect, since we might have a different figure schema entirely - table.addEventListener(JsTable.EVENT_DISCONNECT, ignore -> table.close()); - tables[p1] = table; - return Promise.resolve(table); - }); + connection.tableServiceClient().getExportedTableCreationResponse(workaround, connection.metadata(), + c::apply); + }).then(etcr -> { + ClientTableState cts = connection.newStateFromUnsolicitedTable(etcr, "table for figure"); + JsTable table = new JsTable(connection, cts); + // never attempt a reconnect, since we might have a different figure schema entirely + table.addEventListener(JsTable.EVENT_DISCONNECT, ignore -> table.close()); + tables[p1] = table; + return Promise.resolve(table); + }); return null; }); From 01c93e36dc65395e24c077d0d5b716f72cebda0f Mon Sep 17 00:00:00 2001 From: Colin Alworth Date: Tue, 18 Jan 2022 12:40:50 -0600 Subject: [PATCH 45/62] Verify CTS gets a sane handle --- .../java/io/deephaven/web/client/state/ClientTableState.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/web/client-api/src/main/java/io/deephaven/web/client/state/ClientTableState.java b/web/client-api/src/main/java/io/deephaven/web/client/state/ClientTableState.java index c0f4cfc727c..373cd87dbd5 100644 --- a/web/client-api/src/main/java/io/deephaven/web/client/state/ClientTableState.java +++ b/web/client-api/src/main/java/io/deephaven/web/client/state/ClientTableState.java @@ -1024,6 +1024,8 @@ public Promise refetch(HasEventHandling failHandler, BrowserHe } public void applyTableCreationResponse(ExportedTableCreationResponse def) { + assert def.getResultId().getTicket().getTicket_asB64().equals(getHandle().makeTicket().getTicket_asB64()) + : "Ticket is incompatible with the table details"; // by definition, the ticket is now exported and connected handle.setState(TableTicket.State.EXPORTED); handle.setConnected(true); From 1dd9a59bee59637933739ec66355d7aaf30a418d Mon Sep 17 00:00:00 2001 From: Devin Smith Date: Tue, 18 Jan 2022 13:18:48 -0800 Subject: [PATCH 46/62] More test coverage --- .../server/object/ObjectServiceTest.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/server/src/test/java/io/deephaven/server/object/ObjectServiceTest.java b/server/src/test/java/io/deephaven/server/object/ObjectServiceTest.java index c6307f04d3c..a304fd8e08f 100644 --- a/server/src/test/java/io/deephaven/server/object/ObjectServiceTest.java +++ b/server/src/test/java/io/deephaven/server/object/ObjectServiceTest.java @@ -12,6 +12,7 @@ import io.deephaven.server.runner.DeephavenApiServerSingleAuthenticatedBase; import io.deephaven.server.session.SessionState.ExportObject; import io.grpc.StatusRuntimeException; +import org.assertj.core.api.Condition; import org.junit.Test; import java.io.DataInput; @@ -20,7 +21,9 @@ import java.io.DataOutputStream; import java.io.IOException; import java.io.OutputStream; +import java.util.Arrays; import java.util.Objects; +import java.util.Optional; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.failBecauseExceptionWasNotThrown; @@ -150,6 +153,18 @@ public void writeToImpl(Exporter exporter, MyObject object, OutputStream out) th final Reference extraTableRef = exporter.reference(object.someTable, false, false).orElseThrow(); final Reference extraNewObjRef = exporter.reference(object.someObj, false, true).orElseThrow(); + final Optional dontAllowUnknown = exporter.reference(new Object(), false, false); + + assertThat(tableRef.type()).contains("Table"); + assertThat(objRef.type()).contains(MyObjectRegistration.MY_REF_OBJECT_TYPE_NAME); + assertThat(unknownRef.type()).isEmpty(); + assertThat(extraTableRef.type()).contains("Table"); + assertThat(extraNewObjRef.type()).contains(MyObjectRegistration.MY_REF_OBJECT_TYPE_NAME); + assertThat(dontAllowUnknown).isEmpty(); + + assertThat(tableRef.ticket()).is(bytesEquals(extraTableRef.ticket())); + assertThat(objRef.ticket()).isNot(bytesEquals(extraNewObjRef.ticket())); + final DataOutputStream doas = new DataOutputStream(out); // let's write them out of order @@ -180,4 +195,8 @@ public void writeToImpl(Exporter exporter, MyRefObject object, OutputStream out) // no-op } } + + private static Condition bytesEquals(byte[] expected) { + return new Condition<>(b -> Arrays.equals(b, expected), "array bytes are equals"); + } } From 17eea96ef082eded603c09409f4249021f99ffda Mon Sep 17 00:00:00 2001 From: Devin Smith Date: Wed, 19 Jan 2022 10:09:11 -0800 Subject: [PATCH 47/62] Added "typed_" prefix. Fixed FieldInfo. Follow up testing in #1850 --- .../main/java/io/deephaven/client/impl/FieldInfo.java | 6 +++--- .../java/io/deephaven/client/impl/SessionImpl.java | 2 +- .../main/java/io/deephaven/client/impl/TicketId.java | 4 ++++ .../src/main/proto/deephaven/proto/application.proto | 11 +++++------ .../src/main/proto/deephaven/proto/object.proto | 2 +- .../server/appmode/ApplicationServiceGrpcImpl.java | 4 ++-- .../server/console/ConsoleServiceGrpcImpl.java | 2 +- .../server/object/ObjectServiceGrpcImpl.java | 2 +- .../io/deephaven/server/object/ObjectServiceTest.java | 10 +++++----- 9 files changed, 23 insertions(+), 20 deletions(-) diff --git a/java-client/session/src/main/java/io/deephaven/client/impl/FieldInfo.java b/java-client/session/src/main/java/io/deephaven/client/impl/FieldInfo.java index 9c869df4455..f90770f4a1d 100644 --- a/java-client/session/src/main/java/io/deephaven/client/impl/FieldInfo.java +++ b/java-client/session/src/main/java/io/deephaven/client/impl/FieldInfo.java @@ -12,14 +12,14 @@ public final class FieldInfo { } public Optional type() { - if (fieldInfo.getTicket().getType().isEmpty()) { + if (fieldInfo.getTypedTicket().getType().isEmpty()) { return Optional.empty(); } - return Optional.of(fieldInfo.getTicket().getType()); + return Optional.of(fieldInfo.getTypedTicket().getType()); } public TicketId ticket() { - return new TicketId(fieldInfo.getTicket().toByteArray()); + return new TicketId(fieldInfo.getTypedTicket().getTicket()); } public String name() { diff --git a/java-client/session/src/main/java/io/deephaven/client/impl/SessionImpl.java b/java-client/session/src/main/java/io/deephaven/client/impl/SessionImpl.java index b97c5113bed..39102547ace 100644 --- a/java-client/session/src/main/java/io/deephaven/client/impl/SessionImpl.java +++ b/java-client/session/src/main/java/io/deephaven/client/impl/SessionImpl.java @@ -430,7 +430,7 @@ public void beforeStart(ClientCallStreamObserver requestStre public void onNext(FetchObjectResponse value) { final String type = value.getType(); final ByteString data = value.getData(); - final List exportIds = value.getExportIdList().stream() + final List exportIds = value.getTypedExportIdList().stream() .map(FetchObserver::toExportId) .collect(Collectors.toList()); future.complete(new FetchedObject(type, data, exportIds)); diff --git a/java-client/session/src/main/java/io/deephaven/client/impl/TicketId.java b/java-client/session/src/main/java/io/deephaven/client/impl/TicketId.java index 9a06fc4c538..8fd382db851 100644 --- a/java-client/session/src/main/java/io/deephaven/client/impl/TicketId.java +++ b/java-client/session/src/main/java/io/deephaven/client/impl/TicketId.java @@ -17,6 +17,10 @@ public TicketId(byte[] ticket) { this.ticket = Objects.requireNonNull(ticket); } + TicketId(Ticket ticket) { + this(ticket.getTicket().toByteArray()); + } + @Override public TicketId ticketId() { return this; diff --git a/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/application.proto b/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/application.proto index 9907bfdf655..e34229b1185 100644 --- a/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/application.proto +++ b/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/application.proto @@ -24,7 +24,7 @@ service ApplicationService { * - Subsequent messages modify the existing state. Fields are identified by * their ticket and may be replaced or removed. */ - rpc listFields(ListFieldsRequest) returns (stream FieldsChangeUpdate) {} + rpc ListFields(ListFieldsRequest) returns (stream FieldsChangeUpdate) {} } @@ -45,12 +45,11 @@ message FieldsChangeUpdate { * A lightweight object describing the exposed field. */ message FieldInfo { - TypedTicket ticket = 1; + TypedTicket typed_ticket = 1; string field_name = 2; -// string field_type = 3; - string field_description = 4; - string application_name = 5; // display-friendly identification - string application_id = 6; // computer-friendly identification + string field_description = 3; + string application_name = 4; // display-friendly identification + string application_id = 5; // computer-friendly identification } /* diff --git a/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/object.proto b/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/object.proto index 1a13078e2de..c55b88c7c26 100644 --- a/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/object.proto +++ b/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/object.proto @@ -22,5 +22,5 @@ message FetchObjectRequest { message FetchObjectResponse { string type = 1; bytes data = 2; - repeated io.deephaven.proto.backplane.grpc.TypedTicket export_id = 3; + repeated io.deephaven.proto.backplane.grpc.TypedTicket typed_export_id = 3; } diff --git a/server/src/main/java/io/deephaven/server/appmode/ApplicationServiceGrpcImpl.java b/server/src/main/java/io/deephaven/server/appmode/ApplicationServiceGrpcImpl.java index 015a1c4206c..e0fdbf77ed4 100644 --- a/server/src/main/java/io/deephaven/server/appmode/ApplicationServiceGrpcImpl.java +++ b/server/src/main/java/io/deephaven/server/appmode/ApplicationServiceGrpcImpl.java @@ -241,7 +241,7 @@ synchronized void remove(Subscription sub) { private FieldInfo getRemovedFieldInfo(final AppFieldId id, final Field field) { return FieldInfo.newBuilder() - .setTicket(typedTicket(id, field)) + .setTypedTicket(typedTicket(id, field)) .setFieldName(id.fieldName) .setApplicationId(id.applicationId()) .setApplicationName(id.applicationName()) @@ -250,7 +250,7 @@ private FieldInfo getRemovedFieldInfo(final AppFieldId id, final Field field) private FieldInfo getFieldInfo(final AppFieldId id, final Field field) { return FieldInfo.newBuilder() - .setTicket(typedTicket(id, field)) + .setTypedTicket(typedTicket(id, field)) .setFieldName(id.fieldName) .setFieldDescription(field.description().orElse("")) .setApplicationId(id.applicationId()) diff --git a/server/src/main/java/io/deephaven/server/console/ConsoleServiceGrpcImpl.java b/server/src/main/java/io/deephaven/server/console/ConsoleServiceGrpcImpl.java index a055ca0a130..d4bc27b4b2a 100644 --- a/server/src/main/java/io/deephaven/server/console/ConsoleServiceGrpcImpl.java +++ b/server/src/main/java/io/deephaven/server/console/ConsoleServiceGrpcImpl.java @@ -241,7 +241,7 @@ private static FieldInfo makeVariableDefinition(String title, String type) { .setApplicationId("") .setFieldName(title) .setFieldDescription("query scope variable") - .setTicket(id) + .setTypedTicket(id) .build(); } diff --git a/server/src/main/java/io/deephaven/server/object/ObjectServiceGrpcImpl.java b/server/src/main/java/io/deephaven/server/object/ObjectServiceGrpcImpl.java index 746257b08f6..fcd8fb535be 100644 --- a/server/src/main/java/io/deephaven/server/object/ObjectServiceGrpcImpl.java +++ b/server/src/main/java/io/deephaven/server/object/ObjectServiceGrpcImpl.java @@ -79,7 +79,7 @@ private FetchObjectResponse serialize(SessionState state, Object object) throws .setType(objectType.name()) .setData(ByteStringAccess.wrap(out.peekBuffer(), 0, out.size())); for (ReferenceImpl ref : exportCollector.refs()) { - builder.addExportId(ref.typedTicket()); + builder.addTypedExportId(ref.typedTicket()); } return builder.build(); } catch (Throwable t) { diff --git a/server/src/test/java/io/deephaven/server/object/ObjectServiceTest.java b/server/src/test/java/io/deephaven/server/object/ObjectServiceTest.java index a304fd8e08f..c1e137e096a 100644 --- a/server/src/test/java/io/deephaven/server/object/ObjectServiceTest.java +++ b/server/src/test/java/io/deephaven/server/object/ObjectServiceTest.java @@ -68,11 +68,11 @@ private void fetchMyObject(Ticket ticket, String expectedSomeString, int expecte final FetchObjectResponse response = channel().objectBlocking().fetchObject(request); assertThat(response.getType()).isEqualTo(MyObjectRegistration.MY_OBJECT_TYPE_NAME); - assertThat(response.getExportIdCount()).isEqualTo(4); - assertThat(response.getExportId(0).getType()).isEqualTo("Table"); - assertThat(response.getExportId(1).getType()).isEqualTo(MyObjectRegistration.MY_REF_OBJECT_TYPE_NAME); - assertThat(response.getExportId(2).getType()).isEmpty(); - assertThat(response.getExportId(3).getType()).isEqualTo(MyObjectRegistration.MY_REF_OBJECT_TYPE_NAME); + assertThat(response.getTypedExportIdCount()).isEqualTo(4); + assertThat(response.getTypedExportId(0).getType()).isEqualTo("Table"); + assertThat(response.getTypedExportId(1).getType()).isEqualTo(MyObjectRegistration.MY_REF_OBJECT_TYPE_NAME); + assertThat(response.getTypedExportId(2).getType()).isEmpty(); + assertThat(response.getTypedExportId(3).getType()).isEqualTo(MyObjectRegistration.MY_REF_OBJECT_TYPE_NAME); final DataInputStream dis = new DataInputStream(response.getData().newInput()); From 4009b9361567844472a2232b0019fa5eac2e7ffd Mon Sep 17 00:00:00 2001 From: Colin Alworth Date: Wed, 19 Jan 2022 14:51:51 -0600 Subject: [PATCH 48/62] Update generated gwt bindings --- .../proto/application_pb/FieldInfo.java | 178 +++++---- .../application_pb/FieldsChangeUpdate.java | 174 +++++---- .../ApplicationService.java | 2 +- .../console_pb/ExecuteCommandResponse.java | 174 +++++---- .../proto/object_pb/FetchObjectResponse.java | 348 ++++++++++-------- .../proto/ticket_pb/TypedTicket.java | 218 +++++------ 6 files changed, 592 insertions(+), 502 deletions(-) diff --git a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/application_pb/FieldInfo.java b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/application_pb/FieldInfo.java index ed2ae15f951..bfbad376af5 100644 --- a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/application_pb/FieldInfo.java +++ b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/application_pb/FieldInfo.java @@ -17,62 +17,78 @@ public class FieldInfo { @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) public interface ToObjectReturnType { @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface TicketFieldType { + public interface TypedTicketFieldType { @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface GetTicketUnionType { - @JsOverlay - static FieldInfo.ToObjectReturnType.TicketFieldType.GetTicketUnionType of(Object o) { - return Js.cast(o); + public interface TicketFieldType { + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface GetTicketUnionType { + @JsOverlay + static FieldInfo.ToObjectReturnType.TypedTicketFieldType.TicketFieldType.GetTicketUnionType of( + Object o) { + return Js.cast(o); + } + + @JsOverlay + default String asString() { + return Js.asString(this); + } + + @JsOverlay + default Uint8Array asUint8Array() { + return Js.cast(this); + } + + @JsOverlay + default boolean isString() { + return (Object) this instanceof String; + } + + @JsOverlay + default boolean isUint8Array() { + return (Object) this instanceof Uint8Array; + } } @JsOverlay - default String asString() { - return Js.asString(this); + static FieldInfo.ToObjectReturnType.TypedTicketFieldType.TicketFieldType create() { + return Js.uncheckedCast(JsPropertyMap.of()); } - @JsOverlay - default Uint8Array asUint8Array() { - return Js.cast(this); - } + @JsProperty + FieldInfo.ToObjectReturnType.TypedTicketFieldType.TicketFieldType.GetTicketUnionType getTicket(); + + @JsProperty + void setTicket( + FieldInfo.ToObjectReturnType.TypedTicketFieldType.TicketFieldType.GetTicketUnionType ticket); @JsOverlay - default boolean isString() { - return (Object) this instanceof String; + default void setTicket(String ticket) { + setTicket( + Js.uncheckedCast( + ticket)); } @JsOverlay - default boolean isUint8Array() { - return (Object) this instanceof Uint8Array; + default void setTicket(Uint8Array ticket) { + setTicket( + Js.uncheckedCast( + ticket)); } } @JsOverlay - static FieldInfo.ToObjectReturnType.TicketFieldType create() { + static FieldInfo.ToObjectReturnType.TypedTicketFieldType create() { return Js.uncheckedCast(JsPropertyMap.of()); } @JsProperty - FieldInfo.ToObjectReturnType.TicketFieldType.GetTicketUnionType getTicket(); + FieldInfo.ToObjectReturnType.TypedTicketFieldType.TicketFieldType getTicket(); @JsProperty String getType(); @JsProperty - void setTicket(FieldInfo.ToObjectReturnType.TicketFieldType.GetTicketUnionType ticket); - - @JsOverlay - default void setTicket(String ticket) { - setTicket( - Js.uncheckedCast( - ticket)); - } - - @JsOverlay - default void setTicket(Uint8Array ticket) { - setTicket( - Js.uncheckedCast( - ticket)); - } + void setTicket(FieldInfo.ToObjectReturnType.TypedTicketFieldType.TicketFieldType ticket); @JsProperty void setType(String type); @@ -96,7 +112,7 @@ static FieldInfo.ToObjectReturnType create() { String getFieldName(); @JsProperty - FieldInfo.ToObjectReturnType.TicketFieldType getTicket(); + FieldInfo.ToObjectReturnType.TypedTicketFieldType getTypedTicket(); @JsProperty void setApplicationId(String applicationId); @@ -111,68 +127,84 @@ static FieldInfo.ToObjectReturnType create() { void setFieldName(String fieldName); @JsProperty - void setTicket(FieldInfo.ToObjectReturnType.TicketFieldType ticket); + void setTypedTicket(FieldInfo.ToObjectReturnType.TypedTicketFieldType typedTicket); } @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) public interface ToObjectReturnType0 { @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface TicketFieldType { + public interface TypedTicketFieldType { @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface GetTicketUnionType { - @JsOverlay - static FieldInfo.ToObjectReturnType0.TicketFieldType.GetTicketUnionType of(Object o) { - return Js.cast(o); + public interface TicketFieldType { + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface GetTicketUnionType { + @JsOverlay + static FieldInfo.ToObjectReturnType0.TypedTicketFieldType.TicketFieldType.GetTicketUnionType of( + Object o) { + return Js.cast(o); + } + + @JsOverlay + default String asString() { + return Js.asString(this); + } + + @JsOverlay + default Uint8Array asUint8Array() { + return Js.cast(this); + } + + @JsOverlay + default boolean isString() { + return (Object) this instanceof String; + } + + @JsOverlay + default boolean isUint8Array() { + return (Object) this instanceof Uint8Array; + } } @JsOverlay - default String asString() { - return Js.asString(this); + static FieldInfo.ToObjectReturnType0.TypedTicketFieldType.TicketFieldType create() { + return Js.uncheckedCast(JsPropertyMap.of()); } - @JsOverlay - default Uint8Array asUint8Array() { - return Js.cast(this); - } + @JsProperty + FieldInfo.ToObjectReturnType0.TypedTicketFieldType.TicketFieldType.GetTicketUnionType getTicket(); + + @JsProperty + void setTicket( + FieldInfo.ToObjectReturnType0.TypedTicketFieldType.TicketFieldType.GetTicketUnionType ticket); @JsOverlay - default boolean isString() { - return (Object) this instanceof String; + default void setTicket(String ticket) { + setTicket( + Js.uncheckedCast( + ticket)); } @JsOverlay - default boolean isUint8Array() { - return (Object) this instanceof Uint8Array; + default void setTicket(Uint8Array ticket) { + setTicket( + Js.uncheckedCast( + ticket)); } } @JsOverlay - static FieldInfo.ToObjectReturnType0.TicketFieldType create() { + static FieldInfo.ToObjectReturnType0.TypedTicketFieldType create() { return Js.uncheckedCast(JsPropertyMap.of()); } @JsProperty - FieldInfo.ToObjectReturnType0.TicketFieldType.GetTicketUnionType getTicket(); + FieldInfo.ToObjectReturnType0.TypedTicketFieldType.TicketFieldType getTicket(); @JsProperty String getType(); @JsProperty - void setTicket(FieldInfo.ToObjectReturnType0.TicketFieldType.GetTicketUnionType ticket); - - @JsOverlay - default void setTicket(String ticket) { - setTicket( - Js.uncheckedCast( - ticket)); - } - - @JsOverlay - default void setTicket(Uint8Array ticket) { - setTicket( - Js.uncheckedCast( - ticket)); - } + void setTicket(FieldInfo.ToObjectReturnType0.TypedTicketFieldType.TicketFieldType ticket); @JsProperty void setType(String type); @@ -196,7 +228,7 @@ static FieldInfo.ToObjectReturnType0 create() { String getFieldName(); @JsProperty - FieldInfo.ToObjectReturnType0.TicketFieldType getTicket(); + FieldInfo.ToObjectReturnType0.TypedTicketFieldType getTypedTicket(); @JsProperty void setApplicationId(String applicationId); @@ -211,7 +243,7 @@ static FieldInfo.ToObjectReturnType0 create() { void setFieldName(String fieldName); @JsProperty - void setTicket(FieldInfo.ToObjectReturnType0.TicketFieldType ticket); + void setTypedTicket(FieldInfo.ToObjectReturnType0.TypedTicketFieldType typedTicket); } public static native FieldInfo deserializeBinary(Uint8Array bytes); @@ -223,7 +255,7 @@ static FieldInfo.ToObjectReturnType0 create() { public static native FieldInfo.ToObjectReturnType toObject( boolean includeInstance, FieldInfo msg); - public native void clearTicket(); + public native void clearTypedTicket(); public native String getApplicationId(); @@ -233,9 +265,9 @@ public static native FieldInfo.ToObjectReturnType toObject( public native String getFieldName(); - public native TypedTicket getTicket(); + public native TypedTicket getTypedTicket(); - public native boolean hasTicket(); + public native boolean hasTypedTicket(); public native Uint8Array serializeBinary(); @@ -247,9 +279,9 @@ public static native FieldInfo.ToObjectReturnType toObject( public native void setFieldName(String value); - public native void setTicket(); + public native void setTypedTicket(); - public native void setTicket(TypedTicket value); + public native void setTypedTicket(TypedTicket value); public native FieldInfo.ToObjectReturnType0 toObject(); diff --git a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/application_pb/FieldsChangeUpdate.java b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/application_pb/FieldsChangeUpdate.java index 753600f155e..ec195875379 100644 --- a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/application_pb/FieldsChangeUpdate.java +++ b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/application_pb/FieldsChangeUpdate.java @@ -19,64 +19,79 @@ public interface ToObjectReturnType { @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) public interface CreatedListFieldType { @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface TicketFieldType { + public interface TypedTicketFieldType { @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface GetTicketUnionType { - @JsOverlay - static FieldsChangeUpdate.ToObjectReturnType.CreatedListFieldType.TicketFieldType.GetTicketUnionType of( - Object o) { - return Js.cast(o); + public interface TicketFieldType { + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface GetTicketUnionType { + @JsOverlay + static FieldsChangeUpdate.ToObjectReturnType.CreatedListFieldType.TypedTicketFieldType.TicketFieldType.GetTicketUnionType of( + Object o) { + return Js.cast(o); + } + + @JsOverlay + default String asString() { + return Js.asString(this); + } + + @JsOverlay + default Uint8Array asUint8Array() { + return Js.cast(this); + } + + @JsOverlay + default boolean isString() { + return (Object) this instanceof String; + } + + @JsOverlay + default boolean isUint8Array() { + return (Object) this instanceof Uint8Array; + } } @JsOverlay - default String asString() { - return Js.asString(this); + static FieldsChangeUpdate.ToObjectReturnType.CreatedListFieldType.TypedTicketFieldType.TicketFieldType create() { + return Js.uncheckedCast(JsPropertyMap.of()); } - @JsOverlay - default Uint8Array asUint8Array() { - return Js.cast(this); - } + @JsProperty + FieldsChangeUpdate.ToObjectReturnType.CreatedListFieldType.TypedTicketFieldType.TicketFieldType.GetTicketUnionType getTicket(); + + @JsProperty + void setTicket( + FieldsChangeUpdate.ToObjectReturnType.CreatedListFieldType.TypedTicketFieldType.TicketFieldType.GetTicketUnionType ticket); @JsOverlay - default boolean isString() { - return (Object) this instanceof String; + default void setTicket(String ticket) { + setTicket( + Js.uncheckedCast( + ticket)); } @JsOverlay - default boolean isUint8Array() { - return (Object) this instanceof Uint8Array; + default void setTicket(Uint8Array ticket) { + setTicket( + Js.uncheckedCast( + ticket)); } } @JsOverlay - static FieldsChangeUpdate.ToObjectReturnType.CreatedListFieldType.TicketFieldType create() { + static FieldsChangeUpdate.ToObjectReturnType.CreatedListFieldType.TypedTicketFieldType create() { return Js.uncheckedCast(JsPropertyMap.of()); } @JsProperty - FieldsChangeUpdate.ToObjectReturnType.CreatedListFieldType.TicketFieldType.GetTicketUnionType getTicket(); + FieldsChangeUpdate.ToObjectReturnType.CreatedListFieldType.TypedTicketFieldType.TicketFieldType getTicket(); @JsProperty String getType(); @JsProperty void setTicket( - FieldsChangeUpdate.ToObjectReturnType.CreatedListFieldType.TicketFieldType.GetTicketUnionType ticket); - - @JsOverlay - default void setTicket(String ticket) { - setTicket( - Js.uncheckedCast( - ticket)); - } - - @JsOverlay - default void setTicket(Uint8Array ticket) { - setTicket( - Js.uncheckedCast( - ticket)); - } + FieldsChangeUpdate.ToObjectReturnType.CreatedListFieldType.TypedTicketFieldType.TicketFieldType ticket); @JsProperty void setType(String type); @@ -100,7 +115,7 @@ static FieldsChangeUpdate.ToObjectReturnType.CreatedListFieldType create() { String getFieldName(); @JsProperty - FieldsChangeUpdate.ToObjectReturnType.CreatedListFieldType.TicketFieldType getTicket(); + FieldsChangeUpdate.ToObjectReturnType.CreatedListFieldType.TypedTicketFieldType getTypedTicket(); @JsProperty void setApplicationId(String applicationId); @@ -115,8 +130,8 @@ static FieldsChangeUpdate.ToObjectReturnType.CreatedListFieldType create() { void setFieldName(String fieldName); @JsProperty - void setTicket( - FieldsChangeUpdate.ToObjectReturnType.CreatedListFieldType.TicketFieldType ticket); + void setTypedTicket( + FieldsChangeUpdate.ToObjectReturnType.CreatedListFieldType.TypedTicketFieldType typedTicket); } @JsOverlay @@ -167,64 +182,79 @@ public interface ToObjectReturnType0 { @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) public interface CreatedListFieldType { @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface TicketFieldType { + public interface TypedTicketFieldType { @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface GetTicketUnionType { - @JsOverlay - static FieldsChangeUpdate.ToObjectReturnType0.CreatedListFieldType.TicketFieldType.GetTicketUnionType of( - Object o) { - return Js.cast(o); + public interface TicketFieldType { + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface GetTicketUnionType { + @JsOverlay + static FieldsChangeUpdate.ToObjectReturnType0.CreatedListFieldType.TypedTicketFieldType.TicketFieldType.GetTicketUnionType of( + Object o) { + return Js.cast(o); + } + + @JsOverlay + default String asString() { + return Js.asString(this); + } + + @JsOverlay + default Uint8Array asUint8Array() { + return Js.cast(this); + } + + @JsOverlay + default boolean isString() { + return (Object) this instanceof String; + } + + @JsOverlay + default boolean isUint8Array() { + return (Object) this instanceof Uint8Array; + } } @JsOverlay - default String asString() { - return Js.asString(this); + static FieldsChangeUpdate.ToObjectReturnType0.CreatedListFieldType.TypedTicketFieldType.TicketFieldType create() { + return Js.uncheckedCast(JsPropertyMap.of()); } - @JsOverlay - default Uint8Array asUint8Array() { - return Js.cast(this); - } + @JsProperty + FieldsChangeUpdate.ToObjectReturnType0.CreatedListFieldType.TypedTicketFieldType.TicketFieldType.GetTicketUnionType getTicket(); + + @JsProperty + void setTicket( + FieldsChangeUpdate.ToObjectReturnType0.CreatedListFieldType.TypedTicketFieldType.TicketFieldType.GetTicketUnionType ticket); @JsOverlay - default boolean isString() { - return (Object) this instanceof String; + default void setTicket(String ticket) { + setTicket( + Js.uncheckedCast( + ticket)); } @JsOverlay - default boolean isUint8Array() { - return (Object) this instanceof Uint8Array; + default void setTicket(Uint8Array ticket) { + setTicket( + Js.uncheckedCast( + ticket)); } } @JsOverlay - static FieldsChangeUpdate.ToObjectReturnType0.CreatedListFieldType.TicketFieldType create() { + static FieldsChangeUpdate.ToObjectReturnType0.CreatedListFieldType.TypedTicketFieldType create() { return Js.uncheckedCast(JsPropertyMap.of()); } @JsProperty - FieldsChangeUpdate.ToObjectReturnType0.CreatedListFieldType.TicketFieldType.GetTicketUnionType getTicket(); + FieldsChangeUpdate.ToObjectReturnType0.CreatedListFieldType.TypedTicketFieldType.TicketFieldType getTicket(); @JsProperty String getType(); @JsProperty void setTicket( - FieldsChangeUpdate.ToObjectReturnType0.CreatedListFieldType.TicketFieldType.GetTicketUnionType ticket); - - @JsOverlay - default void setTicket(String ticket) { - setTicket( - Js.uncheckedCast( - ticket)); - } - - @JsOverlay - default void setTicket(Uint8Array ticket) { - setTicket( - Js.uncheckedCast( - ticket)); - } + FieldsChangeUpdate.ToObjectReturnType0.CreatedListFieldType.TypedTicketFieldType.TicketFieldType ticket); @JsProperty void setType(String type); @@ -248,7 +278,7 @@ static FieldsChangeUpdate.ToObjectReturnType0.CreatedListFieldType create() { String getFieldName(); @JsProperty - FieldsChangeUpdate.ToObjectReturnType0.CreatedListFieldType.TicketFieldType getTicket(); + FieldsChangeUpdate.ToObjectReturnType0.CreatedListFieldType.TypedTicketFieldType getTypedTicket(); @JsProperty void setApplicationId(String applicationId); @@ -263,8 +293,8 @@ static FieldsChangeUpdate.ToObjectReturnType0.CreatedListFieldType create() { void setFieldName(String fieldName); @JsProperty - void setTicket( - FieldsChangeUpdate.ToObjectReturnType0.CreatedListFieldType.TicketFieldType ticket); + void setTypedTicket( + FieldsChangeUpdate.ToObjectReturnType0.CreatedListFieldType.TypedTicketFieldType typedTicket); } @JsOverlay diff --git a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/application_pb_service/ApplicationService.java b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/application_pb_service/ApplicationService.java index f29731b428f..bd552f62c56 100644 --- a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/application_pb_service/ApplicationService.java +++ b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/application_pb_service/ApplicationService.java @@ -56,6 +56,6 @@ static ApplicationService.ListFieldsType create() { void setService(Object service); } - public static ApplicationService.ListFieldsType listFields; + public static ApplicationService.ListFieldsType ListFields; public static String serviceName; } diff --git a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/console_pb/ExecuteCommandResponse.java b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/console_pb/ExecuteCommandResponse.java index a5361c95b39..c5fa11f284f 100644 --- a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/console_pb/ExecuteCommandResponse.java +++ b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/console_pb/ExecuteCommandResponse.java @@ -22,64 +22,79 @@ public interface ChangesFieldType { @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) public interface CreatedListFieldType { @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface TicketFieldType { + public interface TypedTicketFieldType { @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface GetTicketUnionType { - @JsOverlay - static ExecuteCommandResponse.ToObjectReturnType.ChangesFieldType.CreatedListFieldType.TicketFieldType.GetTicketUnionType of( - Object o) { - return Js.cast(o); + public interface TicketFieldType { + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface GetTicketUnionType { + @JsOverlay + static ExecuteCommandResponse.ToObjectReturnType.ChangesFieldType.CreatedListFieldType.TypedTicketFieldType.TicketFieldType.GetTicketUnionType of( + Object o) { + return Js.cast(o); + } + + @JsOverlay + default String asString() { + return Js.asString(this); + } + + @JsOverlay + default Uint8Array asUint8Array() { + return Js.cast(this); + } + + @JsOverlay + default boolean isString() { + return (Object) this instanceof String; + } + + @JsOverlay + default boolean isUint8Array() { + return (Object) this instanceof Uint8Array; + } } @JsOverlay - default String asString() { - return Js.asString(this); + static ExecuteCommandResponse.ToObjectReturnType.ChangesFieldType.CreatedListFieldType.TypedTicketFieldType.TicketFieldType create() { + return Js.uncheckedCast(JsPropertyMap.of()); } - @JsOverlay - default Uint8Array asUint8Array() { - return Js.cast(this); - } + @JsProperty + ExecuteCommandResponse.ToObjectReturnType.ChangesFieldType.CreatedListFieldType.TypedTicketFieldType.TicketFieldType.GetTicketUnionType getTicket(); + + @JsProperty + void setTicket( + ExecuteCommandResponse.ToObjectReturnType.ChangesFieldType.CreatedListFieldType.TypedTicketFieldType.TicketFieldType.GetTicketUnionType ticket); @JsOverlay - default boolean isString() { - return (Object) this instanceof String; + default void setTicket(String ticket) { + setTicket( + Js.uncheckedCast( + ticket)); } @JsOverlay - default boolean isUint8Array() { - return (Object) this instanceof Uint8Array; + default void setTicket(Uint8Array ticket) { + setTicket( + Js.uncheckedCast( + ticket)); } } @JsOverlay - static ExecuteCommandResponse.ToObjectReturnType.ChangesFieldType.CreatedListFieldType.TicketFieldType create() { + static ExecuteCommandResponse.ToObjectReturnType.ChangesFieldType.CreatedListFieldType.TypedTicketFieldType create() { return Js.uncheckedCast(JsPropertyMap.of()); } @JsProperty - ExecuteCommandResponse.ToObjectReturnType.ChangesFieldType.CreatedListFieldType.TicketFieldType.GetTicketUnionType getTicket(); + ExecuteCommandResponse.ToObjectReturnType.ChangesFieldType.CreatedListFieldType.TypedTicketFieldType.TicketFieldType getTicket(); @JsProperty String getType(); @JsProperty void setTicket( - ExecuteCommandResponse.ToObjectReturnType.ChangesFieldType.CreatedListFieldType.TicketFieldType.GetTicketUnionType ticket); - - @JsOverlay - default void setTicket(String ticket) { - setTicket( - Js.uncheckedCast( - ticket)); - } - - @JsOverlay - default void setTicket(Uint8Array ticket) { - setTicket( - Js.uncheckedCast( - ticket)); - } + ExecuteCommandResponse.ToObjectReturnType.ChangesFieldType.CreatedListFieldType.TypedTicketFieldType.TicketFieldType ticket); @JsProperty void setType(String type); @@ -103,7 +118,7 @@ static ExecuteCommandResponse.ToObjectReturnType.ChangesFieldType.CreatedListFie String getFieldName(); @JsProperty - ExecuteCommandResponse.ToObjectReturnType.ChangesFieldType.CreatedListFieldType.TicketFieldType getTicket(); + ExecuteCommandResponse.ToObjectReturnType.ChangesFieldType.CreatedListFieldType.TypedTicketFieldType getTypedTicket(); @JsProperty void setApplicationId(String applicationId); @@ -118,8 +133,8 @@ static ExecuteCommandResponse.ToObjectReturnType.ChangesFieldType.CreatedListFie void setFieldName(String fieldName); @JsProperty - void setTicket( - ExecuteCommandResponse.ToObjectReturnType.ChangesFieldType.CreatedListFieldType.TicketFieldType ticket); + void setTypedTicket( + ExecuteCommandResponse.ToObjectReturnType.ChangesFieldType.CreatedListFieldType.TypedTicketFieldType typedTicket); } @JsOverlay @@ -190,64 +205,79 @@ public interface ChangesFieldType { @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) public interface CreatedListFieldType { @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface TicketFieldType { + public interface TypedTicketFieldType { @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface GetTicketUnionType { - @JsOverlay - static ExecuteCommandResponse.ToObjectReturnType0.ChangesFieldType.CreatedListFieldType.TicketFieldType.GetTicketUnionType of( - Object o) { - return Js.cast(o); + public interface TicketFieldType { + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface GetTicketUnionType { + @JsOverlay + static ExecuteCommandResponse.ToObjectReturnType0.ChangesFieldType.CreatedListFieldType.TypedTicketFieldType.TicketFieldType.GetTicketUnionType of( + Object o) { + return Js.cast(o); + } + + @JsOverlay + default String asString() { + return Js.asString(this); + } + + @JsOverlay + default Uint8Array asUint8Array() { + return Js.cast(this); + } + + @JsOverlay + default boolean isString() { + return (Object) this instanceof String; + } + + @JsOverlay + default boolean isUint8Array() { + return (Object) this instanceof Uint8Array; + } } @JsOverlay - default String asString() { - return Js.asString(this); + static ExecuteCommandResponse.ToObjectReturnType0.ChangesFieldType.CreatedListFieldType.TypedTicketFieldType.TicketFieldType create() { + return Js.uncheckedCast(JsPropertyMap.of()); } - @JsOverlay - default Uint8Array asUint8Array() { - return Js.cast(this); - } + @JsProperty + ExecuteCommandResponse.ToObjectReturnType0.ChangesFieldType.CreatedListFieldType.TypedTicketFieldType.TicketFieldType.GetTicketUnionType getTicket(); + + @JsProperty + void setTicket( + ExecuteCommandResponse.ToObjectReturnType0.ChangesFieldType.CreatedListFieldType.TypedTicketFieldType.TicketFieldType.GetTicketUnionType ticket); @JsOverlay - default boolean isString() { - return (Object) this instanceof String; + default void setTicket(String ticket) { + setTicket( + Js.uncheckedCast( + ticket)); } @JsOverlay - default boolean isUint8Array() { - return (Object) this instanceof Uint8Array; + default void setTicket(Uint8Array ticket) { + setTicket( + Js.uncheckedCast( + ticket)); } } @JsOverlay - static ExecuteCommandResponse.ToObjectReturnType0.ChangesFieldType.CreatedListFieldType.TicketFieldType create() { + static ExecuteCommandResponse.ToObjectReturnType0.ChangesFieldType.CreatedListFieldType.TypedTicketFieldType create() { return Js.uncheckedCast(JsPropertyMap.of()); } @JsProperty - ExecuteCommandResponse.ToObjectReturnType0.ChangesFieldType.CreatedListFieldType.TicketFieldType.GetTicketUnionType getTicket(); + ExecuteCommandResponse.ToObjectReturnType0.ChangesFieldType.CreatedListFieldType.TypedTicketFieldType.TicketFieldType getTicket(); @JsProperty String getType(); @JsProperty void setTicket( - ExecuteCommandResponse.ToObjectReturnType0.ChangesFieldType.CreatedListFieldType.TicketFieldType.GetTicketUnionType ticket); - - @JsOverlay - default void setTicket(String ticket) { - setTicket( - Js.uncheckedCast( - ticket)); - } - - @JsOverlay - default void setTicket(Uint8Array ticket) { - setTicket( - Js.uncheckedCast( - ticket)); - } + ExecuteCommandResponse.ToObjectReturnType0.ChangesFieldType.CreatedListFieldType.TypedTicketFieldType.TicketFieldType ticket); @JsProperty void setType(String type); @@ -271,7 +301,7 @@ static ExecuteCommandResponse.ToObjectReturnType0.ChangesFieldType.CreatedListFi String getFieldName(); @JsProperty - ExecuteCommandResponse.ToObjectReturnType0.ChangesFieldType.CreatedListFieldType.TicketFieldType getTicket(); + ExecuteCommandResponse.ToObjectReturnType0.ChangesFieldType.CreatedListFieldType.TypedTicketFieldType getTypedTicket(); @JsProperty void setApplicationId(String applicationId); @@ -286,8 +316,8 @@ static ExecuteCommandResponse.ToObjectReturnType0.ChangesFieldType.CreatedListFi void setFieldName(String fieldName); @JsProperty - void setTicket( - ExecuteCommandResponse.ToObjectReturnType0.ChangesFieldType.CreatedListFieldType.TicketFieldType ticket); + void setTypedTicket( + ExecuteCommandResponse.ToObjectReturnType0.ChangesFieldType.CreatedListFieldType.TypedTicketFieldType typedTicket); } @JsOverlay diff --git a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/object_pb/FetchObjectResponse.java b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/object_pb/FetchObjectResponse.java index adaac078a7b..4d7e3a47ca4 100644 --- a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/object_pb/FetchObjectResponse.java +++ b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/object_pb/FetchObjectResponse.java @@ -74,97 +74,112 @@ default boolean isUint8Array() { @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) public interface ToObjectReturnType { @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface ExportIdListFieldType { + public interface GetDataUnionType { + @JsOverlay + static FetchObjectResponse.ToObjectReturnType.GetDataUnionType of(Object o) { + return Js.cast(o); + } + + @JsOverlay + default String asString() { + return Js.asString(this); + } + + @JsOverlay + default Uint8Array asUint8Array() { + return Js.cast(this); + } + + @JsOverlay + default boolean isString() { + return (Object) this instanceof String; + } + + @JsOverlay + default boolean isUint8Array() { + return (Object) this instanceof Uint8Array; + } + } + + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface TypedExportIdListFieldType { @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface GetTicketUnionType { - @JsOverlay - static FetchObjectResponse.ToObjectReturnType.ExportIdListFieldType.GetTicketUnionType of( - Object o) { - return Js.cast(o); + public interface TicketFieldType { + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface GetTicketUnionType { + @JsOverlay + static FetchObjectResponse.ToObjectReturnType.TypedExportIdListFieldType.TicketFieldType.GetTicketUnionType of( + Object o) { + return Js.cast(o); + } + + @JsOverlay + default String asString() { + return Js.asString(this); + } + + @JsOverlay + default Uint8Array asUint8Array() { + return Js.cast(this); + } + + @JsOverlay + default boolean isString() { + return (Object) this instanceof String; + } + + @JsOverlay + default boolean isUint8Array() { + return (Object) this instanceof Uint8Array; + } } @JsOverlay - default String asString() { - return Js.asString(this); + static FetchObjectResponse.ToObjectReturnType.TypedExportIdListFieldType.TicketFieldType create() { + return Js.uncheckedCast(JsPropertyMap.of()); } - @JsOverlay - default Uint8Array asUint8Array() { - return Js.cast(this); - } + @JsProperty + FetchObjectResponse.ToObjectReturnType.TypedExportIdListFieldType.TicketFieldType.GetTicketUnionType getTicket(); + + @JsProperty + void setTicket( + FetchObjectResponse.ToObjectReturnType.TypedExportIdListFieldType.TicketFieldType.GetTicketUnionType ticket); @JsOverlay - default boolean isString() { - return (Object) this instanceof String; + default void setTicket(String ticket) { + setTicket( + Js.uncheckedCast( + ticket)); } @JsOverlay - default boolean isUint8Array() { - return (Object) this instanceof Uint8Array; + default void setTicket(Uint8Array ticket) { + setTicket( + Js.uncheckedCast( + ticket)); } } @JsOverlay - static FetchObjectResponse.ToObjectReturnType.ExportIdListFieldType create() { + static FetchObjectResponse.ToObjectReturnType.TypedExportIdListFieldType create() { return Js.uncheckedCast(JsPropertyMap.of()); } @JsProperty - FetchObjectResponse.ToObjectReturnType.ExportIdListFieldType.GetTicketUnionType getTicket(); + FetchObjectResponse.ToObjectReturnType.TypedExportIdListFieldType.TicketFieldType getTicket(); @JsProperty String getType(); @JsProperty void setTicket( - FetchObjectResponse.ToObjectReturnType.ExportIdListFieldType.GetTicketUnionType ticket); - - @JsOverlay - default void setTicket(String ticket) { - setTicket( - Js.uncheckedCast( - ticket)); - } - - @JsOverlay - default void setTicket(Uint8Array ticket) { - setTicket( - Js.uncheckedCast( - ticket)); - } + FetchObjectResponse.ToObjectReturnType.TypedExportIdListFieldType.TicketFieldType ticket); @JsProperty void setType(String type); } - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface GetDataUnionType { - @JsOverlay - static FetchObjectResponse.ToObjectReturnType.GetDataUnionType of(Object o) { - return Js.cast(o); - } - - @JsOverlay - default String asString() { - return Js.asString(this); - } - - @JsOverlay - default Uint8Array asUint8Array() { - return Js.cast(this); - } - - @JsOverlay - default boolean isString() { - return (Object) this instanceof String; - } - - @JsOverlay - default boolean isUint8Array() { - return (Object) this instanceof Uint8Array; - } - } - @JsOverlay static FetchObjectResponse.ToObjectReturnType create() { return Js.uncheckedCast(JsPropertyMap.of()); @@ -174,10 +189,10 @@ static FetchObjectResponse.ToObjectReturnType create() { FetchObjectResponse.ToObjectReturnType.GetDataUnionType getData(); @JsProperty - JsArray getExportIdList(); + String getType(); @JsProperty - String getType(); + JsArray getTypedExportIdList(); @JsProperty void setData(FetchObjectResponse.ToObjectReturnType.GetDataUnionType data); @@ -192,116 +207,131 @@ default void setData(Uint8Array data) { setData(Js.uncheckedCast(data)); } - @JsOverlay - default void setExportIdList( - FetchObjectResponse.ToObjectReturnType.ExportIdListFieldType[] exportIdList) { - setExportIdList( - Js.>uncheckedCast( - exportIdList)); - } - @JsProperty - void setExportIdList( - JsArray exportIdList); + void setType(String type); @JsProperty - void setType(String type); + void setTypedExportIdList( + JsArray typedExportIdList); + + @JsOverlay + default void setTypedExportIdList( + FetchObjectResponse.ToObjectReturnType.TypedExportIdListFieldType[] typedExportIdList) { + setTypedExportIdList( + Js.>uncheckedCast( + typedExportIdList)); + } } @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) public interface ToObjectReturnType0 { @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface ExportIdListFieldType { + public interface GetDataUnionType { + @JsOverlay + static FetchObjectResponse.ToObjectReturnType0.GetDataUnionType of(Object o) { + return Js.cast(o); + } + + @JsOverlay + default String asString() { + return Js.asString(this); + } + + @JsOverlay + default Uint8Array asUint8Array() { + return Js.cast(this); + } + + @JsOverlay + default boolean isString() { + return (Object) this instanceof String; + } + + @JsOverlay + default boolean isUint8Array() { + return (Object) this instanceof Uint8Array; + } + } + + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface TypedExportIdListFieldType { @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface GetTicketUnionType { - @JsOverlay - static FetchObjectResponse.ToObjectReturnType0.ExportIdListFieldType.GetTicketUnionType of( - Object o) { - return Js.cast(o); + public interface TicketFieldType { + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface GetTicketUnionType { + @JsOverlay + static FetchObjectResponse.ToObjectReturnType0.TypedExportIdListFieldType.TicketFieldType.GetTicketUnionType of( + Object o) { + return Js.cast(o); + } + + @JsOverlay + default String asString() { + return Js.asString(this); + } + + @JsOverlay + default Uint8Array asUint8Array() { + return Js.cast(this); + } + + @JsOverlay + default boolean isString() { + return (Object) this instanceof String; + } + + @JsOverlay + default boolean isUint8Array() { + return (Object) this instanceof Uint8Array; + } } @JsOverlay - default String asString() { - return Js.asString(this); + static FetchObjectResponse.ToObjectReturnType0.TypedExportIdListFieldType.TicketFieldType create() { + return Js.uncheckedCast(JsPropertyMap.of()); } - @JsOverlay - default Uint8Array asUint8Array() { - return Js.cast(this); - } + @JsProperty + FetchObjectResponse.ToObjectReturnType0.TypedExportIdListFieldType.TicketFieldType.GetTicketUnionType getTicket(); + + @JsProperty + void setTicket( + FetchObjectResponse.ToObjectReturnType0.TypedExportIdListFieldType.TicketFieldType.GetTicketUnionType ticket); @JsOverlay - default boolean isString() { - return (Object) this instanceof String; + default void setTicket(String ticket) { + setTicket( + Js.uncheckedCast( + ticket)); } @JsOverlay - default boolean isUint8Array() { - return (Object) this instanceof Uint8Array; + default void setTicket(Uint8Array ticket) { + setTicket( + Js.uncheckedCast( + ticket)); } } @JsOverlay - static FetchObjectResponse.ToObjectReturnType0.ExportIdListFieldType create() { + static FetchObjectResponse.ToObjectReturnType0.TypedExportIdListFieldType create() { return Js.uncheckedCast(JsPropertyMap.of()); } @JsProperty - FetchObjectResponse.ToObjectReturnType0.ExportIdListFieldType.GetTicketUnionType getTicket(); + FetchObjectResponse.ToObjectReturnType0.TypedExportIdListFieldType.TicketFieldType getTicket(); @JsProperty String getType(); @JsProperty void setTicket( - FetchObjectResponse.ToObjectReturnType0.ExportIdListFieldType.GetTicketUnionType ticket); - - @JsOverlay - default void setTicket(String ticket) { - setTicket( - Js.uncheckedCast( - ticket)); - } - - @JsOverlay - default void setTicket(Uint8Array ticket) { - setTicket( - Js.uncheckedCast( - ticket)); - } + FetchObjectResponse.ToObjectReturnType0.TypedExportIdListFieldType.TicketFieldType ticket); @JsProperty void setType(String type); } - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface GetDataUnionType { - @JsOverlay - static FetchObjectResponse.ToObjectReturnType0.GetDataUnionType of(Object o) { - return Js.cast(o); - } - - @JsOverlay - default String asString() { - return Js.asString(this); - } - - @JsOverlay - default Uint8Array asUint8Array() { - return Js.cast(this); - } - - @JsOverlay - default boolean isString() { - return (Object) this instanceof String; - } - - @JsOverlay - default boolean isUint8Array() { - return (Object) this instanceof Uint8Array; - } - } - @JsOverlay static FetchObjectResponse.ToObjectReturnType0 create() { return Js.uncheckedCast(JsPropertyMap.of()); @@ -311,10 +341,10 @@ static FetchObjectResponse.ToObjectReturnType0 create() { FetchObjectResponse.ToObjectReturnType0.GetDataUnionType getData(); @JsProperty - JsArray getExportIdList(); + String getType(); @JsProperty - String getType(); + JsArray getTypedExportIdList(); @JsProperty void setData(FetchObjectResponse.ToObjectReturnType0.GetDataUnionType data); @@ -329,20 +359,20 @@ default void setData(Uint8Array data) { setData(Js.uncheckedCast(data)); } - @JsOverlay - default void setExportIdList( - FetchObjectResponse.ToObjectReturnType0.ExportIdListFieldType[] exportIdList) { - setExportIdList( - Js.>uncheckedCast( - exportIdList)); - } - @JsProperty - void setExportIdList( - JsArray exportIdList); + void setType(String type); @JsProperty - void setType(String type); + void setTypedExportIdList( + JsArray typedExportIdList); + + @JsOverlay + default void setTypedExportIdList( + FetchObjectResponse.ToObjectReturnType0.TypedExportIdListFieldType[] typedExportIdList) { + setTypedExportIdList( + Js.>uncheckedCast( + typedExportIdList)); + } } public static native FetchObjectResponse deserializeBinary(Uint8Array bytes); @@ -355,13 +385,13 @@ public static native FetchObjectResponse deserializeBinaryFromReader( public static native FetchObjectResponse.ToObjectReturnType toObject( boolean includeInstance, FetchObjectResponse msg); - public native TypedTicket addExportId(); + public native TypedTicket addTypedExportId(); - public native TypedTicket addExportId(TypedTicket value, double index); + public native TypedTicket addTypedExportId(TypedTicket value, double index); - public native TypedTicket addExportId(TypedTicket value); + public native TypedTicket addTypedExportId(TypedTicket value); - public native void clearExportIdList(); + public native void clearTypedExportIdList(); public native FetchObjectResponse.GetDataUnionType getData(); @@ -369,10 +399,10 @@ public static native FetchObjectResponse.ToObjectReturnType toObject( public native Uint8Array getData_asU8(); - public native JsArray getExportIdList(); - public native String getType(); + public native JsArray getTypedExportIdList(); + public native Uint8Array serializeBinary(); public native void setData(FetchObjectResponse.SetDataValueUnionType value); @@ -387,15 +417,15 @@ public final void setData(Uint8Array value) { setData(Js.uncheckedCast(value)); } - public native void setExportIdList(JsArray value); + public native void setType(String value); + + public native void setTypedExportIdList(JsArray value); @JsOverlay - public final void setExportIdList(TypedTicket[] value) { - setExportIdList(Js.>uncheckedCast(value)); + public final void setTypedExportIdList(TypedTicket[] value) { + setTypedExportIdList(Js.>uncheckedCast(value)); } - public native void setType(String value); - public native FetchObjectResponse.ToObjectReturnType0 toObject(); public native FetchObjectResponse.ToObjectReturnType0 toObject(boolean includeInstance); diff --git a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/ticket_pb/TypedTicket.java b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/ticket_pb/TypedTicket.java index 07b826673cf..aca923087c1 100644 --- a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/ticket_pb/TypedTicket.java +++ b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/ticket_pb/TypedTicket.java @@ -13,89 +13,61 @@ name = "dhinternal.io.deephaven.proto.ticket_pb.TypedTicket", namespace = JsPackage.GLOBAL) public class TypedTicket { - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface GetTicketUnionType { - @JsOverlay - static TypedTicket.GetTicketUnionType of(Object o) { - return Js.cast(o); - } - - @JsOverlay - default String asString() { - return Js.asString(this); - } - - @JsOverlay - default Uint8Array asUint8Array() { - return Js.cast(this); - } - - @JsOverlay - default boolean isString() { - return (Object) this instanceof String; - } - - @JsOverlay - default boolean isUint8Array() { - return (Object) this instanceof Uint8Array; - } - } - - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface SetTicketValueUnionType { - @JsOverlay - static TypedTicket.SetTicketValueUnionType of(Object o) { - return Js.cast(o); - } - - @JsOverlay - default String asString() { - return Js.asString(this); - } - - @JsOverlay - default Uint8Array asUint8Array() { - return Js.cast(this); - } - - @JsOverlay - default boolean isString() { - return (Object) this instanceof String; - } - - @JsOverlay - default boolean isUint8Array() { - return (Object) this instanceof Uint8Array; - } - } - @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) public interface ToObjectReturnType { @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface GetTicketUnionType { - @JsOverlay - static TypedTicket.ToObjectReturnType.GetTicketUnionType of(Object o) { - return Js.cast(o); + public interface TicketFieldType { + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface GetTicketUnionType { + @JsOverlay + static TypedTicket.ToObjectReturnType.TicketFieldType.GetTicketUnionType of(Object o) { + return Js.cast(o); + } + + @JsOverlay + default String asString() { + return Js.asString(this); + } + + @JsOverlay + default Uint8Array asUint8Array() { + return Js.cast(this); + } + + @JsOverlay + default boolean isString() { + return (Object) this instanceof String; + } + + @JsOverlay + default boolean isUint8Array() { + return (Object) this instanceof Uint8Array; + } } @JsOverlay - default String asString() { - return Js.asString(this); + static TypedTicket.ToObjectReturnType.TicketFieldType create() { + return Js.uncheckedCast(JsPropertyMap.of()); } - @JsOverlay - default Uint8Array asUint8Array() { - return Js.cast(this); - } + @JsProperty + TypedTicket.ToObjectReturnType.TicketFieldType.GetTicketUnionType getTicket(); + + @JsProperty + void setTicket(TypedTicket.ToObjectReturnType.TicketFieldType.GetTicketUnionType ticket); @JsOverlay - default boolean isString() { - return (Object) this instanceof String; + default void setTicket(String ticket) { + setTicket( + Js.uncheckedCast( + ticket)); } @JsOverlay - default boolean isUint8Array() { - return (Object) this instanceof Uint8Array; + default void setTicket(Uint8Array ticket) { + setTicket( + Js.uncheckedCast( + ticket)); } } @@ -105,23 +77,13 @@ static TypedTicket.ToObjectReturnType create() { } @JsProperty - TypedTicket.ToObjectReturnType.GetTicketUnionType getTicket(); + TypedTicket.ToObjectReturnType.TicketFieldType getTicket(); @JsProperty String getType(); @JsProperty - void setTicket(TypedTicket.ToObjectReturnType.GetTicketUnionType ticket); - - @JsOverlay - default void setTicket(String ticket) { - setTicket(Js.uncheckedCast(ticket)); - } - - @JsOverlay - default void setTicket(Uint8Array ticket) { - setTicket(Js.uncheckedCast(ticket)); - } + void setTicket(TypedTicket.ToObjectReturnType.TicketFieldType ticket); @JsProperty void setType(String type); @@ -130,30 +92,58 @@ default void setTicket(Uint8Array ticket) { @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) public interface ToObjectReturnType0 { @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface GetTicketUnionType { - @JsOverlay - static TypedTicket.ToObjectReturnType0.GetTicketUnionType of(Object o) { - return Js.cast(o); + public interface TicketFieldType { + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface GetTicketUnionType { + @JsOverlay + static TypedTicket.ToObjectReturnType0.TicketFieldType.GetTicketUnionType of(Object o) { + return Js.cast(o); + } + + @JsOverlay + default String asString() { + return Js.asString(this); + } + + @JsOverlay + default Uint8Array asUint8Array() { + return Js.cast(this); + } + + @JsOverlay + default boolean isString() { + return (Object) this instanceof String; + } + + @JsOverlay + default boolean isUint8Array() { + return (Object) this instanceof Uint8Array; + } } @JsOverlay - default String asString() { - return Js.asString(this); + static TypedTicket.ToObjectReturnType0.TicketFieldType create() { + return Js.uncheckedCast(JsPropertyMap.of()); } - @JsOverlay - default Uint8Array asUint8Array() { - return Js.cast(this); - } + @JsProperty + TypedTicket.ToObjectReturnType0.TicketFieldType.GetTicketUnionType getTicket(); + + @JsProperty + void setTicket(TypedTicket.ToObjectReturnType0.TicketFieldType.GetTicketUnionType ticket); @JsOverlay - default boolean isString() { - return (Object) this instanceof String; + default void setTicket(String ticket) { + setTicket( + Js.uncheckedCast( + ticket)); } @JsOverlay - default boolean isUint8Array() { - return (Object) this instanceof Uint8Array; + default void setTicket(Uint8Array ticket) { + setTicket( + Js.uncheckedCast( + ticket)); } } @@ -163,23 +153,13 @@ static TypedTicket.ToObjectReturnType0 create() { } @JsProperty - TypedTicket.ToObjectReturnType0.GetTicketUnionType getTicket(); + TypedTicket.ToObjectReturnType0.TicketFieldType getTicket(); @JsProperty String getType(); @JsProperty - void setTicket(TypedTicket.ToObjectReturnType0.GetTicketUnionType ticket); - - @JsOverlay - default void setTicket(String ticket) { - setTicket(Js.uncheckedCast(ticket)); - } - - @JsOverlay - default void setTicket(Uint8Array ticket) { - setTicket(Js.uncheckedCast(ticket)); - } + void setTicket(TypedTicket.ToObjectReturnType0.TicketFieldType ticket); @JsProperty void setType(String type); @@ -194,31 +174,19 @@ default void setTicket(Uint8Array ticket) { public static native TypedTicket.ToObjectReturnType toObject( boolean includeInstance, TypedTicket msg); - public native void clearType(); - - public native TypedTicket.GetTicketUnionType getTicket(); - - public native String getTicket_asB64(); + public native void clearTicket(); - public native Uint8Array getTicket_asU8(); + public native Ticket getTicket(); public native String getType(); - public native boolean hasType(); + public native boolean hasTicket(); public native Uint8Array serializeBinary(); - public native void setTicket(TypedTicket.SetTicketValueUnionType value); + public native void setTicket(); - @JsOverlay - public final void setTicket(String value) { - setTicket(Js.uncheckedCast(value)); - } - - @JsOverlay - public final void setTicket(Uint8Array value) { - setTicket(Js.uncheckedCast(value)); - } + public native void setTicket(Ticket value); public native void setType(String value); From 7681a3faa84291c63b14493f719c34a5b854007f Mon Sep 17 00:00:00 2001 From: Colin Alworth Date: Wed, 19 Jan 2022 14:52:04 -0600 Subject: [PATCH 49/62] Update to new typedticket stuff --- .../java/io/deephaven/web/client/api/WorkerConnection.java | 2 +- .../web/client/api/console/JsVariableDefinition.java | 4 ++-- .../io/deephaven/web/client/api/widget/plot/JsFigure.java | 7 +++---- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/web/client-api/src/main/java/io/deephaven/web/client/api/WorkerConnection.java b/web/client-api/src/main/java/io/deephaven/web/client/api/WorkerConnection.java index 72fa003aece..1520500f305 100644 --- a/web/client-api/src/main/java/io/deephaven/web/client/api/WorkerConnection.java +++ b/web/client-api/src/main/java/io/deephaven/web/client/api/WorkerConnection.java @@ -729,7 +729,7 @@ public JsRunnable subscribeToFieldUpdates(JsConsumer callback JsArray removedFI = data.getRemovedList(); for (int i = 0; i < removedFI.length; ++i) { - String removedId = removedFI.getAt(i).getTicket().getTicket_asB64(); + String removedId = removedFI.getAt(i).getTypedTicket().getTicket().getTicket_asB64(); JsVariableDefinition result = knownFields.get(removedId); removed[removed.length] = result; knownFields.remove(removedId); diff --git a/web/client-api/src/main/java/io/deephaven/web/client/api/console/JsVariableDefinition.java b/web/client-api/src/main/java/io/deephaven/web/client/api/console/JsVariableDefinition.java index 0b7b9cb3ffb..b4b66df2b6e 100644 --- a/web/client-api/src/main/java/io/deephaven/web/client/api/console/JsVariableDefinition.java +++ b/web/client-api/src/main/java/io/deephaven/web/client/api/console/JsVariableDefinition.java @@ -23,8 +23,8 @@ public JsVariableDefinition(String type, String title, String id, String descrip } public JsVariableDefinition(FieldInfo field) { - this.type = field.getTicket().getType(); - this.id = field.getTicket().getTicket_asB64(); + this.type = field.getTypedTicket().getType(); + this.id = field.getTypedTicket().getTicket().getTicket_asB64(); this.title = field.getFieldName(); this.description = field.getFieldDescription(); this.applicationId = field.getApplicationId(); diff --git a/web/client-api/src/main/java/io/deephaven/web/client/api/widget/plot/JsFigure.java b/web/client-api/src/main/java/io/deephaven/web/client/api/widget/plot/JsFigure.java index 440c032f812..9642017e6ec 100644 --- a/web/client-api/src/main/java/io/deephaven/web/client/api/widget/plot/JsFigure.java +++ b/web/client-api/src/main/java/io/deephaven/web/client/api/widget/plot/JsFigure.java @@ -632,13 +632,13 @@ private static class DefaultFigureTableFetch implements FigureTableFetch { @Override public Promise fetch(JsFigure figure, FetchObjectResponse response) { - int count = response.getExportIdList().length; + int count = response.getTypedExportIdList().length; JsTable[] tables = new JsTable[count]; TableMap[] tableMaps = new TableMap[count]; Promise[] promises = new Promise[count]; - response.getExportIdList().forEach((p0, p1, p2) -> { + response.getTypedExportIdList().forEach((p0, p1, p2) -> { if (!p0.getType().equals("Table")) { // TODO (deephaven-core#62) implement fetch for tablemaps assert false : p0.getType() + " found in figure, not yet supported"; @@ -649,8 +649,7 @@ public Promise fetch(JsFigure figure, FetchObjectResponse response) { // Note that creating a CTS like this means we can't actually refetch it, but that's okay, we can't // reconnect in this way without refetching the entire figure anyway. promises[p1] = Callbacks.grpcUnaryPromise(c -> { - Ticket workaround = new TableTicket(p0.getTicket().asUint8Array()).makeTicket(); - connection.tableServiceClient().getExportedTableCreationResponse(workaround, connection.metadata(), + connection.tableServiceClient().getExportedTableCreationResponse(p0.getTicket(), connection.metadata(), c::apply); }).then(etcr -> { ClientTableState cts = connection.newStateFromUnsolicitedTable(etcr, "table for figure"); From fe57ee7877e24266d2868e52a13d6fa296ef4fdf Mon Sep 17 00:00:00 2001 From: Devin Smith Date: Thu, 20 Jan 2022 06:43:42 -0800 Subject: [PATCH 50/62] spotless --- .../java/io/deephaven/web/client/api/widget/plot/JsFigure.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/web/client-api/src/main/java/io/deephaven/web/client/api/widget/plot/JsFigure.java b/web/client-api/src/main/java/io/deephaven/web/client/api/widget/plot/JsFigure.java index 9642017e6ec..8f5407ea3fc 100644 --- a/web/client-api/src/main/java/io/deephaven/web/client/api/widget/plot/JsFigure.java +++ b/web/client-api/src/main/java/io/deephaven/web/client/api/widget/plot/JsFigure.java @@ -649,7 +649,8 @@ public Promise fetch(JsFigure figure, FetchObjectResponse response) { // Note that creating a CTS like this means we can't actually refetch it, but that's okay, we can't // reconnect in this way without refetching the entire figure anyway. promises[p1] = Callbacks.grpcUnaryPromise(c -> { - connection.tableServiceClient().getExportedTableCreationResponse(p0.getTicket(), connection.metadata(), + connection.tableServiceClient().getExportedTableCreationResponse(p0.getTicket(), + connection.metadata(), c::apply); }).then(etcr -> { ClientTableState cts = connection.newStateFromUnsolicitedTable(etcr, "table for figure"); From eb9863ca3c867b32dab998868e91ab7a25455fc5 Mon Sep 17 00:00:00 2001 From: Devin Smith Date: Thu, 20 Jan 2022 09:44:34 -0800 Subject: [PATCH 51/62] Copy regenerated _pb2 --- pyclient/pydeephaven/proto/application_pb2.py | 239 +---------- .../pydeephaven/proto/application_pb2_grpc.py | 14 +- pyclient/pydeephaven/proto/console_pb2.py | 388 +++++------------- .../pydeephaven/proto/console_pb2_grpc.py | 33 -- pyclient/pydeephaven/proto/object_pb2.py | 155 +++++++ pyclient/pydeephaven/proto/object_pb2_grpc.py | 66 +++ pyclient/pydeephaven/proto/ticket_pb2.py | 50 ++- pyclient/pydeephaven/session.py | 24 +- 8 files changed, 415 insertions(+), 554 deletions(-) create mode 100644 pyclient/pydeephaven/proto/object_pb2.py create mode 100644 pyclient/pydeephaven/proto/object_pb2_grpc.py diff --git a/pyclient/pydeephaven/proto/application_pb2.py b/pyclient/pydeephaven/proto/application_pb2.py index 80d177a4541..7616e633e7e 100644 --- a/pyclient/pydeephaven/proto/application_pb2.py +++ b/pyclient/pydeephaven/proto/application_pb2.py @@ -20,7 +20,7 @@ syntax='proto3', serialized_options=b'H\001P\001', create_key=_descriptor._internal_create_key, - serialized_pb=b'\n!deephaven/proto/application.proto\x12!io.deephaven.proto.backplane.grpc\x1a\x1c\x64\x65\x65phaven/proto/ticket.proto\"\x13\n\x11ListFieldsRequest\"\xd1\x01\n\x12\x46ieldsChangeUpdate\x12=\n\x07\x63reated\x18\x01 \x03(\x0b\x32,.io.deephaven.proto.backplane.grpc.FieldInfo\x12=\n\x07updated\x18\x02 \x03(\x0b\x32,.io.deephaven.proto.backplane.grpc.FieldInfo\x12=\n\x07removed\x18\x03 \x03(\x0b\x32,.io.deephaven.proto.backplane.grpc.FieldInfo\"\xcb\x03\n\tFieldInfo\x12\x39\n\x06ticket\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12\x12\n\nfield_name\x18\x02 \x01(\t\x12J\n\nfield_type\x18\x03 \x01(\x0b\x32\x36.io.deephaven.proto.backplane.grpc.FieldInfo.FieldType\x12\x19\n\x11\x66ield_description\x18\x04 \x01(\t\x12\x18\n\x10\x61pplication_name\x18\x05 \x01(\t\x12\x16\n\x0e\x61pplication_id\x18\x06 \x01(\t\x1a\xd5\x01\n\tFieldType\x12?\n\x06\x63ustom\x18\x01 \x01(\x0b\x32-.io.deephaven.proto.backplane.grpc.CustomInfoH\x00\x12=\n\x05table\x18\x02 \x01(\x0b\x32,.io.deephaven.proto.backplane.grpc.TableInfoH\x00\x12?\n\x06\x66igure\x18\x05 \x01(\x0b\x32-.io.deephaven.proto.backplane.grpc.FigureInfoH\x00\x42\x07\n\x05\x66ield\"\x0e\n\x0cRemovedField\"\x1a\n\nCustomInfo\x12\x0c\n\x04type\x18\x01 \x01(\t\"G\n\tTableInfo\x12\x15\n\rschema_header\x18\x01 \x01(\x0c\x12\x11\n\tis_static\x18\x02 \x01(\x08\x12\x10\n\x04size\x18\x03 \x01(\x12\x42\x02\x30\x01\"\x0c\n\nFigureInfo2\x93\x01\n\x12\x41pplicationService\x12}\n\nlistFields\x12\x34.io.deephaven.proto.backplane.grpc.ListFieldsRequest\x1a\x35.io.deephaven.proto.backplane.grpc.FieldsChangeUpdate\"\x00\x30\x01\x42\x04H\x01P\x01\x62\x06proto3' + serialized_pb=b'\n!deephaven/proto/application.proto\x12!io.deephaven.proto.backplane.grpc\x1a\x1c\x64\x65\x65phaven/proto/ticket.proto\"\x13\n\x11ListFieldsRequest\"\xd1\x01\n\x12\x46ieldsChangeUpdate\x12=\n\x07\x63reated\x18\x01 \x03(\x0b\x32,.io.deephaven.proto.backplane.grpc.FieldInfo\x12=\n\x07updated\x18\x02 \x03(\x0b\x32,.io.deephaven.proto.backplane.grpc.FieldInfo\x12=\n\x07removed\x18\x03 \x03(\x0b\x32,.io.deephaven.proto.backplane.grpc.FieldInfo\"\xb2\x01\n\tFieldInfo\x12\x44\n\x0ctyped_ticket\x18\x01 \x01(\x0b\x32..io.deephaven.proto.backplane.grpc.TypedTicket\x12\x12\n\nfield_name\x18\x02 \x01(\t\x12\x19\n\x11\x66ield_description\x18\x03 \x01(\t\x12\x18\n\x10\x61pplication_name\x18\x04 \x01(\t\x12\x16\n\x0e\x61pplication_id\x18\x05 \x01(\t\"\x0e\n\x0cRemovedField2\x93\x01\n\x12\x41pplicationService\x12}\n\nListFields\x12\x34.io.deephaven.proto.backplane.grpc.ListFieldsRequest\x1a\x35.io.deephaven.proto.backplane.grpc.FieldsChangeUpdate\"\x00\x30\x01\x42\x04H\x01P\x01\x62\x06proto3' , dependencies=[deephaven_dot_proto_dot_ticket__pb2.DESCRIPTOR,]) @@ -98,56 +98,6 @@ ) -_FIELDINFO_FIELDTYPE = _descriptor.Descriptor( - name='FieldType', - full_name='io.deephaven.proto.backplane.grpc.FieldInfo.FieldType', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='custom', full_name='io.deephaven.proto.backplane.grpc.FieldInfo.FieldType.custom', index=0, - number=1, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='table', full_name='io.deephaven.proto.backplane.grpc.FieldInfo.FieldType.table', index=1, - number=2, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='figure', full_name='io.deephaven.proto.backplane.grpc.FieldInfo.FieldType.figure', index=2, - number=5, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - _descriptor.OneofDescriptor( - name='field', full_name='io.deephaven.proto.backplane.grpc.FieldInfo.FieldType.field', - index=0, containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[]), - ], - serialized_start=582, - serialized_end=795, -) - _FIELDINFO = _descriptor.Descriptor( name='FieldInfo', full_name='io.deephaven.proto.backplane.grpc.FieldInfo', @@ -157,7 +107,7 @@ create_key=_descriptor._internal_create_key, fields=[ _descriptor.FieldDescriptor( - name='ticket', full_name='io.deephaven.proto.backplane.grpc.FieldInfo.ticket', index=0, + name='typed_ticket', full_name='io.deephaven.proto.backplane.grpc.FieldInfo.typed_ticket', index=0, number=1, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, @@ -171,37 +121,30 @@ is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( - name='field_type', full_name='io.deephaven.proto.backplane.grpc.FieldInfo.field_type', index=2, - number=3, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, + name='field_description', full_name='io.deephaven.proto.backplane.grpc.FieldInfo.field_description', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=b"".decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( - name='field_description', full_name='io.deephaven.proto.backplane.grpc.FieldInfo.field_description', index=3, + name='application_name', full_name='io.deephaven.proto.backplane.grpc.FieldInfo.application_name', index=3, number=4, type=9, cpp_type=9, label=1, has_default_value=False, default_value=b"".decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( - name='application_name', full_name='io.deephaven.proto.backplane.grpc.FieldInfo.application_name', index=4, + name='application_id', full_name='io.deephaven.proto.backplane.grpc.FieldInfo.application_id', index=4, number=5, type=9, cpp_type=9, label=1, has_default_value=False, default_value=b"".decode('utf-8'), message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='application_id', full_name='io.deephaven.proto.backplane.grpc.FieldInfo.application_id', index=5, - number=6, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), ], extensions=[ ], - nested_types=[_FIELDINFO_FIELDTYPE, ], + nested_types=[], enum_types=[ ], serialized_options=None, @@ -211,7 +154,7 @@ oneofs=[ ], serialized_start=336, - serialized_end=795, + serialized_end=514, ) @@ -235,138 +178,18 @@ extension_ranges=[], oneofs=[ ], - serialized_start=797, - serialized_end=811, -) - - -_CUSTOMINFO = _descriptor.Descriptor( - name='CustomInfo', - full_name='io.deephaven.proto.backplane.grpc.CustomInfo', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='type', full_name='io.deephaven.proto.backplane.grpc.CustomInfo.type', index=0, - number=1, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=813, - serialized_end=839, -) - - -_TABLEINFO = _descriptor.Descriptor( - name='TableInfo', - full_name='io.deephaven.proto.backplane.grpc.TableInfo', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='schema_header', full_name='io.deephaven.proto.backplane.grpc.TableInfo.schema_header', index=0, - number=1, type=12, cpp_type=9, label=1, - has_default_value=False, default_value=b"", - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='is_static', full_name='io.deephaven.proto.backplane.grpc.TableInfo.is_static', index=1, - number=2, type=8, cpp_type=7, label=1, - has_default_value=False, default_value=False, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='size', full_name='io.deephaven.proto.backplane.grpc.TableInfo.size', index=2, - number=3, type=18, cpp_type=2, label=1, - has_default_value=False, default_value=0, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=b'0\001', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=841, - serialized_end=912, -) - - -_FIGUREINFO = _descriptor.Descriptor( - name='FigureInfo', - full_name='io.deephaven.proto.backplane.grpc.FigureInfo', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=914, - serialized_end=926, + serialized_start=516, + serialized_end=530, ) _FIELDSCHANGEUPDATE.fields_by_name['created'].message_type = _FIELDINFO _FIELDSCHANGEUPDATE.fields_by_name['updated'].message_type = _FIELDINFO _FIELDSCHANGEUPDATE.fields_by_name['removed'].message_type = _FIELDINFO -_FIELDINFO_FIELDTYPE.fields_by_name['custom'].message_type = _CUSTOMINFO -_FIELDINFO_FIELDTYPE.fields_by_name['table'].message_type = _TABLEINFO -_FIELDINFO_FIELDTYPE.fields_by_name['figure'].message_type = _FIGUREINFO -_FIELDINFO_FIELDTYPE.containing_type = _FIELDINFO -_FIELDINFO_FIELDTYPE.oneofs_by_name['field'].fields.append( - _FIELDINFO_FIELDTYPE.fields_by_name['custom']) -_FIELDINFO_FIELDTYPE.fields_by_name['custom'].containing_oneof = _FIELDINFO_FIELDTYPE.oneofs_by_name['field'] -_FIELDINFO_FIELDTYPE.oneofs_by_name['field'].fields.append( - _FIELDINFO_FIELDTYPE.fields_by_name['table']) -_FIELDINFO_FIELDTYPE.fields_by_name['table'].containing_oneof = _FIELDINFO_FIELDTYPE.oneofs_by_name['field'] -_FIELDINFO_FIELDTYPE.oneofs_by_name['field'].fields.append( - _FIELDINFO_FIELDTYPE.fields_by_name['figure']) -_FIELDINFO_FIELDTYPE.fields_by_name['figure'].containing_oneof = _FIELDINFO_FIELDTYPE.oneofs_by_name['field'] -_FIELDINFO.fields_by_name['ticket'].message_type = deephaven_dot_proto_dot_ticket__pb2._TICKET -_FIELDINFO.fields_by_name['field_type'].message_type = _FIELDINFO_FIELDTYPE +_FIELDINFO.fields_by_name['typed_ticket'].message_type = deephaven_dot_proto_dot_ticket__pb2._TYPEDTICKET DESCRIPTOR.message_types_by_name['ListFieldsRequest'] = _LISTFIELDSREQUEST DESCRIPTOR.message_types_by_name['FieldsChangeUpdate'] = _FIELDSCHANGEUPDATE DESCRIPTOR.message_types_by_name['FieldInfo'] = _FIELDINFO DESCRIPTOR.message_types_by_name['RemovedField'] = _REMOVEDFIELD -DESCRIPTOR.message_types_by_name['CustomInfo'] = _CUSTOMINFO -DESCRIPTOR.message_types_by_name['TableInfo'] = _TABLEINFO -DESCRIPTOR.message_types_by_name['FigureInfo'] = _FIGUREINFO _sym_db.RegisterFileDescriptor(DESCRIPTOR) ListFieldsRequest = _reflection.GeneratedProtocolMessageType('ListFieldsRequest', (_message.Message,), { @@ -384,19 +207,11 @@ _sym_db.RegisterMessage(FieldsChangeUpdate) FieldInfo = _reflection.GeneratedProtocolMessageType('FieldInfo', (_message.Message,), { - - 'FieldType' : _reflection.GeneratedProtocolMessageType('FieldType', (_message.Message,), { - 'DESCRIPTOR' : _FIELDINFO_FIELDTYPE, - '__module__' : 'pydeephaven.proto.application_pb2' - # @@protoc_insertion_point(class_scope:io.deephaven.proto.backplane.grpc.FieldInfo.FieldType) - }) - , 'DESCRIPTOR' : _FIELDINFO, '__module__' : 'pydeephaven.proto.application_pb2' # @@protoc_insertion_point(class_scope:io.deephaven.proto.backplane.grpc.FieldInfo) }) _sym_db.RegisterMessage(FieldInfo) -_sym_db.RegisterMessage(FieldInfo.FieldType) RemovedField = _reflection.GeneratedProtocolMessageType('RemovedField', (_message.Message,), { 'DESCRIPTOR' : _REMOVEDFIELD, @@ -405,30 +220,8 @@ }) _sym_db.RegisterMessage(RemovedField) -CustomInfo = _reflection.GeneratedProtocolMessageType('CustomInfo', (_message.Message,), { - 'DESCRIPTOR' : _CUSTOMINFO, - '__module__' : 'pydeephaven.proto.application_pb2' - # @@protoc_insertion_point(class_scope:io.deephaven.proto.backplane.grpc.CustomInfo) - }) -_sym_db.RegisterMessage(CustomInfo) - -TableInfo = _reflection.GeneratedProtocolMessageType('TableInfo', (_message.Message,), { - 'DESCRIPTOR' : _TABLEINFO, - '__module__' : 'pydeephaven.proto.application_pb2' - # @@protoc_insertion_point(class_scope:io.deephaven.proto.backplane.grpc.TableInfo) - }) -_sym_db.RegisterMessage(TableInfo) - -FigureInfo = _reflection.GeneratedProtocolMessageType('FigureInfo', (_message.Message,), { - 'DESCRIPTOR' : _FIGUREINFO, - '__module__' : 'pydeephaven.proto.application_pb2' - # @@protoc_insertion_point(class_scope:io.deephaven.proto.backplane.grpc.FigureInfo) - }) -_sym_db.RegisterMessage(FigureInfo) - DESCRIPTOR._options = None -_TABLEINFO.fields_by_name['size']._options = None _APPLICATIONSERVICE = _descriptor.ServiceDescriptor( name='ApplicationService', @@ -437,12 +230,12 @@ index=0, serialized_options=None, create_key=_descriptor._internal_create_key, - serialized_start=929, - serialized_end=1076, + serialized_start=533, + serialized_end=680, methods=[ _descriptor.MethodDescriptor( - name='listFields', - full_name='io.deephaven.proto.backplane.grpc.ApplicationService.listFields', + name='ListFields', + full_name='io.deephaven.proto.backplane.grpc.ApplicationService.ListFields', index=0, containing_service=None, input_type=_LISTFIELDSREQUEST, diff --git a/pyclient/pydeephaven/proto/application_pb2_grpc.py b/pyclient/pydeephaven/proto/application_pb2_grpc.py index ac691c5a1e2..31c4d1151ec 100644 --- a/pyclient/pydeephaven/proto/application_pb2_grpc.py +++ b/pyclient/pydeephaven/proto/application_pb2_grpc.py @@ -16,8 +16,8 @@ def __init__(self, channel): Args: channel: A grpc.Channel. """ - self.listFields = channel.unary_stream( - '/io.deephaven.proto.backplane.grpc.ApplicationService/listFields', + self.ListFields = channel.unary_stream( + '/io.deephaven.proto.backplane.grpc.ApplicationService/ListFields', request_serializer=deephaven_dot_proto_dot_application__pb2.ListFieldsRequest.SerializeToString, response_deserializer=deephaven_dot_proto_dot_application__pb2.FieldsChangeUpdate.FromString, ) @@ -28,7 +28,7 @@ class ApplicationServiceServicer(object): Allows clients to list fields that are accessible to them. """ - def listFields(self, request, context): + def ListFields(self, request, context): """ Request the list of the fields exposed via the worker. @@ -44,8 +44,8 @@ def listFields(self, request, context): def add_ApplicationServiceServicer_to_server(servicer, server): rpc_method_handlers = { - 'listFields': grpc.unary_stream_rpc_method_handler( - servicer.listFields, + 'ListFields': grpc.unary_stream_rpc_method_handler( + servicer.ListFields, request_deserializer=deephaven_dot_proto_dot_application__pb2.ListFieldsRequest.FromString, response_serializer=deephaven_dot_proto_dot_application__pb2.FieldsChangeUpdate.SerializeToString, ), @@ -62,7 +62,7 @@ class ApplicationService(object): """ @staticmethod - def listFields(request, + def ListFields(request, target, options=(), channel_credentials=None, @@ -72,7 +72,7 @@ def listFields(request, wait_for_ready=None, timeout=None, metadata=None): - return grpc.experimental.unary_stream(request, target, '/io.deephaven.proto.backplane.grpc.ApplicationService/listFields', + return grpc.experimental.unary_stream(request, target, '/io.deephaven.proto.backplane.grpc.ApplicationService/ListFields', deephaven_dot_proto_dot_application__pb2.ListFieldsRequest.SerializeToString, deephaven_dot_proto_dot_application__pb2.FieldsChangeUpdate.FromString, options, channel_credentials, diff --git a/pyclient/pydeephaven/proto/console_pb2.py b/pyclient/pydeephaven/proto/console_pb2.py index 1f72d3368a4..59d68873e93 100644 --- a/pyclient/pydeephaven/proto/console_pb2.py +++ b/pyclient/pydeephaven/proto/console_pb2.py @@ -13,6 +13,7 @@ from pydeephaven.proto import table_pb2 as deephaven_dot_proto_dot_table__pb2 from pydeephaven.proto import ticket_pb2 as deephaven_dot_proto_dot_ticket__pb2 +from pydeephaven.proto import application_pb2 as deephaven_dot_proto_dot_application__pb2 DESCRIPTOR = _descriptor.FileDescriptor( @@ -21,9 +22,9 @@ syntax='proto3', serialized_options=b'H\001P\001', create_key=_descriptor._internal_create_key, - serialized_pb=b'\n\x1d\x64\x65\x65phaven/proto/console.proto\x12(io.deephaven.proto.backplane.script.grpc\x1a\x1b\x64\x65\x65phaven/proto/table.proto\x1a\x1c\x64\x65\x65phaven/proto/ticket.proto\"\x18\n\x16GetConsoleTypesRequest\"0\n\x17GetConsoleTypesResponse\x12\x15\n\rconsole_types\x18\x01 \x03(\t\"i\n\x13StartConsoleRequest\x12<\n\tresult_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12\x14\n\x0csession_type\x18\x02 \x01(\t\"T\n\x14StartConsoleResponse\x12<\n\tresult_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\"I\n\x16LogSubscriptionRequest\x12\x1f\n\x17last_seen_log_timestamp\x18\x01 \x01(\x03\x12\x0e\n\x06levels\x18\x02 \x03(\t\"O\n\x13LogSubscriptionData\x12\x0e\n\x06micros\x18\x01 \x01(\x03\x12\x11\n\tlog_level\x18\x02 \x01(\t\x12\x0f\n\x07message\x18\x03 \x01(\tJ\x04\x08\x04\x10\x05\"j\n\x15\x45xecuteCommandRequest\x12=\n\nconsole_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12\x0c\n\x04\x63ode\x18\x03 \x01(\tJ\x04\x08\x02\x10\x03\"\x9c\x02\n\x16\x45xecuteCommandResponse\x12\x15\n\rerror_message\x18\x01 \x01(\t\x12M\n\x07\x63reated\x18\x02 \x03(\x0b\x32<.io.deephaven.proto.backplane.script.grpc.VariableDefinition\x12M\n\x07updated\x18\x03 \x03(\x0b\x32<.io.deephaven.proto.backplane.script.grpc.VariableDefinition\x12M\n\x07removed\x18\x04 \x03(\x0b\x32<.io.deephaven.proto.backplane.script.grpc.VariableDefinition\"h\n\x12VariableDefinition\x12\x0c\n\x04type\x18\x01 \x01(\t\x12\r\n\x05title\x18\x02 \x01(\t\x12\x35\n\x02id\x18\x03 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\"\xb5\x01\n\x1a\x42indTableToVariableRequest\x12=\n\nconsole_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12\x15\n\rvariable_name\x18\x03 \x01(\t\x12;\n\x08table_id\x18\x04 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.TicketJ\x04\x08\x02\x10\x03\"\x1d\n\x1b\x42indTableToVariableResponse\"\x94\x01\n\x14\x43\x61ncelCommandRequest\x12=\n\nconsole_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12=\n\ncommand_id\x18\x02 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\"\x17\n\x15\x43\x61ncelCommandResponse\"\x93\x03\n\x13\x41utoCompleteRequest\x12V\n\ropen_document\x18\x01 \x01(\x0b\x32=.io.deephaven.proto.backplane.script.grpc.OpenDocumentRequestH\x00\x12Z\n\x0f\x63hange_document\x18\x02 \x01(\x0b\x32?.io.deephaven.proto.backplane.script.grpc.ChangeDocumentRequestH\x00\x12\x63\n\x14get_completion_items\x18\x03 \x01(\x0b\x32\x43.io.deephaven.proto.backplane.script.grpc.GetCompletionItemsRequestH\x00\x12X\n\x0e\x63lose_document\x18\x04 \x01(\x0b\x32>.io.deephaven.proto.backplane.script.grpc.CloseDocumentRequestH\x00\x42\t\n\x07request\"\x84\x01\n\x14\x41utoCompleteResponse\x12`\n\x10\x63ompletion_items\x18\x01 \x01(\x0b\x32\x44.io.deephaven.proto.backplane.script.grpc.GetCompletionItemsResponseH\x00\x42\n\n\x08response\"\x15\n\x13\x42rowserNextResponse\"\xa7\x01\n\x13OpenDocumentRequest\x12=\n\nconsole_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12Q\n\rtext_document\x18\x02 \x01(\x0b\x32:.io.deephaven.proto.backplane.script.grpc.TextDocumentItem\"S\n\x10TextDocumentItem\x12\x0b\n\x03uri\x18\x01 \x01(\t\x12\x13\n\x0blanguage_id\x18\x02 \x01(\t\x12\x0f\n\x07version\x18\x03 \x01(\x05\x12\x0c\n\x04text\x18\x04 \x01(\t\"\xb7\x01\n\x14\x43loseDocumentRequest\x12=\n\nconsole_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12`\n\rtext_document\x18\x02 \x01(\x0b\x32I.io.deephaven.proto.backplane.script.grpc.VersionedTextDocumentIdentifier\"\xc0\x03\n\x15\x43hangeDocumentRequest\x12=\n\nconsole_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12`\n\rtext_document\x18\x02 \x01(\x0b\x32I.io.deephaven.proto.backplane.script.grpc.VersionedTextDocumentIdentifier\x12w\n\x0f\x63ontent_changes\x18\x03 \x03(\x0b\x32^.io.deephaven.proto.backplane.script.grpc.ChangeDocumentRequest.TextDocumentContentChangeEvent\x1a\x8c\x01\n\x1eTextDocumentContentChangeEvent\x12\x46\n\x05range\x18\x01 \x01(\x0b\x32\x37.io.deephaven.proto.backplane.script.grpc.DocumentRange\x12\x14\n\x0crange_length\x18\x02 \x01(\x05\x12\x0c\n\x04text\x18\x03 \x01(\t\"\x93\x01\n\rDocumentRange\x12\x41\n\x05start\x18\x01 \x01(\x0b\x32\x32.io.deephaven.proto.backplane.script.grpc.Position\x12?\n\x03\x65nd\x18\x02 \x01(\x0b\x32\x32.io.deephaven.proto.backplane.script.grpc.Position\"?\n\x1fVersionedTextDocumentIdentifier\x12\x0b\n\x03uri\x18\x01 \x01(\t\x12\x0f\n\x07version\x18\x02 \x01(\x05\"+\n\x08Position\x12\x0c\n\x04line\x18\x01 \x01(\x05\x12\x11\n\tcharacter\x18\x02 \x01(\x05\"\xe4\x02\n\x19GetCompletionItemsRequest\x12=\n\nconsole_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12L\n\x07\x63ontext\x18\x02 \x01(\x0b\x32;.io.deephaven.proto.backplane.script.grpc.CompletionContext\x12`\n\rtext_document\x18\x03 \x01(\x0b\x32I.io.deephaven.proto.backplane.script.grpc.VersionedTextDocumentIdentifier\x12\x44\n\x08position\x18\x04 \x01(\x0b\x32\x32.io.deephaven.proto.backplane.script.grpc.Position\x12\x12\n\nrequest_id\x18\x05 \x01(\x05\"D\n\x11\x43ompletionContext\x12\x14\n\x0ctrigger_kind\x18\x01 \x01(\x05\x12\x19\n\x11trigger_character\x18\x02 \x01(\t\"\x8a\x01\n\x1aGetCompletionItemsResponse\x12G\n\x05items\x18\x01 \x03(\x0b\x32\x38.io.deephaven.proto.backplane.script.grpc.CompletionItem\x12\x12\n\nrequest_id\x18\x02 \x01(\x05\x12\x0f\n\x07success\x18\x03 \x01(\x08\"\x93\x03\n\x0e\x43ompletionItem\x12\r\n\x05start\x18\x01 \x01(\x05\x12\x0e\n\x06length\x18\x02 \x01(\x05\x12\r\n\x05label\x18\x03 \x01(\t\x12\x0c\n\x04kind\x18\x04 \x01(\x05\x12\x0e\n\x06\x64\x65tail\x18\x05 \x01(\t\x12\x15\n\rdocumentation\x18\x06 \x01(\t\x12\x12\n\ndeprecated\x18\x07 \x01(\x08\x12\x11\n\tpreselect\x18\x08 \x01(\x08\x12\x45\n\ttext_edit\x18\t \x01(\x0b\x32\x32.io.deephaven.proto.backplane.script.grpc.TextEdit\x12\x11\n\tsort_text\x18\n \x01(\t\x12\x13\n\x0b\x66ilter_text\x18\x0b \x01(\t\x12\x1a\n\x12insert_text_format\x18\x0c \x01(\x05\x12Q\n\x15\x61\x64\x64itional_text_edits\x18\r \x03(\x0b\x32\x32.io.deephaven.proto.backplane.script.grpc.TextEdit\x12\x19\n\x11\x63ommit_characters\x18\x0e \x03(\t\"`\n\x08TextEdit\x12\x46\n\x05range\x18\x01 \x01(\x0b\x32\x37.io.deephaven.proto.backplane.script.grpc.DocumentRange\x12\x0c\n\x04text\x18\x02 \x01(\t\"R\n\x12\x46\x65tchFigureRequest\x12<\n\tsource_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\"l\n\x13\x46\x65tchFigureResponse\x12U\n\x11\x66igure_descriptor\x18\x01 \x01(\x0b\x32:.io.deephaven.proto.backplane.script.grpc.FigureDescriptor\"\xf7/\n\x10\x46igureDescriptor\x12\x12\n\x05title\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x12\n\ntitle_font\x18\x02 \x01(\t\x12\x13\n\x0btitle_color\x18\x03 \x01(\t\x12\x17\n\x0fupdate_interval\x18\x07 \x01(\x03\x12\x0c\n\x04\x63ols\x18\x08 \x01(\x05\x12\x0c\n\x04rows\x18\t \x01(\x05\x12Z\n\x06\x63harts\x18\n \x03(\x0b\x32J.io.deephaven.proto.backplane.script.grpc.FigureDescriptor.ChartDescriptor\x12P\n\x06tables\x18\x0b \x03(\x0b\x32@.io.deephaven.proto.backplane.grpc.ExportedTableCreationResponse\x12\x0e\n\x06\x65rrors\x18\r \x03(\t\x1a\xa0\x05\n\x0f\x43hartDescriptor\x12\x0f\n\x07\x63olspan\x18\x01 \x01(\x05\x12\x0f\n\x07rowspan\x18\x02 \x01(\x05\x12[\n\x06series\x18\x03 \x03(\x0b\x32K.io.deephaven.proto.backplane.script.grpc.FigureDescriptor.SeriesDescriptor\x12\x66\n\x0cmulti_series\x18\x04 \x03(\x0b\x32P.io.deephaven.proto.backplane.script.grpc.FigureDescriptor.MultiSeriesDescriptor\x12W\n\x04\x61xes\x18\x05 \x03(\x0b\x32I.io.deephaven.proto.backplane.script.grpc.FigureDescriptor.AxisDescriptor\x12h\n\nchart_type\x18\x06 \x01(\x0e\x32T.io.deephaven.proto.backplane.script.grpc.FigureDescriptor.ChartDescriptor.ChartType\x12\x12\n\x05title\x18\x07 \x01(\tH\x00\x88\x01\x01\x12\x12\n\ntitle_font\x18\x08 \x01(\t\x12\x13\n\x0btitle_color\x18\t \x01(\t\x12\x13\n\x0bshow_legend\x18\n \x01(\x08\x12\x13\n\x0blegend_font\x18\x0b \x01(\t\x12\x14\n\x0clegend_color\x18\x0c \x01(\t\x12\x0c\n\x04is3d\x18\r \x01(\x08\"N\n\tChartType\x12\x06\n\x02XY\x10\x00\x12\x07\n\x03PIE\x10\x01\x12\x08\n\x04OHLC\x10\x02\x12\x0c\n\x08\x43\x41TEGORY\x10\x03\x12\x07\n\x03XYZ\x10\x04\x12\x0f\n\x0b\x43\x41TEGORY_3D\x10\x05\x42\x08\n\x06_title\x1a\xfe\x04\n\x10SeriesDescriptor\x12^\n\nplot_style\x18\x01 \x01(\x0e\x32J.io.deephaven.proto.backplane.script.grpc.FigureDescriptor.SeriesPlotStyle\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x1a\n\rlines_visible\x18\x03 \x01(\x08H\x00\x88\x01\x01\x12\x1b\n\x0eshapes_visible\x18\x04 \x01(\x08H\x01\x88\x01\x01\x12\x18\n\x10gradient_visible\x18\x05 \x01(\x08\x12\x12\n\nline_color\x18\x06 \x01(\t\x12\x1f\n\x12point_label_format\x18\x08 \x01(\tH\x02\x88\x01\x01\x12\x1f\n\x12x_tool_tip_pattern\x18\t \x01(\tH\x03\x88\x01\x01\x12\x1f\n\x12y_tool_tip_pattern\x18\n \x01(\tH\x04\x88\x01\x01\x12\x13\n\x0bshape_label\x18\x0b \x01(\t\x12\x17\n\nshape_size\x18\x0c \x01(\x01H\x05\x88\x01\x01\x12\x13\n\x0bshape_color\x18\r \x01(\t\x12\r\n\x05shape\x18\x0e \x01(\t\x12\x61\n\x0c\x64\x61ta_sources\x18\x0f \x03(\x0b\x32K.io.deephaven.proto.backplane.script.grpc.FigureDescriptor.SourceDescriptorB\x10\n\x0e_lines_visibleB\x11\n\x0f_shapes_visibleB\x15\n\x13_point_label_formatB\x15\n\x13_x_tool_tip_patternB\x15\n\x13_y_tool_tip_patternB\r\n\x0b_shape_sizeJ\x04\x08\x07\x10\x08\x1a\xec\n\n\x15MultiSeriesDescriptor\x12^\n\nplot_style\x18\x01 \x01(\x0e\x32J.io.deephaven.proto.backplane.script.grpc.FigureDescriptor.SeriesPlotStyle\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x63\n\nline_color\x18\x03 \x01(\x0b\x32O.io.deephaven.proto.backplane.script.grpc.FigureDescriptor.StringMapWithDefault\x12\x64\n\x0bpoint_color\x18\x04 \x01(\x0b\x32O.io.deephaven.proto.backplane.script.grpc.FigureDescriptor.StringMapWithDefault\x12\x64\n\rlines_visible\x18\x05 \x01(\x0b\x32M.io.deephaven.proto.backplane.script.grpc.FigureDescriptor.BoolMapWithDefault\x12\x65\n\x0epoints_visible\x18\x06 \x01(\x0b\x32M.io.deephaven.proto.backplane.script.grpc.FigureDescriptor.BoolMapWithDefault\x12g\n\x10gradient_visible\x18\x07 \x01(\x0b\x32M.io.deephaven.proto.backplane.script.grpc.FigureDescriptor.BoolMapWithDefault\x12k\n\x12point_label_format\x18\x08 \x01(\x0b\x32O.io.deephaven.proto.backplane.script.grpc.FigureDescriptor.StringMapWithDefault\x12k\n\x12x_tool_tip_pattern\x18\t \x01(\x0b\x32O.io.deephaven.proto.backplane.script.grpc.FigureDescriptor.StringMapWithDefault\x12k\n\x12y_tool_tip_pattern\x18\n \x01(\x0b\x32O.io.deephaven.proto.backplane.script.grpc.FigureDescriptor.StringMapWithDefault\x12\x64\n\x0bpoint_label\x18\x0b \x01(\x0b\x32O.io.deephaven.proto.backplane.script.grpc.FigureDescriptor.StringMapWithDefault\x12\x63\n\npoint_size\x18\x0c \x01(\x0b\x32O.io.deephaven.proto.backplane.script.grpc.FigureDescriptor.DoubleMapWithDefault\x12\x64\n\x0bpoint_shape\x18\r \x01(\x0b\x32O.io.deephaven.proto.backplane.script.grpc.FigureDescriptor.StringMapWithDefault\x12l\n\x0c\x64\x61ta_sources\x18\x0e \x03(\x0b\x32V.io.deephaven.proto.backplane.script.grpc.FigureDescriptor.MultiSeriesSourceDescriptor\x1aL\n\x14StringMapWithDefault\x12\x16\n\x0e\x64\x65\x66\x61ult_string\x18\x01 \x01(\t\x12\x0c\n\x04keys\x18\x02 \x03(\t\x12\x0e\n\x06values\x18\x03 \x03(\t\x1aL\n\x14\x44oubleMapWithDefault\x12\x16\n\x0e\x64\x65\x66\x61ult_double\x18\x01 \x01(\x01\x12\x0c\n\x04keys\x18\x02 \x03(\t\x12\x0e\n\x06values\x18\x03 \x03(\x01\x1aH\n\x12\x42oolMapWithDefault\x12\x14\n\x0c\x64\x65\x66\x61ult_bool\x18\x01 \x01(\x08\x12\x0c\n\x04keys\x18\x02 \x03(\t\x12\x0e\n\x06values\x18\x03 \x03(\x08\x1a\xa6\x08\n\x0e\x41xisDescriptor\x12\n\n\x02id\x18\x01 \x01(\t\x12m\n\x0b\x66ormat_type\x18\x02 \x01(\x0e\x32X.io.deephaven.proto.backplane.script.grpc.FigureDescriptor.AxisDescriptor.AxisFormatType\x12`\n\x04type\x18\x03 \x01(\x0e\x32R.io.deephaven.proto.backplane.script.grpc.FigureDescriptor.AxisDescriptor.AxisType\x12h\n\x08position\x18\x04 \x01(\x0e\x32V.io.deephaven.proto.backplane.script.grpc.FigureDescriptor.AxisDescriptor.AxisPosition\x12\x0b\n\x03log\x18\x05 \x01(\x08\x12\r\n\x05label\x18\x06 \x01(\t\x12\x12\n\nlabel_font\x18\x07 \x01(\t\x12\x12\n\nticks_font\x18\x08 \x01(\t\x12\x1b\n\x0e\x66ormat_pattern\x18\t \x01(\tH\x00\x88\x01\x01\x12\r\n\x05\x63olor\x18\n \x01(\t\x12\x11\n\tmin_range\x18\x0b \x01(\x01\x12\x11\n\tmax_range\x18\x0c \x01(\x01\x12\x1b\n\x13minor_ticks_visible\x18\r \x01(\x08\x12\x1b\n\x13major_ticks_visible\x18\x0e \x01(\x08\x12\x18\n\x10minor_tick_count\x18\x0f \x01(\x05\x12$\n\x17gap_between_major_ticks\x18\x10 \x01(\x01H\x01\x88\x01\x01\x12\x1c\n\x14major_tick_locations\x18\x11 \x03(\x01\x12\x18\n\x10tick_label_angle\x18\x12 \x01(\x01\x12\x0e\n\x06invert\x18\x13 \x01(\x08\x12\x14\n\x0cis_time_axis\x18\x14 \x01(\x08\x12{\n\x1c\x62usiness_calendar_descriptor\x18\x15 \x01(\x0b\x32U.io.deephaven.proto.backplane.script.grpc.FigureDescriptor.BusinessCalendarDescriptor\"*\n\x0e\x41xisFormatType\x12\x0c\n\x08\x43\x41TEGORY\x10\x00\x12\n\n\x06NUMBER\x10\x01\"C\n\x08\x41xisType\x12\x05\n\x01X\x10\x00\x12\x05\n\x01Y\x10\x01\x12\t\n\x05SHAPE\x10\x02\x12\x08\n\x04SIZE\x10\x03\x12\t\n\x05LABEL\x10\x04\x12\t\n\x05\x43OLOR\x10\x05\"B\n\x0c\x41xisPosition\x12\x07\n\x03TOP\x10\x00\x12\n\n\x06\x42OTTOM\x10\x01\x12\x08\n\x04LEFT\x10\x02\x12\t\n\x05RIGHT\x10\x03\x12\x08\n\x04NONE\x10\x04\x42\x11\n\x0f_format_patternB\x1a\n\x18_gap_between_major_ticks\x1a\xf0\x06\n\x1a\x42usinessCalendarDescriptor\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x11\n\ttime_zone\x18\x02 \x01(\t\x12v\n\rbusiness_days\x18\x03 \x03(\x0e\x32_.io.deephaven.proto.backplane.script.grpc.FigureDescriptor.BusinessCalendarDescriptor.DayOfWeek\x12~\n\x10\x62usiness_periods\x18\x04 \x03(\x0b\x32\x64.io.deephaven.proto.backplane.script.grpc.FigureDescriptor.BusinessCalendarDescriptor.BusinessPeriod\x12o\n\x08holidays\x18\x05 \x03(\x0b\x32].io.deephaven.proto.backplane.script.grpc.FigureDescriptor.BusinessCalendarDescriptor.Holiday\x1a-\n\x0e\x42usinessPeriod\x12\x0c\n\x04open\x18\x01 \x01(\t\x12\r\n\x05\x63lose\x18\x02 \x01(\t\x1a\xf8\x01\n\x07Holiday\x12m\n\x04\x64\x61te\x18\x01 \x01(\x0b\x32_.io.deephaven.proto.backplane.script.grpc.FigureDescriptor.BusinessCalendarDescriptor.LocalDate\x12~\n\x10\x62usiness_periods\x18\x02 \x03(\x0b\x32\x64.io.deephaven.proto.backplane.script.grpc.FigureDescriptor.BusinessCalendarDescriptor.BusinessPeriod\x1a\x35\n\tLocalDate\x12\x0c\n\x04year\x18\x01 \x01(\x05\x12\r\n\x05month\x18\x02 \x01(\x05\x12\x0b\n\x03\x64\x61y\x18\x03 \x01(\x05\"g\n\tDayOfWeek\x12\n\n\x06SUNDAY\x10\x00\x12\n\n\x06MONDAY\x10\x01\x12\x0b\n\x07TUESDAY\x10\x02\x12\r\n\tWEDNESDAY\x10\x03\x12\x0c\n\x08THURSDAY\x10\x04\x12\n\n\x06\x46RIDAY\x10\x05\x12\x0c\n\x08SATURDAY\x10\x06\x1a\xae\x01\n\x1bMultiSeriesSourceDescriptor\x12\x0f\n\x07\x61xis_id\x18\x01 \x01(\t\x12S\n\x04type\x18\x02 \x01(\x0e\x32\x45.io.deephaven.proto.backplane.script.grpc.FigureDescriptor.SourceType\x12\x14\n\x0ctable_map_id\x18\x03 \x01(\x05\x12\x13\n\x0b\x63olumn_name\x18\x04 \x01(\t\x1a\xac\x02\n\x10SourceDescriptor\x12\x0f\n\x07\x61xis_id\x18\x01 \x01(\t\x12S\n\x04type\x18\x02 \x01(\x0e\x32\x45.io.deephaven.proto.backplane.script.grpc.FigureDescriptor.SourceType\x12\x10\n\x08table_id\x18\x03 \x01(\x05\x12\x14\n\x0ctable_map_id\x18\x04 \x01(\x05\x12\x13\n\x0b\x63olumn_name\x18\x05 \x01(\t\x12\x13\n\x0b\x63olumn_type\x18\x06 \x01(\t\x12`\n\tone_click\x18\x07 \x01(\x0b\x32M.io.deephaven.proto.backplane.script.grpc.FigureDescriptor.OneClickDescriptor\x1a\x63\n\x12OneClickDescriptor\x12\x0f\n\x07\x63olumns\x18\x01 \x03(\t\x12\x14\n\x0c\x63olumn_types\x18\x02 \x03(\t\x12&\n\x1erequire_all_filters_to_display\x18\x03 \x01(\x08\"\x99\x01\n\x0fSeriesPlotStyle\x12\x07\n\x03\x42\x41R\x10\x00\x12\x0f\n\x0bSTACKED_BAR\x10\x01\x12\x08\n\x04LINE\x10\x02\x12\x08\n\x04\x41REA\x10\x03\x12\x10\n\x0cSTACKED_AREA\x10\x04\x12\x07\n\x03PIE\x10\x05\x12\r\n\tHISTOGRAM\x10\x06\x12\x08\n\x04OHLC\x10\x07\x12\x0b\n\x07SCATTER\x10\x08\x12\x08\n\x04STEP\x10\t\x12\r\n\tERROR_BAR\x10\n\"\xac\x01\n\nSourceType\x12\x05\n\x01X\x10\x00\x12\x05\n\x01Y\x10\x01\x12\x05\n\x01Z\x10\x02\x12\t\n\x05X_LOW\x10\x03\x12\n\n\x06X_HIGH\x10\x04\x12\t\n\x05Y_LOW\x10\x05\x12\n\n\x06Y_HIGH\x10\x06\x12\x08\n\x04TIME\x10\x07\x12\x08\n\x04OPEN\x10\x08\x12\x08\n\x04HIGH\x10\t\x12\x07\n\x03LOW\x10\n\x12\t\n\x05\x43LOSE\x10\x0b\x12\t\n\x05SHAPE\x10\x0c\x12\x08\n\x04SIZE\x10\r\x12\t\n\x05LABEL\x10\x0e\x12\t\n\x05\x43OLOR\x10\x0f\x42\x08\n\x06_titleJ\x04\x08\x0c\x10\r2\x8e\x0c\n\x0e\x43onsoleService\x12\x98\x01\n\x0fGetConsoleTypes\x12@.io.deephaven.proto.backplane.script.grpc.GetConsoleTypesRequest\x1a\x41.io.deephaven.proto.backplane.script.grpc.GetConsoleTypesResponse\"\x00\x12\x8f\x01\n\x0cStartConsole\x12=.io.deephaven.proto.backplane.script.grpc.StartConsoleRequest\x1a>.io.deephaven.proto.backplane.script.grpc.StartConsoleResponse\"\x00\x12\x96\x01\n\x0fSubscribeToLogs\x12@.io.deephaven.proto.backplane.script.grpc.LogSubscriptionRequest\x1a=.io.deephaven.proto.backplane.script.grpc.LogSubscriptionData\"\x00\x30\x01\x12\x95\x01\n\x0e\x45xecuteCommand\x12?.io.deephaven.proto.backplane.script.grpc.ExecuteCommandRequest\x1a@.io.deephaven.proto.backplane.script.grpc.ExecuteCommandResponse\"\x00\x12\x92\x01\n\rCancelCommand\x12>.io.deephaven.proto.backplane.script.grpc.CancelCommandRequest\x1a?.io.deephaven.proto.backplane.script.grpc.CancelCommandResponse\"\x00\x12\xa4\x01\n\x13\x42indTableToVariable\x12\x44.io.deephaven.proto.backplane.script.grpc.BindTableToVariableRequest\x1a\x45.io.deephaven.proto.backplane.script.grpc.BindTableToVariableResponse\"\x00\x12\x99\x01\n\x12\x41utoCompleteStream\x12=.io.deephaven.proto.backplane.script.grpc.AutoCompleteRequest\x1a>.io.deephaven.proto.backplane.script.grpc.AutoCompleteResponse\"\x00(\x01\x30\x01\x12\x9b\x01\n\x16OpenAutoCompleteStream\x12=.io.deephaven.proto.backplane.script.grpc.AutoCompleteRequest\x1a>.io.deephaven.proto.backplane.script.grpc.AutoCompleteResponse\"\x00\x30\x01\x12\x98\x01\n\x16NextAutoCompleteStream\x12=.io.deephaven.proto.backplane.script.grpc.AutoCompleteRequest\x1a=.io.deephaven.proto.backplane.script.grpc.BrowserNextResponse\"\x00\x12\x8c\x01\n\x0b\x46\x65tchFigure\x12<.io.deephaven.proto.backplane.script.grpc.FetchFigureRequest\x1a=.io.deephaven.proto.backplane.script.grpc.FetchFigureResponse\"\x00\x42\x04H\x01P\x01\x62\x06proto3' + serialized_pb=b'\n\x1d\x64\x65\x65phaven/proto/console.proto\x12(io.deephaven.proto.backplane.script.grpc\x1a\x1b\x64\x65\x65phaven/proto/table.proto\x1a\x1c\x64\x65\x65phaven/proto/ticket.proto\x1a!deephaven/proto/application.proto\"\x18\n\x16GetConsoleTypesRequest\"0\n\x17GetConsoleTypesResponse\x12\x15\n\rconsole_types\x18\x01 \x03(\t\"i\n\x13StartConsoleRequest\x12<\n\tresult_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12\x14\n\x0csession_type\x18\x02 \x01(\t\"T\n\x14StartConsoleResponse\x12<\n\tresult_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\"I\n\x16LogSubscriptionRequest\x12\x1f\n\x17last_seen_log_timestamp\x18\x01 \x01(\x03\x12\x0e\n\x06levels\x18\x02 \x03(\t\"O\n\x13LogSubscriptionData\x12\x0e\n\x06micros\x18\x01 \x01(\x03\x12\x11\n\tlog_level\x18\x02 \x01(\t\x12\x0f\n\x07message\x18\x03 \x01(\tJ\x04\x08\x04\x10\x05\"j\n\x15\x45xecuteCommandRequest\x12=\n\nconsole_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12\x0c\n\x04\x63ode\x18\x03 \x01(\tJ\x04\x08\x02\x10\x03\"w\n\x16\x45xecuteCommandResponse\x12\x15\n\rerror_message\x18\x01 \x01(\t\x12\x46\n\x07\x63hanges\x18\x02 \x01(\x0b\x32\x35.io.deephaven.proto.backplane.grpc.FieldsChangeUpdate\"\xb5\x01\n\x1a\x42indTableToVariableRequest\x12=\n\nconsole_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12\x15\n\rvariable_name\x18\x03 \x01(\t\x12;\n\x08table_id\x18\x04 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.TicketJ\x04\x08\x02\x10\x03\"\x1d\n\x1b\x42indTableToVariableResponse\"\x94\x01\n\x14\x43\x61ncelCommandRequest\x12=\n\nconsole_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12=\n\ncommand_id\x18\x02 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\"\x17\n\x15\x43\x61ncelCommandResponse\"\x93\x03\n\x13\x41utoCompleteRequest\x12V\n\ropen_document\x18\x01 \x01(\x0b\x32=.io.deephaven.proto.backplane.script.grpc.OpenDocumentRequestH\x00\x12Z\n\x0f\x63hange_document\x18\x02 \x01(\x0b\x32?.io.deephaven.proto.backplane.script.grpc.ChangeDocumentRequestH\x00\x12\x63\n\x14get_completion_items\x18\x03 \x01(\x0b\x32\x43.io.deephaven.proto.backplane.script.grpc.GetCompletionItemsRequestH\x00\x12X\n\x0e\x63lose_document\x18\x04 \x01(\x0b\x32>.io.deephaven.proto.backplane.script.grpc.CloseDocumentRequestH\x00\x42\t\n\x07request\"\x84\x01\n\x14\x41utoCompleteResponse\x12`\n\x10\x63ompletion_items\x18\x01 \x01(\x0b\x32\x44.io.deephaven.proto.backplane.script.grpc.GetCompletionItemsResponseH\x00\x42\n\n\x08response\"\x15\n\x13\x42rowserNextResponse\"\xa7\x01\n\x13OpenDocumentRequest\x12=\n\nconsole_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12Q\n\rtext_document\x18\x02 \x01(\x0b\x32:.io.deephaven.proto.backplane.script.grpc.TextDocumentItem\"S\n\x10TextDocumentItem\x12\x0b\n\x03uri\x18\x01 \x01(\t\x12\x13\n\x0blanguage_id\x18\x02 \x01(\t\x12\x0f\n\x07version\x18\x03 \x01(\x05\x12\x0c\n\x04text\x18\x04 \x01(\t\"\xb7\x01\n\x14\x43loseDocumentRequest\x12=\n\nconsole_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12`\n\rtext_document\x18\x02 \x01(\x0b\x32I.io.deephaven.proto.backplane.script.grpc.VersionedTextDocumentIdentifier\"\xc0\x03\n\x15\x43hangeDocumentRequest\x12=\n\nconsole_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12`\n\rtext_document\x18\x02 \x01(\x0b\x32I.io.deephaven.proto.backplane.script.grpc.VersionedTextDocumentIdentifier\x12w\n\x0f\x63ontent_changes\x18\x03 \x03(\x0b\x32^.io.deephaven.proto.backplane.script.grpc.ChangeDocumentRequest.TextDocumentContentChangeEvent\x1a\x8c\x01\n\x1eTextDocumentContentChangeEvent\x12\x46\n\x05range\x18\x01 \x01(\x0b\x32\x37.io.deephaven.proto.backplane.script.grpc.DocumentRange\x12\x14\n\x0crange_length\x18\x02 \x01(\x05\x12\x0c\n\x04text\x18\x03 \x01(\t\"\x93\x01\n\rDocumentRange\x12\x41\n\x05start\x18\x01 \x01(\x0b\x32\x32.io.deephaven.proto.backplane.script.grpc.Position\x12?\n\x03\x65nd\x18\x02 \x01(\x0b\x32\x32.io.deephaven.proto.backplane.script.grpc.Position\"?\n\x1fVersionedTextDocumentIdentifier\x12\x0b\n\x03uri\x18\x01 \x01(\t\x12\x0f\n\x07version\x18\x02 \x01(\x05\"+\n\x08Position\x12\x0c\n\x04line\x18\x01 \x01(\x05\x12\x11\n\tcharacter\x18\x02 \x01(\x05\"\xe4\x02\n\x19GetCompletionItemsRequest\x12=\n\nconsole_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12L\n\x07\x63ontext\x18\x02 \x01(\x0b\x32;.io.deephaven.proto.backplane.script.grpc.CompletionContext\x12`\n\rtext_document\x18\x03 \x01(\x0b\x32I.io.deephaven.proto.backplane.script.grpc.VersionedTextDocumentIdentifier\x12\x44\n\x08position\x18\x04 \x01(\x0b\x32\x32.io.deephaven.proto.backplane.script.grpc.Position\x12\x12\n\nrequest_id\x18\x05 \x01(\x05\"D\n\x11\x43ompletionContext\x12\x14\n\x0ctrigger_kind\x18\x01 \x01(\x05\x12\x19\n\x11trigger_character\x18\x02 \x01(\t\"\x8a\x01\n\x1aGetCompletionItemsResponse\x12G\n\x05items\x18\x01 \x03(\x0b\x32\x38.io.deephaven.proto.backplane.script.grpc.CompletionItem\x12\x12\n\nrequest_id\x18\x02 \x01(\x05\x12\x0f\n\x07success\x18\x03 \x01(\x08\"\x93\x03\n\x0e\x43ompletionItem\x12\r\n\x05start\x18\x01 \x01(\x05\x12\x0e\n\x06length\x18\x02 \x01(\x05\x12\r\n\x05label\x18\x03 \x01(\t\x12\x0c\n\x04kind\x18\x04 \x01(\x05\x12\x0e\n\x06\x64\x65tail\x18\x05 \x01(\t\x12\x15\n\rdocumentation\x18\x06 \x01(\t\x12\x12\n\ndeprecated\x18\x07 \x01(\x08\x12\x11\n\tpreselect\x18\x08 \x01(\x08\x12\x45\n\ttext_edit\x18\t \x01(\x0b\x32\x32.io.deephaven.proto.backplane.script.grpc.TextEdit\x12\x11\n\tsort_text\x18\n \x01(\t\x12\x13\n\x0b\x66ilter_text\x18\x0b \x01(\t\x12\x1a\n\x12insert_text_format\x18\x0c \x01(\x05\x12Q\n\x15\x61\x64\x64itional_text_edits\x18\r \x03(\x0b\x32\x32.io.deephaven.proto.backplane.script.grpc.TextEdit\x12\x19\n\x11\x63ommit_characters\x18\x0e \x03(\t\"`\n\x08TextEdit\x12\x46\n\x05range\x18\x01 \x01(\x0b\x32\x37.io.deephaven.proto.backplane.script.grpc.DocumentRange\x12\x0c\n\x04text\x18\x02 \x01(\t\"\xab/\n\x10\x46igureDescriptor\x12\x12\n\x05title\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x12\n\ntitle_font\x18\x02 \x01(\t\x12\x13\n\x0btitle_color\x18\x03 \x01(\t\x12\x17\n\x0fupdate_interval\x18\x07 \x01(\x03\x12\x0c\n\x04\x63ols\x18\x08 \x01(\x05\x12\x0c\n\x04rows\x18\t \x01(\x05\x12Z\n\x06\x63harts\x18\n \x03(\x0b\x32J.io.deephaven.proto.backplane.script.grpc.FigureDescriptor.ChartDescriptor\x12\x0e\n\x06\x65rrors\x18\r \x03(\t\x1a\xa0\x05\n\x0f\x43hartDescriptor\x12\x0f\n\x07\x63olspan\x18\x01 \x01(\x05\x12\x0f\n\x07rowspan\x18\x02 \x01(\x05\x12[\n\x06series\x18\x03 \x03(\x0b\x32K.io.deephaven.proto.backplane.script.grpc.FigureDescriptor.SeriesDescriptor\x12\x66\n\x0cmulti_series\x18\x04 \x03(\x0b\x32P.io.deephaven.proto.backplane.script.grpc.FigureDescriptor.MultiSeriesDescriptor\x12W\n\x04\x61xes\x18\x05 \x03(\x0b\x32I.io.deephaven.proto.backplane.script.grpc.FigureDescriptor.AxisDescriptor\x12h\n\nchart_type\x18\x06 \x01(\x0e\x32T.io.deephaven.proto.backplane.script.grpc.FigureDescriptor.ChartDescriptor.ChartType\x12\x12\n\x05title\x18\x07 \x01(\tH\x00\x88\x01\x01\x12\x12\n\ntitle_font\x18\x08 \x01(\t\x12\x13\n\x0btitle_color\x18\t \x01(\t\x12\x13\n\x0bshow_legend\x18\n \x01(\x08\x12\x13\n\x0blegend_font\x18\x0b \x01(\t\x12\x14\n\x0clegend_color\x18\x0c \x01(\t\x12\x0c\n\x04is3d\x18\r \x01(\x08\"N\n\tChartType\x12\x06\n\x02XY\x10\x00\x12\x07\n\x03PIE\x10\x01\x12\x08\n\x04OHLC\x10\x02\x12\x0c\n\x08\x43\x41TEGORY\x10\x03\x12\x07\n\x03XYZ\x10\x04\x12\x0f\n\x0b\x43\x41TEGORY_3D\x10\x05\x42\x08\n\x06_title\x1a\xfe\x04\n\x10SeriesDescriptor\x12^\n\nplot_style\x18\x01 \x01(\x0e\x32J.io.deephaven.proto.backplane.script.grpc.FigureDescriptor.SeriesPlotStyle\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x1a\n\rlines_visible\x18\x03 \x01(\x08H\x00\x88\x01\x01\x12\x1b\n\x0eshapes_visible\x18\x04 \x01(\x08H\x01\x88\x01\x01\x12\x18\n\x10gradient_visible\x18\x05 \x01(\x08\x12\x12\n\nline_color\x18\x06 \x01(\t\x12\x1f\n\x12point_label_format\x18\x08 \x01(\tH\x02\x88\x01\x01\x12\x1f\n\x12x_tool_tip_pattern\x18\t \x01(\tH\x03\x88\x01\x01\x12\x1f\n\x12y_tool_tip_pattern\x18\n \x01(\tH\x04\x88\x01\x01\x12\x13\n\x0bshape_label\x18\x0b \x01(\t\x12\x17\n\nshape_size\x18\x0c \x01(\x01H\x05\x88\x01\x01\x12\x13\n\x0bshape_color\x18\r \x01(\t\x12\r\n\x05shape\x18\x0e \x01(\t\x12\x61\n\x0c\x64\x61ta_sources\x18\x0f \x03(\x0b\x32K.io.deephaven.proto.backplane.script.grpc.FigureDescriptor.SourceDescriptorB\x10\n\x0e_lines_visibleB\x11\n\x0f_shapes_visibleB\x15\n\x13_point_label_formatB\x15\n\x13_x_tool_tip_patternB\x15\n\x13_y_tool_tip_patternB\r\n\x0b_shape_sizeJ\x04\x08\x07\x10\x08\x1a\xec\n\n\x15MultiSeriesDescriptor\x12^\n\nplot_style\x18\x01 \x01(\x0e\x32J.io.deephaven.proto.backplane.script.grpc.FigureDescriptor.SeriesPlotStyle\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x63\n\nline_color\x18\x03 \x01(\x0b\x32O.io.deephaven.proto.backplane.script.grpc.FigureDescriptor.StringMapWithDefault\x12\x64\n\x0bpoint_color\x18\x04 \x01(\x0b\x32O.io.deephaven.proto.backplane.script.grpc.FigureDescriptor.StringMapWithDefault\x12\x64\n\rlines_visible\x18\x05 \x01(\x0b\x32M.io.deephaven.proto.backplane.script.grpc.FigureDescriptor.BoolMapWithDefault\x12\x65\n\x0epoints_visible\x18\x06 \x01(\x0b\x32M.io.deephaven.proto.backplane.script.grpc.FigureDescriptor.BoolMapWithDefault\x12g\n\x10gradient_visible\x18\x07 \x01(\x0b\x32M.io.deephaven.proto.backplane.script.grpc.FigureDescriptor.BoolMapWithDefault\x12k\n\x12point_label_format\x18\x08 \x01(\x0b\x32O.io.deephaven.proto.backplane.script.grpc.FigureDescriptor.StringMapWithDefault\x12k\n\x12x_tool_tip_pattern\x18\t \x01(\x0b\x32O.io.deephaven.proto.backplane.script.grpc.FigureDescriptor.StringMapWithDefault\x12k\n\x12y_tool_tip_pattern\x18\n \x01(\x0b\x32O.io.deephaven.proto.backplane.script.grpc.FigureDescriptor.StringMapWithDefault\x12\x64\n\x0bpoint_label\x18\x0b \x01(\x0b\x32O.io.deephaven.proto.backplane.script.grpc.FigureDescriptor.StringMapWithDefault\x12\x63\n\npoint_size\x18\x0c \x01(\x0b\x32O.io.deephaven.proto.backplane.script.grpc.FigureDescriptor.DoubleMapWithDefault\x12\x64\n\x0bpoint_shape\x18\r \x01(\x0b\x32O.io.deephaven.proto.backplane.script.grpc.FigureDescriptor.StringMapWithDefault\x12l\n\x0c\x64\x61ta_sources\x18\x0e \x03(\x0b\x32V.io.deephaven.proto.backplane.script.grpc.FigureDescriptor.MultiSeriesSourceDescriptor\x1aL\n\x14StringMapWithDefault\x12\x16\n\x0e\x64\x65\x66\x61ult_string\x18\x01 \x01(\t\x12\x0c\n\x04keys\x18\x02 \x03(\t\x12\x0e\n\x06values\x18\x03 \x03(\t\x1aL\n\x14\x44oubleMapWithDefault\x12\x16\n\x0e\x64\x65\x66\x61ult_double\x18\x01 \x01(\x01\x12\x0c\n\x04keys\x18\x02 \x03(\t\x12\x0e\n\x06values\x18\x03 \x03(\x01\x1aH\n\x12\x42oolMapWithDefault\x12\x14\n\x0c\x64\x65\x66\x61ult_bool\x18\x01 \x01(\x08\x12\x0c\n\x04keys\x18\x02 \x03(\t\x12\x0e\n\x06values\x18\x03 \x03(\x08\x1a\xa6\x08\n\x0e\x41xisDescriptor\x12\n\n\x02id\x18\x01 \x01(\t\x12m\n\x0b\x66ormat_type\x18\x02 \x01(\x0e\x32X.io.deephaven.proto.backplane.script.grpc.FigureDescriptor.AxisDescriptor.AxisFormatType\x12`\n\x04type\x18\x03 \x01(\x0e\x32R.io.deephaven.proto.backplane.script.grpc.FigureDescriptor.AxisDescriptor.AxisType\x12h\n\x08position\x18\x04 \x01(\x0e\x32V.io.deephaven.proto.backplane.script.grpc.FigureDescriptor.AxisDescriptor.AxisPosition\x12\x0b\n\x03log\x18\x05 \x01(\x08\x12\r\n\x05label\x18\x06 \x01(\t\x12\x12\n\nlabel_font\x18\x07 \x01(\t\x12\x12\n\nticks_font\x18\x08 \x01(\t\x12\x1b\n\x0e\x66ormat_pattern\x18\t \x01(\tH\x00\x88\x01\x01\x12\r\n\x05\x63olor\x18\n \x01(\t\x12\x11\n\tmin_range\x18\x0b \x01(\x01\x12\x11\n\tmax_range\x18\x0c \x01(\x01\x12\x1b\n\x13minor_ticks_visible\x18\r \x01(\x08\x12\x1b\n\x13major_ticks_visible\x18\x0e \x01(\x08\x12\x18\n\x10minor_tick_count\x18\x0f \x01(\x05\x12$\n\x17gap_between_major_ticks\x18\x10 \x01(\x01H\x01\x88\x01\x01\x12\x1c\n\x14major_tick_locations\x18\x11 \x03(\x01\x12\x18\n\x10tick_label_angle\x18\x12 \x01(\x01\x12\x0e\n\x06invert\x18\x13 \x01(\x08\x12\x14\n\x0cis_time_axis\x18\x14 \x01(\x08\x12{\n\x1c\x62usiness_calendar_descriptor\x18\x15 \x01(\x0b\x32U.io.deephaven.proto.backplane.script.grpc.FigureDescriptor.BusinessCalendarDescriptor\"*\n\x0e\x41xisFormatType\x12\x0c\n\x08\x43\x41TEGORY\x10\x00\x12\n\n\x06NUMBER\x10\x01\"C\n\x08\x41xisType\x12\x05\n\x01X\x10\x00\x12\x05\n\x01Y\x10\x01\x12\t\n\x05SHAPE\x10\x02\x12\x08\n\x04SIZE\x10\x03\x12\t\n\x05LABEL\x10\x04\x12\t\n\x05\x43OLOR\x10\x05\"B\n\x0c\x41xisPosition\x12\x07\n\x03TOP\x10\x00\x12\n\n\x06\x42OTTOM\x10\x01\x12\x08\n\x04LEFT\x10\x02\x12\t\n\x05RIGHT\x10\x03\x12\x08\n\x04NONE\x10\x04\x42\x11\n\x0f_format_patternB\x1a\n\x18_gap_between_major_ticks\x1a\xf0\x06\n\x1a\x42usinessCalendarDescriptor\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x11\n\ttime_zone\x18\x02 \x01(\t\x12v\n\rbusiness_days\x18\x03 \x03(\x0e\x32_.io.deephaven.proto.backplane.script.grpc.FigureDescriptor.BusinessCalendarDescriptor.DayOfWeek\x12~\n\x10\x62usiness_periods\x18\x04 \x03(\x0b\x32\x64.io.deephaven.proto.backplane.script.grpc.FigureDescriptor.BusinessCalendarDescriptor.BusinessPeriod\x12o\n\x08holidays\x18\x05 \x03(\x0b\x32].io.deephaven.proto.backplane.script.grpc.FigureDescriptor.BusinessCalendarDescriptor.Holiday\x1a-\n\x0e\x42usinessPeriod\x12\x0c\n\x04open\x18\x01 \x01(\t\x12\r\n\x05\x63lose\x18\x02 \x01(\t\x1a\xf8\x01\n\x07Holiday\x12m\n\x04\x64\x61te\x18\x01 \x01(\x0b\x32_.io.deephaven.proto.backplane.script.grpc.FigureDescriptor.BusinessCalendarDescriptor.LocalDate\x12~\n\x10\x62usiness_periods\x18\x02 \x03(\x0b\x32\x64.io.deephaven.proto.backplane.script.grpc.FigureDescriptor.BusinessCalendarDescriptor.BusinessPeriod\x1a\x35\n\tLocalDate\x12\x0c\n\x04year\x18\x01 \x01(\x05\x12\r\n\x05month\x18\x02 \x01(\x05\x12\x0b\n\x03\x64\x61y\x18\x03 \x01(\x05\"g\n\tDayOfWeek\x12\n\n\x06SUNDAY\x10\x00\x12\n\n\x06MONDAY\x10\x01\x12\x0b\n\x07TUESDAY\x10\x02\x12\r\n\tWEDNESDAY\x10\x03\x12\x0c\n\x08THURSDAY\x10\x04\x12\n\n\x06\x46RIDAY\x10\x05\x12\x0c\n\x08SATURDAY\x10\x06\x1a\xae\x01\n\x1bMultiSeriesSourceDescriptor\x12\x0f\n\x07\x61xis_id\x18\x01 \x01(\t\x12S\n\x04type\x18\x02 \x01(\x0e\x32\x45.io.deephaven.proto.backplane.script.grpc.FigureDescriptor.SourceType\x12\x14\n\x0ctable_map_id\x18\x03 \x01(\x05\x12\x13\n\x0b\x63olumn_name\x18\x04 \x01(\t\x1a\xac\x02\n\x10SourceDescriptor\x12\x0f\n\x07\x61xis_id\x18\x01 \x01(\t\x12S\n\x04type\x18\x02 \x01(\x0e\x32\x45.io.deephaven.proto.backplane.script.grpc.FigureDescriptor.SourceType\x12\x10\n\x08table_id\x18\x03 \x01(\x05\x12\x14\n\x0ctable_map_id\x18\x04 \x01(\x05\x12\x13\n\x0b\x63olumn_name\x18\x05 \x01(\t\x12\x13\n\x0b\x63olumn_type\x18\x06 \x01(\t\x12`\n\tone_click\x18\x07 \x01(\x0b\x32M.io.deephaven.proto.backplane.script.grpc.FigureDescriptor.OneClickDescriptor\x1a\x63\n\x12OneClickDescriptor\x12\x0f\n\x07\x63olumns\x18\x01 \x03(\t\x12\x14\n\x0c\x63olumn_types\x18\x02 \x03(\t\x12&\n\x1erequire_all_filters_to_display\x18\x03 \x01(\x08\"\x99\x01\n\x0fSeriesPlotStyle\x12\x07\n\x03\x42\x41R\x10\x00\x12\x0f\n\x0bSTACKED_BAR\x10\x01\x12\x08\n\x04LINE\x10\x02\x12\x08\n\x04\x41REA\x10\x03\x12\x10\n\x0cSTACKED_AREA\x10\x04\x12\x07\n\x03PIE\x10\x05\x12\r\n\tHISTOGRAM\x10\x06\x12\x08\n\x04OHLC\x10\x07\x12\x0b\n\x07SCATTER\x10\x08\x12\x08\n\x04STEP\x10\t\x12\r\n\tERROR_BAR\x10\n\"\xac\x01\n\nSourceType\x12\x05\n\x01X\x10\x00\x12\x05\n\x01Y\x10\x01\x12\x05\n\x01Z\x10\x02\x12\t\n\x05X_LOW\x10\x03\x12\n\n\x06X_HIGH\x10\x04\x12\t\n\x05Y_LOW\x10\x05\x12\n\n\x06Y_HIGH\x10\x06\x12\x08\n\x04TIME\x10\x07\x12\x08\n\x04OPEN\x10\x08\x12\x08\n\x04HIGH\x10\t\x12\x07\n\x03LOW\x10\n\x12\t\n\x05\x43LOSE\x10\x0b\x12\t\n\x05SHAPE\x10\x0c\x12\x08\n\x04SIZE\x10\r\x12\t\n\x05LABEL\x10\x0e\x12\t\n\x05\x43OLOR\x10\x0f\x42\x08\n\x06_titleJ\x04\x08\x0b\x10\x0cJ\x04\x08\x0c\x10\r2\xff\n\n\x0e\x43onsoleService\x12\x98\x01\n\x0fGetConsoleTypes\x12@.io.deephaven.proto.backplane.script.grpc.GetConsoleTypesRequest\x1a\x41.io.deephaven.proto.backplane.script.grpc.GetConsoleTypesResponse\"\x00\x12\x8f\x01\n\x0cStartConsole\x12=.io.deephaven.proto.backplane.script.grpc.StartConsoleRequest\x1a>.io.deephaven.proto.backplane.script.grpc.StartConsoleResponse\"\x00\x12\x96\x01\n\x0fSubscribeToLogs\x12@.io.deephaven.proto.backplane.script.grpc.LogSubscriptionRequest\x1a=.io.deephaven.proto.backplane.script.grpc.LogSubscriptionData\"\x00\x30\x01\x12\x95\x01\n\x0e\x45xecuteCommand\x12?.io.deephaven.proto.backplane.script.grpc.ExecuteCommandRequest\x1a@.io.deephaven.proto.backplane.script.grpc.ExecuteCommandResponse\"\x00\x12\x92\x01\n\rCancelCommand\x12>.io.deephaven.proto.backplane.script.grpc.CancelCommandRequest\x1a?.io.deephaven.proto.backplane.script.grpc.CancelCommandResponse\"\x00\x12\xa4\x01\n\x13\x42indTableToVariable\x12\x44.io.deephaven.proto.backplane.script.grpc.BindTableToVariableRequest\x1a\x45.io.deephaven.proto.backplane.script.grpc.BindTableToVariableResponse\"\x00\x12\x99\x01\n\x12\x41utoCompleteStream\x12=.io.deephaven.proto.backplane.script.grpc.AutoCompleteRequest\x1a>.io.deephaven.proto.backplane.script.grpc.AutoCompleteResponse\"\x00(\x01\x30\x01\x12\x9b\x01\n\x16OpenAutoCompleteStream\x12=.io.deephaven.proto.backplane.script.grpc.AutoCompleteRequest\x1a>.io.deephaven.proto.backplane.script.grpc.AutoCompleteResponse\"\x00\x30\x01\x12\x98\x01\n\x16NextAutoCompleteStream\x12=.io.deephaven.proto.backplane.script.grpc.AutoCompleteRequest\x1a=.io.deephaven.proto.backplane.script.grpc.BrowserNextResponse\"\x00\x42\x04H\x01P\x01\x62\x06proto3' , - dependencies=[deephaven_dot_proto_dot_table__pb2.DESCRIPTOR,deephaven_dot_proto_dot_ticket__pb2.DESCRIPTOR,]) + dependencies=[deephaven_dot_proto_dot_table__pb2.DESCRIPTOR,deephaven_dot_proto_dot_ticket__pb2.DESCRIPTOR,deephaven_dot_proto_dot_application__pb2.DESCRIPTOR,]) @@ -67,8 +68,8 @@ ], containing_type=None, serialized_options=None, - serialized_start=5345, - serialized_end=5423, + serialized_start=4832, + serialized_end=4910, ) _sym_db.RegisterEnumDescriptor(_FIGUREDESCRIPTOR_CHARTDESCRIPTOR_CHARTTYPE) @@ -92,8 +93,8 @@ ], containing_type=None, serialized_options=None, - serialized_start=8534, - serialized_end=8576, + serialized_start=8021, + serialized_end=8063, ) _sym_db.RegisterEnumDescriptor(_FIGUREDESCRIPTOR_AXISDESCRIPTOR_AXISFORMATTYPE) @@ -137,8 +138,8 @@ ], containing_type=None, serialized_options=None, - serialized_start=8578, - serialized_end=8645, + serialized_start=8065, + serialized_end=8132, ) _sym_db.RegisterEnumDescriptor(_FIGUREDESCRIPTOR_AXISDESCRIPTOR_AXISTYPE) @@ -177,8 +178,8 @@ ], containing_type=None, serialized_options=None, - serialized_start=8647, - serialized_end=8713, + serialized_start=8134, + serialized_end=8200, ) _sym_db.RegisterEnumDescriptor(_FIGUREDESCRIPTOR_AXISDESCRIPTOR_AXISPOSITION) @@ -227,8 +228,8 @@ ], containing_type=None, serialized_options=None, - serialized_start=9540, - serialized_end=9643, + serialized_start=9027, + serialized_end=9130, ) _sym_db.RegisterEnumDescriptor(_FIGUREDESCRIPTOR_BUSINESSCALENDARDESCRIPTOR_DAYOFWEEK) @@ -297,8 +298,8 @@ ], containing_type=None, serialized_options=None, - serialized_start=10227, - serialized_end=10380, + serialized_start=9714, + serialized_end=9867, ) _sym_db.RegisterEnumDescriptor(_FIGUREDESCRIPTOR_SERIESPLOTSTYLE) @@ -392,8 +393,8 @@ ], containing_type=None, serialized_options=None, - serialized_start=10383, - serialized_end=10555, + serialized_start=9870, + serialized_end=10042, ) _sym_db.RegisterEnumDescriptor(_FIGUREDESCRIPTOR_SOURCETYPE) @@ -418,8 +419,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=134, - serialized_end=158, + serialized_start=169, + serialized_end=193, ) @@ -450,8 +451,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=160, - serialized_end=208, + serialized_start=195, + serialized_end=243, ) @@ -489,8 +490,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=210, - serialized_end=315, + serialized_start=245, + serialized_end=350, ) @@ -521,8 +522,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=317, - serialized_end=401, + serialized_start=352, + serialized_end=436, ) @@ -560,8 +561,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=403, - serialized_end=476, + serialized_start=438, + serialized_end=511, ) @@ -606,8 +607,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=478, - serialized_end=557, + serialized_start=513, + serialized_end=592, ) @@ -645,8 +646,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=559, - serialized_end=665, + serialized_start=594, + serialized_end=700, ) @@ -666,68 +667,8 @@ is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( - name='created', full_name='io.deephaven.proto.backplane.script.grpc.ExecuteCommandResponse.created', index=1, - number=2, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='updated', full_name='io.deephaven.proto.backplane.script.grpc.ExecuteCommandResponse.updated', index=2, - number=3, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='removed', full_name='io.deephaven.proto.backplane.script.grpc.ExecuteCommandResponse.removed', index=3, - number=4, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=668, - serialized_end=952, -) - - -_VARIABLEDEFINITION = _descriptor.Descriptor( - name='VariableDefinition', - full_name='io.deephaven.proto.backplane.script.grpc.VariableDefinition', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='type', full_name='io.deephaven.proto.backplane.script.grpc.VariableDefinition.type', index=0, - number=1, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='title', full_name='io.deephaven.proto.backplane.script.grpc.VariableDefinition.title', index=1, - number=2, type=9, cpp_type=9, label=1, - has_default_value=False, default_value=b"".decode('utf-8'), - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='id', full_name='io.deephaven.proto.backplane.script.grpc.VariableDefinition.id', index=2, - number=3, type=11, cpp_type=10, label=1, + name='changes', full_name='io.deephaven.proto.backplane.script.grpc.ExecuteCommandResponse.changes', index=1, + number=2, type=11, cpp_type=10, label=1, has_default_value=False, default_value=None, message_type=None, enum_type=None, containing_type=None, is_extension=False, extension_scope=None, @@ -744,8 +685,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=954, - serialized_end=1058, + serialized_start=702, + serialized_end=821, ) @@ -790,8 +731,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=1061, - serialized_end=1242, + serialized_start=824, + serialized_end=1005, ) @@ -815,8 +756,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=1244, - serialized_end=1273, + serialized_start=1007, + serialized_end=1036, ) @@ -854,8 +795,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=1276, - serialized_end=1424, + serialized_start=1039, + serialized_end=1187, ) @@ -879,8 +820,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=1426, - serialized_end=1449, + serialized_start=1189, + serialized_end=1212, ) @@ -937,8 +878,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=1452, - serialized_end=1855, + serialized_start=1215, + serialized_end=1618, ) @@ -974,8 +915,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=1858, - serialized_end=1990, + serialized_start=1621, + serialized_end=1753, ) @@ -999,8 +940,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=1992, - serialized_end=2013, + serialized_start=1755, + serialized_end=1776, ) @@ -1038,8 +979,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=2016, - serialized_end=2183, + serialized_start=1779, + serialized_end=1946, ) @@ -1091,8 +1032,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=2185, - serialized_end=2268, + serialized_start=1948, + serialized_end=2031, ) @@ -1130,8 +1071,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=2271, - serialized_end=2454, + serialized_start=2034, + serialized_end=2217, ) @@ -1176,8 +1117,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=2765, - serialized_end=2905, + serialized_start=2528, + serialized_end=2668, ) _CHANGEDOCUMENTREQUEST = _descriptor.Descriptor( @@ -1221,8 +1162,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=2457, - serialized_end=2905, + serialized_start=2220, + serialized_end=2668, ) @@ -1260,8 +1201,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=2908, - serialized_end=3055, + serialized_start=2671, + serialized_end=2818, ) @@ -1299,8 +1240,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=3057, - serialized_end=3120, + serialized_start=2820, + serialized_end=2883, ) @@ -1338,8 +1279,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=3122, - serialized_end=3165, + serialized_start=2885, + serialized_end=2928, ) @@ -1398,8 +1339,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=3168, - serialized_end=3524, + serialized_start=2931, + serialized_end=3287, ) @@ -1437,8 +1378,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=3526, - serialized_end=3594, + serialized_start=3289, + serialized_end=3357, ) @@ -1483,8 +1424,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=3597, - serialized_end=3735, + serialized_start=3360, + serialized_end=3498, ) @@ -1606,8 +1547,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=3738, - serialized_end=4141, + serialized_start=3501, + serialized_end=3904, ) @@ -1645,72 +1586,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=4143, - serialized_end=4239, -) - - -_FETCHFIGUREREQUEST = _descriptor.Descriptor( - name='FetchFigureRequest', - full_name='io.deephaven.proto.backplane.script.grpc.FetchFigureRequest', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='source_id', full_name='io.deephaven.proto.backplane.script.grpc.FetchFigureRequest.source_id', index=0, - number=1, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=4241, - serialized_end=4323, -) - - -_FETCHFIGURERESPONSE = _descriptor.Descriptor( - name='FetchFigureResponse', - full_name='io.deephaven.proto.backplane.script.grpc.FetchFigureResponse', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - _descriptor.FieldDescriptor( - name='figure_descriptor', full_name='io.deephaven.proto.backplane.script.grpc.FetchFigureResponse.figure_descriptor', index=0, - number=1, type=11, cpp_type=10, label=1, - has_default_value=False, default_value=None, - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=4325, - serialized_end=4433, + serialized_start=3906, + serialized_end=4002, ) @@ -1831,8 +1708,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=4761, - serialized_end=5433, + serialized_start=4248, + serialized_end=4920, ) _FIGUREDESCRIPTOR_SERIESDESCRIPTOR = _descriptor.Descriptor( @@ -1983,8 +1860,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=5436, - serialized_end=6074, + serialized_start=4923, + serialized_end=5561, ) _FIGUREDESCRIPTOR_MULTISERIESDESCRIPTOR = _descriptor.Descriptor( @@ -2105,8 +1982,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=6077, - serialized_end=7465, + serialized_start=5564, + serialized_end=6952, ) _FIGUREDESCRIPTOR_STRINGMAPWITHDEFAULT = _descriptor.Descriptor( @@ -2150,8 +2027,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=7467, - serialized_end=7543, + serialized_start=6954, + serialized_end=7030, ) _FIGUREDESCRIPTOR_DOUBLEMAPWITHDEFAULT = _descriptor.Descriptor( @@ -2195,8 +2072,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=7545, - serialized_end=7621, + serialized_start=7032, + serialized_end=7108, ) _FIGUREDESCRIPTOR_BOOLMAPWITHDEFAULT = _descriptor.Descriptor( @@ -2240,8 +2117,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=7623, - serialized_end=7695, + serialized_start=7110, + serialized_end=7182, ) _FIGUREDESCRIPTOR_AXISDESCRIPTOR = _descriptor.Descriptor( @@ -2424,8 +2301,8 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=7698, - serialized_end=8760, + serialized_start=7185, + serialized_end=8247, ) _FIGUREDESCRIPTOR_BUSINESSCALENDARDESCRIPTOR_BUSINESSPERIOD = _descriptor.Descriptor( @@ -2462,8 +2339,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=9187, - serialized_end=9232, + serialized_start=8674, + serialized_end=8719, ) _FIGUREDESCRIPTOR_BUSINESSCALENDARDESCRIPTOR_HOLIDAY = _descriptor.Descriptor( @@ -2500,8 +2377,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=9235, - serialized_end=9483, + serialized_start=8722, + serialized_end=8970, ) _FIGUREDESCRIPTOR_BUSINESSCALENDARDESCRIPTOR_LOCALDATE = _descriptor.Descriptor( @@ -2545,8 +2422,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=9485, - serialized_end=9538, + serialized_start=8972, + serialized_end=9025, ) _FIGUREDESCRIPTOR_BUSINESSCALENDARDESCRIPTOR = _descriptor.Descriptor( @@ -2605,8 +2482,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=8763, - serialized_end=9643, + serialized_start=8250, + serialized_end=9130, ) _FIGUREDESCRIPTOR_MULTISERIESSOURCEDESCRIPTOR = _descriptor.Descriptor( @@ -2657,8 +2534,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=9646, - serialized_end=9820, + serialized_start=9133, + serialized_end=9307, ) _FIGUREDESCRIPTOR_SOURCEDESCRIPTOR = _descriptor.Descriptor( @@ -2730,8 +2607,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=9823, - serialized_end=10123, + serialized_start=9310, + serialized_end=9610, ) _FIGUREDESCRIPTOR_ONECLICKDESCRIPTOR = _descriptor.Descriptor( @@ -2775,8 +2652,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=10125, - serialized_end=10224, + serialized_start=9612, + serialized_end=9711, ) _FIGUREDESCRIPTOR = _descriptor.Descriptor( @@ -2837,14 +2714,7 @@ is_extension=False, extension_scope=None, serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), _descriptor.FieldDescriptor( - name='tables', full_name='io.deephaven.proto.backplane.script.grpc.FigureDescriptor.tables', index=7, - number=11, type=11, cpp_type=10, label=3, - has_default_value=False, default_value=[], - message_type=None, enum_type=None, containing_type=None, - is_extension=False, extension_scope=None, - serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), - _descriptor.FieldDescriptor( - name='errors', full_name='io.deephaven.proto.backplane.script.grpc.FigureDescriptor.errors', index=8, + name='errors', full_name='io.deephaven.proto.backplane.script.grpc.FigureDescriptor.errors', index=7, number=13, type=9, cpp_type=9, label=3, has_default_value=False, default_value=[], message_type=None, enum_type=None, containing_type=None, @@ -2869,17 +2739,14 @@ create_key=_descriptor._internal_create_key, fields=[]), ], - serialized_start=4436, - serialized_end=10571, + serialized_start=4005, + serialized_end=10064, ) _STARTCONSOLEREQUEST.fields_by_name['result_id'].message_type = deephaven_dot_proto_dot_ticket__pb2._TICKET _STARTCONSOLERESPONSE.fields_by_name['result_id'].message_type = deephaven_dot_proto_dot_ticket__pb2._TICKET _EXECUTECOMMANDREQUEST.fields_by_name['console_id'].message_type = deephaven_dot_proto_dot_ticket__pb2._TICKET -_EXECUTECOMMANDRESPONSE.fields_by_name['created'].message_type = _VARIABLEDEFINITION -_EXECUTECOMMANDRESPONSE.fields_by_name['updated'].message_type = _VARIABLEDEFINITION -_EXECUTECOMMANDRESPONSE.fields_by_name['removed'].message_type = _VARIABLEDEFINITION -_VARIABLEDEFINITION.fields_by_name['id'].message_type = deephaven_dot_proto_dot_ticket__pb2._TICKET +_EXECUTECOMMANDRESPONSE.fields_by_name['changes'].message_type = deephaven_dot_proto_dot_application__pb2._FIELDSCHANGEUPDATE _BINDTABLETOVARIABLEREQUEST.fields_by_name['console_id'].message_type = deephaven_dot_proto_dot_ticket__pb2._TICKET _BINDTABLETOVARIABLEREQUEST.fields_by_name['table_id'].message_type = deephaven_dot_proto_dot_ticket__pb2._TICKET _CANCELCOMMANDREQUEST.fields_by_name['console_id'].message_type = deephaven_dot_proto_dot_ticket__pb2._TICKET @@ -2923,8 +2790,6 @@ _COMPLETIONITEM.fields_by_name['text_edit'].message_type = _TEXTEDIT _COMPLETIONITEM.fields_by_name['additional_text_edits'].message_type = _TEXTEDIT _TEXTEDIT.fields_by_name['range'].message_type = _DOCUMENTRANGE -_FETCHFIGUREREQUEST.fields_by_name['source_id'].message_type = deephaven_dot_proto_dot_ticket__pb2._TICKET -_FETCHFIGURERESPONSE.fields_by_name['figure_descriptor'].message_type = _FIGUREDESCRIPTOR _FIGUREDESCRIPTOR_CHARTDESCRIPTOR.fields_by_name['series'].message_type = _FIGUREDESCRIPTOR_SERIESDESCRIPTOR _FIGUREDESCRIPTOR_CHARTDESCRIPTOR.fields_by_name['multi_series'].message_type = _FIGUREDESCRIPTOR_MULTISERIESDESCRIPTOR _FIGUREDESCRIPTOR_CHARTDESCRIPTOR.fields_by_name['axes'].message_type = _FIGUREDESCRIPTOR_AXISDESCRIPTOR @@ -3003,7 +2868,6 @@ _FIGUREDESCRIPTOR_SOURCEDESCRIPTOR.containing_type = _FIGUREDESCRIPTOR _FIGUREDESCRIPTOR_ONECLICKDESCRIPTOR.containing_type = _FIGUREDESCRIPTOR _FIGUREDESCRIPTOR.fields_by_name['charts'].message_type = _FIGUREDESCRIPTOR_CHARTDESCRIPTOR -_FIGUREDESCRIPTOR.fields_by_name['tables'].message_type = deephaven_dot_proto_dot_table__pb2._EXPORTEDTABLECREATIONRESPONSE _FIGUREDESCRIPTOR_SERIESPLOTSTYLE.containing_type = _FIGUREDESCRIPTOR _FIGUREDESCRIPTOR_SOURCETYPE.containing_type = _FIGUREDESCRIPTOR _FIGUREDESCRIPTOR.oneofs_by_name['_title'].fields.append( @@ -3017,7 +2881,6 @@ DESCRIPTOR.message_types_by_name['LogSubscriptionData'] = _LOGSUBSCRIPTIONDATA DESCRIPTOR.message_types_by_name['ExecuteCommandRequest'] = _EXECUTECOMMANDREQUEST DESCRIPTOR.message_types_by_name['ExecuteCommandResponse'] = _EXECUTECOMMANDRESPONSE -DESCRIPTOR.message_types_by_name['VariableDefinition'] = _VARIABLEDEFINITION DESCRIPTOR.message_types_by_name['BindTableToVariableRequest'] = _BINDTABLETOVARIABLEREQUEST DESCRIPTOR.message_types_by_name['BindTableToVariableResponse'] = _BINDTABLETOVARIABLERESPONSE DESCRIPTOR.message_types_by_name['CancelCommandRequest'] = _CANCELCOMMANDREQUEST @@ -3037,8 +2900,6 @@ DESCRIPTOR.message_types_by_name['GetCompletionItemsResponse'] = _GETCOMPLETIONITEMSRESPONSE DESCRIPTOR.message_types_by_name['CompletionItem'] = _COMPLETIONITEM DESCRIPTOR.message_types_by_name['TextEdit'] = _TEXTEDIT -DESCRIPTOR.message_types_by_name['FetchFigureRequest'] = _FETCHFIGUREREQUEST -DESCRIPTOR.message_types_by_name['FetchFigureResponse'] = _FETCHFIGURERESPONSE DESCRIPTOR.message_types_by_name['FigureDescriptor'] = _FIGUREDESCRIPTOR _sym_db.RegisterFileDescriptor(DESCRIPTOR) @@ -3098,13 +2959,6 @@ }) _sym_db.RegisterMessage(ExecuteCommandResponse) -VariableDefinition = _reflection.GeneratedProtocolMessageType('VariableDefinition', (_message.Message,), { - 'DESCRIPTOR' : _VARIABLEDEFINITION, - '__module__' : 'pydeephaven.proto.console_pb2' - # @@protoc_insertion_point(class_scope:io.deephaven.proto.backplane.script.grpc.VariableDefinition) - }) -_sym_db.RegisterMessage(VariableDefinition) - BindTableToVariableRequest = _reflection.GeneratedProtocolMessageType('BindTableToVariableRequest', (_message.Message,), { 'DESCRIPTOR' : _BINDTABLETOVARIABLEREQUEST, '__module__' : 'pydeephaven.proto.console_pb2' @@ -3246,20 +3100,6 @@ }) _sym_db.RegisterMessage(TextEdit) -FetchFigureRequest = _reflection.GeneratedProtocolMessageType('FetchFigureRequest', (_message.Message,), { - 'DESCRIPTOR' : _FETCHFIGUREREQUEST, - '__module__' : 'pydeephaven.proto.console_pb2' - # @@protoc_insertion_point(class_scope:io.deephaven.proto.backplane.script.grpc.FetchFigureRequest) - }) -_sym_db.RegisterMessage(FetchFigureRequest) - -FetchFigureResponse = _reflection.GeneratedProtocolMessageType('FetchFigureResponse', (_message.Message,), { - 'DESCRIPTOR' : _FETCHFIGURERESPONSE, - '__module__' : 'pydeephaven.proto.console_pb2' - # @@protoc_insertion_point(class_scope:io.deephaven.proto.backplane.script.grpc.FetchFigureResponse) - }) -_sym_db.RegisterMessage(FetchFigureResponse) - FigureDescriptor = _reflection.GeneratedProtocolMessageType('FigureDescriptor', (_message.Message,), { 'ChartDescriptor' : _reflection.GeneratedProtocolMessageType('ChartDescriptor', (_message.Message,), { @@ -3389,8 +3229,8 @@ index=0, serialized_options=None, create_key=_descriptor._internal_create_key, - serialized_start=10574, - serialized_end=12124, + serialized_start=10067, + serialized_end=11474, methods=[ _descriptor.MethodDescriptor( name='GetConsoleTypes', @@ -3482,16 +3322,6 @@ serialized_options=None, create_key=_descriptor._internal_create_key, ), - _descriptor.MethodDescriptor( - name='FetchFigure', - full_name='io.deephaven.proto.backplane.script.grpc.ConsoleService.FetchFigure', - index=9, - containing_service=None, - input_type=_FETCHFIGUREREQUEST, - output_type=_FETCHFIGURERESPONSE, - serialized_options=None, - create_key=_descriptor._internal_create_key, - ), ]) _sym_db.RegisterServiceDescriptor(_CONSOLESERVICE) diff --git a/pyclient/pydeephaven/proto/console_pb2_grpc.py b/pyclient/pydeephaven/proto/console_pb2_grpc.py index 525a84f82f6..6b87dbc4aad 100644 --- a/pyclient/pydeephaven/proto/console_pb2_grpc.py +++ b/pyclient/pydeephaven/proto/console_pb2_grpc.py @@ -61,11 +61,6 @@ def __init__(self, channel): request_serializer=deephaven_dot_proto_dot_console__pb2.AutoCompleteRequest.SerializeToString, response_deserializer=deephaven_dot_proto_dot_console__pb2.BrowserNextResponse.FromString, ) - self.FetchFigure = channel.unary_unary( - '/io.deephaven.proto.backplane.script.grpc.ConsoleService/FetchFigure', - request_serializer=deephaven_dot_proto_dot_console__pb2.FetchFigureRequest.SerializeToString, - response_deserializer=deephaven_dot_proto_dot_console__pb2.FetchFigureResponse.FromString, - ) class ConsoleServiceServicer(object): @@ -137,12 +132,6 @@ def NextAutoCompleteStream(self, request, context): context.set_details('Method not implemented!') raise NotImplementedError('Method not implemented!') - def FetchFigure(self, request, context): - """Missing associated documentation comment in .proto file.""" - context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details('Method not implemented!') - raise NotImplementedError('Method not implemented!') - def add_ConsoleServiceServicer_to_server(servicer, server): rpc_method_handlers = { @@ -191,11 +180,6 @@ def add_ConsoleServiceServicer_to_server(servicer, server): request_deserializer=deephaven_dot_proto_dot_console__pb2.AutoCompleteRequest.FromString, response_serializer=deephaven_dot_proto_dot_console__pb2.BrowserNextResponse.SerializeToString, ), - 'FetchFigure': grpc.unary_unary_rpc_method_handler( - servicer.FetchFigure, - request_deserializer=deephaven_dot_proto_dot_console__pb2.FetchFigureRequest.FromString, - response_serializer=deephaven_dot_proto_dot_console__pb2.FetchFigureResponse.SerializeToString, - ), } generic_handler = grpc.method_handlers_generic_handler( 'io.deephaven.proto.backplane.script.grpc.ConsoleService', rpc_method_handlers) @@ -360,20 +344,3 @@ def NextAutoCompleteStream(request, deephaven_dot_proto_dot_console__pb2.BrowserNextResponse.FromString, options, channel_credentials, insecure, call_credentials, compression, wait_for_ready, timeout, metadata) - - @staticmethod - def FetchFigure(request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None): - return grpc.experimental.unary_unary(request, target, '/io.deephaven.proto.backplane.script.grpc.ConsoleService/FetchFigure', - deephaven_dot_proto_dot_console__pb2.FetchFigureRequest.SerializeToString, - deephaven_dot_proto_dot_console__pb2.FetchFigureResponse.FromString, - options, channel_credentials, - insecure, call_credentials, compression, wait_for_ready, timeout, metadata) diff --git a/pyclient/pydeephaven/proto/object_pb2.py b/pyclient/pydeephaven/proto/object_pb2.py new file mode 100644 index 00000000000..cad67e91cbb --- /dev/null +++ b/pyclient/pydeephaven/proto/object_pb2.py @@ -0,0 +1,155 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: deephaven/proto/object.proto +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from pydeephaven.proto import ticket_pb2 as deephaven_dot_proto_dot_ticket__pb2 + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='deephaven/proto/object.proto', + package='io.deephaven.proto.backplane.grpc', + syntax='proto3', + serialized_options=b'H\001P\001', + create_key=_descriptor._internal_create_key, + serialized_pb=b'\n\x1c\x64\x65\x65phaven/proto/object.proto\x12!io.deephaven.proto.backplane.grpc\x1a\x1c\x64\x65\x65phaven/proto/ticket.proto\"R\n\x12\x46\x65tchObjectRequest\x12<\n\tsource_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\"z\n\x13\x46\x65tchObjectResponse\x12\x0c\n\x04type\x18\x01 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\x0c\x12G\n\x0ftyped_export_id\x18\x03 \x03(\x0b\x32..io.deephaven.proto.backplane.grpc.TypedTicket2\x8f\x01\n\rObjectService\x12~\n\x0b\x46\x65tchObject\x12\x35.io.deephaven.proto.backplane.grpc.FetchObjectRequest\x1a\x36.io.deephaven.proto.backplane.grpc.FetchObjectResponse\"\x00\x42\x04H\x01P\x01\x62\x06proto3' + , + dependencies=[deephaven_dot_proto_dot_ticket__pb2.DESCRIPTOR,]) + + + + +_FETCHOBJECTREQUEST = _descriptor.Descriptor( + name='FetchObjectRequest', + full_name='io.deephaven.proto.backplane.grpc.FetchObjectRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='source_id', full_name='io.deephaven.proto.backplane.grpc.FetchObjectRequest.source_id', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=97, + serialized_end=179, +) + + +_FETCHOBJECTRESPONSE = _descriptor.Descriptor( + name='FetchObjectResponse', + full_name='io.deephaven.proto.backplane.grpc.FetchObjectResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='type', full_name='io.deephaven.proto.backplane.grpc.FetchObjectResponse.type', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=b"".decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='data', full_name='io.deephaven.proto.backplane.grpc.FetchObjectResponse.data', index=1, + number=2, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=b"", + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='typed_export_id', full_name='io.deephaven.proto.backplane.grpc.FetchObjectResponse.typed_export_id', index=2, + number=3, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=181, + serialized_end=303, +) + +_FETCHOBJECTREQUEST.fields_by_name['source_id'].message_type = deephaven_dot_proto_dot_ticket__pb2._TICKET +_FETCHOBJECTRESPONSE.fields_by_name['typed_export_id'].message_type = deephaven_dot_proto_dot_ticket__pb2._TYPEDTICKET +DESCRIPTOR.message_types_by_name['FetchObjectRequest'] = _FETCHOBJECTREQUEST +DESCRIPTOR.message_types_by_name['FetchObjectResponse'] = _FETCHOBJECTRESPONSE +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +FetchObjectRequest = _reflection.GeneratedProtocolMessageType('FetchObjectRequest', (_message.Message,), { + 'DESCRIPTOR' : _FETCHOBJECTREQUEST, + '__module__' : 'pydeephaven.proto.object_pb2' + # @@protoc_insertion_point(class_scope:io.deephaven.proto.backplane.grpc.FetchObjectRequest) + }) +_sym_db.RegisterMessage(FetchObjectRequest) + +FetchObjectResponse = _reflection.GeneratedProtocolMessageType('FetchObjectResponse', (_message.Message,), { + 'DESCRIPTOR' : _FETCHOBJECTRESPONSE, + '__module__' : 'pydeephaven.proto.object_pb2' + # @@protoc_insertion_point(class_scope:io.deephaven.proto.backplane.grpc.FetchObjectResponse) + }) +_sym_db.RegisterMessage(FetchObjectResponse) + + +DESCRIPTOR._options = None + +_OBJECTSERVICE = _descriptor.ServiceDescriptor( + name='ObjectService', + full_name='io.deephaven.proto.backplane.grpc.ObjectService', + file=DESCRIPTOR, + index=0, + serialized_options=None, + create_key=_descriptor._internal_create_key, + serialized_start=306, + serialized_end=449, + methods=[ + _descriptor.MethodDescriptor( + name='FetchObject', + full_name='io.deephaven.proto.backplane.grpc.ObjectService.FetchObject', + index=0, + containing_service=None, + input_type=_FETCHOBJECTREQUEST, + output_type=_FETCHOBJECTRESPONSE, + serialized_options=None, + create_key=_descriptor._internal_create_key, + ), +]) +_sym_db.RegisterServiceDescriptor(_OBJECTSERVICE) + +DESCRIPTOR.services_by_name['ObjectService'] = _OBJECTSERVICE + +# @@protoc_insertion_point(module_scope) diff --git a/pyclient/pydeephaven/proto/object_pb2_grpc.py b/pyclient/pydeephaven/proto/object_pb2_grpc.py new file mode 100644 index 00000000000..36a420d766c --- /dev/null +++ b/pyclient/pydeephaven/proto/object_pb2_grpc.py @@ -0,0 +1,66 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +"""Client and server classes corresponding to protobuf-defined services.""" +import grpc + +from pydeephaven.proto import object_pb2 as deephaven_dot_proto_dot_object__pb2 + + +class ObjectServiceStub(object): + """Missing associated documentation comment in .proto file.""" + + def __init__(self, channel): + """Constructor. + + Args: + channel: A grpc.Channel. + """ + self.FetchObject = channel.unary_unary( + '/io.deephaven.proto.backplane.grpc.ObjectService/FetchObject', + request_serializer=deephaven_dot_proto_dot_object__pb2.FetchObjectRequest.SerializeToString, + response_deserializer=deephaven_dot_proto_dot_object__pb2.FetchObjectResponse.FromString, + ) + + +class ObjectServiceServicer(object): + """Missing associated documentation comment in .proto file.""" + + def FetchObject(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + +def add_ObjectServiceServicer_to_server(servicer, server): + rpc_method_handlers = { + 'FetchObject': grpc.unary_unary_rpc_method_handler( + servicer.FetchObject, + request_deserializer=deephaven_dot_proto_dot_object__pb2.FetchObjectRequest.FromString, + response_serializer=deephaven_dot_proto_dot_object__pb2.FetchObjectResponse.SerializeToString, + ), + } + generic_handler = grpc.method_handlers_generic_handler( + 'io.deephaven.proto.backplane.grpc.ObjectService', rpc_method_handlers) + server.add_generic_rpc_handlers((generic_handler,)) + + + # This class is part of an EXPERIMENTAL API. +class ObjectService(object): + """Missing associated documentation comment in .proto file.""" + + @staticmethod + def FetchObject(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/io.deephaven.proto.backplane.grpc.ObjectService/FetchObject', + deephaven_dot_proto_dot_object__pb2.FetchObjectRequest.SerializeToString, + deephaven_dot_proto_dot_object__pb2.FetchObjectResponse.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) diff --git a/pyclient/pydeephaven/proto/ticket_pb2.py b/pyclient/pydeephaven/proto/ticket_pb2.py index df97c0d30b6..3be5d1f0fc9 100644 --- a/pyclient/pydeephaven/proto/ticket_pb2.py +++ b/pyclient/pydeephaven/proto/ticket_pb2.py @@ -19,7 +19,7 @@ syntax='proto3', serialized_options=b'H\001P\001', create_key=_descriptor._internal_create_key, - serialized_pb=b'\n\x1c\x64\x65\x65phaven/proto/ticket.proto\x12!io.deephaven.proto.backplane.grpc\"\x18\n\x06Ticket\x12\x0e\n\x06ticket\x18\x01 \x01(\x0c\x42\x04H\x01P\x01\x62\x06proto3' + serialized_pb=b'\n\x1c\x64\x65\x65phaven/proto/ticket.proto\x12!io.deephaven.proto.backplane.grpc\"\x18\n\x06Ticket\x12\x0e\n\x06ticket\x18\x01 \x01(\x0c\"V\n\x0bTypedTicket\x12\x39\n\x06ticket\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\x12\x0c\n\x04type\x18\x02 \x01(\tB\x04H\x01P\x01\x62\x06proto3' ) @@ -56,7 +56,48 @@ serialized_end=91, ) + +_TYPEDTICKET = _descriptor.Descriptor( + name='TypedTicket', + full_name='io.deephaven.proto.backplane.grpc.TypedTicket', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='ticket', full_name='io.deephaven.proto.backplane.grpc.TypedTicket.ticket', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='type', full_name='io.deephaven.proto.backplane.grpc.TypedTicket.type', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=b"".decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=93, + serialized_end=179, +) + +_TYPEDTICKET.fields_by_name['ticket'].message_type = _TICKET DESCRIPTOR.message_types_by_name['Ticket'] = _TICKET +DESCRIPTOR.message_types_by_name['TypedTicket'] = _TYPEDTICKET _sym_db.RegisterFileDescriptor(DESCRIPTOR) Ticket = _reflection.GeneratedProtocolMessageType('Ticket', (_message.Message,), { @@ -66,6 +107,13 @@ }) _sym_db.RegisterMessage(Ticket) +TypedTicket = _reflection.GeneratedProtocolMessageType('TypedTicket', (_message.Message,), { + 'DESCRIPTOR' : _TYPEDTICKET, + '__module__' : 'pydeephaven.proto.ticket_pb2' + # @@protoc_insertion_point(class_scope:io.deephaven.proto.backplane.grpc.TypedTicket) + }) +_sym_db.RegisterMessage(TypedTicket) + DESCRIPTOR._options = None # @@protoc_insertion_point(module_scope) diff --git a/pyclient/pydeephaven/session.py b/pyclient/pydeephaven/session.py index 1fd0f1b4a7a..12429ab4e17 100644 --- a/pyclient/pydeephaven/session.py +++ b/pyclient/pydeephaven/session.py @@ -180,17 +180,19 @@ def release(self, ticket): self.session_service.release(ticket) def _parse_script_response(self, response): - if response.created: - for t in response.created: - self._tables[t.title] = (t.type, Table(session=self, ticket=t.id)) - - if response.updated: - for t in response.updated: - self._tables[t.title] = (t.type, Table(session=self, ticket=t.id)) - - if response.removed: - for t in response.removed: - self._tables.pop(t.title, None) + if response.changes.created: + for t in response.changes.created: + t_type = None if t.typed_ticket.type == '' else t.typed_ticket.type + self._tables[t.field_name] = (t_type, Table(session=self, ticket=t.typed_ticket.ticket)) + + if response.changes.updated: + for t in response.changes.updated: + t_type = None if t.typed_ticket.type == '' else t.typed_ticket.type + self._tables[t.field_name] = (t_type, Table(session=self, ticket=t.typed_ticket.ticket)) + + if response.changes.removed: + for t in response.changes.removed: + self._tables.pop(t.field_name, None) # convenience/factory methods def run_script(self, script: str) -> None: From 1811bb3130a00a9dccc230fd6dd746d49d4059b6 Mon Sep 17 00:00:00 2001 From: Devin Smith Date: Fri, 21 Jan 2022 09:06:27 -0800 Subject: [PATCH 52/62] Final fixes --- .../io/deephaven/server/console/ConsoleServiceGrpcImpl.java | 2 +- .../src/main/java/io/deephaven/server/session/SessionState.java | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/server/src/main/java/io/deephaven/server/console/ConsoleServiceGrpcImpl.java b/server/src/main/java/io/deephaven/server/console/ConsoleServiceGrpcImpl.java index d4bc27b4b2a..d16a46e69d9 100644 --- a/server/src/main/java/io/deephaven/server/console/ConsoleServiceGrpcImpl.java +++ b/server/src/main/java/io/deephaven/server/console/ConsoleServiceGrpcImpl.java @@ -238,7 +238,7 @@ private static FieldInfo makeVariableDefinition(String title, String type) { .setTicket(ScopeTicketResolver.ticketForName(title)) .build(); return FieldInfo.newBuilder() - .setApplicationId("") + .setApplicationId("scope") .setFieldName(title) .setFieldDescription("query scope variable") .setTypedTicket(id) diff --git a/server/src/main/java/io/deephaven/server/session/SessionState.java b/server/src/main/java/io/deephaven/server/session/SessionState.java index 445e208f277..c4e97e236ba 100644 --- a/server/src/main/java/io/deephaven/server/session/SessionState.java +++ b/server/src/main/java/io/deephaven/server/session/SessionState.java @@ -737,7 +737,6 @@ private synchronized void setState(final ExportNotification.State state) { } if (isExportStateFailure(state) && errorHandler != null) { - Assert.neqNull(errorId, "errorId"); if (errorId == null) { assignErrorId(); } From b298d472ea39bc7836a09ec856789b6d99c903a7 Mon Sep 17 00:00:00 2001 From: Devin Smith Date: Fri, 21 Jan 2022 13:16:25 -0800 Subject: [PATCH 53/62] plumb TypedTicket --- .../deephaven/client/examples/FetchObject.java | 16 ++++++++-------- .../deephaven/client/impl/ObjectService.java | 2 +- .../io/deephaven/client/impl/SessionImpl.java | 7 +++++-- .../proto/deephaven/proto/application.proto | 7 ------- .../main/proto/deephaven/proto/object.proto | 2 +- server/build.gradle | 4 +--- .../server/object/ObjectServiceGrpcImpl.java | 18 +++++++++++++----- 7 files changed, 29 insertions(+), 27 deletions(-) diff --git a/java-client/session-examples/src/main/java/io/deephaven/client/examples/FetchObject.java b/java-client/session-examples/src/main/java/io/deephaven/client/examples/FetchObject.java index 9495e45a805..6dd3de729e7 100644 --- a/java-client/session-examples/src/main/java/io/deephaven/client/examples/FetchObject.java +++ b/java-client/session-examples/src/main/java/io/deephaven/client/examples/FetchObject.java @@ -20,6 +20,9 @@ description = "Fetch object", version = "0.1.0") class FetchObject extends SingleSessionExampleBase { + @Option(names = {"--type"}, required = true, description = "The ticket type.") + String type; + @ArgGroup(exclusive = true, multiplicity = "1") Ticket ticket; @@ -31,12 +34,12 @@ class FetchObject extends SingleSessionExampleBase { @Override protected void execute(Session session) throws Exception { - show(session, ticket); + show(session, type, ticket); } - private void show(Session session, HasTicketId ticket) + private void show(Session session, String type, HasTicketId ticket) throws IOException, ExecutionException, InterruptedException { - final FetchedObject customObject = session.fetchObject(ticket).get(); + final FetchedObject customObject = session.fetchObject(type, ticket).get(); show(session, customObject); } @@ -57,11 +60,8 @@ private void show(Session session, FetchedObject customObject) } if (recursive) { for (ExportId exportId : customObject.exportIds()) { - try { - show(session, exportId); - } catch (ExecutionException e) { - // ignore - // TODO: better RPC return around fetchObject when exportId is not fetchable + if (exportId.type().isPresent()) { + show(session, exportId.type().get(), exportId); } } } diff --git a/java-client/session/src/main/java/io/deephaven/client/impl/ObjectService.java b/java-client/session/src/main/java/io/deephaven/client/impl/ObjectService.java index 50a29809518..adb10e38256 100644 --- a/java-client/session/src/main/java/io/deephaven/client/impl/ObjectService.java +++ b/java-client/session/src/main/java/io/deephaven/client/impl/ObjectService.java @@ -9,5 +9,5 @@ public interface ObjectService { * @param ticket the ticket * @return the future */ - CompletableFuture fetchObject(HasTicketId ticket); + CompletableFuture fetchObject(String type, HasTicketId ticket); } diff --git a/java-client/session/src/main/java/io/deephaven/client/impl/SessionImpl.java b/java-client/session/src/main/java/io/deephaven/client/impl/SessionImpl.java index 39102547ace..c7689dbfe6c 100644 --- a/java-client/session/src/main/java/io/deephaven/client/impl/SessionImpl.java +++ b/java-client/session/src/main/java/io/deephaven/client/impl/SessionImpl.java @@ -254,9 +254,12 @@ public CompletableFuture publish(String name, HasTicketId ticketId) { } @Override - public CompletableFuture fetchObject(HasTicketId ticketId) { + public CompletableFuture fetchObject(String type, HasTicketId ticketId) { final FetchObjectRequest request = FetchObjectRequest.newBuilder() - .setSourceId(ticketId.ticketId().ticket()) + .setSourceId(TypedTicket.newBuilder() + .setType(type) + .setTicket(ticketId.ticketId().ticket()) + .build()) .build(); final FetchObserver observer = new FetchObserver(); objectService.fetchObject(request, observer); diff --git a/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/application.proto b/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/application.proto index e34229b1185..bfe46dcf184 100644 --- a/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/application.proto +++ b/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/application.proto @@ -51,10 +51,3 @@ message FieldInfo { string application_name = 4; // display-friendly identification string application_id = 5; // computer-friendly identification } - -/* - * RemovedField represents that the provided ticket is no longer available. - */ -message RemovedField { - // Intentionally empty and is here for backwards compatibility should this API change. -} diff --git a/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/object.proto b/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/object.proto index c55b88c7c26..eb9f1b69cd9 100644 --- a/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/object.proto +++ b/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/object.proto @@ -16,7 +16,7 @@ service ObjectService { } message FetchObjectRequest { - io.deephaven.proto.backplane.grpc.Ticket source_id = 1; + io.deephaven.proto.backplane.grpc.TypedTicket source_id = 1; } message FetchObjectResponse { diff --git a/server/build.gradle b/server/build.gradle index 51a993ce0af..0c7a0fd2c1c 100644 --- a/server/build.gradle +++ b/server/build.gradle @@ -42,9 +42,7 @@ dependencies { api project(':plugin') - // TODO(deephaven-core#1784): Remove fetchFigure RPC - // this can be runtimeOnly only after #1784 - implementation project(':plugin-figure') + runtimeOnly project(':plugin-figure') Classpaths.inheritGrpcPlatform(project, 'api') diff --git a/server/src/main/java/io/deephaven/server/object/ObjectServiceGrpcImpl.java b/server/src/main/java/io/deephaven/server/object/ObjectServiceGrpcImpl.java index fcd8fb535be..2eee645e4e2 100644 --- a/server/src/main/java/io/deephaven/server/object/ObjectServiceGrpcImpl.java +++ b/server/src/main/java/io/deephaven/server/object/ObjectServiceGrpcImpl.java @@ -50,17 +50,21 @@ public ObjectServiceGrpcImpl(SessionService sessionService, TicketRouter ticketR public void fetchObject(FetchObjectRequest request, StreamObserver responseObserver) { GrpcUtil.rpcWrapper(log, responseObserver, () -> { final SessionState session = sessionService.getCurrentSession(); - if (request.getSourceId().getTicket().isEmpty()) { - throw GrpcUtil.statusRuntimeException(Code.FAILED_PRECONDITION, "No sourceId supplied"); + final String type = request.getSourceId().getType(); + if (type.isEmpty()) { + throw GrpcUtil.statusRuntimeException(Code.FAILED_PRECONDITION, "No type supplied"); + } + if (request.getSourceId().getTicket().getTicket().isEmpty()) { + throw GrpcUtil.statusRuntimeException(Code.FAILED_PRECONDITION, "No ticket supplied"); } final SessionState.ExportObject object = ticketRouter.resolve( - session, request.getSourceId(), "sourceId"); + session, request.getSourceId().getTicket(), "sourceId"); session.nonExport() .require(object) .onError(responseObserver) .submit(() -> { final Object o = object.get(); - final FetchObjectResponse response = serialize(session, o); + final FetchObjectResponse response = serialize(type, session, o); responseObserver.onNext(response); responseObserver.onCompleted(); return null; @@ -68,10 +72,14 @@ public void fetchObject(FetchObjectRequest request, StreamObserver noTypeException(object)); + if (!expectedType.equals(objectType.name())) { + throw new IllegalArgumentException(String.format("The expected type '%s' is not equal to found type '%s'", + expectedType, objectType.name())); + } final ExportCollector exportCollector = new ExportCollector(state); try { objectType.writeTo(exportCollector, object, out); From cf36e5bb0f0a3a8cf2a935b41dc324d85cc6af3b Mon Sep 17 00:00:00 2001 From: Devin Smith Date: Fri, 21 Jan 2022 13:17:20 -0800 Subject: [PATCH 54/62] regen and copy python proto --- pyclient/pydeephaven/proto/application_pb2.py | 39 ++----------------- pyclient/pydeephaven/proto/object_pb2.py | 14 +++---- 2 files changed, 10 insertions(+), 43 deletions(-) diff --git a/pyclient/pydeephaven/proto/application_pb2.py b/pyclient/pydeephaven/proto/application_pb2.py index 7616e633e7e..930fd697117 100644 --- a/pyclient/pydeephaven/proto/application_pb2.py +++ b/pyclient/pydeephaven/proto/application_pb2.py @@ -20,7 +20,7 @@ syntax='proto3', serialized_options=b'H\001P\001', create_key=_descriptor._internal_create_key, - serialized_pb=b'\n!deephaven/proto/application.proto\x12!io.deephaven.proto.backplane.grpc\x1a\x1c\x64\x65\x65phaven/proto/ticket.proto\"\x13\n\x11ListFieldsRequest\"\xd1\x01\n\x12\x46ieldsChangeUpdate\x12=\n\x07\x63reated\x18\x01 \x03(\x0b\x32,.io.deephaven.proto.backplane.grpc.FieldInfo\x12=\n\x07updated\x18\x02 \x03(\x0b\x32,.io.deephaven.proto.backplane.grpc.FieldInfo\x12=\n\x07removed\x18\x03 \x03(\x0b\x32,.io.deephaven.proto.backplane.grpc.FieldInfo\"\xb2\x01\n\tFieldInfo\x12\x44\n\x0ctyped_ticket\x18\x01 \x01(\x0b\x32..io.deephaven.proto.backplane.grpc.TypedTicket\x12\x12\n\nfield_name\x18\x02 \x01(\t\x12\x19\n\x11\x66ield_description\x18\x03 \x01(\t\x12\x18\n\x10\x61pplication_name\x18\x04 \x01(\t\x12\x16\n\x0e\x61pplication_id\x18\x05 \x01(\t\"\x0e\n\x0cRemovedField2\x93\x01\n\x12\x41pplicationService\x12}\n\nListFields\x12\x34.io.deephaven.proto.backplane.grpc.ListFieldsRequest\x1a\x35.io.deephaven.proto.backplane.grpc.FieldsChangeUpdate\"\x00\x30\x01\x42\x04H\x01P\x01\x62\x06proto3' + serialized_pb=b'\n!deephaven/proto/application.proto\x12!io.deephaven.proto.backplane.grpc\x1a\x1c\x64\x65\x65phaven/proto/ticket.proto\"\x13\n\x11ListFieldsRequest\"\xd1\x01\n\x12\x46ieldsChangeUpdate\x12=\n\x07\x63reated\x18\x01 \x03(\x0b\x32,.io.deephaven.proto.backplane.grpc.FieldInfo\x12=\n\x07updated\x18\x02 \x03(\x0b\x32,.io.deephaven.proto.backplane.grpc.FieldInfo\x12=\n\x07removed\x18\x03 \x03(\x0b\x32,.io.deephaven.proto.backplane.grpc.FieldInfo\"\xb2\x01\n\tFieldInfo\x12\x44\n\x0ctyped_ticket\x18\x01 \x01(\x0b\x32..io.deephaven.proto.backplane.grpc.TypedTicket\x12\x12\n\nfield_name\x18\x02 \x01(\t\x12\x19\n\x11\x66ield_description\x18\x03 \x01(\t\x12\x18\n\x10\x61pplication_name\x18\x04 \x01(\t\x12\x16\n\x0e\x61pplication_id\x18\x05 \x01(\t2\x93\x01\n\x12\x41pplicationService\x12}\n\nListFields\x12\x34.io.deephaven.proto.backplane.grpc.ListFieldsRequest\x1a\x35.io.deephaven.proto.backplane.grpc.FieldsChangeUpdate\"\x00\x30\x01\x42\x04H\x01P\x01\x62\x06proto3' , dependencies=[deephaven_dot_proto_dot_ticket__pb2.DESCRIPTOR,]) @@ -157,31 +157,6 @@ serialized_end=514, ) - -_REMOVEDFIELD = _descriptor.Descriptor( - name='RemovedField', - full_name='io.deephaven.proto.backplane.grpc.RemovedField', - filename=None, - file=DESCRIPTOR, - containing_type=None, - create_key=_descriptor._internal_create_key, - fields=[ - ], - extensions=[ - ], - nested_types=[], - enum_types=[ - ], - serialized_options=None, - is_extendable=False, - syntax='proto3', - extension_ranges=[], - oneofs=[ - ], - serialized_start=516, - serialized_end=530, -) - _FIELDSCHANGEUPDATE.fields_by_name['created'].message_type = _FIELDINFO _FIELDSCHANGEUPDATE.fields_by_name['updated'].message_type = _FIELDINFO _FIELDSCHANGEUPDATE.fields_by_name['removed'].message_type = _FIELDINFO @@ -189,7 +164,6 @@ DESCRIPTOR.message_types_by_name['ListFieldsRequest'] = _LISTFIELDSREQUEST DESCRIPTOR.message_types_by_name['FieldsChangeUpdate'] = _FIELDSCHANGEUPDATE DESCRIPTOR.message_types_by_name['FieldInfo'] = _FIELDINFO -DESCRIPTOR.message_types_by_name['RemovedField'] = _REMOVEDFIELD _sym_db.RegisterFileDescriptor(DESCRIPTOR) ListFieldsRequest = _reflection.GeneratedProtocolMessageType('ListFieldsRequest', (_message.Message,), { @@ -213,13 +187,6 @@ }) _sym_db.RegisterMessage(FieldInfo) -RemovedField = _reflection.GeneratedProtocolMessageType('RemovedField', (_message.Message,), { - 'DESCRIPTOR' : _REMOVEDFIELD, - '__module__' : 'pydeephaven.proto.application_pb2' - # @@protoc_insertion_point(class_scope:io.deephaven.proto.backplane.grpc.RemovedField) - }) -_sym_db.RegisterMessage(RemovedField) - DESCRIPTOR._options = None @@ -230,8 +197,8 @@ index=0, serialized_options=None, create_key=_descriptor._internal_create_key, - serialized_start=533, - serialized_end=680, + serialized_start=517, + serialized_end=664, methods=[ _descriptor.MethodDescriptor( name='ListFields', diff --git a/pyclient/pydeephaven/proto/object_pb2.py b/pyclient/pydeephaven/proto/object_pb2.py index cad67e91cbb..a1b47474e26 100644 --- a/pyclient/pydeephaven/proto/object_pb2.py +++ b/pyclient/pydeephaven/proto/object_pb2.py @@ -20,7 +20,7 @@ syntax='proto3', serialized_options=b'H\001P\001', create_key=_descriptor._internal_create_key, - serialized_pb=b'\n\x1c\x64\x65\x65phaven/proto/object.proto\x12!io.deephaven.proto.backplane.grpc\x1a\x1c\x64\x65\x65phaven/proto/ticket.proto\"R\n\x12\x46\x65tchObjectRequest\x12<\n\tsource_id\x18\x01 \x01(\x0b\x32).io.deephaven.proto.backplane.grpc.Ticket\"z\n\x13\x46\x65tchObjectResponse\x12\x0c\n\x04type\x18\x01 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\x0c\x12G\n\x0ftyped_export_id\x18\x03 \x03(\x0b\x32..io.deephaven.proto.backplane.grpc.TypedTicket2\x8f\x01\n\rObjectService\x12~\n\x0b\x46\x65tchObject\x12\x35.io.deephaven.proto.backplane.grpc.FetchObjectRequest\x1a\x36.io.deephaven.proto.backplane.grpc.FetchObjectResponse\"\x00\x42\x04H\x01P\x01\x62\x06proto3' + serialized_pb=b'\n\x1c\x64\x65\x65phaven/proto/object.proto\x12!io.deephaven.proto.backplane.grpc\x1a\x1c\x64\x65\x65phaven/proto/ticket.proto\"W\n\x12\x46\x65tchObjectRequest\x12\x41\n\tsource_id\x18\x01 \x01(\x0b\x32..io.deephaven.proto.backplane.grpc.TypedTicket\"z\n\x13\x46\x65tchObjectResponse\x12\x0c\n\x04type\x18\x01 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\x0c\x12G\n\x0ftyped_export_id\x18\x03 \x03(\x0b\x32..io.deephaven.proto.backplane.grpc.TypedTicket2\x8f\x01\n\rObjectService\x12~\n\x0b\x46\x65tchObject\x12\x35.io.deephaven.proto.backplane.grpc.FetchObjectRequest\x1a\x36.io.deephaven.proto.backplane.grpc.FetchObjectResponse\"\x00\x42\x04H\x01P\x01\x62\x06proto3' , dependencies=[deephaven_dot_proto_dot_ticket__pb2.DESCRIPTOR,]) @@ -55,7 +55,7 @@ oneofs=[ ], serialized_start=97, - serialized_end=179, + serialized_end=184, ) @@ -100,11 +100,11 @@ extension_ranges=[], oneofs=[ ], - serialized_start=181, - serialized_end=303, + serialized_start=186, + serialized_end=308, ) -_FETCHOBJECTREQUEST.fields_by_name['source_id'].message_type = deephaven_dot_proto_dot_ticket__pb2._TICKET +_FETCHOBJECTREQUEST.fields_by_name['source_id'].message_type = deephaven_dot_proto_dot_ticket__pb2._TYPEDTICKET _FETCHOBJECTRESPONSE.fields_by_name['typed_export_id'].message_type = deephaven_dot_proto_dot_ticket__pb2._TYPEDTICKET DESCRIPTOR.message_types_by_name['FetchObjectRequest'] = _FETCHOBJECTREQUEST DESCRIPTOR.message_types_by_name['FetchObjectResponse'] = _FETCHOBJECTRESPONSE @@ -134,8 +134,8 @@ index=0, serialized_options=None, create_key=_descriptor._internal_create_key, - serialized_start=306, - serialized_end=449, + serialized_start=311, + serialized_end=454, methods=[ _descriptor.MethodDescriptor( name='FetchObject', From e492010ea784b7541f7a7d9f05ab0826cc2ad79d Mon Sep 17 00:00:00 2001 From: Devin Smith Date: Fri, 21 Jan 2022 13:24:11 -0800 Subject: [PATCH 55/62] Update test --- .../deephaven/server/object/ObjectServiceTest.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/server/src/test/java/io/deephaven/server/object/ObjectServiceTest.java b/server/src/test/java/io/deephaven/server/object/ObjectServiceTest.java index c1e137e096a..acbb410b20f 100644 --- a/server/src/test/java/io/deephaven/server/object/ObjectServiceTest.java +++ b/server/src/test/java/io/deephaven/server/object/ObjectServiceTest.java @@ -9,6 +9,7 @@ import io.deephaven.proto.backplane.grpc.FetchObjectRequest; import io.deephaven.proto.backplane.grpc.FetchObjectResponse; import io.deephaven.proto.backplane.grpc.Ticket; +import io.deephaven.proto.backplane.grpc.TypedTicket; import io.deephaven.server.runner.DeephavenApiServerSingleAuthenticatedBase; import io.deephaven.server.session.SessionState.ExportObject; import io.grpc.StatusRuntimeException; @@ -53,7 +54,11 @@ public void myUnregisteredObject() { ExportObject export = authenticatedSessionState() .newExport(1) .submit(MyUnregisteredObject::new); - final FetchObjectRequest request = FetchObjectRequest.newBuilder().setSourceId(export.getExportId()).build(); + final FetchObjectRequest request = FetchObjectRequest.newBuilder() + .setSourceId(TypedTicket.newBuilder() + .setTicket(export.getExportId()) + .build()) + .build(); try { // noinspection ResultOfMethodCallIgnored channel().objectBlocking().fetchObject(request); @@ -64,7 +69,12 @@ public void myUnregisteredObject() { } private void fetchMyObject(Ticket ticket, String expectedSomeString, int expectedSomeInt) throws IOException { - final FetchObjectRequest request = FetchObjectRequest.newBuilder().setSourceId(ticket).build(); + final FetchObjectRequest request = FetchObjectRequest.newBuilder() + .setSourceId(TypedTicket.newBuilder() + .setType(MyObjectRegistration.MY_OBJECT_TYPE_NAME) + .setTicket(ticket) + .build()) + .build(); final FetchObjectResponse response = channel().objectBlocking().fetchObject(request); assertThat(response.getType()).isEqualTo(MyObjectRegistration.MY_OBJECT_TYPE_NAME); From 95ada5c24e89feb52b09d6e3b0781fefea3ccf1e Mon Sep 17 00:00:00 2001 From: Colin Alworth Date: Fri, 21 Jan 2022 16:09:52 -0600 Subject: [PATCH 56/62] Update gwt bindings --- .../proto/object_pb/FetchObjectRequest.java | 168 +++++++++++------- 1 file changed, 105 insertions(+), 63 deletions(-) diff --git a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/object_pb/FetchObjectRequest.java b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/object_pb/FetchObjectRequest.java index a669f253b9a..c91ea78ab58 100644 --- a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/object_pb/FetchObjectRequest.java +++ b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/object_pb/FetchObjectRequest.java @@ -1,7 +1,7 @@ package io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.object_pb; import elemental2.core.Uint8Array; -import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.ticket_pb.Ticket; +import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.ticket_pb.TypedTicket; import jsinterop.annotations.JsOverlay; import jsinterop.annotations.JsPackage; import jsinterop.annotations.JsProperty; @@ -19,31 +19,60 @@ public interface ToObjectReturnType { @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) public interface SourceIdFieldType { @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface GetTicketUnionType { - @JsOverlay - static FetchObjectRequest.ToObjectReturnType.SourceIdFieldType.GetTicketUnionType of( - Object o) { - return Js.cast(o); + public interface TicketFieldType { + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface GetTicketUnionType { + @JsOverlay + static FetchObjectRequest.ToObjectReturnType.SourceIdFieldType.TicketFieldType.GetTicketUnionType of( + Object o) { + return Js.cast(o); + } + + @JsOverlay + default String asString() { + return Js.asString(this); + } + + @JsOverlay + default Uint8Array asUint8Array() { + return Js.cast(this); + } + + @JsOverlay + default boolean isString() { + return (Object) this instanceof String; + } + + @JsOverlay + default boolean isUint8Array() { + return (Object) this instanceof Uint8Array; + } } @JsOverlay - default String asString() { - return Js.asString(this); + static FetchObjectRequest.ToObjectReturnType.SourceIdFieldType.TicketFieldType create() { + return Js.uncheckedCast(JsPropertyMap.of()); } - @JsOverlay - default Uint8Array asUint8Array() { - return Js.cast(this); - } + @JsProperty + FetchObjectRequest.ToObjectReturnType.SourceIdFieldType.TicketFieldType.GetTicketUnionType getTicket(); + + @JsProperty + void setTicket( + FetchObjectRequest.ToObjectReturnType.SourceIdFieldType.TicketFieldType.GetTicketUnionType ticket); @JsOverlay - default boolean isString() { - return (Object) this instanceof String; + default void setTicket(String ticket) { + setTicket( + Js.uncheckedCast( + ticket)); } @JsOverlay - default boolean isUint8Array() { - return (Object) this instanceof Uint8Array; + default void setTicket(Uint8Array ticket) { + setTicket( + Js.uncheckedCast( + ticket)); } } @@ -53,25 +82,17 @@ static FetchObjectRequest.ToObjectReturnType.SourceIdFieldType create() { } @JsProperty - FetchObjectRequest.ToObjectReturnType.SourceIdFieldType.GetTicketUnionType getTicket(); + FetchObjectRequest.ToObjectReturnType.SourceIdFieldType.TicketFieldType getTicket(); @JsProperty - void setTicket( - FetchObjectRequest.ToObjectReturnType.SourceIdFieldType.GetTicketUnionType ticket); + String getType(); - @JsOverlay - default void setTicket(String ticket) { - setTicket( - Js.uncheckedCast( - ticket)); - } + @JsProperty + void setTicket( + FetchObjectRequest.ToObjectReturnType.SourceIdFieldType.TicketFieldType ticket); - @JsOverlay - default void setTicket(Uint8Array ticket) { - setTicket( - Js.uncheckedCast( - ticket)); - } + @JsProperty + void setType(String type); } @JsOverlay @@ -91,31 +112,60 @@ public interface ToObjectReturnType0 { @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) public interface SourceIdFieldType { @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) - public interface GetTicketUnionType { - @JsOverlay - static FetchObjectRequest.ToObjectReturnType0.SourceIdFieldType.GetTicketUnionType of( - Object o) { - return Js.cast(o); + public interface TicketFieldType { + @JsType(isNative = true, name = "?", namespace = JsPackage.GLOBAL) + public interface GetTicketUnionType { + @JsOverlay + static FetchObjectRequest.ToObjectReturnType0.SourceIdFieldType.TicketFieldType.GetTicketUnionType of( + Object o) { + return Js.cast(o); + } + + @JsOverlay + default String asString() { + return Js.asString(this); + } + + @JsOverlay + default Uint8Array asUint8Array() { + return Js.cast(this); + } + + @JsOverlay + default boolean isString() { + return (Object) this instanceof String; + } + + @JsOverlay + default boolean isUint8Array() { + return (Object) this instanceof Uint8Array; + } } @JsOverlay - default String asString() { - return Js.asString(this); + static FetchObjectRequest.ToObjectReturnType0.SourceIdFieldType.TicketFieldType create() { + return Js.uncheckedCast(JsPropertyMap.of()); } - @JsOverlay - default Uint8Array asUint8Array() { - return Js.cast(this); - } + @JsProperty + FetchObjectRequest.ToObjectReturnType0.SourceIdFieldType.TicketFieldType.GetTicketUnionType getTicket(); + + @JsProperty + void setTicket( + FetchObjectRequest.ToObjectReturnType0.SourceIdFieldType.TicketFieldType.GetTicketUnionType ticket); @JsOverlay - default boolean isString() { - return (Object) this instanceof String; + default void setTicket(String ticket) { + setTicket( + Js.uncheckedCast( + ticket)); } @JsOverlay - default boolean isUint8Array() { - return (Object) this instanceof Uint8Array; + default void setTicket(Uint8Array ticket) { + setTicket( + Js.uncheckedCast( + ticket)); } } @@ -125,25 +175,17 @@ static FetchObjectRequest.ToObjectReturnType0.SourceIdFieldType create() { } @JsProperty - FetchObjectRequest.ToObjectReturnType0.SourceIdFieldType.GetTicketUnionType getTicket(); + FetchObjectRequest.ToObjectReturnType0.SourceIdFieldType.TicketFieldType getTicket(); @JsProperty - void setTicket( - FetchObjectRequest.ToObjectReturnType0.SourceIdFieldType.GetTicketUnionType ticket); + String getType(); - @JsOverlay - default void setTicket(String ticket) { - setTicket( - Js.uncheckedCast( - ticket)); - } + @JsProperty + void setTicket( + FetchObjectRequest.ToObjectReturnType0.SourceIdFieldType.TicketFieldType ticket); - @JsOverlay - default void setTicket(Uint8Array ticket) { - setTicket( - Js.uncheckedCast( - ticket)); - } + @JsProperty + void setType(String type); } @JsOverlay @@ -170,7 +212,7 @@ public static native FetchObjectRequest.ToObjectReturnType toObject( public native void clearSourceId(); - public native Ticket getSourceId(); + public native TypedTicket getSourceId(); public native boolean hasSourceId(); @@ -178,7 +220,7 @@ public static native FetchObjectRequest.ToObjectReturnType toObject( public native void setSourceId(); - public native void setSourceId(Ticket value); + public native void setSourceId(TypedTicket value); public native FetchObjectRequest.ToObjectReturnType0 toObject(); From 15296cb969d4e27d9521409c77250c2160ca0f23 Mon Sep 17 00:00:00 2001 From: Colin Alworth Date: Fri, 21 Jan 2022 16:18:35 -0600 Subject: [PATCH 57/62] Update JS API to use typedticket for object fetch --- .../io/deephaven/web/client/api/WorkerConnection.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/web/client-api/src/main/java/io/deephaven/web/client/api/WorkerConnection.java b/web/client-api/src/main/java/io/deephaven/web/client/api/WorkerConnection.java index 0eea56e8d6a..bea54f0cd0d 100644 --- a/web/client-api/src/main/java/io/deephaven/web/client/api/WorkerConnection.java +++ b/web/client-api/src/main/java/io/deephaven/web/client/api/WorkerConnection.java @@ -56,6 +56,7 @@ import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.table_pb.TimeTableRequest; import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.table_pb_service.TableServiceClient; import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.ticket_pb.Ticket; +import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.ticket_pb.TypedTicket; import io.deephaven.web.client.api.barrage.BarrageUtils; import io.deephaven.web.client.api.barrage.def.ColumnDefinition; import io.deephaven.web.client.api.barrage.def.InitialTableDefinition; @@ -820,10 +821,16 @@ public Promise getTreeTable(JsVariableDefinition varDef) { } public Promise getFigure(JsVariableDefinition varDef) { + if (!varDef.getType().equals("Figure")) { + throw new IllegalArgumentException("Can't load as a figure: " + varDef.getType()); + } return whenServerReady("get a figure") .then(server -> new JsFigure(this, c -> { FetchObjectRequest request = new FetchObjectRequest(); - request.setSourceId(TableTicket.createTicket(varDef)); + TypedTicket typedTicket = new TypedTicket(); + typedTicket.setTicket(TableTicket.createTicket(varDef)); + typedTicket.setType(varDef.getType()); + request.setSourceId(typedTicket); objectServiceClient().fetchObject(request, metadata(), c::apply); }).refetch()); } From d28c82d0dd4f0fef0ca487c15e1829e0fef4e4b7 Mon Sep 17 00:00:00 2001 From: Devin Smith Date: Fri, 21 Jan 2022 14:56:28 -0800 Subject: [PATCH 58/62] Remove Reference.ticket --- .../main/java/io/deephaven/plugin/type/ObjectType.java | 10 +--------- .../deephaven/server/object/ObjectServiceGrpcImpl.java | 5 ----- .../java/io/deephaven/server/session/SessionState.java | 8 -------- .../io/deephaven/server/object/ObjectServiceTest.java | 4 ++-- 4 files changed, 3 insertions(+), 24 deletions(-) diff --git a/plugin/src/main/java/io/deephaven/plugin/type/ObjectType.java b/plugin/src/main/java/io/deephaven/plugin/type/ObjectType.java index 03a5b12d31d..d666203bd40 100644 --- a/plugin/src/main/java/io/deephaven/plugin/type/ObjectType.java +++ b/plugin/src/main/java/io/deephaven/plugin/type/ObjectType.java @@ -82,8 +82,7 @@ Optional reference(Object object, boolean allowUnknownType, boolean f interface Reference { /** * The index, which is defined by the order in which references are created. May be used in the output - * stream to refer to the reference from the client without needing to re-serialize the {@link #type()} and - * {@link #ticket()}. + * stream to refer to the reference from the client. * * @return the index */ @@ -95,13 +94,6 @@ interface Reference { * @return the type, if present */ Optional type(); - - /** - * The ticket. - * - * @return the ticket - */ - byte[] ticket(); } } } diff --git a/server/src/main/java/io/deephaven/server/object/ObjectServiceGrpcImpl.java b/server/src/main/java/io/deephaven/server/object/ObjectServiceGrpcImpl.java index 2eee645e4e2..3fba05dda4b 100644 --- a/server/src/main/java/io/deephaven/server/object/ObjectServiceGrpcImpl.java +++ b/server/src/main/java/io/deephaven/server/object/ObjectServiceGrpcImpl.java @@ -192,10 +192,5 @@ public int index() { public Optional type() { return Optional.ofNullable(type); } - - @Override - public byte[] ticket() { - return export.getExportIdBytes(); - } } } diff --git a/server/src/main/java/io/deephaven/server/session/SessionState.java b/server/src/main/java/io/deephaven/server/session/SessionState.java index c4e97e236ba..9b6a0ce46a0 100644 --- a/server/src/main/java/io/deephaven/server/session/SessionState.java +++ b/server/src/main/java/io/deephaven/server/session/SessionState.java @@ -679,14 +679,6 @@ public Ticket getExportId() { return ExportTicketHelper.wrapExportIdInTicket(exportId); } - /** - * @return the ticket bytes for this export; note if this is a non-export the returned ticket will not resolve - * to anything and is considered an invalid ticket - */ - public byte[] getExportIdBytes() { - return ExportTicketHelper.exportIdToBytes(exportId); - } - /** * Add dependency if object export has not yet completed. * diff --git a/server/src/test/java/io/deephaven/server/object/ObjectServiceTest.java b/server/src/test/java/io/deephaven/server/object/ObjectServiceTest.java index acbb410b20f..aef23dd4903 100644 --- a/server/src/test/java/io/deephaven/server/object/ObjectServiceTest.java +++ b/server/src/test/java/io/deephaven/server/object/ObjectServiceTest.java @@ -172,8 +172,8 @@ public void writeToImpl(Exporter exporter, MyObject object, OutputStream out) th assertThat(extraNewObjRef.type()).contains(MyObjectRegistration.MY_REF_OBJECT_TYPE_NAME); assertThat(dontAllowUnknown).isEmpty(); - assertThat(tableRef.ticket()).is(bytesEquals(extraTableRef.ticket())); - assertThat(objRef.ticket()).isNot(bytesEquals(extraNewObjRef.ticket())); + assertThat(tableRef.index()).isEqualTo(extraTableRef.index()); + assertThat(objRef.index()).isNotEqualTo(extraNewObjRef.index()); final DataOutputStream doas = new DataOutputStream(out); From a995b11ce5d1989d4cec4ccda37b89a428d49db9 Mon Sep 17 00:00:00 2001 From: Devin Smith Date: Fri, 21 Jan 2022 15:13:06 -0800 Subject: [PATCH 59/62] fix python side for Reference --- pyintegration/deephaven2/server/plugin/object/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyintegration/deephaven2/server/plugin/object/__init__.py b/pyintegration/deephaven2/server/plugin/object/__init__.py index 73348ce9c72..2a8e760badf 100644 --- a/pyintegration/deephaven2/server/plugin/object/__init__.py +++ b/pyintegration/deephaven2/server/plugin/object/__init__.py @@ -9,7 +9,7 @@ def _adapt_reference(ref: _JReference) -> Reference: - return Reference(ref.index(), ref.type().orElse(None), bytes(ref.ticket())) + return Reference(ref.index(), ref.type().orElse(None)) def _unwrap(object): From d736c8572fcad5de3256458b39ba65e81f1616fc Mon Sep 17 00:00:00 2001 From: Devin Smith Date: Mon, 24 Jan 2022 09:20:56 -0800 Subject: [PATCH 60/62] FetchObject client don't try Table. Better exceptions for FetchObject --- .../client/examples/FetchObject.java | 4 ++++ .../server/object/ObjectServiceGrpcImpl.java | 21 +++++++++---------- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/java-client/session-examples/src/main/java/io/deephaven/client/examples/FetchObject.java b/java-client/session-examples/src/main/java/io/deephaven/client/examples/FetchObject.java index 6dd3de729e7..171481192c3 100644 --- a/java-client/session-examples/src/main/java/io/deephaven/client/examples/FetchObject.java +++ b/java-client/session-examples/src/main/java/io/deephaven/client/examples/FetchObject.java @@ -39,6 +39,10 @@ protected void execute(Session session) throws Exception { private void show(Session session, String type, HasTicketId ticket) throws IOException, ExecutionException, InterruptedException { + if ("Table".equals(type)) { + System.err.println("Unable to fetchObject for 'Table'"); + return; + } final FetchedObject customObject = session.fetchObject(type, ticket).get(); show(session, customObject); } diff --git a/server/src/main/java/io/deephaven/server/object/ObjectServiceGrpcImpl.java b/server/src/main/java/io/deephaven/server/object/ObjectServiceGrpcImpl.java index 3fba05dda4b..8dc9d798eeb 100644 --- a/server/src/main/java/io/deephaven/server/object/ObjectServiceGrpcImpl.java +++ b/server/src/main/java/io/deephaven/server/object/ObjectServiceGrpcImpl.java @@ -52,10 +52,10 @@ public void fetchObject(FetchObjectRequest request, StreamObserver object = ticketRouter.resolve( session, request.getSourceId().getTicket(), "sourceId"); @@ -74,11 +74,15 @@ public void fetchObject(FetchObjectRequest request, StreamObserver noTypeException(object)); + final Optional o = objectTypeLookup.findObjectType(object); + if (o.isEmpty()) { + throw GrpcUtil.statusRuntimeException(Code.NOT_FOUND, + String.format("No ObjectType found, expected type '%s'", expectedType)); + } + final ObjectType objectType = o.get(); if (!expectedType.equals(objectType.name())) { - throw new IllegalArgumentException(String.format("The expected type '%s' is not equal to found type '%s'", - expectedType, objectType.name())); + throw GrpcUtil.statusRuntimeException(Code.FAILED_PRECONDITION, String.format( + "Unexpected ObjectType, expected type '%s', actual type '%s'", expectedType, objectType.name())); } final ExportCollector exportCollector = new ExportCollector(state); try { @@ -106,11 +110,6 @@ private static void cleanup(ExportCollector exportCollector, Throwable t) { } } - private static IllegalArgumentException noTypeException(Object o) { - return new IllegalArgumentException( - "No type registered for object class=" + o.getClass().getName() + ", value=" + o); - } - private static boolean referenceEquality(Object t, Object u) { return t == u; } From 580b27265d96c2b4ec184346ad97c6229b81ba69 Mon Sep 17 00:00:00 2001 From: Devin Smith Date: Mon, 24 Jan 2022 10:15:46 -0800 Subject: [PATCH 61/62] Add reference to #1872 --- .../java/io/deephaven/server/object/ObjectServiceGrpcImpl.java | 1 + 1 file changed, 1 insertion(+) diff --git a/server/src/main/java/io/deephaven/server/object/ObjectServiceGrpcImpl.java b/server/src/main/java/io/deephaven/server/object/ObjectServiceGrpcImpl.java index 8dc9d798eeb..7d7f9cb62f4 100644 --- a/server/src/main/java/io/deephaven/server/object/ObjectServiceGrpcImpl.java +++ b/server/src/main/java/io/deephaven/server/object/ObjectServiceGrpcImpl.java @@ -74,6 +74,7 @@ public void fetchObject(FetchObjectRequest request, StreamObserver o = objectTypeLookup.findObjectType(object); if (o.isEmpty()) { throw GrpcUtil.statusRuntimeException(Code.NOT_FOUND, From ddfcdaa8f9d3fb44d969e81bb91cbd4dbfc6ec34 Mon Sep 17 00:00:00 2001 From: Devin Smith Date: Mon, 24 Jan 2022 12:26:42 -0800 Subject: [PATCH 62/62] add because notes for api dagger dependencies --- server/build.gradle | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/server/build.gradle b/server/build.gradle index 0c7a0fd2c1c..378c16501ac 100644 --- a/server/build.gradle +++ b/server/build.gradle @@ -8,8 +8,9 @@ dependencies { implementation project(':extensions-parquet-table') implementation project(':Util'); - //TODO(1722) This isn't actually an api dependency, but downstream dagger compiles will need it - api(project(':java-client-barrage-dagger')) + api(project(':java-client-barrage-dagger')) { + because 'downstream dagger compile, see deephaven-core#1722' + } implementation project(':proto:proto-backplane-grpc-flight') implementation project(':open-api-lang-tools') @@ -40,14 +41,17 @@ dependencies { runtimeOnly project(':extensions-suanshu') } - api project(':plugin') + api(project(':plugin')) { + because 'downstream dagger compile, see deephaven-core#1722' + } runtimeOnly project(':plugin-figure') Classpaths.inheritGrpcPlatform(project, 'api') - //TODO(1722) This isn't actually an api dependency, but downstream dagger compiles will need it - api('io.grpc:grpc-services') + api('io.grpc:grpc-services') { + because 'downstream dagger compile, see deephaven-core#1722' + } testImplementation 'io.grpc:grpc-testing'