From b30a6757de84e2ceebc9f28817bcfa5c34c20a30 Mon Sep 17 00:00:00 2001 From: Ajit Thakor <49403056+athakor@users.noreply.github.com> Date: Fri, 14 Feb 2020 11:15:00 +0530 Subject: [PATCH] feat: add delimiter BlobListOption (#102) * feat: add delimiter BlobListOption * feat: added testcase for delemiter method * feat: fix review changes * build: fix build --- .../java/com/google/cloud/storage/Storage.java | 10 ++++++++++ .../com/google/cloud/storage/StorageImpl.java | 6 ++++-- .../google/cloud/storage/StorageImplTest.java | 17 +++++++++++++++++ 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/Storage.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/Storage.java index 98f304dd8..c7514b75c 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/Storage.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/Storage.java @@ -1003,6 +1003,16 @@ public static BlobListOption currentDirectory() { return new BlobListOption(StorageRpc.Option.DELIMITER, true); } + /** + * Returns an option to set a delimiter. + * + * @param delimiter generally '/' is the one used most often, but you can used other delimiters + * as well. + */ + public static BlobListOption delimiter(String delimiter) { + return new BlobListOption(StorageRpc.Option.DELIMITER, delimiter); + } + /** * Returns an option to define the billing user project. This option is required by buckets with * `requester_pays` flag enabled to assign operation costs. diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageImpl.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageImpl.java index d76aa0d29..0f38e3827 100644 --- a/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageImpl.java +++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageImpl.java @@ -1594,9 +1594,11 @@ private static void addToOptionMap( Object prev = temp.put(option.getRpcOption(), option.getValue()); checkArgument(prev == null, "Duplicate option %s", option); } - Boolean value = (Boolean) temp.remove(DELIMITER); - if (Boolean.TRUE.equals(value)) { + if (Boolean.TRUE.equals(temp.get(DELIMITER))) { + temp.remove(DELIMITER); temp.put(DELIMITER, PATH_DELIMITER); + } else if (null != temp.get(DELIMITER)) { + temp.put(DELIMITER, temp.get(DELIMITER)); } if (useAsSource) { addToOptionMap(IF_GENERATION_MATCH, IF_SOURCE_GENERATION_MATCH, generation, temp); diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/StorageImplTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/StorageImplTest.java index 59e1f8d2c..d13cc74a8 100644 --- a/google-cloud-storage/src/test/java/com/google/cloud/storage/StorageImplTest.java +++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/StorageImplTest.java @@ -1166,6 +1166,23 @@ public void testListBlobsCurrentDirectory() { assertArrayEquals(blobList.toArray(), Iterables.toArray(page.getValues(), Blob.class)); } + @Test + public void testListBlobsDelimiter() { + String cursor = "cursor"; + String delimiter = "/"; + Map options = ImmutableMap.of(StorageRpc.Option.DELIMITER, delimiter); + ImmutableList blobInfoList = ImmutableList.of(BLOB_INFO1, BLOB_INFO2); + Tuple> result = + Tuple.of(cursor, Iterables.transform(blobInfoList, BlobInfo.INFO_TO_PB_FUNCTION)); + EasyMock.expect(storageRpcMock.list(BUCKET_NAME1, options)).andReturn(result); + EasyMock.replay(storageRpcMock); + initializeService(); + ImmutableList blobList = ImmutableList.of(expectedBlob1, expectedBlob2); + Page page = storage.list(BUCKET_NAME1, Storage.BlobListOption.delimiter(delimiter)); + assertEquals(cursor, page.getNextPageToken()); + assertArrayEquals(blobList.toArray(), Iterables.toArray(page.getValues(), Blob.class)); + } + @Test public void testUpdateBucket() { BucketInfo updatedBucketInfo = BUCKET_INFO1.toBuilder().setIndexPage("some-page").build();