From 932fe4635b73bf45e4147b230bc892b275275a2a Mon Sep 17 00:00:00 2001 From: Ajit Thakor Date: Wed, 29 Jan 2020 17:03:47 +0530 Subject: [PATCH 1/4] feat: add delimiter BlobListOption --- .../src/main/java/com/google/cloud/storage/Storage.java | 7 +++++++ 1 file changed, 7 insertions(+) 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 77c88e97c6..135abfd005 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 @@ -988,6 +988,13 @@ public static BlobListOption currentDirectory() { return new BlobListOption(StorageRpc.Option.DELIMITER, true); } + /** + * Returns an option to set a delimiter '/'. + */ + public static BlobListOption delimiter() { + return new BlobListOption(StorageRpc.Option.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. From 045506eb77e380f212fc9bab17ac337c8db0d8ec Mon Sep 17 00:00:00 2001 From: Ajit Thakor Date: Thu, 30 Jan 2020 12:11:21 +0530 Subject: [PATCH 2/4] feat: added testcase for delemiter method --- .../java/com/google/cloud/storage/Storage.java | 4 +--- .../com/google/cloud/storage/StorageImpl.java | 6 ++++-- .../google/cloud/storage/StorageImplTest.java | 16 ++++++++++++++++ 3 files changed, 21 insertions(+), 5 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 135abfd005..9f6cf426b4 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 @@ -988,9 +988,7 @@ public static BlobListOption currentDirectory() { return new BlobListOption(StorageRpc.Option.DELIMITER, true); } - /** - * Returns an option to set a delimiter '/'. - */ + /** Returns an option to set a delimiter '/'. */ public static BlobListOption delimiter() { return new BlobListOption(StorageRpc.Option.DELIMITER, "/"); } 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 63c1985570..fd44132f17 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 @@ -1583,8 +1583,10 @@ 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 (PATH_DELIMITER.equals(temp.get(DELIMITER))) { temp.put(DELIMITER, PATH_DELIMITER); } if (useAsSource) { 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 6e698123c4..d0386ed969 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,22 @@ public void testListBlobsCurrentDirectory() { assertArrayEquals(blobList.toArray(), Iterables.toArray(page.getValues(), Blob.class)); } + @Test + public void testListBlobsDelimiter() { + String cursor = "cursor"; + Map options = ImmutableMap.of(StorageRpc.Option.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()); + 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(); From 643c43435052a4a717d3508277bbc500e9b4efdb Mon Sep 17 00:00:00 2001 From: Ajit Thakor Date: Mon, 10 Feb 2020 12:42:59 +0530 Subject: [PATCH 3/4] feat: fix review changes --- .../main/java/com/google/cloud/storage/Storage.java | 11 ++++++++--- .../java/com/google/cloud/storage/StorageImpl.java | 4 ++-- .../com/google/cloud/storage/StorageImplTest.java | 5 +++-- 3 files changed, 13 insertions(+), 7 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 9f6cf426b4..09e0b8c659 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 @@ -988,9 +988,14 @@ public static BlobListOption currentDirectory() { return new BlobListOption(StorageRpc.Option.DELIMITER, true); } - /** Returns an option to set a delimiter '/'. */ - public static BlobListOption delimiter() { - return new BlobListOption(StorageRpc.Option.DELIMITER, "/"); + /** + * 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); } /** 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 fd44132f17..36aab94f79 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 @@ -1586,8 +1586,8 @@ private static void addToOptionMap( if (Boolean.TRUE.equals(temp.get(DELIMITER))) { temp.remove(DELIMITER); temp.put(DELIMITER, PATH_DELIMITER); - } else if (PATH_DELIMITER.equals(temp.get(DELIMITER))) { - temp.put(DELIMITER, PATH_DELIMITER); + } else { + 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 d0386ed969..fda4e97d93 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 @@ -1169,7 +1169,8 @@ public void testListBlobsCurrentDirectory() { @Test public void testListBlobsDelimiter() { String cursor = "cursor"; - Map options = ImmutableMap.of(StorageRpc.Option.DELIMITER, "/"); + 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)); @@ -1177,7 +1178,7 @@ public void testListBlobsDelimiter() { EasyMock.replay(storageRpcMock); initializeService(); ImmutableList blobList = ImmutableList.of(expectedBlob1, expectedBlob2); - Page page = storage.list(BUCKET_NAME1, Storage.BlobListOption.delimiter()); + Page page = storage.list(BUCKET_NAME1, Storage.BlobListOption.delimiter(delimiter)); assertEquals(cursor, page.getNextPageToken()); assertArrayEquals(blobList.toArray(), Iterables.toArray(page.getValues(), Blob.class)); } From 62a567bdc4e60813b4b342cf2aef9142d09be6c7 Mon Sep 17 00:00:00 2001 From: Ajit Thakor Date: Mon, 10 Feb 2020 14:26:42 +0530 Subject: [PATCH 4/4] build: fix build --- .../src/main/java/com/google/cloud/storage/StorageImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 36aab94f79..b6381c560c 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 @@ -1586,7 +1586,7 @@ private static void addToOptionMap( if (Boolean.TRUE.equals(temp.get(DELIMITER))) { temp.remove(DELIMITER); temp.put(DELIMITER, PATH_DELIMITER); - } else { + } else if (null != temp.get(DELIMITER)) { temp.put(DELIMITER, temp.get(DELIMITER)); } if (useAsSource) {