From 41413886ae517450754f2260ee962a8f2cd53a44 Mon Sep 17 00:00:00 2001 From: Colin Alworth Date: Fri, 15 Mar 2024 15:33:15 -0500 Subject: [PATCH 01/11] Send platform file separator to clients, update proto to include normalized path --- props/configs/src/main/resources/dh-defaults.prop | 2 +- .../src/main/proto/deephaven/proto/storage.proto | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/props/configs/src/main/resources/dh-defaults.prop b/props/configs/src/main/resources/dh-defaults.prop index be2dcba5eb9..13e85fae675 100644 --- a/props/configs/src/main/resources/dh-defaults.prop +++ b/props/configs/src/main/resources/dh-defaults.prop @@ -55,7 +55,7 @@ authentication.anonymous.warn=true authentication.client.configuration.list=AuthHandlers # List of configuration properties to provide to authenticated clients, so they can interact with the server. -client.configuration.list=java.version,deephaven.version,barrage.version,http.session.durationMs +client.configuration.list=java.version,deephaven.version,barrage.version,http.session.durationMs,file.separator # Version list to add to the configuration property list. Each `=`-delimited pair denotes a short name for a versioned # jar, and a class that is found in that jar. Any such keys will be made available to the client.configuration.list # as .version. diff --git a/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/storage.proto b/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/storage.proto index 10b39633aa5..9bdf28af4ae 100644 --- a/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/storage.proto +++ b/proto/proto-backplane-grpc/src/main/proto/deephaven/proto/storage.proto @@ -62,6 +62,10 @@ message ItemInfo { message ListItemsResponse { // List of items found in the specified directory. repeated ItemInfo items = 1; + + // The canonical path of the listed directory. This is useful to recognize the basename + // of the items in a cross-platform way. + string canonical_path = 2; } message FetchFileRequest { From eefba0a9b71063c815b5055e0f1c626dd526ad7f Mon Sep 17 00:00:00 2001 From: Colin Alworth Date: Fri, 15 Mar 2024 15:55:11 -0500 Subject: [PATCH 02/11] regen gwt bindings --- .../proto/storage_pb/ListItemsResponse.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/storage_pb/ListItemsResponse.java b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/storage_pb/ListItemsResponse.java index 2cdbbfeb7bf..f6a3c7376ce 100644 --- a/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/storage_pb/ListItemsResponse.java +++ b/web/client-backplane/src/main/java/io/deephaven/javascript/proto/dhinternal/io/deephaven/proto/storage_pb/ListItemsResponse.java @@ -56,9 +56,15 @@ static ListItemsResponse.ToObjectReturnType create() { return Js.uncheckedCast(JsPropertyMap.of()); } + @JsProperty + String getCanonicalPath(); + @JsProperty JsArray getItemsList(); + @JsProperty + void setCanonicalPath(String canonicalPath); + @JsOverlay default void setItemsList(ListItemsResponse.ToObjectReturnType.ItemsListFieldType[] itemsList) { setItemsList( @@ -109,9 +115,15 @@ static ListItemsResponse.ToObjectReturnType0 create() { return Js.uncheckedCast(JsPropertyMap.of()); } + @JsProperty + String getCanonicalPath(); + @JsProperty JsArray getItemsList(); + @JsProperty + void setCanonicalPath(String canonicalPath); + @JsOverlay default void setItemsList( ListItemsResponse.ToObjectReturnType0.ItemsListFieldType[] itemsList) { @@ -142,10 +154,14 @@ public static native ListItemsResponse.ToObjectReturnType toObject( public native void clearItemsList(); + public native String getCanonicalPath(); + public native JsArray getItemsList(); public native Uint8Array serializeBinary(); + public native void setCanonicalPath(String value); + @JsOverlay public final void setItemsList(ItemInfo[] value) { setItemsList(Js.>uncheckedCast(value)); From e86191c93383ab671f30137b16ac6fa4795c2e0d Mon Sep 17 00:00:00 2001 From: Colin Alworth Date: Mon, 18 Mar 2024 09:06:43 -0500 Subject: [PATCH 03/11] Provide opaque paths to the client, add integration test --- .../FilesystemStorageServiceGrpcImpl.java | 17 ++-- .../web/client/api/storage/JsItemDetails.java | 19 ++-- .../client/api/storage/JsStorageService.java | 2 +- .../web/ClientIntegrationTestSuite.java | 2 + .../client/api/AbstractAsyncGwtTestCase.java | 4 +- .../api/storage/JsStorageServiceTest.java | 88 +++++++++++++++++++ 6 files changed, 117 insertions(+), 15 deletions(-) create mode 100644 web/client-api/src/test/java/io/deephaven/web/client/api/storage/JsStorageServiceTest.java diff --git a/server/src/main/java/io/deephaven/server/notebook/FilesystemStorageServiceGrpcImpl.java b/server/src/main/java/io/deephaven/server/notebook/FilesystemStorageServiceGrpcImpl.java index b9c7b79dd93..7f0ee1dadc4 100644 --- a/server/src/main/java/io/deephaven/server/notebook/FilesystemStorageServiceGrpcImpl.java +++ b/server/src/main/java/io/deephaven/server/notebook/FilesystemStorageServiceGrpcImpl.java @@ -35,6 +35,7 @@ import javax.inject.Inject; import javax.inject.Singleton; +import java.io.File; import java.io.IOException; import java.io.UncheckedIOException; import java.nio.file.DirectoryNotEmptyException; @@ -107,11 +108,12 @@ public FilesystemStorageServiceGrpcImpl( } private Path resolveOrThrow(String incomingPath) { - if (incomingPath.startsWith("/")) { - Path resolved = root.resolve(incomingPath.substring(1)).normalize(); - if (resolved.startsWith(root)) { - return resolved; - } + if (incomingPath.startsWith(File.separator)) { + incomingPath = incomingPath.substring(1); + } + Path resolved = root.resolve(incomingPath).normalize(); + if (resolved.startsWith(root)) { + return resolved; } throw Exceptions.statusRuntimeException(Code.INVALID_ARGUMENT, "Invalid path: " + incomingPath); } @@ -132,6 +134,7 @@ public void listItems( PathMatcher matcher = request.hasFilterGlob() ? createPathFilter(request.getFilterGlob()) : ignore -> true; Path dir = resolveOrThrow(request.getPath()); + builder.setCanonicalPath(String.valueOf(root.relativize(dir))); try (Stream list = Files.list(dir)) { for (Path p : (Iterable) list::iterator) { if (!matcher.matches(dir.relativize(p))) { @@ -140,7 +143,7 @@ public void listItems( BasicFileAttributes attrs = Files.readAttributes(p, BasicFileAttributes.class); boolean isDirectory = attrs.isDirectory(); ItemInfo.Builder info = ItemInfo.newBuilder() - .setPath("/" + root.relativize(p)); + .setPath(String.valueOf(root.relativize(p))); if (isDirectory) { info.setType(ItemType.DIRECTORY); } else { @@ -163,7 +166,7 @@ private static PathMatcher createPathFilter(String filterGlob) { if (filterGlob.contains("**")) { throw Exceptions.statusRuntimeException(Code.INVALID_ARGUMENT, "Bad glob, only single `*`s are supported"); } - if (filterGlob.contains("/")) { + if (filterGlob.contains(File.separator)) { throw Exceptions.statusRuntimeException(Code.INVALID_ARGUMENT, "Bad glob, only the same directory can be checked"); } diff --git a/web/client-api/src/main/java/io/deephaven/web/client/api/storage/JsItemDetails.java b/web/client-api/src/main/java/io/deephaven/web/client/api/storage/JsItemDetails.java index 3d45dc0fe7e..bd26cbbbafc 100644 --- a/web/client-api/src/main/java/io/deephaven/web/client/api/storage/JsItemDetails.java +++ b/web/client-api/src/main/java/io/deephaven/web/client/api/storage/JsItemDetails.java @@ -7,6 +7,7 @@ import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.Storage_pb; import io.deephaven.javascript.proto.dhinternal.io.deephaven.proto.storage_pb.ItemInfo; import jsinterop.annotations.JsIgnore; +import jsinterop.annotations.JsMethod; import jsinterop.annotations.JsProperty; import jsinterop.annotations.JsType; @@ -15,13 +16,15 @@ */ @JsType(namespace = "dh.storage", name = "ItemDetails") public class JsItemDetails { + private final String parentPath; private final String path; private final int type; private final String size; private final String etag; @JsIgnore - public JsItemDetails(String path, int kind, String size, String etag) { + public JsItemDetails(String parentPath, String path, int kind, String size, String etag) { + this.parentPath = parentPath; this.path = path; this.type = kind; this.size = size; @@ -29,8 +32,8 @@ public JsItemDetails(String path, int kind, String size, String etag) { } @JsIgnore - public static JsItemDetails fromProto(ItemInfo item) { - return new JsItemDetails(item.getPath(), item.getType(), item.getSize(), item.getEtag()); + public static JsItemDetails fromProto(String parentPath, ItemInfo item) { + return new JsItemDetails(parentPath, item.getPath(), item.getType(), item.getSize(), item.getEtag()); } @JsProperty @@ -40,12 +43,12 @@ public String getFilename() { @JsProperty public String getBasename() { - return path.substring(path.lastIndexOf('/') + 1); + return path.substring(parentPath.length() + 1); } @JsProperty public String getDirname() { - return path.substring(0, path.lastIndexOf('/')); + return parentPath; } @JsProperty @@ -63,4 +66,10 @@ public double getSize() { public String getEtag() { return etag; } + + @JsMethod + @Override + public String toString() { + return getBasename(); + } } diff --git a/web/client-api/src/main/java/io/deephaven/web/client/api/storage/JsStorageService.java b/web/client-api/src/main/java/io/deephaven/web/client/api/storage/JsStorageService.java index f83c5731910..841cb2fde78 100644 --- a/web/client-api/src/main/java/io/deephaven/web/client/api/storage/JsStorageService.java +++ b/web/client-api/src/main/java/io/deephaven/web/client/api/storage/JsStorageService.java @@ -64,7 +64,7 @@ public Promise> listItems(String path, @JsOptional String req.setFilterGlob(glob); return Callbacks.grpcUnaryPromise(c -> client().listItems(req, metadata(), c::apply)) .then(response -> Promise - .resolve(response.getItemsList().map((item, i, arr) -> JsItemDetails.fromProto(item)))); + .resolve(response.getItemsList().map((item, i, arr) -> JsItemDetails.fromProto(response.getCanonicalPath(), item)))); } /** diff --git a/web/client-api/src/test/java/io/deephaven/web/ClientIntegrationTestSuite.java b/web/client-api/src/test/java/io/deephaven/web/ClientIntegrationTestSuite.java index 635cbaaee7e..4d3af37cc20 100644 --- a/web/client-api/src/test/java/io/deephaven/web/ClientIntegrationTestSuite.java +++ b/web/client-api/src/test/java/io/deephaven/web/ClientIntegrationTestSuite.java @@ -7,6 +7,7 @@ import io.deephaven.web.client.api.HierarchicalTableTestGwt; import io.deephaven.web.client.api.NullValueTestGwt; import io.deephaven.web.client.api.PartitionedTableTestGwt; +import io.deephaven.web.client.api.storage.JsStorageServiceTest; import io.deephaven.web.client.api.subscription.ConcurrentTableTestGwt; import io.deephaven.web.client.api.TableManipulationTestGwt; import io.deephaven.web.client.api.subscription.ViewportTestGwt; @@ -29,6 +30,7 @@ public static Test suite() { suite.addTestSuite(NullValueTestGwt.class); suite.addTestSuite(HierarchicalTableTestGwt.class); suite.addTestSuite(PartitionedTableTestGwt.class); + suite.addTestSuite(JsStorageServiceTest.class); // This should be a unit test, but it requires a browser environment to run on GWT 2.9 // GWT 2.9 doesn't have proper bindings for Promises in HtmlUnit, so we need to use the IntegrationTest suite diff --git a/web/client-api/src/test/java/io/deephaven/web/client/api/AbstractAsyncGwtTestCase.java b/web/client-api/src/test/java/io/deephaven/web/client/api/AbstractAsyncGwtTestCase.java index 0035fa5ad05..7b36f3b98a5 100644 --- a/web/client-api/src/test/java/io/deephaven/web/client/api/AbstractAsyncGwtTestCase.java +++ b/web/client-api/src/test/java/io/deephaven/web/client/api/AbstractAsyncGwtTestCase.java @@ -250,9 +250,9 @@ protected Promise assertUpdateReceived(JsTable table, Consumer IThenable.ThenOnFulfilledCallbackFn delayFinish(int timeout) { - return table -> { + return object -> { delayTestFinish(timeout); - return Promise.resolve(table); + return Promise.resolve(object); }; } diff --git a/web/client-api/src/test/java/io/deephaven/web/client/api/storage/JsStorageServiceTest.java b/web/client-api/src/test/java/io/deephaven/web/client/api/storage/JsStorageServiceTest.java new file mode 100644 index 00000000000..dbcba38daad --- /dev/null +++ b/web/client-api/src/test/java/io/deephaven/web/client/api/storage/JsStorageServiceTest.java @@ -0,0 +1,88 @@ +package io.deephaven.web.client.api.storage; + +import elemental2.promise.Promise; +import io.deephaven.web.client.api.AbstractAsyncGwtTestCase; +import io.deephaven.web.client.api.CoreClient; +import jsinterop.base.JsPropertyMap; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + +public class JsStorageServiceTest extends AbstractAsyncGwtTestCase { + + public void testStorageService() { + setupDhInternal().then(ignore -> { + CoreClient coreClient = new CoreClient(localServer, null); + return coreClient.login(JsPropertyMap.of("type", CoreClient.LOGIN_TYPE_ANONYMOUS)) + .then(ignore2 -> Promise.resolve(coreClient)); + }).then(coreClient -> { + JsStorageService storageService = coreClient.getStorageService(); + delayTestFinish(20_000); + + // On startup, there are only default items + return storageService.listItems("", null).then(items -> { + assertEquals(items.toString_(), 2, items.length); + + Set expected = new HashSet<>(Arrays.asList("layouts", "notebooks")); + for (int i = 0; i < items.length; i++) { + expected.remove(items.getAt(i).getFilename()); + } + assertTrue(expected.toString(), expected.isEmpty()); + + delayTestFinish(20_001); + return storageService.createDirectory("notebooks/myDir"); + }).then(ignore -> { + delayTestFinish(20_002); + + return Promise.all(storageService.listItems("notebooks", null).then(items -> { + delayTestFinish(20_003); + + assertEquals(1, items.length); + + assertEquals(JsItemType.DIRECTORY, items.getAt(0).getType()); + assertEquals("myDir", items.getAt(0).getBasename()); + + return null; + }), storageService.listItems("/notebooks", null).then(items -> { + delayTestFinish(20_003); + + assertEquals(1, items.length); + + assertEquals(JsItemType.DIRECTORY, items.getAt(0).getType()); + assertEquals("myDir", items.getAt(0).getBasename()); + return null; + }), storageService.listItems("notebooks/", null).then(items -> { + delayTestFinish(20_003); + + assertEquals(1, items.length); + + assertEquals(JsItemType.DIRECTORY, items.getAt(0).getType()); + assertEquals("myDir", items.getAt(0).getBasename()); + return null; + }), storageService.listItems("/notebooks/", null).then(items -> { + delayTestFinish(20_003); + + assertEquals(1, items.length); + + assertEquals(JsItemType.DIRECTORY, items.getAt(0).getType()); + assertEquals("myDir", items.getAt(0).getBasename()); + return null; + })); + }).then(ignore -> { + delayTestFinish(20_003); + + + + + finishTest(); + return null; + }).catch_(this::report); + }); + } + + @Override + public String getModuleName() { + return "io.deephaven.web.DeephavenIntegrationTest"; + } +} \ No newline at end of file From 58d3898910135ef516cd4cc74f5ddad7442e6c98 Mon Sep 17 00:00:00 2001 From: Colin Alworth Date: Mon, 18 Mar 2024 11:18:23 -0500 Subject: [PATCH 04/11] Restore leading slash to paths --- .../server/notebook/FilesystemStorageServiceGrpcImpl.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/server/src/main/java/io/deephaven/server/notebook/FilesystemStorageServiceGrpcImpl.java b/server/src/main/java/io/deephaven/server/notebook/FilesystemStorageServiceGrpcImpl.java index 7f0ee1dadc4..5d955bd2ccd 100644 --- a/server/src/main/java/io/deephaven/server/notebook/FilesystemStorageServiceGrpcImpl.java +++ b/server/src/main/java/io/deephaven/server/notebook/FilesystemStorageServiceGrpcImpl.java @@ -86,6 +86,7 @@ public class FilesystemStorageServiceGrpcImpl extends StorageServiceGrpc.Storage * and this ensures that clients will have a stable cache across server restarts. */ private static final HashFunction HASH_FUNCTION = Hashing.murmur3_128(0); + public static final String REQUIRED_PATH_PREFIX = "/"; private final Path root = Paths.get(STORAGE_PATH).normalize(); private final SessionService sessionService; @@ -134,7 +135,7 @@ public void listItems( PathMatcher matcher = request.hasFilterGlob() ? createPathFilter(request.getFilterGlob()) : ignore -> true; Path dir = resolveOrThrow(request.getPath()); - builder.setCanonicalPath(String.valueOf(root.relativize(dir))); + builder.setCanonicalPath(REQUIRED_PATH_PREFIX + root.relativize(dir)); try (Stream list = Files.list(dir)) { for (Path p : (Iterable) list::iterator) { if (!matcher.matches(dir.relativize(p))) { @@ -143,7 +144,7 @@ public void listItems( BasicFileAttributes attrs = Files.readAttributes(p, BasicFileAttributes.class); boolean isDirectory = attrs.isDirectory(); ItemInfo.Builder info = ItemInfo.newBuilder() - .setPath(String.valueOf(root.relativize(p))); + .setPath(REQUIRED_PATH_PREFIX + root.relativize(p)); if (isDirectory) { info.setType(ItemType.DIRECTORY); } else { From b8aef02db112c91cdfbc497ce7eb12c6686575a9 Mon Sep 17 00:00:00 2001 From: Colin Alworth Date: Mon, 18 Mar 2024 11:20:35 -0500 Subject: [PATCH 05/11] Send default layout/storage locations to authenticated clients --- props/configs/src/main/resources/dh-defaults.prop | 5 ++++- .../notebook/FilesystemStorageServiceGrpcImpl.java | 11 ++++++++--- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/props/configs/src/main/resources/dh-defaults.prop b/props/configs/src/main/resources/dh-defaults.prop index 13e85fae675..3b97d130368 100644 --- a/props/configs/src/main/resources/dh-defaults.prop +++ b/props/configs/src/main/resources/dh-defaults.prop @@ -50,12 +50,15 @@ http.session.durationMs=300000 AuthHandlers=io.deephaven.authentication.psk.PskAuthenticationHandler authentication.anonymous.warn=true +web.storage.layout.directory=/layouts +web.storage.notebook.directory=/notebooks + # List of configuration properties to provide to unauthenticated clients, so that they can decide how best to prove their # identity to the server. authentication.client.configuration.list=AuthHandlers # List of configuration properties to provide to authenticated clients, so they can interact with the server. -client.configuration.list=java.version,deephaven.version,barrage.version,http.session.durationMs,file.separator +client.configuration.list=java.version,deephaven.version,barrage.version,http.session.durationMs,file.separator,web.storage.layout.directory,web.storage.notebook.directory # Version list to add to the configuration property list. Each `=`-delimited pair denotes a short name for a versioned # jar, and a class that is found in that jar. Any such keys will be made available to the client.configuration.list # as .version. diff --git a/server/src/main/java/io/deephaven/server/notebook/FilesystemStorageServiceGrpcImpl.java b/server/src/main/java/io/deephaven/server/notebook/FilesystemStorageServiceGrpcImpl.java index 5d955bd2ccd..c8dacf941d8 100644 --- a/server/src/main/java/io/deephaven/server/notebook/FilesystemStorageServiceGrpcImpl.java +++ b/server/src/main/java/io/deephaven/server/notebook/FilesystemStorageServiceGrpcImpl.java @@ -71,9 +71,9 @@ public class FilesystemStorageServiceGrpcImpl extends StorageServiceGrpc.Storage DataDir.get().resolve("storage").toString()); private static final String WEB_LAYOUT_DIRECTORY = - Configuration.getInstance().getStringWithDefault("web.storage.layout.directory", "/layouts"); + Configuration.getInstance().getProperty("web.storage.layout.directory"); private static final String WEB_NOTEBOOK_DIRECTORY = - Configuration.getInstance().getStringWithDefault("web.storage.notebook.directory", "/notebooks"); + Configuration.getInstance().getProperty("web.storage.notebook.directory"); private static final String[] PRE_CREATE_PATHS = Configuration.getInstance() .getStringArrayFromPropertyWithDefault("storage.path.defaults", new String[] { WEB_LAYOUT_DIRECTORY, @@ -86,7 +86,12 @@ public class FilesystemStorageServiceGrpcImpl extends StorageServiceGrpc.Storage * and this ensures that clients will have a stable cache across server restarts. */ private static final HashFunction HASH_FUNCTION = Hashing.murmur3_128(0); - public static final String REQUIRED_PATH_PREFIX = "/"; + + /** + * Presently, the Web IDE requires that all paths start with "/". When this is no longer true, remove this constant. + */ + @Deprecated + private static final String REQUIRED_PATH_PREFIX = "/"; private final Path root = Paths.get(STORAGE_PATH).normalize(); private final SessionService sessionService; From 2edc649baf6361ad17980555abf7d707b3c11c09 Mon Sep 17 00:00:00 2001 From: Colin Alworth Date: Mon, 18 Mar 2024 19:39:12 -0500 Subject: [PATCH 06/11] spotless --- .../deephaven/web/client/api/storage/JsStorageService.java | 3 ++- .../web/client/api/storage/JsStorageServiceTest.java | 6 ++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/web/client-api/src/main/java/io/deephaven/web/client/api/storage/JsStorageService.java b/web/client-api/src/main/java/io/deephaven/web/client/api/storage/JsStorageService.java index 841cb2fde78..0ec927df9ee 100644 --- a/web/client-api/src/main/java/io/deephaven/web/client/api/storage/JsStorageService.java +++ b/web/client-api/src/main/java/io/deephaven/web/client/api/storage/JsStorageService.java @@ -64,7 +64,8 @@ public Promise> listItems(String path, @JsOptional String req.setFilterGlob(glob); return Callbacks.grpcUnaryPromise(c -> client().listItems(req, metadata(), c::apply)) .then(response -> Promise - .resolve(response.getItemsList().map((item, i, arr) -> JsItemDetails.fromProto(response.getCanonicalPath(), item)))); + .resolve(response.getItemsList() + .map((item, i, arr) -> JsItemDetails.fromProto(response.getCanonicalPath(), item)))); } /** diff --git a/web/client-api/src/test/java/io/deephaven/web/client/api/storage/JsStorageServiceTest.java b/web/client-api/src/test/java/io/deephaven/web/client/api/storage/JsStorageServiceTest.java index dbcba38daad..12197ba9f3a 100644 --- a/web/client-api/src/test/java/io/deephaven/web/client/api/storage/JsStorageServiceTest.java +++ b/web/client-api/src/test/java/io/deephaven/web/client/api/storage/JsStorageServiceTest.java @@ -1,3 +1,6 @@ +// +// Copyright (c) 2016-2024 Deephaven Data Labs and Patent Pending +// package io.deephaven.web.client.api.storage; import elemental2.promise.Promise; @@ -74,7 +77,6 @@ public void testStorageService() { - finishTest(); return null; }).catch_(this::report); @@ -85,4 +87,4 @@ public void testStorageService() { public String getModuleName() { return "io.deephaven.web.DeephavenIntegrationTest"; } -} \ No newline at end of file +} From 5db28ca81cc1c035ee559c8d23eb7d063ebb31dc Mon Sep 17 00:00:00 2001 From: Colin Alworth Date: Fri, 24 May 2024 14:02:59 -0500 Subject: [PATCH 07/11] Update go/cpp/py protos --- .../proto/deephaven/proto/storage.pb.cc | 150 +++++++++----- .../proto/deephaven/proto/storage.pb.h | 66 ++++++ go/internal/proto/storage/storage.pb.go | 189 ++++++++++-------- py/client/pydeephaven/proto/storage_pb2.py | 52 ++--- 4 files changed, 295 insertions(+), 162 deletions(-) diff --git a/cpp-client/deephaven/dhclient/proto/deephaven/proto/storage.pb.cc b/cpp-client/deephaven/dhclient/proto/deephaven/proto/storage.pb.cc index 6b51feabaf2..72ddf3ac02a 100644 --- a/cpp-client/deephaven/dhclient/proto/deephaven/proto/storage.pb.cc +++ b/cpp-client/deephaven/dhclient/proto/deephaven/proto/storage.pb.cc @@ -60,6 +60,7 @@ PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORIT PROTOBUF_CONSTEXPR ListItemsResponse::ListItemsResponse( ::_pbi::ConstantInitialized): _impl_{ /*decltype(_impl_.items_)*/{} + , /*decltype(_impl_.canonical_path_)*/{&::_pbi::fixed_address_empty_string, ::_pbi::ConstantInitialized{}} , /*decltype(_impl_._cached_size_)*/{}} {} struct ListItemsResponseDefaultTypeInternal { PROTOBUF_CONSTEXPR ListItemsResponseDefaultTypeInternal() @@ -244,6 +245,7 @@ const uint32_t TableStruct_deephaven_2fproto_2fstorage_2eproto::offsets[] PROTOB ~0u, // no _weak_field_map_ ~0u, // no _inlined_string_donated_ PROTOBUF_FIELD_OFFSET(::io::deephaven::proto::backplane::grpc::ListItemsResponse, _impl_.items_), + PROTOBUF_FIELD_OFFSET(::io::deephaven::proto::backplane::grpc::ListItemsResponse, _impl_.canonical_path_), PROTOBUF_FIELD_OFFSET(::io::deephaven::proto::backplane::grpc::FetchFileRequest, _impl_._has_bits_), PROTOBUF_FIELD_OFFSET(::io::deephaven::proto::backplane::grpc::FetchFileRequest, _internal_metadata_), ~0u, // no _extensions_ @@ -327,16 +329,16 @@ static const ::_pbi::MigrationSchema schemas[] PROTOBUF_SECTION_VARIABLE(protode { 0, 8, -1, sizeof(::io::deephaven::proto::backplane::grpc::ListItemsRequest)}, { 10, 20, -1, sizeof(::io::deephaven::proto::backplane::grpc::ItemInfo)}, { 24, -1, -1, sizeof(::io::deephaven::proto::backplane::grpc::ListItemsResponse)}, - { 31, 39, -1, sizeof(::io::deephaven::proto::backplane::grpc::FetchFileRequest)}, - { 41, 49, -1, sizeof(::io::deephaven::proto::backplane::grpc::FetchFileResponse)}, - { 51, -1, -1, sizeof(::io::deephaven::proto::backplane::grpc::SaveFileRequest)}, - { 60, 67, -1, sizeof(::io::deephaven::proto::backplane::grpc::SaveFileResponse)}, - { 68, -1, -1, sizeof(::io::deephaven::proto::backplane::grpc::MoveItemRequest)}, - { 77, -1, -1, sizeof(::io::deephaven::proto::backplane::grpc::MoveItemResponse)}, - { 83, -1, -1, sizeof(::io::deephaven::proto::backplane::grpc::CreateDirectoryRequest)}, - { 90, -1, -1, sizeof(::io::deephaven::proto::backplane::grpc::CreateDirectoryResponse)}, - { 96, -1, -1, sizeof(::io::deephaven::proto::backplane::grpc::DeleteItemRequest)}, - { 103, -1, -1, sizeof(::io::deephaven::proto::backplane::grpc::DeleteItemResponse)}, + { 32, 40, -1, sizeof(::io::deephaven::proto::backplane::grpc::FetchFileRequest)}, + { 42, 50, -1, sizeof(::io::deephaven::proto::backplane::grpc::FetchFileResponse)}, + { 52, -1, -1, sizeof(::io::deephaven::proto::backplane::grpc::SaveFileRequest)}, + { 61, 68, -1, sizeof(::io::deephaven::proto::backplane::grpc::SaveFileResponse)}, + { 69, -1, -1, sizeof(::io::deephaven::proto::backplane::grpc::MoveItemRequest)}, + { 78, -1, -1, sizeof(::io::deephaven::proto::backplane::grpc::MoveItemResponse)}, + { 84, -1, -1, sizeof(::io::deephaven::proto::backplane::grpc::CreateDirectoryRequest)}, + { 91, -1, -1, sizeof(::io::deephaven::proto::backplane::grpc::CreateDirectoryResponse)}, + { 97, -1, -1, sizeof(::io::deephaven::proto::backplane::grpc::DeleteItemRequest)}, + { 104, -1, -1, sizeof(::io::deephaven::proto::backplane::grpc::DeleteItemResponse)}, }; static const ::_pb::Message* const file_default_instances[] = { @@ -362,48 +364,48 @@ const char descriptor_table_protodef_deephaven_2fproto_2fstorage_2eproto[] PROTO "\tH\000\210\001\001B\016\n\014_filter_glob\"\201\001\n\010ItemInfo\022\014\n\004p" "ath\030\001 \001(\t\0229\n\004type\030\002 \001(\0162+.io.deephaven.p" "roto.backplane.grpc.ItemType\022\020\n\004size\030\003 \001" - "(\022B\0020\001\022\021\n\004etag\030\004 \001(\tH\000\210\001\001B\007\n\005_etag\"O\n\021Li" + "(\022B\0020\001\022\021\n\004etag\030\004 \001(\tH\000\210\001\001B\007\n\005_etag\"g\n\021Li" "stItemsResponse\022:\n\005items\030\001 \003(\0132+.io.deep" - "haven.proto.backplane.grpc.ItemInfo\"<\n\020F" - "etchFileRequest\022\014\n\004path\030\001 \001(\t\022\021\n\004etag\030\002 " - "\001(\tH\000\210\001\001B\007\n\005_etag\"A\n\021FetchFileResponse\022\020" - "\n\010contents\030\001 \001(\014\022\021\n\004etag\030\002 \001(\tH\000\210\001\001B\007\n\005_" - "etag\"J\n\017SaveFileRequest\022\027\n\017allow_overwri" - "te\030\001 \001(\010\022\014\n\004path\030\002 \001(\t\022\020\n\010contents\030\003 \001(\014" - "\".\n\020SaveFileResponse\022\021\n\004etag\030\001 \001(\tH\000\210\001\001B" - "\007\n\005_etag\"N\n\017MoveItemRequest\022\020\n\010old_path\030" - "\001 \001(\t\022\020\n\010new_path\030\002 \001(\t\022\027\n\017allow_overwri" - "te\030\003 \001(\010\"\022\n\020MoveItemResponse\"&\n\026CreateDi" - "rectoryRequest\022\014\n\004path\030\001 \001(\t\"\031\n\027CreateDi" - "rectoryResponse\"!\n\021DeleteItemRequest\022\014\n\004" - "path\030\001 \001(\t\"\024\n\022DeleteItemResponse*0\n\010Item" - "Type\022\013\n\007UNKNOWN\020\000\022\r\n\tDIRECTORY\020\001\022\010\n\004FILE" - "\020\0022\374\005\n\016StorageService\022x\n\tListItems\0223.io." - "deephaven.proto.backplane.grpc.ListItems" - "Request\0324.io.deephaven.proto.backplane.g" - "rpc.ListItemsResponse\"\000\022x\n\tFetchFile\0223.i" - "o.deephaven.proto.backplane.grpc.FetchFi" - "leRequest\0324.io.deephaven.proto.backplane" - ".grpc.FetchFileResponse\"\000\022u\n\010SaveFile\0222." - "io.deephaven.proto.backplane.grpc.SaveFi" - "leRequest\0323.io.deephaven.proto.backplane" - ".grpc.SaveFileResponse\"\000\022u\n\010MoveItem\0222.i" - "o.deephaven.proto.backplane.grpc.MoveIte" - "mRequest\0323.io.deephaven.proto.backplane." - "grpc.MoveItemResponse\"\000\022\212\001\n\017CreateDirect" - "ory\0229.io.deephaven.proto.backplane.grpc." - "CreateDirectoryRequest\032:.io.deephaven.pr" - "oto.backplane.grpc.CreateDirectoryRespon" - "se\"\000\022{\n\nDeleteItem\0224.io.deephaven.proto." - "backplane.grpc.DeleteItemRequest\0325.io.de" - "ephaven.proto.backplane.grpc.DeleteItemR" - "esponse\"\000BCH\001P\001Z=github.com/deephaven/de" - "ephaven-core/go/internal/proto/storageb\006" - "proto3" + "haven.proto.backplane.grpc.ItemInfo\022\026\n\016c" + "anonical_path\030\002 \001(\t\"<\n\020FetchFileRequest\022" + "\014\n\004path\030\001 \001(\t\022\021\n\004etag\030\002 \001(\tH\000\210\001\001B\007\n\005_eta" + "g\"A\n\021FetchFileResponse\022\020\n\010contents\030\001 \001(\014" + "\022\021\n\004etag\030\002 \001(\tH\000\210\001\001B\007\n\005_etag\"J\n\017SaveFile" + "Request\022\027\n\017allow_overwrite\030\001 \001(\010\022\014\n\004path" + "\030\002 \001(\t\022\020\n\010contents\030\003 \001(\014\".\n\020SaveFileResp" + "onse\022\021\n\004etag\030\001 \001(\tH\000\210\001\001B\007\n\005_etag\"N\n\017Move" + "ItemRequest\022\020\n\010old_path\030\001 \001(\t\022\020\n\010new_pat" + "h\030\002 \001(\t\022\027\n\017allow_overwrite\030\003 \001(\010\"\022\n\020Move" + "ItemResponse\"&\n\026CreateDirectoryRequest\022\014" + "\n\004path\030\001 \001(\t\"\031\n\027CreateDirectoryResponse\"" + "!\n\021DeleteItemRequest\022\014\n\004path\030\001 \001(\t\"\024\n\022De" + "leteItemResponse*0\n\010ItemType\022\013\n\007UNKNOWN\020" + "\000\022\r\n\tDIRECTORY\020\001\022\010\n\004FILE\020\0022\374\005\n\016StorageSe" + "rvice\022x\n\tListItems\0223.io.deephaven.proto." + "backplane.grpc.ListItemsRequest\0324.io.dee" + "phaven.proto.backplane.grpc.ListItemsRes" + "ponse\"\000\022x\n\tFetchFile\0223.io.deephaven.prot" + "o.backplane.grpc.FetchFileRequest\0324.io.d" + "eephaven.proto.backplane.grpc.FetchFileR" + "esponse\"\000\022u\n\010SaveFile\0222.io.deephaven.pro" + "to.backplane.grpc.SaveFileRequest\0323.io.d" + "eephaven.proto.backplane.grpc.SaveFileRe" + "sponse\"\000\022u\n\010MoveItem\0222.io.deephaven.prot" + "o.backplane.grpc.MoveItemRequest\0323.io.de" + "ephaven.proto.backplane.grpc.MoveItemRes" + "ponse\"\000\022\212\001\n\017CreateDirectory\0229.io.deephav" + "en.proto.backplane.grpc.CreateDirectoryR" + "equest\032:.io.deephaven.proto.backplane.gr" + "pc.CreateDirectoryResponse\"\000\022{\n\nDeleteIt" + "em\0224.io.deephaven.proto.backplane.grpc.D" + "eleteItemRequest\0325.io.deephaven.proto.ba" + "ckplane.grpc.DeleteItemResponse\"\000BCH\001P\001Z" + "=github.com/deephaven/deephaven-core/go/" + "internal/proto/storageb\006proto3" ; static ::_pbi::once_flag descriptor_table_deephaven_2fproto_2fstorage_2eproto_once; const ::_pbi::DescriptorTable descriptor_table_deephaven_2fproto_2fstorage_2eproto = { - false, false, 1726, descriptor_table_protodef_deephaven_2fproto_2fstorage_2eproto, + false, false, 1750, descriptor_table_protodef_deephaven_2fproto_2fstorage_2eproto, "deephaven/proto/storage.proto", &descriptor_table_deephaven_2fproto_2fstorage_2eproto_once, nullptr, 0, 13, schemas, file_default_instances, TableStruct_deephaven_2fproto_2fstorage_2eproto::offsets, @@ -1051,9 +1053,18 @@ ListItemsResponse::ListItemsResponse(const ListItemsResponse& from) ListItemsResponse* const _this = this; (void)_this; new (&_impl_) Impl_{ decltype(_impl_.items_){from._impl_.items_} + , decltype(_impl_.canonical_path_){} , /*decltype(_impl_._cached_size_)*/{}}; _internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_); + _impl_.canonical_path_.InitDefault(); + #ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING + _impl_.canonical_path_.Set("", GetArenaForAllocation()); + #endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING + if (!from._internal_canonical_path().empty()) { + _this->_impl_.canonical_path_.Set(from._internal_canonical_path(), + _this->GetArenaForAllocation()); + } // @@protoc_insertion_point(copy_constructor:io.deephaven.proto.backplane.grpc.ListItemsResponse) } @@ -1063,8 +1074,13 @@ inline void ListItemsResponse::SharedCtor( (void)is_message_owned; new (&_impl_) Impl_{ decltype(_impl_.items_){arena} + , decltype(_impl_.canonical_path_){} , /*decltype(_impl_._cached_size_)*/{} }; + _impl_.canonical_path_.InitDefault(); + #ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING + _impl_.canonical_path_.Set("", GetArenaForAllocation()); + #endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING } ListItemsResponse::~ListItemsResponse() { @@ -1079,6 +1095,7 @@ ListItemsResponse::~ListItemsResponse() { inline void ListItemsResponse::SharedDtor() { GOOGLE_DCHECK(GetArenaForAllocation() == nullptr); _impl_.items_.~RepeatedPtrField(); + _impl_.canonical_path_.Destroy(); } void ListItemsResponse::SetCachedSize(int size) const { @@ -1092,6 +1109,7 @@ void ListItemsResponse::Clear() { (void) cached_has_bits; _impl_.items_.Clear(); + _impl_.canonical_path_.ClearToEmpty(); _internal_metadata_.Clear<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(); } @@ -1114,6 +1132,16 @@ const char* ListItemsResponse::_InternalParse(const char* ptr, ::_pbi::ParseCont } else goto handle_unusual; continue; + // string canonical_path = 2; + case 2: + if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 18)) { + auto str = _internal_mutable_canonical_path(); + ptr = ::_pbi::InlineGreedyStringParser(str, ptr, ctx); + CHK_(ptr); + CHK_(::_pbi::VerifyUTF8(str, "io.deephaven.proto.backplane.grpc.ListItemsResponse.canonical_path")); + } else + goto handle_unusual; + continue; default: goto handle_unusual; } // switch @@ -1151,6 +1179,16 @@ uint8_t* ListItemsResponse::_InternalSerialize( InternalWriteMessage(1, repfield, repfield.GetCachedSize(), target, stream); } + // string canonical_path = 2; + if (!this->_internal_canonical_path().empty()) { + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::VerifyUtf8String( + this->_internal_canonical_path().data(), static_cast(this->_internal_canonical_path().length()), + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::SERIALIZE, + "io.deephaven.proto.backplane.grpc.ListItemsResponse.canonical_path"); + target = stream->WriteStringMaybeAliased( + 2, this->_internal_canonical_path(), target); + } + if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { target = ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray( _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance), target, stream); @@ -1174,6 +1212,13 @@ size_t ListItemsResponse::ByteSizeLong() const { ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize(msg); } + // string canonical_path = 2; + if (!this->_internal_canonical_path().empty()) { + total_size += 1 + + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::StringSize( + this->_internal_canonical_path()); + } + return MaybeComputeUnknownFieldsSize(total_size, &_impl_._cached_size_); } @@ -1193,6 +1238,9 @@ void ListItemsResponse::MergeImpl(::PROTOBUF_NAMESPACE_ID::Message& to_msg, cons (void) cached_has_bits; _this->_impl_.items_.MergeFrom(from._impl_.items_); + if (!from._internal_canonical_path().empty()) { + _this->_internal_set_canonical_path(from._internal_canonical_path()); + } _this->_internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_); } @@ -1209,8 +1257,14 @@ bool ListItemsResponse::IsInitialized() const { void ListItemsResponse::InternalSwap(ListItemsResponse* other) { using std::swap; + auto* lhs_arena = GetArenaForAllocation(); + auto* rhs_arena = other->GetArenaForAllocation(); _internal_metadata_.InternalSwap(&other->_internal_metadata_); _impl_.items_.InternalSwap(&other->_impl_.items_); + ::PROTOBUF_NAMESPACE_ID::internal::ArenaStringPtr::InternalSwap( + &_impl_.canonical_path_, lhs_arena, + &other->_impl_.canonical_path_, rhs_arena + ); } ::PROTOBUF_NAMESPACE_ID::Metadata ListItemsResponse::GetMetadata() const { diff --git a/cpp-client/deephaven/dhclient/proto/deephaven/proto/storage.pb.h b/cpp-client/deephaven/dhclient/proto/deephaven/proto/storage.pb.h index 54388fb27a9..1585e29f9a2 100644 --- a/cpp-client/deephaven/dhclient/proto/deephaven/proto/storage.pb.h +++ b/cpp-client/deephaven/dhclient/proto/deephaven/proto/storage.pb.h @@ -636,6 +636,7 @@ class ListItemsResponse final : enum : int { kItemsFieldNumber = 1, + kCanonicalPathFieldNumber = 2, }; // repeated .io.deephaven.proto.backplane.grpc.ItemInfo items = 1; int items_size() const; @@ -655,6 +656,20 @@ class ListItemsResponse final : const ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::io::deephaven::proto::backplane::grpc::ItemInfo >& items() const; + // string canonical_path = 2; + void clear_canonical_path(); + const std::string& canonical_path() const; + template + void set_canonical_path(ArgT0&& arg0, ArgT... args); + std::string* mutable_canonical_path(); + PROTOBUF_NODISCARD std::string* release_canonical_path(); + void set_allocated_canonical_path(std::string* canonical_path); + private: + const std::string& _internal_canonical_path() const; + inline PROTOBUF_ALWAYS_INLINE void _internal_set_canonical_path(const std::string& value); + std::string* _internal_mutable_canonical_path(); + public: + // @@protoc_insertion_point(class_scope:io.deephaven.proto.backplane.grpc.ListItemsResponse) private: class _Internal; @@ -664,6 +679,7 @@ class ListItemsResponse final : typedef void DestructorSkippable_; struct Impl_ { ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::io::deephaven::proto::backplane::grpc::ItemInfo > items_; + ::PROTOBUF_NAMESPACE_ID::internal::ArenaStringPtr canonical_path_; mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_; }; union { Impl_ _impl_; }; @@ -2530,6 +2546,56 @@ ListItemsResponse::items() const { return _impl_.items_; } +// string canonical_path = 2; +inline void ListItemsResponse::clear_canonical_path() { + _impl_.canonical_path_.ClearToEmpty(); +} +inline const std::string& ListItemsResponse::canonical_path() const { + // @@protoc_insertion_point(field_get:io.deephaven.proto.backplane.grpc.ListItemsResponse.canonical_path) + return _internal_canonical_path(); +} +template +inline PROTOBUF_ALWAYS_INLINE +void ListItemsResponse::set_canonical_path(ArgT0&& arg0, ArgT... args) { + + _impl_.canonical_path_.Set(static_cast(arg0), args..., GetArenaForAllocation()); + // @@protoc_insertion_point(field_set:io.deephaven.proto.backplane.grpc.ListItemsResponse.canonical_path) +} +inline std::string* ListItemsResponse::mutable_canonical_path() { + std::string* _s = _internal_mutable_canonical_path(); + // @@protoc_insertion_point(field_mutable:io.deephaven.proto.backplane.grpc.ListItemsResponse.canonical_path) + return _s; +} +inline const std::string& ListItemsResponse::_internal_canonical_path() const { + return _impl_.canonical_path_.Get(); +} +inline void ListItemsResponse::_internal_set_canonical_path(const std::string& value) { + + _impl_.canonical_path_.Set(value, GetArenaForAllocation()); +} +inline std::string* ListItemsResponse::_internal_mutable_canonical_path() { + + return _impl_.canonical_path_.Mutable(GetArenaForAllocation()); +} +inline std::string* ListItemsResponse::release_canonical_path() { + // @@protoc_insertion_point(field_release:io.deephaven.proto.backplane.grpc.ListItemsResponse.canonical_path) + return _impl_.canonical_path_.Release(); +} +inline void ListItemsResponse::set_allocated_canonical_path(std::string* canonical_path) { + if (canonical_path != nullptr) { + + } else { + + } + _impl_.canonical_path_.SetAllocated(canonical_path, GetArenaForAllocation()); +#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING + if (_impl_.canonical_path_.IsDefault()) { + _impl_.canonical_path_.Set("", GetArenaForAllocation()); + } +#endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING + // @@protoc_insertion_point(field_set_allocated:io.deephaven.proto.backplane.grpc.ListItemsResponse.canonical_path) +} + // ------------------------------------------------------------------- // FetchFileRequest diff --git a/go/internal/proto/storage/storage.pb.go b/go/internal/proto/storage/storage.pb.go index 2c33196f3b2..d3f691bf6ff 100644 --- a/go/internal/proto/storage/storage.pb.go +++ b/go/internal/proto/storage/storage.pb.go @@ -214,6 +214,9 @@ type ListItemsResponse struct { // List of items found in the specified directory. Items []*ItemInfo `protobuf:"bytes,1,rep,name=items,proto3" json:"items,omitempty"` + // The canonical path of the listed directory. This is useful to recognize the basename + // of the items in a cross-platform way. + CanonicalPath string `protobuf:"bytes,2,opt,name=canonical_path,json=canonicalPath,proto3" json:"canonical_path,omitempty"` } func (x *ListItemsResponse) Reset() { @@ -255,6 +258,13 @@ func (x *ListItemsResponse) GetItems() []*ItemInfo { return nil } +func (x *ListItemsResponse) GetCanonicalPath() string { + if x != nil { + return x.CanonicalPath + } + return "" +} + type FetchFileRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -785,105 +795,108 @@ var file_deephaven_proto_storage_proto_rawDesc = []byte{ 0x70, 0x65, 0x12, 0x16, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x12, 0x42, 0x02, 0x30, 0x01, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x17, 0x0a, 0x04, 0x65, 0x74, 0x61, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, 0x65, 0x74, 0x61, 0x67, - 0x88, 0x01, 0x01, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x65, 0x74, 0x61, 0x67, 0x22, 0x56, 0x0a, 0x11, + 0x88, 0x01, 0x01, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x65, 0x74, 0x61, 0x67, 0x22, 0x7d, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x41, 0x0a, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x65, 0x70, 0x68, 0x61, 0x76, 0x65, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x49, 0x74, 0x65, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x69, - 0x74, 0x65, 0x6d, 0x73, 0x22, 0x48, 0x0a, 0x10, 0x46, 0x65, 0x74, 0x63, 0x68, 0x46, 0x69, 0x6c, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x17, 0x0a, 0x04, - 0x65, 0x74, 0x61, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, 0x65, 0x74, - 0x61, 0x67, 0x88, 0x01, 0x01, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x65, 0x74, 0x61, 0x67, 0x22, 0x51, - 0x0a, 0x11, 0x46, 0x65, 0x74, 0x63, 0x68, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x12, - 0x17, 0x0a, 0x04, 0x65, 0x74, 0x61, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, - 0x04, 0x65, 0x74, 0x61, 0x67, 0x88, 0x01, 0x01, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x65, 0x74, 0x61, - 0x67, 0x22, 0x6a, 0x0a, 0x0f, 0x53, 0x61, 0x76, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x6f, 0x76, - 0x65, 0x72, 0x77, 0x72, 0x69, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x61, - 0x6c, 0x6c, 0x6f, 0x77, 0x4f, 0x76, 0x65, 0x72, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x12, 0x0a, - 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, - 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x34, 0x0a, - 0x10, 0x53, 0x61, 0x76, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x17, 0x0a, 0x04, 0x65, 0x74, 0x61, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, - 0x00, 0x52, 0x04, 0x65, 0x74, 0x61, 0x67, 0x88, 0x01, 0x01, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x65, - 0x74, 0x61, 0x67, 0x22, 0x70, 0x0a, 0x0f, 0x4d, 0x6f, 0x76, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x6c, 0x64, 0x5f, 0x70, 0x61, - 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x6c, 0x64, 0x50, 0x61, 0x74, - 0x68, 0x12, 0x19, 0x0a, 0x08, 0x6e, 0x65, 0x77, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x6e, 0x65, 0x77, 0x50, 0x61, 0x74, 0x68, 0x12, 0x27, 0x0a, 0x0f, - 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x6f, 0x76, 0x65, 0x72, 0x77, 0x72, 0x69, 0x74, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x4f, 0x76, 0x65, 0x72, - 0x77, 0x72, 0x69, 0x74, 0x65, 0x22, 0x12, 0x0a, 0x10, 0x4d, 0x6f, 0x76, 0x65, 0x49, 0x74, 0x65, - 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2c, 0x0a, 0x16, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x22, 0x19, 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x27, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x74, 0x65, 0x6d, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x22, 0x14, 0x0a, 0x12, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x2a, 0x30, 0x0a, 0x08, 0x49, 0x74, 0x65, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, - 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x44, 0x49, - 0x52, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x59, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x46, 0x49, 0x4c, - 0x45, 0x10, 0x02, 0x32, 0xfc, 0x05, 0x0a, 0x0e, 0x53, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x78, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x74, - 0x65, 0x6d, 0x73, 0x12, 0x33, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x65, 0x70, 0x68, 0x61, 0x76, - 0x65, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x70, 0x6c, 0x61, - 0x6e, 0x65, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x74, 0x65, 0x6d, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, - 0x65, 0x70, 0x68, 0x61, 0x76, 0x65, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x62, 0x61, - 0x63, 0x6b, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x78, 0x0a, 0x09, 0x46, 0x65, 0x74, 0x63, 0x68, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x33, 0x2e, - 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x65, 0x70, 0x68, 0x61, 0x76, 0x65, 0x6e, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x67, 0x72, 0x70, - 0x63, 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x65, 0x70, 0x68, 0x61, 0x76, 0x65, - 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x70, 0x6c, 0x61, 0x6e, - 0x65, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x46, 0x69, 0x6c, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x75, 0x0a, 0x08, 0x53, 0x61, - 0x76, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x32, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x65, 0x70, - 0x68, 0x61, 0x76, 0x65, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x62, 0x61, 0x63, 0x6b, - 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x61, 0x76, 0x65, 0x46, - 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x69, 0x6f, 0x2e, + 0x74, 0x65, 0x6d, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x61, 0x6e, 0x6f, 0x6e, 0x69, 0x63, 0x61, + 0x6c, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x61, + 0x6e, 0x6f, 0x6e, 0x69, 0x63, 0x61, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x22, 0x48, 0x0a, 0x10, 0x46, + 0x65, 0x74, 0x63, 0x68, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, + 0x61, 0x74, 0x68, 0x12, 0x17, 0x0a, 0x04, 0x65, 0x74, 0x61, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x00, 0x52, 0x04, 0x65, 0x74, 0x61, 0x67, 0x88, 0x01, 0x01, 0x42, 0x07, 0x0a, 0x05, + 0x5f, 0x65, 0x74, 0x61, 0x67, 0x22, 0x51, 0x0a, 0x11, 0x46, 0x65, 0x74, 0x63, 0x68, 0x46, 0x69, + 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x17, 0x0a, 0x04, 0x65, 0x74, 0x61, 0x67, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, 0x65, 0x74, 0x61, 0x67, 0x88, 0x01, 0x01, 0x42, + 0x07, 0x0a, 0x05, 0x5f, 0x65, 0x74, 0x61, 0x67, 0x22, 0x6a, 0x0a, 0x0f, 0x53, 0x61, 0x76, 0x65, + 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x61, + 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x6f, 0x76, 0x65, 0x72, 0x77, 0x72, 0x69, 0x74, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x4f, 0x76, 0x65, 0x72, 0x77, + 0x72, 0x69, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x73, 0x22, 0x34, 0x0a, 0x10, 0x53, 0x61, 0x76, 0x65, 0x46, 0x69, 0x6c, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x17, 0x0a, 0x04, 0x65, 0x74, 0x61, 0x67, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, 0x65, 0x74, 0x61, 0x67, 0x88, 0x01, + 0x01, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x65, 0x74, 0x61, 0x67, 0x22, 0x70, 0x0a, 0x0f, 0x4d, 0x6f, + 0x76, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, + 0x08, 0x6f, 0x6c, 0x64, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x6f, 0x6c, 0x64, 0x50, 0x61, 0x74, 0x68, 0x12, 0x19, 0x0a, 0x08, 0x6e, 0x65, 0x77, 0x5f, + 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6e, 0x65, 0x77, 0x50, + 0x61, 0x74, 0x68, 0x12, 0x27, 0x0a, 0x0f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x6f, 0x76, 0x65, + 0x72, 0x77, 0x72, 0x69, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x61, 0x6c, + 0x6c, 0x6f, 0x77, 0x4f, 0x76, 0x65, 0x72, 0x77, 0x72, 0x69, 0x74, 0x65, 0x22, 0x12, 0x0a, 0x10, + 0x4d, 0x6f, 0x76, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x2c, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, + 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x22, 0x19, + 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x27, 0x0a, 0x11, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, + 0x74, 0x68, 0x22, 0x14, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x74, 0x65, 0x6d, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2a, 0x30, 0x0a, 0x08, 0x49, 0x74, 0x65, 0x6d, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, + 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x44, 0x49, 0x52, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x59, 0x10, 0x01, + 0x12, 0x08, 0x0a, 0x04, 0x46, 0x49, 0x4c, 0x45, 0x10, 0x02, 0x32, 0xfc, 0x05, 0x0a, 0x0e, 0x53, + 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x78, 0x0a, + 0x09, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x33, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x65, 0x70, 0x68, 0x61, 0x76, 0x65, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, - 0x62, 0x61, 0x63, 0x6b, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x53, - 0x61, 0x76, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x75, 0x0a, 0x08, 0x4d, 0x6f, 0x76, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x32, 0x2e, + 0x62, 0x61, 0x63, 0x6b, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x34, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x65, 0x70, 0x68, 0x61, 0x76, 0x65, 0x6e, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x67, + 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x78, 0x0a, 0x09, 0x46, 0x65, 0x74, 0x63, 0x68, + 0x46, 0x69, 0x6c, 0x65, 0x12, 0x33, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x65, 0x70, 0x68, 0x61, + 0x76, 0x65, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x70, 0x6c, + 0x61, 0x6e, 0x65, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x46, 0x69, + 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x69, 0x6f, 0x2e, 0x64, + 0x65, 0x65, 0x70, 0x68, 0x61, 0x76, 0x65, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x62, + 0x61, 0x63, 0x6b, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x46, 0x65, + 0x74, 0x63, 0x68, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x75, 0x0a, 0x08, 0x53, 0x61, 0x76, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x32, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x65, 0x70, 0x68, 0x61, 0x76, 0x65, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x67, 0x72, 0x70, - 0x63, 0x2e, 0x4d, 0x6f, 0x76, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x63, 0x2e, 0x53, 0x61, 0x76, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x65, 0x70, 0x68, 0x61, 0x76, 0x65, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x70, 0x6c, 0x61, 0x6e, 0x65, - 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x4d, 0x6f, 0x76, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x8a, 0x01, 0x0a, 0x0f, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x39, 0x2e, 0x69, - 0x6f, 0x2e, 0x64, 0x65, 0x65, 0x70, 0x68, 0x61, 0x76, 0x65, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x67, 0x72, 0x70, 0x63, - 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3a, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x65, - 0x70, 0x68, 0x61, 0x76, 0x65, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x62, 0x61, 0x63, - 0x6b, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7b, 0x0a, 0x0a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, - 0x74, 0x65, 0x6d, 0x12, 0x34, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x65, 0x70, 0x68, 0x61, 0x76, + 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x61, 0x76, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x75, 0x0a, 0x08, 0x4d, 0x6f, 0x76, 0x65, + 0x49, 0x74, 0x65, 0x6d, 0x12, 0x32, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x65, 0x70, 0x68, 0x61, + 0x76, 0x65, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x70, 0x6c, + 0x61, 0x6e, 0x65, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x4d, 0x6f, 0x76, 0x65, 0x49, 0x74, 0x65, + 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, + 0x65, 0x70, 0x68, 0x61, 0x76, 0x65, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x62, 0x61, + 0x63, 0x6b, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x4d, 0x6f, 0x76, + 0x65, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x8a, 0x01, 0x0a, 0x0f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x79, 0x12, 0x39, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x65, 0x70, 0x68, 0x61, 0x76, 0x65, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x70, 0x6c, 0x61, - 0x6e, 0x65, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x74, - 0x65, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x69, 0x6f, 0x2e, 0x64, - 0x65, 0x65, 0x70, 0x68, 0x61, 0x76, 0x65, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x62, - 0x61, 0x63, 0x6b, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x42, 0x43, 0x48, 0x01, 0x50, 0x01, 0x5a, 0x3d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, - 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x64, 0x65, 0x65, 0x70, 0x68, 0x61, 0x76, 0x65, 0x6e, 0x2f, 0x64, - 0x65, 0x65, 0x70, 0x68, 0x61, 0x76, 0x65, 0x6e, 0x2d, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x67, 0x6f, - 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, - 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6e, 0x65, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x69, + 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3a, + 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x65, 0x70, 0x68, 0x61, 0x76, 0x65, 0x6e, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x67, 0x72, + 0x70, 0x63, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7b, 0x0a, 0x0a, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x34, 0x2e, 0x69, 0x6f, 0x2e, + 0x64, 0x65, 0x65, 0x70, 0x68, 0x61, 0x76, 0x65, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x62, 0x61, 0x63, 0x6b, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x35, 0x2e, 0x69, 0x6f, 0x2e, 0x64, 0x65, 0x65, 0x70, 0x68, 0x61, 0x76, 0x65, 0x6e, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x70, 0x6c, 0x61, 0x6e, 0x65, 0x2e, + 0x67, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x43, 0x48, 0x01, 0x50, 0x01, 0x5a, + 0x3d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x64, 0x65, 0x65, 0x70, + 0x68, 0x61, 0x76, 0x65, 0x6e, 0x2f, 0x64, 0x65, 0x65, 0x70, 0x68, 0x61, 0x76, 0x65, 0x6e, 0x2d, + 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x67, 0x6f, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/py/client/pydeephaven/proto/storage_pb2.py b/py/client/pydeephaven/proto/storage_pb2.py index f5b8a5dd026..06a947122ee 100644 --- a/py/client/pydeephaven/proto/storage_pb2.py +++ b/py/client/pydeephaven/proto/storage_pb2.py @@ -13,7 +13,7 @@ -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1d\x64\x65\x65phaven/proto/storage.proto\x12!io.deephaven.proto.backplane.grpc\"J\n\x10ListItemsRequest\x12\x0c\n\x04path\x18\x01 \x01(\t\x12\x18\n\x0b\x66ilter_glob\x18\x04 \x01(\tH\x00\x88\x01\x01\x42\x0e\n\x0c_filter_glob\"\x81\x01\n\x08ItemInfo\x12\x0c\n\x04path\x18\x01 \x01(\t\x12\x39\n\x04type\x18\x02 \x01(\x0e\x32+.io.deephaven.proto.backplane.grpc.ItemType\x12\x10\n\x04size\x18\x03 \x01(\x12\x42\x02\x30\x01\x12\x11\n\x04\x65tag\x18\x04 \x01(\tH\x00\x88\x01\x01\x42\x07\n\x05_etag\"O\n\x11ListItemsResponse\x12:\n\x05items\x18\x01 \x03(\x0b\x32+.io.deephaven.proto.backplane.grpc.ItemInfo\"<\n\x10\x46\x65tchFileRequest\x12\x0c\n\x04path\x18\x01 \x01(\t\x12\x11\n\x04\x65tag\x18\x02 \x01(\tH\x00\x88\x01\x01\x42\x07\n\x05_etag\"A\n\x11\x46\x65tchFileResponse\x12\x10\n\x08\x63ontents\x18\x01 \x01(\x0c\x12\x11\n\x04\x65tag\x18\x02 \x01(\tH\x00\x88\x01\x01\x42\x07\n\x05_etag\"J\n\x0fSaveFileRequest\x12\x17\n\x0f\x61llow_overwrite\x18\x01 \x01(\x08\x12\x0c\n\x04path\x18\x02 \x01(\t\x12\x10\n\x08\x63ontents\x18\x03 \x01(\x0c\".\n\x10SaveFileResponse\x12\x11\n\x04\x65tag\x18\x01 \x01(\tH\x00\x88\x01\x01\x42\x07\n\x05_etag\"N\n\x0fMoveItemRequest\x12\x10\n\x08old_path\x18\x01 \x01(\t\x12\x10\n\x08new_path\x18\x02 \x01(\t\x12\x17\n\x0f\x61llow_overwrite\x18\x03 \x01(\x08\"\x12\n\x10MoveItemResponse\"&\n\x16\x43reateDirectoryRequest\x12\x0c\n\x04path\x18\x01 \x01(\t\"\x19\n\x17\x43reateDirectoryResponse\"!\n\x11\x44\x65leteItemRequest\x12\x0c\n\x04path\x18\x01 \x01(\t\"\x14\n\x12\x44\x65leteItemResponse*0\n\x08ItemType\x12\x0b\n\x07UNKNOWN\x10\x00\x12\r\n\tDIRECTORY\x10\x01\x12\x08\n\x04\x46ILE\x10\x02\x32\xfc\x05\n\x0eStorageService\x12x\n\tListItems\x12\x33.io.deephaven.proto.backplane.grpc.ListItemsRequest\x1a\x34.io.deephaven.proto.backplane.grpc.ListItemsResponse\"\x00\x12x\n\tFetchFile\x12\x33.io.deephaven.proto.backplane.grpc.FetchFileRequest\x1a\x34.io.deephaven.proto.backplane.grpc.FetchFileResponse\"\x00\x12u\n\x08SaveFile\x12\x32.io.deephaven.proto.backplane.grpc.SaveFileRequest\x1a\x33.io.deephaven.proto.backplane.grpc.SaveFileResponse\"\x00\x12u\n\x08MoveItem\x12\x32.io.deephaven.proto.backplane.grpc.MoveItemRequest\x1a\x33.io.deephaven.proto.backplane.grpc.MoveItemResponse\"\x00\x12\x8a\x01\n\x0f\x43reateDirectory\x12\x39.io.deephaven.proto.backplane.grpc.CreateDirectoryRequest\x1a:.io.deephaven.proto.backplane.grpc.CreateDirectoryResponse\"\x00\x12{\n\nDeleteItem\x12\x34.io.deephaven.proto.backplane.grpc.DeleteItemRequest\x1a\x35.io.deephaven.proto.backplane.grpc.DeleteItemResponse\"\x00\x42\x43H\x01P\x01Z=github.com/deephaven/deephaven-core/go/internal/proto/storageb\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1d\x64\x65\x65phaven/proto/storage.proto\x12!io.deephaven.proto.backplane.grpc\"J\n\x10ListItemsRequest\x12\x0c\n\x04path\x18\x01 \x01(\t\x12\x18\n\x0b\x66ilter_glob\x18\x04 \x01(\tH\x00\x88\x01\x01\x42\x0e\n\x0c_filter_glob\"\x81\x01\n\x08ItemInfo\x12\x0c\n\x04path\x18\x01 \x01(\t\x12\x39\n\x04type\x18\x02 \x01(\x0e\x32+.io.deephaven.proto.backplane.grpc.ItemType\x12\x10\n\x04size\x18\x03 \x01(\x12\x42\x02\x30\x01\x12\x11\n\x04\x65tag\x18\x04 \x01(\tH\x00\x88\x01\x01\x42\x07\n\x05_etag\"g\n\x11ListItemsResponse\x12:\n\x05items\x18\x01 \x03(\x0b\x32+.io.deephaven.proto.backplane.grpc.ItemInfo\x12\x16\n\x0e\x63\x61nonical_path\x18\x02 \x01(\t\"<\n\x10\x46\x65tchFileRequest\x12\x0c\n\x04path\x18\x01 \x01(\t\x12\x11\n\x04\x65tag\x18\x02 \x01(\tH\x00\x88\x01\x01\x42\x07\n\x05_etag\"A\n\x11\x46\x65tchFileResponse\x12\x10\n\x08\x63ontents\x18\x01 \x01(\x0c\x12\x11\n\x04\x65tag\x18\x02 \x01(\tH\x00\x88\x01\x01\x42\x07\n\x05_etag\"J\n\x0fSaveFileRequest\x12\x17\n\x0f\x61llow_overwrite\x18\x01 \x01(\x08\x12\x0c\n\x04path\x18\x02 \x01(\t\x12\x10\n\x08\x63ontents\x18\x03 \x01(\x0c\".\n\x10SaveFileResponse\x12\x11\n\x04\x65tag\x18\x01 \x01(\tH\x00\x88\x01\x01\x42\x07\n\x05_etag\"N\n\x0fMoveItemRequest\x12\x10\n\x08old_path\x18\x01 \x01(\t\x12\x10\n\x08new_path\x18\x02 \x01(\t\x12\x17\n\x0f\x61llow_overwrite\x18\x03 \x01(\x08\"\x12\n\x10MoveItemResponse\"&\n\x16\x43reateDirectoryRequest\x12\x0c\n\x04path\x18\x01 \x01(\t\"\x19\n\x17\x43reateDirectoryResponse\"!\n\x11\x44\x65leteItemRequest\x12\x0c\n\x04path\x18\x01 \x01(\t\"\x14\n\x12\x44\x65leteItemResponse*0\n\x08ItemType\x12\x0b\n\x07UNKNOWN\x10\x00\x12\r\n\tDIRECTORY\x10\x01\x12\x08\n\x04\x46ILE\x10\x02\x32\xfc\x05\n\x0eStorageService\x12x\n\tListItems\x12\x33.io.deephaven.proto.backplane.grpc.ListItemsRequest\x1a\x34.io.deephaven.proto.backplane.grpc.ListItemsResponse\"\x00\x12x\n\tFetchFile\x12\x33.io.deephaven.proto.backplane.grpc.FetchFileRequest\x1a\x34.io.deephaven.proto.backplane.grpc.FetchFileResponse\"\x00\x12u\n\x08SaveFile\x12\x32.io.deephaven.proto.backplane.grpc.SaveFileRequest\x1a\x33.io.deephaven.proto.backplane.grpc.SaveFileResponse\"\x00\x12u\n\x08MoveItem\x12\x32.io.deephaven.proto.backplane.grpc.MoveItemRequest\x1a\x33.io.deephaven.proto.backplane.grpc.MoveItemResponse\"\x00\x12\x8a\x01\n\x0f\x43reateDirectory\x12\x39.io.deephaven.proto.backplane.grpc.CreateDirectoryRequest\x1a:.io.deephaven.proto.backplane.grpc.CreateDirectoryResponse\"\x00\x12{\n\nDeleteItem\x12\x34.io.deephaven.proto.backplane.grpc.DeleteItemRequest\x1a\x35.io.deephaven.proto.backplane.grpc.DeleteItemResponse\"\x00\x42\x43H\x01P\x01Z=github.com/deephaven/deephaven-core/go/internal/proto/storageb\x06proto3') _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'deephaven.proto.storage_pb2', globals()) @@ -23,34 +23,34 @@ DESCRIPTOR._serialized_options = b'H\001P\001Z=github.com/deephaven/deephaven-core/go/internal/proto/storage' _ITEMINFO.fields_by_name['size']._options = None _ITEMINFO.fields_by_name['size']._serialized_options = b'0\001' - _ITEMTYPE._serialized_start=834 - _ITEMTYPE._serialized_end=882 + _ITEMTYPE._serialized_start=858 + _ITEMTYPE._serialized_end=906 _LISTITEMSREQUEST._serialized_start=68 _LISTITEMSREQUEST._serialized_end=142 _ITEMINFO._serialized_start=145 _ITEMINFO._serialized_end=274 _LISTITEMSRESPONSE._serialized_start=276 - _LISTITEMSRESPONSE._serialized_end=355 - _FETCHFILEREQUEST._serialized_start=357 - _FETCHFILEREQUEST._serialized_end=417 - _FETCHFILERESPONSE._serialized_start=419 - _FETCHFILERESPONSE._serialized_end=484 - _SAVEFILEREQUEST._serialized_start=486 - _SAVEFILEREQUEST._serialized_end=560 - _SAVEFILERESPONSE._serialized_start=562 - _SAVEFILERESPONSE._serialized_end=608 - _MOVEITEMREQUEST._serialized_start=610 - _MOVEITEMREQUEST._serialized_end=688 - _MOVEITEMRESPONSE._serialized_start=690 - _MOVEITEMRESPONSE._serialized_end=708 - _CREATEDIRECTORYREQUEST._serialized_start=710 - _CREATEDIRECTORYREQUEST._serialized_end=748 - _CREATEDIRECTORYRESPONSE._serialized_start=750 - _CREATEDIRECTORYRESPONSE._serialized_end=775 - _DELETEITEMREQUEST._serialized_start=777 - _DELETEITEMREQUEST._serialized_end=810 - _DELETEITEMRESPONSE._serialized_start=812 - _DELETEITEMRESPONSE._serialized_end=832 - _STORAGESERVICE._serialized_start=885 - _STORAGESERVICE._serialized_end=1649 + _LISTITEMSRESPONSE._serialized_end=379 + _FETCHFILEREQUEST._serialized_start=381 + _FETCHFILEREQUEST._serialized_end=441 + _FETCHFILERESPONSE._serialized_start=443 + _FETCHFILERESPONSE._serialized_end=508 + _SAVEFILEREQUEST._serialized_start=510 + _SAVEFILEREQUEST._serialized_end=584 + _SAVEFILERESPONSE._serialized_start=586 + _SAVEFILERESPONSE._serialized_end=632 + _MOVEITEMREQUEST._serialized_start=634 + _MOVEITEMREQUEST._serialized_end=712 + _MOVEITEMRESPONSE._serialized_start=714 + _MOVEITEMRESPONSE._serialized_end=732 + _CREATEDIRECTORYREQUEST._serialized_start=734 + _CREATEDIRECTORYREQUEST._serialized_end=772 + _CREATEDIRECTORYRESPONSE._serialized_start=774 + _CREATEDIRECTORYRESPONSE._serialized_end=799 + _DELETEITEMREQUEST._serialized_start=801 + _DELETEITEMREQUEST._serialized_end=834 + _DELETEITEMRESPONSE._serialized_start=836 + _DELETEITEMRESPONSE._serialized_end=856 + _STORAGESERVICE._serialized_start=909 + _STORAGESERVICE._serialized_end=1673 # @@protoc_insertion_point(module_scope) From 1ce439767a1b1f1f6bfd5216e755e642ab89ffd0 Mon Sep 17 00:00:00 2001 From: Colin Alworth Date: Fri, 24 May 2024 15:28:39 -0500 Subject: [PATCH 08/11] Also update test prop --- props/test-configs/src/main/resources/dh-tests.prop | 3 +++ 1 file changed, 3 insertions(+) diff --git a/props/test-configs/src/main/resources/dh-tests.prop b/props/test-configs/src/main/resources/dh-tests.prop index baff6680273..b8aa3bec295 100644 --- a/props/test-configs/src/main/resources/dh-tests.prop +++ b/props/test-configs/src/main/resources/dh-tests.prop @@ -94,6 +94,9 @@ BarrageMessageProducer.minSnapshotCellCount=50 BarrageMessageProducer.maxSnapshotCellCount=50 BarrageStreamGenerator.batchSize=4 +web.storage.layout.directory=/layouts +web.storage.notebook.directory=/notebooks + http.session.durationMs=300000 AuthHandlers=io.deephaven.auth.AnonymousAuthenticationHandler authentication.client.configuration.list= From aeac133ce03276c96be510e3d1eaf40fc3afe323 Mon Sep 17 00:00:00 2001 From: Colin Alworth Date: Tue, 28 May 2024 13:29:01 -0500 Subject: [PATCH 09/11] Add missing tests, and TODOs for later follow-up --- .../web/client/api/storage/JsItemDetails.java | 4 + .../api/storage/JsStorageServiceTest.java | 73 ++++++++++++++++--- 2 files changed, 65 insertions(+), 12 deletions(-) diff --git a/web/client-api/src/main/java/io/deephaven/web/client/api/storage/JsItemDetails.java b/web/client-api/src/main/java/io/deephaven/web/client/api/storage/JsItemDetails.java index bd26cbbbafc..dcc26bac3a8 100644 --- a/web/client-api/src/main/java/io/deephaven/web/client/api/storage/JsItemDetails.java +++ b/web/client-api/src/main/java/io/deephaven/web/client/api/storage/JsItemDetails.java @@ -43,6 +43,10 @@ public String getFilename() { @JsProperty public String getBasename() { + // TODO (deephaven-core#5068) remove extra check + if (parentPath.equals("/")) { + return path.substring(1); + } return path.substring(parentPath.length() + 1); } diff --git a/web/client-api/src/test/java/io/deephaven/web/client/api/storage/JsStorageServiceTest.java b/web/client-api/src/test/java/io/deephaven/web/client/api/storage/JsStorageServiceTest.java index 12197ba9f3a..d18386cc258 100644 --- a/web/client-api/src/test/java/io/deephaven/web/client/api/storage/JsStorageServiceTest.java +++ b/web/client-api/src/test/java/io/deephaven/web/client/api/storage/JsStorageServiceTest.java @@ -27,9 +27,10 @@ public void testStorageService() { return storageService.listItems("", null).then(items -> { assertEquals(items.toString_(), 2, items.length); + // TODO (deephaven-core#5068) remove leading slash Set expected = new HashSet<>(Arrays.asList("layouts", "notebooks")); for (int i = 0; i < items.length; i++) { - expected.remove(items.getAt(i).getFilename()); + expected.remove(items.getAt(i).getBasename()); } assertTrue(expected.toString(), expected.isEmpty()); @@ -48,7 +49,7 @@ public void testStorageService() { return null; }), storageService.listItems("/notebooks", null).then(items -> { - delayTestFinish(20_003); + delayTestFinish(20_004); assertEquals(1, items.length); @@ -56,7 +57,7 @@ public void testStorageService() { assertEquals("myDir", items.getAt(0).getBasename()); return null; }), storageService.listItems("notebooks/", null).then(items -> { - delayTestFinish(20_003); + delayTestFinish(20_005); assertEquals(1, items.length); @@ -64,7 +65,7 @@ public void testStorageService() { assertEquals("myDir", items.getAt(0).getBasename()); return null; }), storageService.listItems("/notebooks/", null).then(items -> { - delayTestFinish(20_003); + delayTestFinish(20_006); assertEquals(1, items.length); @@ -72,14 +73,62 @@ public void testStorageService() { assertEquals("myDir", items.getAt(0).getBasename()); return null; })); - }).then(ignore -> { - delayTestFinish(20_003); - - - - finishTest(); - return null; - }).catch_(this::report); + }).then(ignore -> storageService + .saveFile("layouts/myFile.txt", JsFileContents.text("hello, ", "world"), false) + .then(file -> { + delayTestFinish(20_007); + + assertEquals("8ebc5e3a62ac2f344d41429607bcdc4c", file.getEtag()); + return Promise.all(storageService.listItems("layouts", null) + .then(items -> { + delayTestFinish(20_008); + + assertEquals(JsItemType.FILE, items.getAt(0).getType()); + assertEquals("myFile.txt", items.getAt(0).getBasename()); + return null; + }), storageService.loadFile("layouts/myFile.txt", null).then(contents -> { + delayTestFinish(20_009); + + return contents.text().then(c -> { + delayTestFinish(20_010); + + assertEquals("hello, world", c); + return null; + }); + }), storageService.loadFile("/layouts/myFile.txt", null).then(contents -> { + delayTestFinish(20_011); + + return contents.text().then(c -> { + delayTestFinish(20_012); + + assertEquals("hello, world", c); + return null; + }); + }), storageService.loadFile("layouts/myFile.txt", "8ebc5e3a62ac2f344d41429607bcdc4c").then(contents -> { + delayTestFinish(20_013); + + return contents.text().then(c -> { + fail("should not have resolved"); + return null; + }, error -> { + assertTrue(error.toString() + .contains("No contents available, please use provided etag")); + return null; + }); + }), storageService.loadFile("layouts/myFile.txt", "definitely-the-wrong-hash").then(contents -> { + delayTestFinish(20_014); + + return contents.text().then(c -> { + delayTestFinish(20_015); + + assertEquals("hello, world", c); + return null; + }); + })); + })).then(ignore -> { + finishTest(); + return null; + }).catch_(this::report); }); } From 8a21073ba208cb549cb79ed27ed636671ebc5d49 Mon Sep 17 00:00:00 2001 From: Colin Alworth Date: Tue, 28 May 2024 14:17:41 -0500 Subject: [PATCH 10/11] spotless --- .../api/storage/JsStorageServiceTest.java | 45 ++++++++++--------- 1 file changed, 24 insertions(+), 21 deletions(-) diff --git a/web/client-api/src/test/java/io/deephaven/web/client/api/storage/JsStorageServiceTest.java b/web/client-api/src/test/java/io/deephaven/web/client/api/storage/JsStorageServiceTest.java index d18386cc258..c407a986a2d 100644 --- a/web/client-api/src/test/java/io/deephaven/web/client/api/storage/JsStorageServiceTest.java +++ b/web/client-api/src/test/java/io/deephaven/web/client/api/storage/JsStorageServiceTest.java @@ -104,27 +104,30 @@ public void testStorageService() { assertEquals("hello, world", c); return null; }); - }), storageService.loadFile("layouts/myFile.txt", "8ebc5e3a62ac2f344d41429607bcdc4c").then(contents -> { - delayTestFinish(20_013); - - return contents.text().then(c -> { - fail("should not have resolved"); - return null; - }, error -> { - assertTrue(error.toString() - .contains("No contents available, please use provided etag")); - return null; - }); - }), storageService.loadFile("layouts/myFile.txt", "definitely-the-wrong-hash").then(contents -> { - delayTestFinish(20_014); - - return contents.text().then(c -> { - delayTestFinish(20_015); - - assertEquals("hello, world", c); - return null; - }); - })); + }), storageService.loadFile("layouts/myFile.txt", "8ebc5e3a62ac2f344d41429607bcdc4c") + .then(contents -> { + delayTestFinish(20_013); + + return contents.text().then(c -> { + fail("should not have resolved"); + return null; + }, error -> { + assertTrue(error.toString() + .contains("No contents available, please use provided etag")); + return null; + }); + }), + storageService.loadFile("layouts/myFile.txt", "definitely-the-wrong-hash") + .then(contents -> { + delayTestFinish(20_014); + + return contents.text().then(c -> { + delayTestFinish(20_015); + + assertEquals("hello, world", c); + return null; + }); + })); })).then(ignore -> { finishTest(); return null; From c38b8edb9e0ae61641f2c5b88435338c9d789c09 Mon Sep 17 00:00:00 2001 From: Colin Alworth Date: Wed, 29 May 2024 11:04:51 -0500 Subject: [PATCH 11/11] Rename test to match expected pattern --- .../java/io/deephaven/web/ClientIntegrationTestSuite.java | 4 ++-- ...JsStorageServiceTest.java => JsStorageServiceTestGwt.java} | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) rename web/client-api/src/test/java/io/deephaven/web/client/api/storage/{JsStorageServiceTest.java => JsStorageServiceTestGwt.java} (98%) diff --git a/web/client-api/src/test/java/io/deephaven/web/ClientIntegrationTestSuite.java b/web/client-api/src/test/java/io/deephaven/web/ClientIntegrationTestSuite.java index 4d3af37cc20..077edddb63a 100644 --- a/web/client-api/src/test/java/io/deephaven/web/ClientIntegrationTestSuite.java +++ b/web/client-api/src/test/java/io/deephaven/web/ClientIntegrationTestSuite.java @@ -7,7 +7,7 @@ import io.deephaven.web.client.api.HierarchicalTableTestGwt; import io.deephaven.web.client.api.NullValueTestGwt; import io.deephaven.web.client.api.PartitionedTableTestGwt; -import io.deephaven.web.client.api.storage.JsStorageServiceTest; +import io.deephaven.web.client.api.storage.JsStorageServiceTestGwt; import io.deephaven.web.client.api.subscription.ConcurrentTableTestGwt; import io.deephaven.web.client.api.TableManipulationTestGwt; import io.deephaven.web.client.api.subscription.ViewportTestGwt; @@ -30,7 +30,7 @@ public static Test suite() { suite.addTestSuite(NullValueTestGwt.class); suite.addTestSuite(HierarchicalTableTestGwt.class); suite.addTestSuite(PartitionedTableTestGwt.class); - suite.addTestSuite(JsStorageServiceTest.class); + suite.addTestSuite(JsStorageServiceTestGwt.class); // This should be a unit test, but it requires a browser environment to run on GWT 2.9 // GWT 2.9 doesn't have proper bindings for Promises in HtmlUnit, so we need to use the IntegrationTest suite diff --git a/web/client-api/src/test/java/io/deephaven/web/client/api/storage/JsStorageServiceTest.java b/web/client-api/src/test/java/io/deephaven/web/client/api/storage/JsStorageServiceTestGwt.java similarity index 98% rename from web/client-api/src/test/java/io/deephaven/web/client/api/storage/JsStorageServiceTest.java rename to web/client-api/src/test/java/io/deephaven/web/client/api/storage/JsStorageServiceTestGwt.java index c407a986a2d..d37b03d4728 100644 --- a/web/client-api/src/test/java/io/deephaven/web/client/api/storage/JsStorageServiceTest.java +++ b/web/client-api/src/test/java/io/deephaven/web/client/api/storage/JsStorageServiceTestGwt.java @@ -12,7 +12,7 @@ import java.util.HashSet; import java.util.Set; -public class JsStorageServiceTest extends AbstractAsyncGwtTestCase { +public class JsStorageServiceTestGwt extends AbstractAsyncGwtTestCase { public void testStorageService() { setupDhInternal().then(ignore -> {