From 3f09199007338d73f10f02a5ccaef89e0d0a13ee Mon Sep 17 00:00:00 2001 From: Nidhi Nandwani Date: Thu, 11 Jun 2026 10:55:15 +0000 Subject: [PATCH 1/2] feat(java): add deleteFolderRecursive sample This adds a sample demonstrating how to recursively delete a folder in a hierarchical namespace bucket. Fixes: b/521168740 [Generated-by: AI] --- .../control/v2/DeleteFolderRecursive.java | 49 +++++++++++++++++++ .../storage/control/v2/FoldersTest.java | 14 ++++++ 2 files changed, 63 insertions(+) create mode 100644 java-storage/samples/snippets/src/main/java/com/example/storage/control/v2/DeleteFolderRecursive.java diff --git a/java-storage/samples/snippets/src/main/java/com/example/storage/control/v2/DeleteFolderRecursive.java b/java-storage/samples/snippets/src/main/java/com/example/storage/control/v2/DeleteFolderRecursive.java new file mode 100644 index 000000000000..163d8999af31 --- /dev/null +++ b/java-storage/samples/snippets/src/main/java/com/example/storage/control/v2/DeleteFolderRecursive.java @@ -0,0 +1,49 @@ +/* + * Copyright 2026 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.example.storage.control.v2; + +// [START storage_control_delete_folder_recursive] + +import com.google.storage.control.v2.DeleteFolderRecursiveRequest; +import com.google.storage.control.v2.FolderName; +import com.google.storage.control.v2.StorageControlClient; +import java.util.concurrent.ExecutionException; + +public final class DeleteFolderRecursive { + + public static void deleteFolderRecursive(String bucketName, String folderName) + throws ExecutionException, InterruptedException, Exception { + // The name of the bucket + // String bucketName = "your-unique-bucket-name"; + + // The name of the folder within the bucket + // String folderName = "your-unique-folder-name"; + + try (StorageControlClient storageControl = StorageControlClient.create()) { + + // Set project to "_" to signify globally scoped bucket + String folderResourceName = FolderName.format("_", bucketName, folderName); + DeleteFolderRecursiveRequest request = + DeleteFolderRecursiveRequest.newBuilder().setName(folderResourceName).build(); + + storageControl.deleteFolderRecursiveAsync(request).get(); + + System.out.printf("Deleted folder recursively: %s%n", folderResourceName); + } + } +} +// [END storage_control_delete_folder_recursive] diff --git a/java-storage/samples/snippets/src/test/java/com/example/storage/control/v2/FoldersTest.java b/java-storage/samples/snippets/src/test/java/com/example/storage/control/v2/FoldersTest.java index a677614a9a7c..31e2b62839eb 100644 --- a/java-storage/samples/snippets/src/test/java/com/example/storage/control/v2/FoldersTest.java +++ b/java-storage/samples/snippets/src/test/java/com/example/storage/control/v2/FoldersTest.java @@ -139,6 +139,20 @@ public void deleteFolder() throws IOException { assertThrows(NotFoundException.class, () -> storageControl.getFolder(folderName)); } + @Test + public void deleteFolderRecursive() throws Exception { + FolderName folderName = FolderName.of("_", bucket.getName(), UUID.randomUUID().toString()); + Folder gen1 = + storageControl.createFolder( + BucketName.of("_", bucket.getName()), + Folder.getDefaultInstance(), + folderName.getFolder()); + + DeleteFolderRecursive.deleteFolderRecursive(bucket.getName(), folderName.getFolder()); + assertThat(stdOut.getCapturedOutputAsUtf8String()).contains(folderName.toString()); + assertThrows(NotFoundException.class, () -> storageControl.getFolder(folderName)); + } + @Test public void listFolder() throws IOException { FolderName folderName = FolderName.of("_", bucket.getName(), UUID.randomUUID().toString()); From bf9535bef123bcc45bf2bfcac03d88e164b779cc Mon Sep 17 00:00:00 2001 From: Nidhi Nandwani Date: Thu, 11 Jun 2026 11:27:50 +0000 Subject: [PATCH 2/2] fix(java-storage): resolve PR comments for delete folder [Generated-by: AI] --- .../storage/control/v2/DeleteFolderRecursive.java | 3 +-- .../example/storage/control/v2/FoldersTest.java | 15 +++++---------- 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/java-storage/samples/snippets/src/main/java/com/example/storage/control/v2/DeleteFolderRecursive.java b/java-storage/samples/snippets/src/main/java/com/example/storage/control/v2/DeleteFolderRecursive.java index 163d8999af31..ff65aa145412 100644 --- a/java-storage/samples/snippets/src/main/java/com/example/storage/control/v2/DeleteFolderRecursive.java +++ b/java-storage/samples/snippets/src/main/java/com/example/storage/control/v2/DeleteFolderRecursive.java @@ -21,12 +21,11 @@ import com.google.storage.control.v2.DeleteFolderRecursiveRequest; import com.google.storage.control.v2.FolderName; import com.google.storage.control.v2.StorageControlClient; -import java.util.concurrent.ExecutionException; public final class DeleteFolderRecursive { public static void deleteFolderRecursive(String bucketName, String folderName) - throws ExecutionException, InterruptedException, Exception { + throws Exception { // The name of the bucket // String bucketName = "your-unique-bucket-name"; diff --git a/java-storage/samples/snippets/src/test/java/com/example/storage/control/v2/FoldersTest.java b/java-storage/samples/snippets/src/test/java/com/example/storage/control/v2/FoldersTest.java index 31e2b62839eb..d3ae78252d05 100644 --- a/java-storage/samples/snippets/src/test/java/com/example/storage/control/v2/FoldersTest.java +++ b/java-storage/samples/snippets/src/test/java/com/example/storage/control/v2/FoldersTest.java @@ -88,8 +88,7 @@ public void createFolder() throws IOException { @Test public void getFolder() throws IOException { FolderName folderName = FolderName.of("_", bucket.getName(), UUID.randomUUID().toString()); - Folder gen1 = - storageControl.createFolder( + storageControl.createFolder( BucketName.of("_", bucket.getName()), Folder.getDefaultInstance(), folderName.getFolder()); @@ -106,8 +105,7 @@ public void getFolder() throws IOException { public void renameFolder() throws IOException, ExecutionException, InterruptedException, TimeoutException { FolderName srcFolderName = FolderName.of("_", bucket.getName(), UUID.randomUUID().toString()); - Folder gen1 = - storageControl.createFolder( + storageControl.createFolder( BucketName.of("_", bucket.getName()), Folder.getDefaultInstance(), srcFolderName.getFolder()); @@ -128,8 +126,7 @@ public void renameFolder() @Test public void deleteFolder() throws IOException { FolderName folderName = FolderName.of("_", bucket.getName(), UUID.randomUUID().toString()); - Folder gen1 = - storageControl.createFolder( + storageControl.createFolder( BucketName.of("_", bucket.getName()), Folder.getDefaultInstance(), folderName.getFolder()); @@ -142,8 +139,7 @@ public void deleteFolder() throws IOException { @Test public void deleteFolderRecursive() throws Exception { FolderName folderName = FolderName.of("_", bucket.getName(), UUID.randomUUID().toString()); - Folder gen1 = - storageControl.createFolder( + storageControl.createFolder( BucketName.of("_", bucket.getName()), Folder.getDefaultInstance(), folderName.getFolder()); @@ -156,8 +152,7 @@ public void deleteFolderRecursive() throws Exception { @Test public void listFolder() throws IOException { FolderName folderName = FolderName.of("_", bucket.getName(), UUID.randomUUID().toString()); - Folder gen1 = - storageControl.createFolder( + storageControl.createFolder( BucketName.of("_", bucket.getName()), Folder.getDefaultInstance(), folderName.getFolder());